private StorageCredentialsFactory CreateStorageCredentialsFactory() { StorageCredentialsFactory storageCredentialsFactory; var storageClient = AzureSession.ClientFactory.CreateArmClient <StorageManagementClient>( DefaultProfile.Context, AzureEnvironment.Endpoint.ResourceManager); if (StorageCredentialsFactory.IsChannelRequired(Destination)) { storageCredentialsFactory = new StorageCredentialsFactory(this.ResourceGroupName, storageClient, DefaultContext.Subscription); } else { storageCredentialsFactory = new StorageCredentialsFactory(); } return(storageCredentialsFactory); }
/// <summary> /// find the snapshot with the tags /// </summary> /// <param name="blobUris"></param> /// <param name="snapshotTag"></param> /// <param name="taskId"></param> /// <param name="storageCredentialsFactory"></param> /// <returns></returns> public List<CloudPageBlob> FindSnapshot(List<string> blobUris, Dictionary<string, string> snapshotQuery, StorageCredentialsFactory storageCredentialsFactory) { List<CloudPageBlob> snapshots = new List<CloudPageBlob>(); for (int i = 0; i < blobUris.Count; i++) { BlobUri blobUri = null; if (BlobUri.TryParseUri(new Uri(blobUris[i]), out blobUri)) { StorageCredentials sc = storageCredentialsFactory.Create(blobUri); CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(sc, true); CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer blobContainer = blobClient.GetContainerReference(blobUri.BlobContainerName); IEnumerable<IListBlobItem> blobs = blobContainer.ListBlobs(null, true, BlobListingDetails.All); foreach (var blob in blobs) { if (blob is CloudPageBlob) { CloudPageBlob pageBlob = blob as CloudPageBlob; if (pageBlob.IsSnapshot && pageBlob.Name == blobUri.BlobName) { bool allMatch = true; foreach (string keyToQuey in snapshotQuery.Keys) { if (!pageBlob.Metadata.Keys.Contains(keyToQuey)) { allMatch = false; } else if (!string.Equals(pageBlob.Metadata[keyToQuey], snapshotQuery[keyToQuey])) { allMatch = false; } } if (allMatch) { snapshots.Add(pageBlob); } } } } } } return snapshots; }
internal int? GetDiskSizeGbFromBlobUri(string sBlobUri) { var storageClient = new StorageManagementClient(); var blobMatch = Regex.Match(sBlobUri, "https?://(\\S*?)\\..*?/(.*)"); if (!blobMatch.Success) { WriteError("Blob URI of disk does not match known pattern {0}", sBlobUri); throw new ArgumentException("Blob URI of disk does not match known pattern"); } var accountName = blobMatch.Groups[1].Value; BlobUri blobUri; if (BlobUri.TryParseUri(new Uri(sBlobUri), out blobUri)) { try { var account = this.GetStorageAccountFromCache(accountName); var resGroupName = this.GetResourceGroupFromId(account.Id); StorageCredentialsFactory storageCredentialsFactory = new StorageCredentialsFactory(resGroupName, this._StorageClient, this._Subscription); StorageCredentials sc = storageCredentialsFactory.Create(blobUri); CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(sc, true); CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer blobContainer = blobClient.GetContainerReference(blobUri.BlobContainerName); var cloudBlob = blobContainer.GetPageBlobReference(blobUri.BlobName); var sasToken = cloudBlob.GetSharedAccessSignature( new SharedAccessBlobPolicy() { SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24.0), Permissions = SharedAccessBlobPermissions.Read }); cloudBlob.FetchAttributes(); return (int?)(cloudBlob.Properties.Length / (1024 * 1024 * 1024)); } catch (Exception) { this.WriteWarning("Could not determine OS Disk size."); } } return null; }
/// <summary> /// remove the vmbackups with the metadata key "vmbackuptag" and value snapshotTag, snapshotTag is the parameter passed in. /// </summary> /// <param name="resourceGroupName"></param> /// <param name="vmName"></param> /// <param name="virtualMachineExtensionType"></param> /// <param name="location"></param> /// <param name="virtualMachineResponse"></param> /// <param name="profile"></param> /// <param name="VirtualMachineExtensionClient"></param> /// <param name="snapshotTag"></param> public void RemoveSnapshot(AzureVMBackupConfig vmConfig, string snapshotTag, VirtualMachineExtensionBaseCmdlet virtualMachineExtensionBaseCmdlet) { var virtualMachineResponse = virtualMachineExtensionBaseCmdlet.ComputeClient.ComputeManagementClient.VirtualMachines.GetWithInstanceView(vmConfig.ResourceGroupName, vmConfig.VMName); StorageManagementClient storageClient = AzureSession.ClientFactory.CreateClient<StorageManagementClient>(virtualMachineExtensionBaseCmdlet.DefaultProfile.Context, AzureEnvironment.Endpoint.ResourceManager); StorageCredentialsFactory storageCredentialsFactory = new StorageCredentialsFactory(vmConfig.ResourceGroupName, storageClient, virtualMachineExtensionBaseCmdlet.DefaultProfile.Context.Subscription); List<string> blobUris = this.GetDiskBlobUris(virtualMachineResponse.Body); Dictionary<string, string> snapshotQuery = new Dictionary<string, string>(); List<CloudPageBlob> snapshots = this.FindSnapshot(blobUris, snapshotQuery, storageCredentialsFactory); foreach (CloudPageBlob snapshot in snapshots) { snapshot.Delete(); } }
/// <summary> /// we only support the Linux box now, if it's a windows, one AzureVMBackupException would be thrown. /// </summary> /// <param name="resourceGroupName"></param> /// <param name="vmName"></param> /// <param name="virtualMachineExtensionType"></param> /// <param name="location"></param> /// <param name="virtualMachineResponse"></param> /// <param name="snapshotTag"></param> /// <param name="virtualMachineExtensionBaseCmdlet"></param> public void CreateSnapshotForDisks(AzureVMBackupConfig vmConfig, string snapshotTag, VirtualMachineExtensionBaseCmdlet virtualMachineExtensionBaseCmdlet) { var virtualMachine = virtualMachineExtensionBaseCmdlet.ComputeClient.ComputeManagementClient.VirtualMachines.GetWithInstanceView( vmConfig.ResourceGroupName, vmConfig.VMName); StorageManagementClient storageClient = AzureSession.ClientFactory.CreateClient<StorageManagementClient>(virtualMachineExtensionBaseCmdlet.DefaultProfile.Context, AzureEnvironment.Endpoint.ResourceManager); StorageCredentialsFactory storageCredentialsFactory = new StorageCredentialsFactory(vmConfig.ResourceGroupName, storageClient, virtualMachineExtensionBaseCmdlet.DefaultProfile.Context.Subscription); CloudPageBlobObjectFactory cloudPageBlobObjectFactory = new CloudPageBlobObjectFactory(storageCredentialsFactory, TimeSpan.FromMinutes(1)); List<string> vmPageBlobUris = this.GetDiskBlobUris(virtualMachine.Body); AzureVMBackupBlobSasUris blobSASUris = this.GenerateBlobSasUris(vmPageBlobUris, cloudPageBlobObjectFactory); string taskId = Guid.NewGuid().ToString(); AzureVMBackupExtensionProtectedSettings privateConfig = new AzureVMBackupExtensionProtectedSettings(); privateConfig.logsBlobUri = string.Empty; privateConfig.objectStr = this.GetBase64Encoding(blobSASUris); AzureVMBackupExtensionPublicSettings publicConfig = new AzureVMBackupExtensionPublicSettings(); publicConfig.commandToExecute = backupSnapshotCommand; publicConfig.locale = backupDefaultLocale; publicConfig.commandStartTimeUTCTicks = DateTimeOffset.UtcNow.Ticks.ToString(); publicConfig.taskId = taskId; AzureVMBackupMetadata backupMetadata = new AzureVMBackupMetadata(); AzureVMBackupMetadataItem tagMetadataItem = new AzureVMBackupMetadataItem(); tagMetadataItem.Key = backupExtensionMetadataName; tagMetadataItem.Value = snapshotTag; AzureVMBackupMetadataItem taskIdMetadataItem = new AzureVMBackupMetadataItem(); taskIdMetadataItem.Key = backupExtensionIdentityMetadataName; taskIdMetadataItem.Value = taskId; backupMetadata.backupMetadata.Add(tagMetadataItem); backupMetadata.backupMetadata.Add(taskIdMetadataItem); publicConfig.objectStr = this.GetBase64Encoding(backupMetadata); VirtualMachineExtension vmExtensionParameters = new VirtualMachineExtension { Location = virtualMachine.Body.Location, Publisher = extensionPublisher, VirtualMachineExtensionType = extensionType, TypeHandlerVersion = extensionDefaultVersion, Settings = publicConfig, ProtectedSettings = privateConfig, }; var vmBackupOperation = virtualMachineExtensionBaseCmdlet.VirtualMachineExtensionClient.CreateOrUpdate( vmConfig.ResourceGroupName, vmConfig.VMName, vmConfig.ExtensionName ?? backupExtensionName, vmExtensionParameters); // check the snapshots with the task id are all created. int timePeriod = 5000; int loopingTimes = ((int)TimeSpan.FromMinutes(10).TotalMilliseconds / timePeriod); Dictionary<string, string> snapshotQuery = new Dictionary<string, string>(); snapshotQuery.Add(backupExtensionMetadataName, snapshotTag); snapshotQuery.Add(backupExtensionIdentityMetadataName, taskId); int i = 0; for (; i < loopingTimes; i++) { List<CloudPageBlob> snapshotsFound = this.FindSnapshot(vmPageBlobUris, snapshotQuery, storageCredentialsFactory); if (snapshotsFound.Count == vmPageBlobUris.Count) { break; } else { Thread.Sleep(timePeriod); } } if (i == loopingTimes) { throw new AzureVMBackupException(AzureVMBackupErrorCodes.TimeOut, "snapshot not created, or not found in time."); } }
private StorageCredentialsFactory CreateStorageCredentialsFactory() { StorageCredentialsFactory storageCredentialsFactory; var storageClient = AzureSession.ClientFactory.CreateArmClient<StorageManagementClient>( DefaultProfile.Context, AzureEnvironment.Endpoint.ResourceManager); if (StorageCredentialsFactory.IsChannelRequired(Destination)) { storageCredentialsFactory = new StorageCredentialsFactory(this.ResourceGroupName, storageClient, DefaultContext.Subscription); } else { storageCredentialsFactory = new StorageCredentialsFactory(); } return storageCredentialsFactory; }
public CloudPageBlobObjectFactory(StorageCredentialsFactory credentialsFactory, TimeSpan operationTimeout) { this.credentialsFactory = credentialsFactory; this.operationTimeout = operationTimeout; }
public CloudPageBlobObjectFactory(StorageCredentialsFactory credentialsFactory, TimeSpan operationTimeout) { this.credentialsFactory = credentialsFactory; this.operationTimeout = operationTimeout; }
/// <summary> /// remove the vmbackups with the metadata key "vmbackuptag" and value snapshotTag, snapshotTag is the parameter passed in. /// </summary> /// <param name="resourceGroupName"></param> /// <param name="vmName"></param> /// <param name="virtualMachineExtensionType"></param> /// <param name="location"></param> /// <param name="virtualMachineResponse"></param> /// <param name="profile"></param> /// <param name="VirtualMachineExtensionClient"></param> /// <param name="snapshotTag"></param> public void RemoveSnapshot(AzureVMBackupConfig vmConfig, string snapshotTag, VirtualMachineExtensionBaseCmdlet virtualMachineExtensionBaseCmdlet) { var virtualMachineResponse = virtualMachineExtensionBaseCmdlet.ComputeClient.ComputeManagementClient.VirtualMachines.GetWithInstanceView(vmConfig.ResourceGroupName, vmConfig.VMName); StorageManagementClient storageClient = AzureSession.ClientFactory.CreateArmClient<StorageManagementClient>(virtualMachineExtensionBaseCmdlet.DefaultProfile.Context, AzureEnvironment.Endpoint.ResourceManager); StorageCredentialsFactory storageCredentialsFactory = new StorageCredentialsFactory(vmConfig.ResourceGroupName, storageClient, virtualMachineExtensionBaseCmdlet.DefaultProfile.Context.Subscription); List<string> blobUris = this.GetDiskBlobUris(virtualMachineResponse.Body); AzureVMBackupBlobSasUris blobSASUris = this.GenerateBlobSasUris(blobUris, virtualMachineExtensionBaseCmdlet.DefaultProfile.Context); Dictionary<string, string> snapshotQuery = new Dictionary<string, string>(); snapshotQuery.Add(backupExtensionMetadataName, snapshotTag); List<CloudPageBlob> snapshots = this.FindSnapshot(virtualMachineExtensionBaseCmdlet.DefaultProfile.Context, blobSASUris.pageBlobUri, blobSASUris.storageCredentialsFactory, snapshotQuery); if (snapshots == null || snapshots.Count == 0) { throw new AzureVMBackupException(AzureVMBackupErrorCodes.NoSnapshotFound, "snapshot with the tag not found."); } else { foreach (CloudPageBlob snapshot in snapshots) { snapshot.Delete(); } } }
public AzureVMBackupBlobSasUris GenerateBlobSasUris(List<string> blobUris, AzureContext azContext) { AzureVMBackupBlobSasUris blobSASUris = new AzureVMBackupBlobSasUris(); for (int i = 0; i < blobUris.Count; i++) { string blobUri = blobUris[i]; BlobUri osBlobUri = null; if (BlobUri.TryParseUri(new Uri(blobUri), out osBlobUri)) { StorageManagementClient storageClient = AzureSession.ClientFactory.CreateArmClient<StorageManagementClient>(azContext, AzureEnvironment.Endpoint.ResourceManager); // Need to convert osBlobUri.StorageAccountName into corresponding resource group name var listResponse = storageClient.StorageAccounts.List(); var account = listResponse.First(accTemp => accTemp.Name.Equals(osBlobUri.StorageAccountName, StringComparison.InvariantCultureIgnoreCase)); string resourceGroupName = GetResourceGroupFromId(account.Id); StorageCredentialsFactory storageCredentialsFactory = new StorageCredentialsFactory(resourceGroupName, storageClient, azContext.Subscription); CloudPageBlobObjectFactory cloudPageBlobObjectFactory = new CloudPageBlobObjectFactory(storageCredentialsFactory, TimeSpan.FromMinutes(1)); CloudPageBlob pageBlob = cloudPageBlobObjectFactory.Create(osBlobUri); SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy(); sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(5); sasConstraints.Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.List; string sasUri = osBlobUri.Uri + pageBlob.GetSharedAccessSignature(sasConstraints); blobSASUris.blobSASUri.Add(sasUri); blobSASUris.pageBlobUri.Add(blobUri); blobSASUris.storageCredentialsFactory.Add(storageCredentialsFactory); } else { throw new AzureVMBackupException(AzureVMBackupErrorCodes.WrongBlobUriFormat, "the blob uri is not in correct format."); } } return blobSASUris; }