internal ProximityPlacementGroupData(ResourceIdentifier id, string name, ResourceType resourceType, SystemData systemData, IDictionary <string, string> tags, AzureLocation location, IList <string> zones, ProximityPlacementGroupType?proximityPlacementGroupType, IReadOnlyList <ComputeSubResourceDataWithColocationStatus> virtualMachines, IReadOnlyList <ComputeSubResourceDataWithColocationStatus> virtualMachineScaleSets, IReadOnlyList <ComputeSubResourceDataWithColocationStatus> availabilitySets, InstanceViewStatus colocationStatus, ProximityPlacementGroupPropertiesIntent intent) : base(id, name, resourceType, systemData, tags, location) { Zones = zones; ProximityPlacementGroupType = proximityPlacementGroupType; VirtualMachines = virtualMachines; VirtualMachineScaleSets = virtualMachineScaleSets; AvailabilitySets = availabilitySets; ColocationStatus = colocationStatus; Intent = intent; }
private void AssertExtension(NodeVMExtension extension, string name = "batchNodeExtension") { Assert.NotNull(extension); Assert.NotNull(extension.VmExtension); Assert.Equal(name, extension.VmExtension.Name); Assert.Equal("Microsoft.Azure.Extensions", extension.VmExtension.Publisher); Assert.Equal("CustomScript", extension.VmExtension.Type); Assert.Equal("2.0", extension.VmExtension.TypeHandlerVersion); Assert.True(extension.VmExtension.AutoUpgradeMinorVersion); Assert.NotNull(extension.InstanceView); Assert.Equal(name, extension.InstanceView.Name); Assert.NotNull(extension.InstanceView.Statuses); Assert.Single(extension.InstanceView.Statuses); InstanceViewStatus status = extension.InstanceView.Statuses.First(); Assert.Equal("ProvisioningState/succeeded", status.Code); Assert.Equal("Provisioning succeeded", status.DisplayStatus); Assert.True(status.Level.HasValue); Assert.Equal(Models.StatusLevelTypes.Info.ToString(), status.Level.Value.ToString()); Assert.Equal("Enable succeeded: Enabling and starting agent and controller", status.Message); }
private async Task VerifyProximityPlacementGroupColocationStatusView() { var ppgName = Recording.GenerateAssetName("testppg"); string asName = Recording.GenerateAssetName("testas"); string vmssName = Recording.GenerateAssetName("testvmss"); string storageAccountName = Recording.GenerateAssetName(TestPrefix); ImageReference imageRef = await GetPlatformVMImage(useWindowsImage : true); var inputProximityPlacementGroup = new ProximityPlacementGroup(m_location) { Tags = { { "RG", "rg" }, { "testTag", "1" }, }, ProximityPlacementGroupType = ProximityPlacementGroupType.Standard }; var expectedProximityPlacementGroup = new ProximityPlacementGroup(m_location) { Tags = { { "RG", "rg" }, { "testTag", "1" }, }, ProximityPlacementGroupType = ProximityPlacementGroupType.Standard }; // Create and expect success. ProximityPlacementGroup outProximityPlacementGroup = await ProximityPlacementGroupsOperations.CreateOrUpdateAsync(m_resourceGroup1Name, ppgName, inputProximityPlacementGroup); ValidateProximityPlacementGroup(expectedProximityPlacementGroup, outProximityPlacementGroup, ppgName); VirtualMachine inputVM; var returnTwoVM = await CreateVM(m_resourceGroup1Name, asName, storageAccountName, imageRef, hasManagedDisks : true, hasDiffDisks : false, vmSize : "Standard_A0", osDiskStorageAccountType : "Standard_LRS", dataDiskStorageAccountType : "Standard_LRS", writeAcceleratorEnabled : false, zones : null, ppgName : ppgName, diskEncryptionSetId : null); VirtualMachine outVM = returnTwoVM.Item1; inputVM = returnTwoVM.Item2; // Get and expect success. outProximityPlacementGroup = await ProximityPlacementGroupsOperations.GetAsync(m_resourceGroup1Name, ppgName, includeColocationStatus : "true"); InstanceViewStatus expectedInstanceViewStatus = new InstanceViewStatus { Code = "ColocationStatus/Aligned", Level = StatusLevelTypes.Info, DisplayStatus = "Aligned", Message = "All resources in the proximity placement group are aligned." }; expectedProximityPlacementGroup = new ProximityPlacementGroup(null, null, null, m_location, new Dictionary <string, string>() { { "RG", "rg" }, { "testTag", "1" }, }, ProximityPlacementGroupType.Standard, new List <SubResourceWithColocationStatus> { new SubResourceWithColocationStatus(outVM.Id, null) }, null, new List <SubResourceWithColocationStatus> { new SubResourceWithColocationStatus(outVM.AvailabilitySet.Id, null) }, null ); ValidateProximityPlacementGroup(expectedProximityPlacementGroup, outProximityPlacementGroup, ppgName); ValidateColocationStatus(expectedInstanceViewStatus, outProximityPlacementGroup.ColocationStatus); }
public async Task TestVMDataDiskScenario() { EnsureClientsInitialized(DefaultLocation); ImageReference imgageRef = await GetPlatformVMImage(useWindowsImage : true); // Create resource group var rgName = Recording.GenerateAssetName(TestPrefix); string storageAccountName = Recording.GenerateAssetName(TestPrefix); string asName = Recording.GenerateAssetName("as"); VirtualMachine inputVM; bool passed = false; try { // Create Storage Account, so that both the VMs can share it var storageAccountOutput = await CreateStorageAccount(rgName, storageAccountName); Action <VirtualMachine> addDataDiskToVM = vm => { string containerName = Recording.GenerateAssetName("testvmdatadiskscenario", TestPrefix); var vhdContainer = "https://" + storageAccountName + ".blob.core.windows.net/" + containerName; var vhduri = vhdContainer + string.Format("/{0}.vhd", Recording.GenerateAssetName("testvmdatadiskscenario", TestPrefix)); vm.HardwareProfile.VmSize = VirtualMachineSizeTypes.StandardA4; foreach (int index in new int[] { 1, 2 }) { var diskName = "dataDisk" + index; var ddUri = vhdContainer + string.Format("/{0}{1}.vhd", diskName, Recording.GenerateAssetName("testvmdatadiskscenario", TestPrefix)); var dd = new DataDisk(1 + index, DiskCreateOptionTypes.Empty) { Caching = CachingTypes.None, Image = null, DiskSizeGB = 10, Name = diskName, Vhd = new VirtualHardDisk { Uri = ddUri } }; vm.StorageProfile.DataDisks.Add(dd); } var testStatus = new InstanceViewStatus { Code = "test", Message = "test" }; var testStatusList = new List <InstanceViewStatus> { testStatus }; // Negative tests for a bug in 5.0.0 that read-only fields have side-effect on the request body /* vm.InstanceView = new VirtualMachineInstanceView * { * Statuses = testStatusList, * VmAgent = new VirtualMachineAgentInstanceView * { * Statuses = testStatusList, * ExtensionHandlers = { * new VirtualMachineExtensionHandlerInstanceView * { * Status = testStatus, * Type = "test", * TypeHandlerVersion = "test" * } * }, * VmAgentVersion = "test" * }, * Disks = { * new DiskInstanceView * { * Statuses = testStatusList, * Name = "test" * } * }, * Extensions = { * new VirtualMachineExtensionInstanceView * { * Statuses = testStatusList * } * } * }; */ }; var returnTwoVM = await CreateVM(rgName, asName, storageAccountOutput, imgageRef, addDataDiskToVM); VirtualMachine vm1 = returnTwoVM.Item1; inputVM = returnTwoVM.Item2; string inputVMName = returnTwoVM.Item3; var getVMWithInstanceViewResponse = await VirtualMachinesOperations.GetAsync(rgName, inputVMName); Assert.True(getVMWithInstanceViewResponse != null, "VM in Get"); ValidateVMInstanceView(inputVM, getVMWithInstanceViewResponse); var vm2 = getVMWithInstanceViewResponse; var vmReCreateResponse = await WaitForCompletionAsync(await VirtualMachinesOperations.StartCreateOrUpdateAsync(rgName, getVMWithInstanceViewResponse.Value.Name, getVMWithInstanceViewResponse)); await WaitForCompletionAsync(await VirtualMachinesOperations.StartDeleteAsync(rgName, inputVMName)); passed = true; Assert.True(passed); } catch (Exception e) { throw e; } }
internal static AvailabilitySetData DeserializeAvailabilitySetData(JsonElement element) { Optional <ComputeSku> sku = default; IDictionary <string, string> tags = default; AzureLocation location = default; ResourceIdentifier id = default; string name = default; ResourceType type = default; SystemData systemData = default; Optional <int> platformUpdateDomainCount = default; Optional <int> platformFaultDomainCount = default; Optional <IList <WritableSubResource> > virtualMachines = default; Optional <WritableSubResource> proximityPlacementGroup = default; Optional <IReadOnlyList <InstanceViewStatus> > statuses = default; foreach (var property in element.EnumerateObject()) { if (property.NameEquals("sku")) { if (property.Value.ValueKind == JsonValueKind.Null) { property.ThrowNonNullablePropertyIsNull(); continue; } sku = ComputeSku.DeserializeComputeSku(property.Value); continue; } if (property.NameEquals("tags")) { Dictionary <string, string> dictionary = new Dictionary <string, string>(); foreach (var property0 in property.Value.EnumerateObject()) { dictionary.Add(property0.Name, property0.Value.GetString()); } tags = dictionary; continue; } if (property.NameEquals("location")) { location = property.Value.GetString(); continue; } if (property.NameEquals("id")) { id = new ResourceIdentifier(property.Value.GetString()); continue; } if (property.NameEquals("name")) { name = property.Value.GetString(); continue; } if (property.NameEquals("type")) { type = property.Value.GetString(); continue; } if (property.NameEquals("systemData")) { systemData = JsonSerializer.Deserialize <SystemData>(property.Value.ToString()); continue; } if (property.NameEquals("properties")) { if (property.Value.ValueKind == JsonValueKind.Null) { property.ThrowNonNullablePropertyIsNull(); continue; } foreach (var property0 in property.Value.EnumerateObject()) { if (property0.NameEquals("platformUpdateDomainCount")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } platformUpdateDomainCount = property0.Value.GetInt32(); continue; } if (property0.NameEquals("platformFaultDomainCount")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } platformFaultDomainCount = property0.Value.GetInt32(); continue; } if (property0.NameEquals("virtualMachines")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } List <WritableSubResource> array = new List <WritableSubResource>(); foreach (var item in property0.Value.EnumerateArray()) { array.Add(JsonSerializer.Deserialize <WritableSubResource>(item.ToString())); } virtualMachines = array; continue; } if (property0.NameEquals("proximityPlacementGroup")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } proximityPlacementGroup = JsonSerializer.Deserialize <WritableSubResource>(property0.Value.ToString()); continue; } if (property0.NameEquals("statuses")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } List <InstanceViewStatus> array = new List <InstanceViewStatus>(); foreach (var item in property0.Value.EnumerateArray()) { array.Add(InstanceViewStatus.DeserializeInstanceViewStatus(item)); } statuses = array; continue; } } continue; } } return(new AvailabilitySetData(id, name, type, systemData, tags, location, sku.Value, Optional.ToNullable(platformUpdateDomainCount), Optional.ToNullable(platformFaultDomainCount), Optional.ToList(virtualMachines), proximityPlacementGroup, Optional.ToList(statuses))); }
internal DiskRestorePointReplicationStatus(InstanceViewStatus status, int?completionPercent) { Status = status; CompletionPercent = completionPercent; }
private void VerifyProximityPlacementGroupColocationStatusView() { var ppgName = ComputeManagementTestUtilities.GenerateName("testppg"); string asName = ComputeManagementTestUtilities.GenerateName("testas"); string vmssName = ComputeManagementTestUtilities.GenerateName("testvmss"); string storageAccountName = ComputeManagementTestUtilities.GenerateName(TestPrefix); ImageReference imageRef = GetPlatformVMImage(useWindowsImage: true); var inputProximityPlacementGroup = new ProximityPlacementGroup { Location = m_location, Tags = new Dictionary <string, string>() { { "RG", "rg" }, { "testTag", "1" }, }, ProximityPlacementGroupType = ProximityPlacementGroupType.Standard }; var expectedProximityPlacementGroup = new ProximityPlacementGroup { Location = m_location, Tags = new Dictionary <string, string>() { { "RG", "rg" }, { "testTag", "1" }, }, ProximityPlacementGroupType = ProximityPlacementGroupType.Standard }; // Create and expect success. ProximityPlacementGroup outProximityPlacementGroup = m_CrpClient.ProximityPlacementGroups.CreateOrUpdate(m_resourceGroup1Name, ppgName, inputProximityPlacementGroup); ValidateProximityPlacementGroup(expectedProximityPlacementGroup, outProximityPlacementGroup, ppgName); VirtualMachine inputVM; VirtualMachine outVM = CreateVM(m_resourceGroup1Name, asName, storageAccountName, imageRef, out inputVM, hasManagedDisks: true, hasDiffDisks: false, vmSize: "Standard_A1_v2", osDiskStorageAccountType: "Standard_LRS", dataDiskStorageAccountType: "Standard_LRS", writeAcceleratorEnabled: false, zones: null, ppgName: ppgName, diskEncryptionSetId: null); // Get and expect success. outProximityPlacementGroup = m_CrpClient.ProximityPlacementGroups.Get(m_resourceGroup1Name, ppgName, includeColocationStatus: "true"); InstanceViewStatus expectedInstanceViewStatus = new InstanceViewStatus { Code = "ColocationStatus/Aligned", Level = StatusLevelTypes.Info, DisplayStatus = "Aligned", Message = "All resources in the proximity placement group are aligned." }; expectedProximityPlacementGroup = new ProximityPlacementGroup( m_location, tags: new Dictionary <string, string>() { { "RG", "rg" }, { "testTag", "1" }, }, proximityPlacementGroupType: ProximityPlacementGroupType.Standard, virtualMachines: new List <SubResourceWithColocationStatus> { new SubResourceWithColocationStatus(outVM.Id) }, availabilitySets: new List <SubResourceWithColocationStatus> { new SubResourceWithColocationStatus(outVM.AvailabilitySet.Id) }); ValidateProximityPlacementGroup(expectedProximityPlacementGroup, outProximityPlacementGroup, ppgName); ValidateColocationStatus(expectedInstanceViewStatus, outProximityPlacementGroup.ColocationStatus); }
private List <AEMTestResult> TestOldExtension(VirtualMachine selectedVM, VirtualMachineInstanceView selectedVMStatus, VirtualMachineExtension monExtension) { var osdisk = selectedVM.StorageProfile.OsDisk; List <AEMTestResult> partialResults = new List <AEMTestResult>(); this._Helper.WriteHost("Azure Enhanced Monitoring Extension for SAP Installation check...", false); string monPublicConfig = null; if (monExtension != null) { monPublicConfig = monExtension.Settings.ToString(); } if (monExtension == null || String.IsNullOrEmpty(monPublicConfig)) { partialResults.Add(new AEMTestResult("Azure Enhanced Monitoring Extension for SAP Installation check", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { partialResults.Add(new AEMTestResult("Azure Enhanced Monitoring Extension for SAP Installation check", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } //################################################# //################################################# var accounts = new List <string>(); //var osdisk = selectedVM.StorageProfile.OsDisk; var osaccountName = String.Empty; if (osdisk.ManagedDisk == null) { var accountName = this._Helper.GetStorageAccountFromUri(osdisk.Vhd.Uri); osaccountName = accountName; accounts.Add(accountName); } var dataDisks = selectedVM.StorageProfile.DataDisks; foreach (var disk in dataDisks) { if (disk.ManagedDisk != null) { continue; } var accountName = this._Helper.GetStorageAccountFromUri(disk.Vhd.Uri); if (!accounts.Contains(accountName)) { accounts.Add(accountName); } } //################################################# //# Check storage metrics //################################################# this._Helper.WriteHost("Storage Metrics check..."); var metricsResult = new AEMTestResult("Storage Metrics check"); partialResults.Add(metricsResult); if (!this.SkipStorageCheck.IsPresent) { foreach (var account in accounts) { var accountResult = new AEMTestResult("Storage Metrics check for {0}", account); metricsResult.PartialResults.Add(accountResult); this._Helper.WriteHost("\tStorage Metrics check for {0}...", account); var storage = this._Helper.GetStorageAccountFromCache(account); if (!this._Helper.IsPremiumStorageAccount(storage)) { this._Helper.WriteHost("\t\tStorage Metrics configuration check for {0}...", false, account); var currentConfig = this._Helper.GetStorageAnalytics(account); bool storageConfigOk = false; if (!this._Helper.CheckStorageAnalytics(account, currentConfig)) { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics configuration check for {0}", false, account)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics configuration check for {0}", true, account)); this._Helper.WriteHost("OK ", ConsoleColor.Green); storageConfigOk = true; } this._Helper.WriteHost("\t\tStorage Metrics data check for {0}...", false, account); var filterMinute = Microsoft.WindowsAzure.Storage.Table.TableQuery. GenerateFilterConditionForDate("Timestamp", "gt", DateTime.Now.AddMinutes(AEMExtensionConstants.ContentAgeInMinutes * -1)); if (storageConfigOk && this._Helper.CheckTableAndContent(account, "$MetricsMinutePrimaryTransactionsBlob", filterMinute, ".", false, this.WaitTimeInMinutes)) { this._Helper.WriteHost("OK ", ConsoleColor.Green); accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics data check for {0}", true, account)); } else { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics data check for {0}", false, account)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } } else { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics not available for Premium Storage account {0}", true, account)); this._Helper.WriteHost("\t\tStorage Metrics not available for Premium Storage account {0}...", false, account); this._Helper.WriteHost("OK ", ConsoleColor.Green); } } if (accounts.Count == 0) { metricsResult.Result = true; } } else { metricsResult.Result = true; this._Helper.WriteHost("Skipped ", ConsoleColor.Yellow); } //################################################# //################################################# //################################################# //# Check Azure Enhanced Monitoring Extension for SAP Configuration //################################################# this._Helper.WriteHost("Azure Enhanced Monitoring Extension for SAP public configuration check...", false); var aemConfigResult = new AEMTestResult("Azure Enhanced Monitoring Extension for SAP public configuration check"); partialResults.Add(aemConfigResult); JObject sapmonPublicConfig = null; if (monExtension != null) { this._Helper.WriteHost(""); //New Line sapmonPublicConfig = JsonConvert.DeserializeObject(monPublicConfig) as JObject; StorageAccount storage = null; var osaccountIsPremium = false; if (!String.IsNullOrEmpty(osaccountName)) { storage = this._Helper.GetStorageAccountFromCache(osaccountName); osaccountIsPremium = this._Helper.IsPremiumStorageAccount(osaccountName); } var vmSize = selectedVM.HardwareProfile.VmSize; this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Size", "vmsize", sapmonPublicConfig, vmSize.ToString(), aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Memory", "vm.memory.isovercommitted", sapmonPublicConfig, 0, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM CPU", "vm.cpu.isovercommitted", sapmonPublicConfig, 0, aemConfigResult); this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: Script Version", "script.version", sapmonPublicConfig, aemConfigResult); var vmSLA = this._Helper.GetVMSLA(selectedVM); if (vmSLA.HasSLA) { this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM SLA IOPS", "vm.sla.iops", sapmonPublicConfig, vmSLA.IOPS, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM SLA Throughput", "vm.sla.throughput", sapmonPublicConfig, vmSLA.TP, aemConfigResult); } int wadEnabled; if (this._Helper.GetMonPropertyValue("wad.isenabled", sapmonPublicConfig, out wadEnabled)) { if (wadEnabled == 1) { this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD name", "wad.name", sapmonPublicConfig, aemConfigResult); this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD URI", "wad.uri", sapmonPublicConfig, aemConfigResult); } else { this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD name", "wad.name", sapmonPublicConfig, aemConfigResult, false); this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD URI", "wad.uri", sapmonPublicConfig, aemConfigResult, false); } } else { string message = "Azure Enhanced Monitoring Extension for SAP public configuration check:"; aemConfigResult.PartialResults.Add(new AEMTestResult(message, false)); this._Helper.WriteHost(message + "...", false); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } if (!osaccountIsPremium && storage != null) { var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage); var minuteUri = endpoint + "$MetricsMinutePrimaryTransactionsBlob"; this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Key", "osdisk.connminute", sapmonPublicConfig, osaccountName + ".minute", aemConfigResult); //# TODO: check uri config this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Value", osaccountName + ".minute.uri", sapmonPublicConfig, minuteUri, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Name", osaccountName + ".minute.name", sapmonPublicConfig, osaccountName, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk Type", "osdisk.type", sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_STANDARD, aemConfigResult); } else if (storage != null) { var sla = this._Helper.GetDiskSLA(osdisk); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk Type", "osdisk.type", sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA IOPS", "osdisk.sla.throughput", sapmonPublicConfig, sla.TP, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA Throughput", "osdisk.sla.iops", sapmonPublicConfig, sla.IOPS, aemConfigResult); } else { var resId = new ResourceIdentifier(osdisk.ManagedDisk.Id); var osDiskMD = ComputeClient.ComputeManagementClient.Disks.Get(resId.ResourceGroupName, resId.ResourceName); if (osDiskMD.Sku.Name == StorageAccountTypes.PremiumLRS) { var sla = this._Helper.GetDiskSLA(osDiskMD.DiskSizeGB, null); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk Type", "osdisk.type", sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM_MD, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA IOPS", "osdisk.sla.throughput", sapmonPublicConfig, sla.TP, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA Throughput", "osdisk.sla.iops", sapmonPublicConfig, sla.IOPS, aemConfigResult); } else { this._Helper.WriteWarning("[WARN] Standard Managed Disks are not supported."); } } if (osdisk.ManagedDisk == null) { this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk name", "osdisk.name", sapmonPublicConfig, this._Helper.GetDiskName(osdisk.Vhd.Uri), aemConfigResult); } var diskNumber = 1; foreach (var disk in dataDisks) { if (disk.ManagedDisk != null) { var resId = new ResourceIdentifier(disk.ManagedDisk.Id); var diskMD = ComputeClient.ComputeManagementClient.Disks.Get(resId.ResourceGroupName, resId.ResourceName); if (diskMD.Sku.Name == StorageAccountTypes.PremiumLRS) { var sla = this._Helper.GetDiskSLA(diskMD.DiskSizeGB, null); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " Type", "disk.type." + diskNumber, sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM_MD, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA IOPS", "disk.sla.throughput." + diskNumber, sapmonPublicConfig, sla.TP, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA Throughput", "disk.sla.iops." + diskNumber, sapmonPublicConfig, sla.IOPS, aemConfigResult); } else if (diskMD.Sku.Name == StorageAccountTypes.UltraSSDLRS) { this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " Type", "disk.type." + diskNumber, sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM_MD, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA IOPS", "disk.sla.throughput." + diskNumber, sapmonPublicConfig, diskMD.DiskMBpsReadWrite, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA Throughput", "disk.sla.iops." + diskNumber, sapmonPublicConfig, diskMD.DiskIOPSReadWrite, aemConfigResult); } else { this._Helper.WriteWarning("[WARN] Standard Managed Disks are not supported."); } } else { var accountName = this._Helper.GetStorageAccountFromUri(disk.Vhd.Uri); storage = this._Helper.GetStorageAccountFromCache(accountName); var accountIsPremium = this._Helper.IsPremiumStorageAccount(storage); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " LUN", "disk.lun." + diskNumber, sapmonPublicConfig, disk.Lun, aemConfigResult); if (!accountIsPremium) { var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage); var minuteUri = endpoint + "$MetricsMinutePrimaryTransactionsBlob"; this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Key", "disk.connminute." + diskNumber, sapmonPublicConfig, accountName + ".minute", aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Value", accountName + ".minute.uri", sapmonPublicConfig, minuteUri, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Name", accountName + ".minute.name", sapmonPublicConfig, accountName, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " Type", "disk.type." + diskNumber, sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_STANDARD, aemConfigResult); } else { var sla = this._Helper.GetDiskSLA(disk); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " Type", "disk.type." + diskNumber, sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA IOPS", "disk.sla.throughput." + diskNumber, sapmonPublicConfig, sla.TP, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA Throughput", "disk.sla.iops." + diskNumber, sapmonPublicConfig, sla.IOPS, aemConfigResult); } this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " name", "disk.name." + diskNumber, sapmonPublicConfig, this._Helper.GetDiskName(disk.Vhd.Uri), aemConfigResult); } diskNumber += 1; } if (dataDisks.Count == 0) { aemConfigResult.PartialResults.Add(new AEMTestResult("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disks", true)); this._Helper.WriteHost("\tAzure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disks ", false); this._Helper.WriteHost("OK ", ConsoleColor.Green); } } else { aemConfigResult.Result = false; this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } //################################################# //################################################# //################################################# //# Check WAD Configuration //################################################# int iswadEnabled; if (this._Helper.GetMonPropertyValue("wad.isenabled", sapmonPublicConfig, out iswadEnabled) && iswadEnabled == 1) { var wadConfigResult = new AEMTestResult("IaaSDiagnostics check"); partialResults.Add(wadConfigResult); string wadPublicConfig = null; var wadExtension = AEMHelper.GetWADExtension(selectedVM, this.OSType); if (wadExtension != null) { wadPublicConfig = wadExtension.Settings.ToString(); } this._Helper.WriteHost("IaaSDiagnostics check...", false); if (wadExtension != null) { this._Helper.WriteHost(""); //New Line this._Helper.WriteHost("\tIaaSDiagnostics configuration check...", false); var currentJSONConfig = JsonConvert.DeserializeObject(wadPublicConfig) as Newtonsoft.Json.Linq.JObject; var base64 = currentJSONConfig["xmlCfg"] as Newtonsoft.Json.Linq.JValue; System.Xml.XmlDocument currentConfig = new System.Xml.XmlDocument(); currentConfig.LoadXml(Encoding.UTF8.GetString(System.Convert.FromBase64String(base64.Value.ToString()))); if (!this._Helper.CheckWADConfiguration(currentConfig)) { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics configuration check", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics configuration check", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } this._Helper.WriteHost("\tIaaSDiagnostics performance counters check..."); var wadPerfCountersResult = new AEMTestResult("IaaSDiagnostics performance counters check"); wadConfigResult.PartialResults.Add(wadPerfCountersResult); foreach (var perfCounter in AEMExtensionConstants.PerformanceCounters[this.OSType]) { this._Helper.WriteHost("\t\tIaaSDiagnostics performance counters " + (perfCounter.counterSpecifier) + "check...", false); var currentCounter = currentConfig.SelectSingleNode("/WadCfg/DiagnosticMonitorConfiguration/PerformanceCounters/PerformanceCounterConfiguration[@counterSpecifier = '" + perfCounter.counterSpecifier + "']"); if (currentCounter != null) { wadPerfCountersResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics performance counters " + (perfCounter.counterSpecifier) + "check...", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } else { wadPerfCountersResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics performance counters " + (perfCounter.counterSpecifier) + "check...", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } } string wadstorage; if (!this._Helper.GetMonPropertyValue <string>("wad.name", sapmonPublicConfig, out wadstorage)) { wadstorage = null; } this._Helper.WriteHost("\tIaaSDiagnostics data check...", false); var deploymentId = String.Empty; var roleName = String.Empty; var extStatuses = AEMHelper.GetAEMExtensionStatus(selectedVM, selectedVMStatus, this.OSType); InstanceViewStatus aemStatus = null; if (extStatuses != null && extStatuses.Statuses != null) { aemStatus = extStatuses.Statuses.FirstOrDefault(stat => Regex.Match(stat.Message, "deploymentId=(\\S*) roleInstance=(\\S*)").Success); } if (aemStatus != null) { var match = Regex.Match(aemStatus.Message, "deploymentId=(\\S*) roleInstance=(\\S*)"); deploymentId = match.Groups[1].Value; roleName = match.Groups[2].Value; } else { this._Helper.WriteWarning("DeploymentId and RoleInstanceName could not be parsed from extension status"); } var ok = false; if (!this.SkipStorageCheck.IsPresent && (!String.IsNullOrEmpty(deploymentId)) && (!String.IsNullOrEmpty(roleName)) && (!String.IsNullOrEmpty(wadstorage))) { if (this.OSType.Equals(AEMExtensionConstants.OSTypeLinux, StringComparison.InvariantCultureIgnoreCase)) { ok = this._Helper.CheckDiagnosticsTable(wadstorage, deploymentId, selectedVM.OsProfile.ComputerName, ".", this.OSType, this.WaitTimeInMinutes); } else { string filterMinute = "Role eq '" + AEMExtensionConstants.ROLECONTENT + "' and DeploymentId eq '" + deploymentId + "' and RoleInstance eq '" + roleName + "' and PartitionKey gt '0" + DateTime.UtcNow.AddMinutes(AEMExtensionConstants.ContentAgeInMinutes * -1).Ticks + "'"; ok = this._Helper.CheckTableAndContent(wadstorage, AEMExtensionConstants.WadTableName, filterMinute, ".", false, this.WaitTimeInMinutes); } } if (ok && !this.SkipStorageCheck.IsPresent) { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics data check", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } else if (!this.SkipStorageCheck.IsPresent) { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics data check", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { this._Helper.WriteHost("Skipped ", ConsoleColor.Yellow); } } else { wadConfigResult.Result = false; this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } } return(partialResults); }
public void TestVMDataDiskScenario() { using (MockContext context = MockContext.Start(this.GetType())) { EnsureClientsInitialized(context); ImageReference imgageRef = GetPlatformVMImage(useWindowsImage: true); // Create resource group var rgName = ComputeManagementTestUtilities.GenerateName(TestPrefix); string storageAccountName = ComputeManagementTestUtilities.GenerateName(TestPrefix); string asName = ComputeManagementTestUtilities.GenerateName("as"); VirtualMachine inputVM; bool passed = false; try { // Create Storage Account, so that both the VMs can share it var storageAccountOutput = CreateStorageAccount(rgName, storageAccountName); Action <VirtualMachine> addDataDiskToVM = vm => { string containerName = HttpMockServer.GetAssetName("TestVMDataDiskScenario", TestPrefix); var vhdContainer = "https://" + storageAccountName + ".blob.core.windows.net/" + containerName; var vhduri = vhdContainer + string.Format("/{0}.vhd", HttpMockServer.GetAssetName("TestVMDataDiskScenario", TestPrefix)); vm.HardwareProfile.VmSize = VirtualMachineSizeTypes.StandardA1V2; vm.StorageProfile.DataDisks = new List <DataDisk>(); foreach (int index in new int[] { 1, 2 }) { var diskName = "dataDisk" + index; var ddUri = vhdContainer + string.Format("/{0}{1}.vhd", diskName, HttpMockServer.GetAssetName("TestVMDataDiskScenario", TestPrefix)); var dd = new DataDisk { Caching = CachingTypes.None, Image = null, DiskSizeGB = 10, CreateOption = DiskCreateOptionTypes.Empty, Lun = 1 + index, Name = diskName, Vhd = new VirtualHardDisk { Uri = ddUri } }; vm.StorageProfile.DataDisks.Add(dd); } var testStatus = new InstanceViewStatus { Code = "test", Message = "test" }; var testStatusList = new List <InstanceViewStatus> { testStatus }; // Negative tests for a bug in 5.0.0 that read-only fields have side-effect on the request body /* vm.InstanceView = new VirtualMachineInstanceView * { * Statuses = testStatusList, * VmAgent = new VirtualMachineAgentInstanceView * { * Statuses = testStatusList, * ExtensionHandlers = new List<VirtualMachineExtensionHandlerInstanceView> * { * new VirtualMachineExtensionHandlerInstanceView * { * Status = testStatus, * Type = "test", * TypeHandlerVersion = "test" * } * }, * VmAgentVersion = "test" * }, * Disks = new List<DiskInstanceView> * { * new DiskInstanceView * { * Statuses = testStatusList, * Name = "test" * } * }, * Extensions = new List<VirtualMachineExtensionInstanceView> * { * new VirtualMachineExtensionInstanceView * { * Statuses = testStatusList * } * } * }; */ }; var vm1 = CreateVM(rgName, asName, storageAccountOutput, imgageRef, out inputVM, addDataDiskToVM); var getVMWithInstanceViewResponse = m_CrpClient.VirtualMachines.Get(rgName, inputVM.Name, InstanceViewTypes.InstanceView); Assert.True(getVMWithInstanceViewResponse != null, "VM in Get"); ValidateVMInstanceView(inputVM, getVMWithInstanceViewResponse); var vm2 = getVMWithInstanceViewResponse; var vmReCreateResponse = m_CrpClient.VirtualMachines.CreateOrUpdate(rgName, getVMWithInstanceViewResponse.Name, getVMWithInstanceViewResponse); m_CrpClient.VirtualMachines.Delete(rgName, inputVM.Name); passed = true; } catch (Exception e) { throw e; } finally { m_ResourcesClient.ResourceGroups.Delete(rgName); Assert.True(passed); } } }
public void ValidateColocationStatus(InstanceViewStatus expectedColocationStatus, InstanceViewStatus actualColocationStatus) { Assert.True(expectedColocationStatus.Code == actualColocationStatus.Code, "ColocationStatus code do not match with expected value."); Assert.True(expectedColocationStatus.Level == actualColocationStatus.Level, "ColocationStatus level do not match with expected value."); Assert.True(expectedColocationStatus.DisplayStatus == actualColocationStatus.DisplayStatus, "ColocationStatus display status do not match with expected value."); Assert.True(expectedColocationStatus.Message == actualColocationStatus.Message, "ColocationStatus message do not match with expected value."); }
internal VirtualMachineHealthStatus(InstanceViewStatus status) { Status = status; }
private void CreateImageTestHelper(string originalTestLocation, string diskEncryptionSetId) { VirtualMachine inputVM = null; // Create resource group var rgName = ComputeManagementTestUtilities.GenerateName(TestPrefix); var imageName = ComputeManagementTestUtilities.GenerateName("imageTest"); // Create a VM, so we can use its OS disk for creating the image string storageAccountName = ComputeManagementTestUtilities.GenerateName(TestPrefix); string asName = ComputeManagementTestUtilities.GenerateName("as"); ImageReference imageRef = GetPlatformVMImage(useWindowsImage: true); try { // Create Storage Account var storageAccountOutput = CreateStorageAccount(rgName, storageAccountName); // Add data disk to the VM. Action <VirtualMachine> addDataDiskToVM = vm => { string containerName = HttpMockServer.GetAssetName("TestImageOperations", TestPrefix); var vhdContainer = "https://" + storageAccountName + ".blob.core.windows.net/" + containerName; var vhduri = vhdContainer + string.Format("/{0}.vhd", HttpMockServer.GetAssetName("TestImageOperations", TestPrefix)); vm.HardwareProfile.VmSize = VirtualMachineSizeTypes.StandardA4; vm.StorageProfile.DataDisks = new List <DataDisk>(); foreach (int index in new int[] { 1, 2 }) { var diskName = "dataDisk" + index; var ddUri = vhdContainer + string.Format("/{0}{1}.vhd", diskName, HttpMockServer.GetAssetName("TestImageOperations", TestPrefix)); var dd = new DataDisk { Caching = CachingTypes.None, Image = null, DiskSizeGB = 10, CreateOption = DiskCreateOptionTypes.Empty, Lun = 1 + index, Name = diskName, Vhd = new VirtualHardDisk { Uri = ddUri } }; vm.StorageProfile.DataDisks.Add(dd); } var testStatus = new InstanceViewStatus { Code = "test", Message = "test" }; var testStatusList = new List <InstanceViewStatus> { testStatus }; }; // Create the VM, whose OS disk will be used in creating the image var createdVM = CreateVM(rgName, asName, storageAccountOutput, imageRef, out inputVM, addDataDiskToVM); int expectedDiskLunWithDiskEncryptionSet = createdVM.StorageProfile.DataDisks[0].Lun; // Create the Image var imageInput = new Image() { Location = m_location, Tags = new Dictionary <string, string>() { { "RG", "rg" }, { "testTag", "1" }, }, StorageProfile = new ImageStorageProfile() { OsDisk = new ImageOSDisk() { BlobUri = createdVM.StorageProfile.OsDisk.Vhd.Uri, DiskEncryptionSet = diskEncryptionSetId == null ? null : new DiskEncryptionSetParameters() { Id = diskEncryptionSetId }, OsState = OperatingSystemStateTypes.Generalized, OsType = OperatingSystemTypes.Windows, }, DataDisks = new List <ImageDataDisk>() { new ImageDataDisk() { BlobUri = createdVM.StorageProfile.DataDisks[0].Vhd.Uri, DiskEncryptionSet = diskEncryptionSetId == null ? null: new DiskEncryptionSetParameters() { Id = diskEncryptionSetId }, Lun = expectedDiskLunWithDiskEncryptionSet, } } }, HyperVGeneration = HyperVGeneration.V1 }; var image = m_CrpClient.Images.CreateOrUpdate(rgName, imageName, imageInput); var getImage = m_CrpClient.Images.Get(rgName, imageName); ValidateImage(imageInput, getImage); if (diskEncryptionSetId != null) { Assert.True(getImage.StorageProfile.OsDisk.DiskEncryptionSet != null, "OsDisk.DiskEncryptionSet is null"); Assert.True(string.Equals(diskEncryptionSetId, getImage.StorageProfile.OsDisk.DiskEncryptionSet.Id, StringComparison.OrdinalIgnoreCase), "getImage.StorageProfile.OsDisk.DiskEncryptionSet is not matching with expected DiskEncryptionSet resource"); Assert.Equal(1, getImage.StorageProfile.DataDisks.Count); Assert.True(getImage.StorageProfile.DataDisks[0].DiskEncryptionSet != null, ".DataDisks.DiskEncryptionSet is null"); Assert.True(string.Equals(diskEncryptionSetId, getImage.StorageProfile.DataDisks[0].DiskEncryptionSet.Id, StringComparison.OrdinalIgnoreCase), "DataDisks.DiskEncryptionSet.Id is not matching with expected DiskEncryptionSet resource"); } ImageUpdate updateParams = new ImageUpdate() { Tags = getImage.Tags }; string tagKey = "UpdateTag"; updateParams.Tags.Add(tagKey, "TagValue"); m_CrpClient.Images.Update(rgName, imageName, updateParams); getImage = m_CrpClient.Images.Get(rgName, imageName); Assert.True(getImage.Tags.ContainsKey(tagKey)); var listResponse = m_CrpClient.Images.ListByResourceGroup(rgName); Assert.Single(listResponse); m_CrpClient.Images.Delete(rgName, image.Name); } finally { Environment.SetEnvironmentVariable("AZURE_VM_TEST_LOCATION", originalTestLocation); if (inputVM != null) { m_CrpClient.VirtualMachines.Delete(rgName, inputVM.Name); } m_ResourcesClient.ResourceGroups.Delete(rgName); } }
internal static ProximityPlacementGroupData DeserializeProximityPlacementGroupData(JsonElement element) { IDictionary <string, string> tags = default; Location location = default; ResourceIdentifier id = default; string name = default; ResourceType type = default; Optional <ProximityPlacementGroupType> proximityPlacementGroupType = default; Optional <IReadOnlyList <SubResourceWithColocationStatus> > virtualMachines = default; Optional <IReadOnlyList <SubResourceWithColocationStatus> > virtualMachineScaleSets = default; Optional <IReadOnlyList <SubResourceWithColocationStatus> > availabilitySets = default; Optional <InstanceViewStatus> colocationStatus = default; foreach (var property in element.EnumerateObject()) { if (property.NameEquals("tags")) { Dictionary <string, string> dictionary = new Dictionary <string, string>(); foreach (var property0 in property.Value.EnumerateObject()) { dictionary.Add(property0.Name, property0.Value.GetString()); } tags = dictionary; continue; } if (property.NameEquals("location")) { location = property.Value.GetString(); continue; } if (property.NameEquals("id")) { id = property.Value.GetString(); continue; } if (property.NameEquals("name")) { name = property.Value.GetString(); continue; } if (property.NameEquals("type")) { type = property.Value.GetString(); continue; } if (property.NameEquals("properties")) { if (property.Value.ValueKind == JsonValueKind.Null) { property.ThrowNonNullablePropertyIsNull(); continue; } foreach (var property0 in property.Value.EnumerateObject()) { if (property0.NameEquals("proximityPlacementGroupType")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } proximityPlacementGroupType = new ProximityPlacementGroupType(property0.Value.GetString()); continue; } if (property0.NameEquals("virtualMachines")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } List <SubResourceWithColocationStatus> array = new List <SubResourceWithColocationStatus>(); foreach (var item in property0.Value.EnumerateArray()) { array.Add(SubResourceWithColocationStatus.DeserializeSubResourceWithColocationStatus(item)); } virtualMachines = array; continue; } if (property0.NameEquals("virtualMachineScaleSets")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } List <SubResourceWithColocationStatus> array = new List <SubResourceWithColocationStatus>(); foreach (var item in property0.Value.EnumerateArray()) { array.Add(SubResourceWithColocationStatus.DeserializeSubResourceWithColocationStatus(item)); } virtualMachineScaleSets = array; continue; } if (property0.NameEquals("availabilitySets")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } List <SubResourceWithColocationStatus> array = new List <SubResourceWithColocationStatus>(); foreach (var item in property0.Value.EnumerateArray()) { array.Add(SubResourceWithColocationStatus.DeserializeSubResourceWithColocationStatus(item)); } availabilitySets = array; continue; } if (property0.NameEquals("colocationStatus")) { if (property0.Value.ValueKind == JsonValueKind.Null) { property0.ThrowNonNullablePropertyIsNull(); continue; } colocationStatus = InstanceViewStatus.DeserializeInstanceViewStatus(property0.Value); continue; } } continue; } } return(new ProximityPlacementGroupData(id, name, type, tags, location, Optional.ToNullable(proximityPlacementGroupType), Optional.ToList(virtualMachines), Optional.ToList(virtualMachineScaleSets), Optional.ToList(availabilitySets), colocationStatus.Value)); }
public override void ExecuteCmdlet() { this._Helper = new AEMHelper((err) => this.WriteError(err), (msg) => this.WriteVerbose(msg), (msg) => this.WriteWarning(msg), this.CommandRuntime.Host.UI, AzureSession.ClientFactory.CreateClient <StorageManagementClient>(DefaultProfile.Context, AzureEnvironment.Endpoint.ResourceManager), this.DefaultContext.Subscription); this._Helper.WriteVerbose("Starting TestAzureRmVMAEMExtension"); base.ExecuteCmdlet(); ExecuteClientAction(() => { AEMTestResult rootResult = new AEMTestResult(); rootResult.TestName = "Azure Enhanced Monitoring Test"; //################################################# //# Check if VM exists //################################################# this._Helper.WriteHost("VM Existance check for {0} ...", false, this.VMName); var selectedVM = this.ComputeClient.ComputeManagementClient.VirtualMachines.Get(this.ResourceGroupName, this.VMName); var selectedVMStatus = this.ComputeClient.ComputeManagementClient.VirtualMachines.GetWithInstanceView(this.ResourceGroupName, this.VMName).Body.InstanceView; if (selectedVM == null) { rootResult.PartialResults.Add(new AEMTestResult("VM Existance check for {0}", false, this.VMName)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); return; } else { rootResult.PartialResults.Add(new AEMTestResult("VM Existance check for {0}", true, this.VMName)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } //################################################# //################################################# var osdisk = selectedVM.StorageProfile.OsDisk; if (String.IsNullOrEmpty(this.OSType)) { this.OSType = osdisk.OsType.ToString(); } if (String.IsNullOrEmpty(this.OSType)) { this._Helper.WriteError("Could not determine Operating System of the VM. Please provide the Operating System type ({0} or {1}) via parameter OSType", AEMExtensionConstants.OSTypeWindows, AEMExtensionConstants.OSTypeLinux); return; } //################################################# //# Check for Guest Agent //################################################# this._Helper.WriteHost("VM Guest Agent check...", false); var vmAgentStatus = false; //# It is not possible to detect if VM Agent is installed on ARM vmAgentStatus = true; if (!vmAgentStatus) { rootResult.PartialResults.Add(new AEMTestResult("VM Guest Agent check", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); this._Helper.WriteWarning(AEMExtensionConstants.MissingGuestAgentWarning); return; } else { rootResult.PartialResults.Add(new AEMTestResult("VM Guest Agent check", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } //################################################# //################################################# //################################################# //# Check for Azure Enhanced Monitoring Extension for SAP //################################################# this._Helper.WriteHost("Azure Enhanced Monitoring Extension for SAP Installation check...", false); string monPublicConfig = null; var monExtension = this._Helper.GetExtension(selectedVM, AEMExtensionConstants.AEMExtensionType[this.OSType], AEMExtensionConstants.AEMExtensionPublisher[this.OSType]); if (monExtension != null) { monPublicConfig = monExtension.Settings.ToString(); } if (monExtension == null || String.IsNullOrEmpty(monPublicConfig)) { rootResult.PartialResults.Add(new AEMTestResult("Azure Enhanced Monitoring Extension for SAP Installation check", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { rootResult.PartialResults.Add(new AEMTestResult("Azure Enhanced Monitoring Extension for SAP Installation check", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } //################################################# //################################################# var accounts = new List <string>(); //var osdisk = selectedVM.StorageProfile.OsDisk; var dataDisks = selectedVM.StorageProfile.DataDisks; var accountName = this._Helper.GetStorageAccountFromUri(osdisk.Vhd.Uri); var osaccountName = accountName; accounts.Add(accountName); foreach (var disk in dataDisks) { accountName = this._Helper.GetStorageAccountFromUri(disk.Vhd.Uri); if (!accounts.Contains(accountName)) { accounts.Add(accountName); } } //################################################# //# Check storage metrics //################################################# this._Helper.WriteHost("Storage Metrics check..."); var metricsResult = new AEMTestResult("Storage Metrics check"); rootResult.PartialResults.Add(metricsResult); if (!this.SkipStorageCheck.IsPresent) { foreach (var account in accounts) { var accountResult = new AEMTestResult("Storage Metrics check for {0}", account); metricsResult.PartialResults.Add(accountResult); this._Helper.WriteHost("\tStorage Metrics check for {0}...", account); var storage = this._Helper.GetStorageAccountFromCache(account); if (!this._Helper.IsPremiumStorageAccount(storage)) { this._Helper.WriteHost("\t\tStorage Metrics configuration check for {0}...", false, account); var currentConfig = this._Helper.GetStorageAnalytics(account); bool storageConfigOk = false; if (!this._Helper.CheckStorageAnalytics(account, currentConfig)) { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics configuration check for {0}", false, account)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics configuration check for {0}", true, account)); this._Helper.WriteHost("OK ", ConsoleColor.Green); storageConfigOk = true; } this._Helper.WriteHost("\t\tStorage Metrics data check for {0}...", false, account); var filterMinute = Microsoft.WindowsAzure.Storage.Table.TableQuery. GenerateFilterConditionForDate("Timestamp", "gt", DateTime.Now.AddMinutes(AEMExtensionConstants.ContentAgeInMinutes * -1)); if (storageConfigOk && this._Helper.CheckTableAndContent(account, "$MetricsMinutePrimaryTransactionsBlob", filterMinute, ".", false, this.WaitTimeInMinutes)) { this._Helper.WriteHost("OK ", ConsoleColor.Green); accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics data check for {0}", true, account)); } else { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics data check for {0}", false, account)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } } else { accountResult.PartialResults.Add(new AEMTestResult("Storage Metrics not available for Premium Storage account {0}", true, account)); this._Helper.WriteHost("\t\tStorage Metrics not available for Premium Storage account {0}...", false, account); this._Helper.WriteHost("OK ", ConsoleColor.Green); } } } else { metricsResult.Result = true; this._Helper.WriteHost("Skipped ", ConsoleColor.Yellow); } //################################################# //################################################# //################################################# //# Check Azure Enhanced Monitoring Extension for SAP Configuration //################################################# this._Helper.WriteHost("Azure Enhanced Monitoring Extension for SAP public configuration check...", false); var aemConfigResult = new AEMTestResult("Azure Enhanced Monitoring Extension for SAP public configuration check"); rootResult.PartialResults.Add(aemConfigResult); JObject sapmonPublicConfig = null; if (monExtension != null) { this._Helper.WriteHost(""); //New Line sapmonPublicConfig = JsonConvert.DeserializeObject(monPublicConfig) as JObject; var storage = this._Helper.GetStorageAccountFromCache(osaccountName); var osaccountIsPremium = this._Helper.IsPremiumStorageAccount(osaccountName); var vmSize = selectedVM.HardwareProfile.VmSize; this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Size", "vmsize", sapmonPublicConfig, vmSize, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Memory", "vm.memory.isovercommitted", sapmonPublicConfig, 0, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM CPU", "vm.cpu.isovercommitted", sapmonPublicConfig, 0, aemConfigResult); this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: Script Version", "script.version", sapmonPublicConfig, aemConfigResult); var vmSLA = this._Helper.GetVMSLA(selectedVM); if (vmSLA.HasSLA) { this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM SLA IOPS", "vm.sla.iops", sapmonPublicConfig, vmSLA.IOPS, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM SLA Throughput", "vm.sla.throughput", sapmonPublicConfig, vmSLA.TP, aemConfigResult); } int wadEnabled; if (this._Helper.GetMonPropertyValue("wad.isenabled", sapmonPublicConfig, out wadEnabled)) { if (wadEnabled == 1) { this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD name", "wad.name", sapmonPublicConfig, aemConfigResult); this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD URI", "wad.uri", sapmonPublicConfig, aemConfigResult); } else { this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD name", "wad.name", sapmonPublicConfig, aemConfigResult, false); this._Helper.MonitoringPropertyExists("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD URI", "wad.uri", sapmonPublicConfig, aemConfigResult, false); } } else { string message = "Azure Enhanced Monitoring Extension for SAP public configuration check:"; aemConfigResult.PartialResults.Add(new AEMTestResult(message, false)); this._Helper.WriteHost(message + "...", false); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } if (!osaccountIsPremium) { var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage); var minuteUri = endpoint + "$MetricsMinutePrimaryTransactionsBlob"; this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Key", "osdisk.connminute", sapmonPublicConfig, osaccountName + ".minute", aemConfigResult); //# TODO: check uri config this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Value", osaccountName + ".minute.uri", sapmonPublicConfig, minuteUri, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Name", osaccountName + ".minute.name", sapmonPublicConfig, osaccountName, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk Type", "osdisk.type", sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_STANDARD, aemConfigResult); } else { var sla = this._Helper.GetDiskSLA(osdisk); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk Type", "osdisk.type", sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA IOPS", "osdisk.sla.throughput", sapmonPublicConfig, sla.TP, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA Throughput", "osdisk.sla.iops", sapmonPublicConfig, sla.IOPS, aemConfigResult); } this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk name", "osdisk.name", sapmonPublicConfig, this._Helper.GetDiskName(osdisk.Vhd.Uri), aemConfigResult); var diskNumber = 1; foreach (var disk in dataDisks) { accountName = this._Helper.GetStorageAccountFromUri(disk.Vhd.Uri); storage = this._Helper.GetStorageAccountFromCache(accountName); var accountIsPremium = this._Helper.IsPremiumStorageAccount(storage); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " LUN", "disk.lun." + diskNumber, sapmonPublicConfig, disk.Lun, aemConfigResult); if (!accountIsPremium) { var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage); var minuteUri = endpoint + "$MetricsMinutePrimaryTransactionsBlob"; this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Key", "disk.connminute." + diskNumber, sapmonPublicConfig, accountName + ".minute", aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Value", accountName + ".minute.uri", sapmonPublicConfig, minuteUri, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Name", accountName + ".minute.name", sapmonPublicConfig, accountName, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " Type", "disk.type." + diskNumber, sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_STANDARD, aemConfigResult); } else { var sla = this._Helper.GetDiskSLA(disk); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " Type", "disk.type." + diskNumber, sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA IOPS", "disk.sla.throughput." + diskNumber, sapmonPublicConfig, sla.TP, aemConfigResult); this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " SLA Throughput", "disk.sla.iops." + diskNumber, sapmonPublicConfig, sla.IOPS, aemConfigResult); } this._Helper.CheckMonitoringProperty("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " name", "disk.name." + diskNumber, sapmonPublicConfig, this._Helper.GetDiskName(disk.Vhd.Uri), aemConfigResult); diskNumber += 1; } if (dataDisks.Count == 0) { aemConfigResult.PartialResults.Add(new AEMTestResult("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disks", true)); this._Helper.WriteHost("\tAzure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disks ", false); this._Helper.WriteHost("OK ", ConsoleColor.Green); } } else { aemConfigResult.Result = false; this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } //################################################# //################################################# //################################################# //# Check WAD Configuration //################################################# int iswadEnabled; if (this._Helper.GetMonPropertyValue("wad.isenabled", sapmonPublicConfig, out iswadEnabled) && iswadEnabled == 1) { var wadConfigResult = new AEMTestResult("IaaSDiagnostics check"); rootResult.PartialResults.Add(wadConfigResult); string wadPublicConfig = null; var wadExtension = this._Helper.GetExtension(selectedVM, AEMExtensionConstants.WADExtensionType[this.OSType], AEMExtensionConstants.WADExtensionPublisher[this.OSType]); if (wadExtension != null) { wadPublicConfig = wadExtension.Settings.ToString(); } this._Helper.WriteHost("IaaSDiagnostics check...", false); if (wadExtension != null) { this._Helper.WriteHost(""); //New Line this._Helper.WriteHost("\tIaaSDiagnostics configuration check...", false); var currentJSONConfig = JsonConvert.DeserializeObject(wadPublicConfig) as Newtonsoft.Json.Linq.JObject; var base64 = currentJSONConfig["xmlCfg"] as Newtonsoft.Json.Linq.JValue; System.Xml.XmlDocument currentConfig = new System.Xml.XmlDocument(); currentConfig.LoadXml(Encoding.UTF8.GetString(System.Convert.FromBase64String(base64.Value.ToString()))); if (!this._Helper.CheckWADConfiguration(currentConfig)) { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics configuration check", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics configuration check", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } this._Helper.WriteHost("\tIaaSDiagnostics performance counters check..."); var wadPerfCountersResult = new AEMTestResult("IaaSDiagnostics performance counters check"); wadConfigResult.PartialResults.Add(wadPerfCountersResult); foreach (var perfCounter in AEMExtensionConstants.PerformanceCounters[this.OSType]) { this._Helper.WriteHost("\t\tIaaSDiagnostics performance counters " + (perfCounter.counterSpecifier) + "check...", false); var currentCounter = currentConfig.SelectSingleNode("/WadCfg/DiagnosticMonitorConfiguration/PerformanceCounters/PerformanceCounterConfiguration[@counterSpecifier = '" + perfCounter.counterSpecifier + "']"); if (currentCounter != null) { wadPerfCountersResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics performance counters " + (perfCounter.counterSpecifier) + "check...", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } else { wadPerfCountersResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics performance counters " + (perfCounter.counterSpecifier) + "check...", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } } string wadstorage; if (!this._Helper.GetMonPropertyValue <string>("wad.name", sapmonPublicConfig, out wadstorage)) { wadstorage = null; } this._Helper.WriteHost("\tIaaSDiagnostics data check...", false); var deploymentId = String.Empty; var roleName = String.Empty; var extStatuses = this._Helper.GetExtension(selectedVM, selectedVMStatus, AEMExtensionConstants.AEMExtensionType[this.OSType], AEMExtensionConstants.AEMExtensionPublisher[this.OSType]); InstanceViewStatus aemStatus = null; if (extStatuses != null && extStatuses.Statuses != null) { aemStatus = extStatuses.Statuses.FirstOrDefault(stat => Regex.Match(stat.Message, "deploymentId=(\\S*) roleInstance=(\\S*)").Success); } if (aemStatus != null) { var match = Regex.Match(aemStatus.Message, "deploymentId=(\\S*) roleInstance=(\\S*)"); deploymentId = match.Groups[1].Value; roleName = match.Groups[2].Value; } else { this._Helper.WriteWarning("DeploymentId and RoleInstanceName could not be parsed from extension status"); } var ok = false; if (!this.SkipStorageCheck.IsPresent && (!String.IsNullOrEmpty(deploymentId)) && (!String.IsNullOrEmpty(roleName)) && (!String.IsNullOrEmpty(wadstorage))) { if (this.OSType.Equals(AEMExtensionConstants.OSTypeLinux, StringComparison.InvariantCultureIgnoreCase)) { ok = this._Helper.CheckDiagnosticsTable(wadstorage, deploymentId, selectedVM.OsProfile.ComputerName, ".", this.OSType, this.WaitTimeInMinutes); } else { string filterMinute = "Role eq '" + AEMExtensionConstants.ROLECONTENT + "' and DeploymentId eq '" + deploymentId + "' and RoleInstance eq '" + roleName + "' and PartitionKey gt '0" + DateTime.UtcNow.AddMinutes(AEMExtensionConstants.ContentAgeInMinutes * -1).Ticks + "'"; ok = this._Helper.CheckTableAndContent(wadstorage, AEMExtensionConstants.WadTableName, filterMinute, ".", false, this.WaitTimeInMinutes); } } if (ok && !this.SkipStorageCheck.IsPresent) { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics data check", true)); this._Helper.WriteHost("OK ", ConsoleColor.Green); } else if (!this.SkipStorageCheck.IsPresent) { wadConfigResult.PartialResults.Add(new AEMTestResult("IaaSDiagnostics data check", false)); this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } else { this._Helper.WriteHost("Skipped ", ConsoleColor.Yellow); } } else { wadConfigResult.Result = false; this._Helper.WriteHost("NOT OK ", ConsoleColor.Red); } } //################################################# //################################################# if (!rootResult.Result) { this._Helper.WriteHost("The script found some configuration issues. Please run the Set-AzureRmVMExtension commandlet to update the configuration of the virtual machine!"); } this._Helper.WriteVerbose("TestAzureRmVMAEMExtension Done (" + rootResult.Result + ")"); var result = Mapper.Map <AEMTestResult>(rootResult); WriteObject(result); }); }
internal ProximityPlacementGroupData(ResourceIdentifier id, string name, ResourceType type, SystemData systemData, IDictionary <string, string> tags, AzureLocation location, ProximityPlacementGroupType?proximityPlacementGroupType, IReadOnlyList <SubResourceWithColocationStatus> virtualMachines, IReadOnlyList <SubResourceWithColocationStatus> virtualMachineScaleSets, IReadOnlyList <SubResourceWithColocationStatus> availabilitySets, InstanceViewStatus colocationStatus) : base(id, name, type, systemData, tags, location) { ProximityPlacementGroupType = proximityPlacementGroupType; VirtualMachines = virtualMachines; VirtualMachineScaleSets = virtualMachineScaleSets; AvailabilitySets = availabilitySets; ColocationStatus = colocationStatus; }
private async Task CreateImageTestHelper(string originalTestLocation, string diskEncryptionSetId) { // Create resource group var rgName = Recording.GenerateAssetName(TestPrefix); var imageName = Recording.GenerateAssetName("imageTest"); // Create a VM, so we can use its OS disk for creating the image string storageAccountName = Recording.GenerateAssetName(TestPrefix); string asName = Recording.GenerateAssetName("as"); ImageReference imageRef = await GetPlatformVMImage(useWindowsImage : true); // Create Storage Account var storageAccountOutput = await CreateStorageAccount(rgName, storageAccountName); // Add data disk to the VM. Action <VirtualMachine> addDataDiskToVM = vm => { string containerName = Recording.GenerateAssetName("testimageoperations", TestPrefix); var vhdContainer = "https://" + storageAccountName + ".blob.core.windows.net/" + containerName; var vhduri = vhdContainer + string.Format("/{0}.vhd", Recording.GenerateAssetName("testimageoperations", TestPrefix)); vm.HardwareProfile.VmSize = VirtualMachineSizeTypes.StandardA4; foreach (int index in new int[] { 1, 2 }) { var diskName = "dataDisk" + index; var ddUri = vhdContainer + string.Format("/{0}{1}.vhd", diskName, Recording.GenerateAssetName("testimageoperations", TestPrefix)); var dd = new DataDisk(1 + index, DiskCreateOptionTypes.Empty) { Caching = CachingTypes.None, Image = null, DiskSizeGB = 10, Name = diskName, Vhd = new VirtualHardDisk { Uri = ddUri } }; vm.StorageProfile.DataDisks.Add(dd); } var testStatus = new InstanceViewStatus { Code = "test", Message = "test" }; var testStatusList = new List <InstanceViewStatus> { testStatus }; }; // Create the VM, whose OS disk will be used in creating the image var returnTwoVM = await CreateVM(rgName, asName, storageAccountOutput, imageRef, addDataDiskToVM); var createdVM = returnTwoVM.Item1; int expectedDiskLunWithDiskEncryptionSet = createdVM.StorageProfile.DataDisks[0].Lun; // Create the Image var imageInput = new Image(m_location) { Tags = { { "RG", "rg" }, { "testTag", "1" }, }, StorageProfile = new ImageStorageProfile() { OsDisk = new ImageOSDisk(OperatingSystemTypes.Windows, OperatingSystemStateTypes.Generalized) { BlobUri = createdVM.StorageProfile.OsDisk.Vhd.Uri, DiskEncryptionSet = diskEncryptionSetId == null ? null : new DiskEncryptionSetParameters() { Id = diskEncryptionSetId }, }, DataDisks = { new ImageDataDisk(expectedDiskLunWithDiskEncryptionSet) { BlobUri = createdVM.StorageProfile.DataDisks[0].Vhd.Uri, DiskEncryptionSet = diskEncryptionSetId == null ? null: new DiskEncryptionSetParameters() { Id = diskEncryptionSetId }, } } }, HyperVGeneration = HyperVGenerationTypes.V1 }; var image = await WaitForCompletionAsync(await ImagesOperations.StartCreateOrUpdateAsync(rgName, imageName, imageInput)); var getImage = (await ImagesOperations.GetAsync(rgName, imageName)).Value; ValidateImage(imageInput, getImage); if (diskEncryptionSetId != null) { Assert.True(getImage.StorageProfile.OsDisk.DiskEncryptionSet != null, "OsDisk.DiskEncryptionSet is null"); Assert.True(string.Equals(diskEncryptionSetId, getImage.StorageProfile.OsDisk.DiskEncryptionSet.Id, StringComparison.OrdinalIgnoreCase), "getImage.StorageProfile.OsDisk.DiskEncryptionSet is not matching with expected DiskEncryptionSet resource"); Assert.AreEqual(1, getImage.StorageProfile.DataDisks.Count); Assert.True(getImage.StorageProfile.DataDisks[0].DiskEncryptionSet != null, ".DataDisks.DiskEncryptionSet is null"); Assert.True(string.Equals(diskEncryptionSetId, getImage.StorageProfile.DataDisks[0].DiskEncryptionSet.Id, StringComparison.OrdinalIgnoreCase), "DataDisks.DiskEncryptionSet.Id is not matching with expected DiskEncryptionSet resource"); } ImageUpdate updateParams = new ImageUpdate(); updateParams.Tags.InitializeFrom(getImage.Tags); string tagKey = "UpdateTag"; updateParams.Tags.Add(tagKey, "TagValue"); await WaitForCompletionAsync(await ImagesOperations.StartUpdateAsync(rgName, imageName, updateParams)); getImage = (await ImagesOperations.GetAsync(rgName, imageName)).Value; Assert.True(getImage.Tags.ContainsKey(tagKey)); var listResponse = await(ImagesOperations.ListByResourceGroupAsync(rgName)).ToEnumerableAsync(); Assert.IsTrue(listResponse.Count() == 1); await WaitForCompletionAsync(await ImagesOperations.StartDeleteAsync(rgName, image.Value.Name)); }
public void TestVMDataDiskScenario() { using (var context = UndoContext.Current) { context.Start(); EnsureClientsInitialized(); ImageReference imgageRef = GetPlatformVMImage(useWindowsImage: true); // Create resource group var rgName = TestUtilities.GenerateName(TestPrefix); string storageAccountName = TestUtilities.GenerateName(TestPrefix); string asName = TestUtilities.GenerateName("as"); VirtualMachine inputVM; bool passed = false; try { // Create Storage Account, so that both the VMs can share it var storageAccountOutput = CreateStorageAccount(rgName, storageAccountName); Action <VirtualMachine> addDataDiskToVM = vm => { string containerName = TestUtilities.GenerateName(TestPrefix); var vhdContainer = string.Format(Constants.StorageAccountBlobUriTemplate, storageAccountName) + containerName; var vhduri = vhdContainer + string.Format("/{0}.vhd", TestUtilities.GenerateName(TestPrefix)); vm.HardwareProfile.VirtualMachineSize = VirtualMachineSizeTypes.StandardA4; vm.StorageProfile.DataDisks = new List <DataDisk>(); foreach (int index in new int[] { 1, 2 }) { var diskName = "dataDisk" + index; var ddUri = vhdContainer + string.Format("/{0}{1}.vhd", diskName, TestUtilities.GenerateName(TestPrefix)); var dd = new DataDisk { Caching = CachingTypes.None, SourceImage = null, DiskSizeGB = 10, CreateOption = DiskCreateOptionTypes.Empty, Lun = 1 + index, Name = diskName, VirtualHardDisk = new VirtualHardDisk { Uri = ddUri } }; vm.StorageProfile.DataDisks.Add(dd); } var testStatus = new InstanceViewStatus { Code = "test", Message = "test" }; var testStatusList = new List <InstanceViewStatus> { testStatus }; // Negative tests for a bug in 5.0.0 that read-only fields have side-effect on the request body vm.InstanceView = new VirtualMachineInstanceView { Statuses = testStatusList, VMAgent = new VirtualMachineAgentInstanceView { Statuses = testStatusList, ExtensionHandlers = new List <VirtualMachineExtensionHandlerInstanceView> { new VirtualMachineExtensionHandlerInstanceView { Status = testStatus, Type = "test", TypeHandlerVersion = "test" } }, VMAgentVersion = "test" }, Disks = new List <DiskInstanceView> { new DiskInstanceView { Statuses = testStatusList, Name = "test" } }, Extensions = new List <VirtualMachineExtensionInstanceView> { new VirtualMachineExtensionInstanceView { Statuses = testStatusList } } }; }; var vm1 = CreateVM_NoAsyncTracking(rgName, asName, storageAccountOutput, imgageRef, out inputVM, addDataDiskToVM); var getVMWithInstanceViewResponse = m_CrpClient.VirtualMachines.GetWithInstanceView(rgName, inputVM.Name); Assert.True(getVMWithInstanceViewResponse.StatusCode == HttpStatusCode.OK); Assert.True(getVMWithInstanceViewResponse.VirtualMachine != null, "VM in Get"); ValidateVMInstanceView(inputVM, getVMWithInstanceViewResponse.VirtualMachine); var vm2 = getVMWithInstanceViewResponse.VirtualMachine; var vmReCreateResponse = m_CrpClient.VirtualMachines.CreateOrUpdate(rgName, getVMWithInstanceViewResponse.VirtualMachine); Assert.True(vmReCreateResponse.Status != ComputeOperationStatus.Failed); var lroResponse = m_CrpClient.VirtualMachines.Delete(rgName, inputVM.Name); Assert.True(lroResponse.Status != OperationStatus.Failed); passed = true; } finally { var deleteResourceGroupResponse = m_ResourcesClient.ResourceGroups.Delete(rgName); Assert.True(deleteResourceGroupResponse.StatusCode == HttpStatusCode.OK); Assert.True(passed); } } }
private void ValidateInstanceViewStatus(InstanceViewStatus instanceViewStatus) { Assert.NotNull(instanceViewStatus.DisplayStatus); Assert.NotNull(instanceViewStatus.Code); Assert.NotNull(instanceViewStatus.Level); }
internal BootDiagnosticsInstanceView(string consoleScreenshotBlobUri, string serialConsoleLogBlobUri, InstanceViewStatus status) { ConsoleScreenshotBlobUri = consoleScreenshotBlobUri; SerialConsoleLogBlobUri = serialConsoleLogBlobUri; Status = status; }
internal VirtualMachineExtensionHandlerInstanceView(string type, string typeHandlerVersion, InstanceViewStatus status) { Type = type; TypeHandlerVersion = typeHandlerVersion; Status = status; }
internal SubResourceWithColocationStatus(string id, InstanceViewStatus colocationStatus) : base(id) { ColocationStatus = colocationStatus; }
public void TestVMDataDiskScenario_ManagedDisk_ForceDetach() { using (MockContext context = MockContext.Start(this.GetType())) { string originalTestLocation = Environment.GetEnvironmentVariable("AZURE_VM_TEST_LOCATION"); Environment.SetEnvironmentVariable("AZURE_VM_TEST_LOCATION", "eastus2euap"); EnsureClientsInitialized(context); ImageReference imageReference = GetPlatformVMImage(useWindowsImage: true); string resourceGroupName = TestUtilities.GenerateName(TestPrefix); string storageAccountForDisksName = TestUtilities.GenerateName(TestPrefix); string availabilitySetName = TestUtilities.GenerateName(TestPrefix); try { StorageAccount storageAccountForDisks = CreateStorageAccount(resourceGroupName, storageAccountForDisksName); Action <VirtualMachine> addManagedDataDiskToVM = vm => { vm.HardwareProfile.VmSize = VirtualMachineSizeTypes.StandardA4; vm.StorageProfile.DataDisks = new List <DataDisk>(); var diskName = "dataDisk" + TestUtilities.GenerateGuid(); var dd = new DataDisk { Caching = CachingTypes.None, DiskSizeGB = 10, CreateOption = DiskCreateOptionTypes.Empty, Lun = 0, Name = diskName, ManagedDisk = new ManagedDiskParameters() { StorageAccountType = StorageAccountType.StandardLRS } }; vm.StorageProfile.DataDisks.Add(dd); var testStatus = new InstanceViewStatus { Code = "test", Message = "test" }; var testStatusList = new List <InstanceViewStatus> { testStatus }; }; VirtualMachine inputVM; CreateVM(resourceGroupName, availabilitySetName, storageAccountForDisks, imageReference, out inputVM, addManagedDataDiskToVM, hasManagedDisks: true); VirtualMachine getVMWithInstanceViewResponse = m_CrpClient.VirtualMachines.Get(resourceGroupName, inputVM.Name, InstanceViewTypes.InstanceView); ValidateVMInstanceView(inputVM, getVMWithInstanceViewResponse, hasManagedDisks: true); DataDisk diskToBeForceDetached = getVMWithInstanceViewResponse.StorageProfile.DataDisks.FirstOrDefault(disk => disk.Lun == 0); Assert.NotNull(diskToBeForceDetached); Helpers.MarkDataDiskToBeDetached(diskToBeForceDetached, "ForceDetach"); var forceDetachVMResponse = m_CrpClient.VirtualMachines.CreateOrUpdate(resourceGroupName, getVMWithInstanceViewResponse.Name, getVMWithInstanceViewResponse); Assert.Equal(0, forceDetachVMResponse.StorageProfile.DataDisks.Count); } finally { Environment.SetEnvironmentVariable("AZURE_VM_TEST_LOCATION", originalTestLocation); m_ResourcesClient.ResourceGroups.Delete(resourceGroupName); } } }