コード例 #1
0
        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);

            base.ExecuteCmdlet();

            ExecuteClientAction(() =>
            {
                VirtualMachine virtualMachine = null;
                if (String.IsNullOrEmpty(this.OSType))
                {
                    virtualMachine = ComputeClient.ComputeManagementClient.VirtualMachines.Get(this.ResourceGroupName, this.VMName);
                    this.OSType = virtualMachine.StorageProfile.OsDisk.OsType;
                }
                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;
                }

                if (string.IsNullOrEmpty(this.Name))
                {
                    if (virtualMachine == null)
                    {
                        virtualMachine = ComputeClient.ComputeManagementClient.VirtualMachines.Get(this.ResourceGroupName, this.VMName);
                    }
                    var aemExtension = this._Helper.GetExtension(virtualMachine, AEMExtensionConstants.AEMExtensionType[this.OSType], AEMExtensionConstants.AEMExtensionPublisher[this.OSType]);

                    if (aemExtension == null)
                    {
                        WriteWarning(string.Format(CultureInfo.InvariantCulture, Properties.Resources.AEMExtensionNotFound, this.ResourceGroupName, this.VMName));
                        return;
                    }
                    else
                    {
                        this.Name = aemExtension.Name;
                    }
                }

                var op = this.VirtualMachineExtensionClient.DeleteWithHttpMessagesAsync(this.ResourceGroupName, this.VMName, this.Name).GetAwaiter().GetResult();
                var result = Mapper.Map<PSAzureOperationResponse>(op);
                WriteObject(result);
            });
        }
コード例 #2
0
        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);

            base.ExecuteCmdlet();

            ExecuteClientAction(() =>
            {
                this._Helper.WriteVerbose("Retrieving VM...");

                var selectedVM = ComputeClient.ComputeManagementClient.VirtualMachines.Get(this.ResourceGroupName, this.VMName);
                var selectedVMStatus = ComputeClient.ComputeManagementClient.VirtualMachines.GetWithInstanceView(this.ResourceGroupName, this.VMName);

                if (selectedVM == null)
                {
                    var subscriptionId = this.DefaultContext.Subscription.Id;
                    this._Helper.WriteError("No virtual machine with name {0} in resource group {1} in subscription {2} found", this.VMName, this.ResourceGroupName, subscriptionId);
                    return;
                }

                var osdisk = selectedVM.StorageProfile.OsDisk;

                if (String.IsNullOrEmpty(this.OSType))
                {
                    this.OSType = osdisk.OsType;
                }
                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;
                }

                var disks = selectedVM.StorageProfile.DataDisks;

                var sapmonPublicConfig = new List<KeyValuePair>();
                var sapmonPrivateConfig = new List<KeyValuePair>();
                var cpuOvercommit = 0;
                var memOvercommit = 0;
                var vmsize = selectedVM.HardwareProfile.VmSize;
                switch (vmsize)
                {
                    case AEMExtensionConstants.VMSizeExtraSmall:
                    case AEMExtensionConstants.VMSizeStandard_A0:
                    case AEMExtensionConstants.VMSizeBasic_A0:
                        vmsize = "ExtraSmall (A0)";
                        WriteVerbose("VM Size is ExtraSmall - setting overcommitted setting");
                        cpuOvercommit = 1;
                        break;
                    case "Small":
                        vmsize = "Small (A1)";
                        break;
                    case "Medium":
                        vmsize = "Medium (A2)";
                        break;
                    case "Large":
                        vmsize = "Large (A3)";
                        break;
                    case "ExtraLarge":
                        vmsize = "ExtraLarge (A4)";
                        break;
                }
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "vmsize", Value = vmsize });
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "vm.memory.isovercommitted", Value = memOvercommit.ToString() });
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "vm.cpu.isovercommitted", Value = cpuOvercommit.ToString() });
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "script.version", Value = AEMExtensionConstants.CurrentScriptVersion });
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "verbose", Value = "1" });
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "href", Value = "http://aka.ms/sapaem" });

                var vmSLA = this._Helper.GetVMSLA(selectedVM);
                if (vmSLA.HasSLA)
                {
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "vm.sla.throughput", Value = vmSLA.TP });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "vm.sla.iops", Value = vmSLA.IOPS });
                }

                // Get Disks
                var accounts = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
                var accountName = this._Helper.GetStorageAccountFromUri(osdisk.Vhd.Uri);
                var storageKey = this._Helper.GetAzureStorageKeyFromCache(accountName);
                accounts.Add(accountName, storageKey);

                this._Helper.WriteHost("[INFO] Adding configuration for OS disk");

                var caching = osdisk.Caching;
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.name", Value = osdisk.Name });
                sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.caching", Value = caching });
                if (this._Helper.IsPremiumStorageAccount(accountName))
                {
                    WriteVerbose("OS Disk Storage Account is a premium account - adding SLAs for OS disk");
                    var sla = this._Helper.GetDiskSLA(osdisk);
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.type", Value = AEMExtensionConstants.DISK_TYPE_PREMIUM });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.sla.throughput", Value = sla.TP });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.sla.iops", Value = sla.IOPS });
                }
                else
                {
                    WriteVerbose("OS Disk Storage Account is a standard account");
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.type", Value = AEMExtensionConstants.DISK_TYPE_STANDARD });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.connminute", Value = (accountName + ".minute") });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "osdisk.connhour", Value = (accountName + ".hour") });
                }

                // Get Storage accounts from disks
                var diskNumber = 1;
                foreach (var disk in disks)
                {
                    accountName = this._Helper.GetStorageAccountFromUri(disk.Vhd.Uri);
                    if (!accounts.ContainsKey(accountName))
                    {
                        storageKey = this._Helper.GetAzureStorageKeyFromCache(accountName);
                        accounts.Add(accountName, storageKey);
                    }

                    this._Helper.WriteHost("[INFO] Adding configuration for data disk {0}", disk.Name);
                    caching = disk.Caching;
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.lun." + diskNumber, Value = disk.Lun.ToString() });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.name." + diskNumber, Value = disk.Name });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.caching." + diskNumber, Value = caching });

                    if (this._Helper.IsPremiumStorageAccount(accountName))
                    {
                        this._Helper.WriteVerbose("Data Disk {0} Storage Account is a premium account - adding SLAs for disk", diskNumber.ToString());
                        var sla = this._Helper.GetDiskSLA(disk);
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.type." + diskNumber, Value = AEMExtensionConstants.DISK_TYPE_PREMIUM });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.sla.throughput." + diskNumber, Value = sla.TP });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.sla.iops." + diskNumber, Value = sla.IOPS });
                        this._Helper.WriteVerbose("Done - Data Disk {0} Storage Account is a premium account - adding SLAs for disk", diskNumber.ToString());

                    }
                    else
                    {
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.type." + diskNumber, Value = AEMExtensionConstants.DISK_TYPE_STANDARD });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.connminute." + diskNumber, Value = (accountName + ".minute") });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = "disk.connhour." + diskNumber, Value = (accountName + ".hour") });
                    }

                    diskNumber += 1;
                }

                //Check storage accounts for analytics
                foreach (var account in accounts)
                {
                    this._Helper.WriteVerbose("Testing Storage Metrics for {0}", account.Key);

                    var storage = this._Helper.GetStorageAccountFromCache(account.Key);

                    if (!this._Helper.IsPremiumStorageAccount(storage))
                    {
                        if (!this.SkipStorage.IsPresent)
                        {
                            var currentConfig = this._Helper.GetStorageAnalytics(storage.Name);

                            if (!this._Helper.CheckStorageAnalytics(storage.Name, currentConfig))
                            {
                                this._Helper.WriteHost("[INFO] Enabling Storage Account Metrics for storage account {0}", storage.Name);

                                // Enable analytics on storage accounts
                                this.SetStorageAnalytics(storage.Name);
                            }
                        }

                        var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage);
                        var hourUri = endpoint + "$MetricsHourPrimaryTransactionsBlob";
                        var minuteUri = endpoint + "$MetricsMinutePrimaryTransactionsBlob";

                        this._Helper.WriteHost("[INFO] Adding Storage Account Metric information for storage account {0}", storage.Name);

                        sapmonPrivateConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".hour.key"), Value = account.Value });
                        sapmonPrivateConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".minute.key"), Value = account.Value });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".hour.uri"), Value = hourUri });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".minute.uri"), Value = minuteUri });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".hour.name"), Value = storage.Name });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".minute.name"), Value = storage.Name });
                    }
                    else
                    {
                        this._Helper.WriteHost("[INFO] {0} is of type {1} - Storage Account Metrics are not available for Premium Type Storage.", storage.Name, storage.AccountType.Value.ToString());
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".hour.ispremium"), Value = "1" });
                        sapmonPublicConfig.Add(new KeyValuePair() { Key = ((storage.Name) + ".minute.ispremium"), Value = "1" });
                    }
                }

                WriteVerbose("Chechking if WAD needs to be configured");
                // Enable VM Diagnostics
                if (!this.DisableWAD.IsPresent)
                {
                    this._Helper.WriteHost("[INFO] Enabling IaaSDiagnostics for VM {0}", selectedVM.Name);
                    KeyValuePair wadstorage = null;
                    if (String.IsNullOrEmpty(this.WADStorageAccountName))
                    {
                        KeyValuePair<string, string>? wadstorageTemp = accounts.Cast<KeyValuePair<string, string>?>().
                            FirstOrDefault(accTemp => !this._Helper.IsPremiumStorageAccount(accTemp.Value.Key));
                        if (wadstorageTemp.HasValue)
                        {
                            wadstorage = new KeyValuePair(wadstorageTemp.Value.Key, wadstorageTemp.Value.Value);
                        }
                    }
                    else
                    {
                        wadstorage = new KeyValuePair(this.WADStorageAccountName, this._Helper.GetAzureStorageKeyFromCache(WADStorageAccountName));
                    }

                    if (wadstorage == null)
                    {
                        this._Helper.WriteError("A Standard Storage Account is required.");
                        return;
                    }

                    selectedVM = SetAzureVMDiagnosticsExtensionC(selectedVM, wadstorage.Key, wadstorage.Value);

                    var storage = this._Helper.GetStorageAccountFromCache(wadstorage.Key);
                    var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage);
                    var wadUri = endpoint + AEMExtensionConstants.WadTableName;

                    sapmonPrivateConfig.Add(new KeyValuePair() { Key = "wad.key", Value = wadstorage.Value });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "wad.name", Value = wadstorage.Key });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "wad.isenabled", Value = "1" });
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "wad.uri", Value = wadUri });
                }
                else
                {
                    sapmonPublicConfig.Add(new KeyValuePair() { Key = "wad.isenabled", Value = "0" });
                }

                ExtensionConfig jsonPublicConfig = new ExtensionConfig();
                jsonPublicConfig.Config = sapmonPublicConfig;

                ExtensionConfig jsonPrivateConfig = new ExtensionConfig();
                jsonPrivateConfig.Config = sapmonPrivateConfig;

                this._Helper.WriteHost("[INFO] Updating Azure Enhanced Monitoring Extension for SAP configuration - Please wait...");

                WriteVerbose("Installing AEM extension");
                var op = this.VirtualMachineExtensionClient.CreateOrUpdateWithHttpMessagesAsync(
                    this.ResourceGroupName, this.VMName, AEMExtensionConstants.AEMExtensionDefaultName[OSType],
                    new VirtualMachineExtension()
                    {
                        Publisher = AEMExtensionConstants.AEMExtensionPublisher[OSType],
                        VirtualMachineExtensionType = AEMExtensionConstants.AEMExtensionType[OSType],
                        TypeHandlerVersion = AEMExtensionConstants.AEMExtensionVersion[OSType],
                        Settings = jsonPublicConfig,
                        ProtectedSettings = jsonPrivateConfig,
                        Location = selectedVM.Location,
                        AutoUpgradeMinorVersion = true
                    }).GetAwaiter().GetResult();

                this._Helper.WriteHost("[INFO] Azure Enhanced Monitoring Extension for SAP configuration updated. It can take up to 15 Minutes for the monitoring data to appear in the SAP system.");
                this._Helper.WriteHost("[INFO] You can check the configuration of a virtual machine by calling the Test-AzureRmVMAEMExtension commandlet.");

                var result = Mapper.Map<PSAzureOperationResponse>(op);
                WriteObject(result);
            });
        }
コード例 #3
0
        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;
                }
                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.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Size", "vmsize", sapmonPublicConfig, vmSize, aemConfigResult);
                    this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Memory", "vm.memory.isovercommitted", sapmonPublicConfig, "0", aemConfigResult);
                    this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM CPU", "vm.cpu.isovercommitted", sapmonPublicConfig, "0", aemConfigResult);
                    this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: Script Version", "script.version", sapmonPublicConfig, null, aemConfigResult, true);

                    var vmSLA = this._Helper.GetVMSLA(selectedVM);
                    if (vmSLA.HasSLA)
                    {
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM SLA IOPS", "vm.sla.iops", sapmonPublicConfig, vmSLA.IOPS, aemConfigResult);
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM SLA Throughput", "vm.sla.throughput", sapmonPublicConfig, vmSLA.TP, aemConfigResult);
                    }

                    var wadEnabled = this._Helper.GetMonPropertyValue("wad.isenabled", sapmonPublicConfig);
                    if (wadEnabled == "1")
                    {
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD name", "wad.name", sapmonPublicConfig, null, aemConfigResult, true);
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD URI", "wad.uri", sapmonPublicConfig, null, aemConfigResult, true);
                    }
                    else
                    {
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD name", "wad.name", sapmonPublicConfig, null, aemConfigResult);
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: WAD URI", "wad.uri", sapmonPublicConfig, null, aemConfigResult);
                    }

                    if (!osaccountIsPremium)
                    {
                        var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage);
                        var minuteUri = endpoint + "$MetricsMinutePrimaryTransactionsBlob";

                        this._Helper.CheckMonProp("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.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Value", osaccountName + ".minute.uri", sapmonPublicConfig, minuteUri, aemConfigResult);
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk URI Name", osaccountName + ".minute.name", sapmonPublicConfig, osaccountName, aemConfigResult);
                        this._Helper.CheckMonProp("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.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk Type", "osdisk.type", sapmonPublicConfig, AEMExtensionConstants.DISK_TYPE_PREMIUM, aemConfigResult);
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA IOPS", "osdisk.sla.throughput", sapmonPublicConfig, sla.TP, aemConfigResult);
                        this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS Disk SLA Throughput", "osdisk.sla.iops", sapmonPublicConfig, sla.IOPS, aemConfigResult);

                    }
                    this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM OS disk name", "osdisk.name", sapmonPublicConfig, osdisk.Name, 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.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " LUN", "disk.lun." + diskNumber, sapmonPublicConfig, disk.Lun.ToString(), aemConfigResult);
                        if (!accountIsPremium)
                        {
                            var endpoint = this._Helper.GetAzureSAPTableEndpoint(storage);
                            var minuteUri = endpoint + "$MetricsMinutePrimaryTransactionsBlob";

                            this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Key", "disk.connminute." + diskNumber, sapmonPublicConfig, accountName + ".minute", aemConfigResult);
                            this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Value", accountName + ".minute.uri", sapmonPublicConfig, minuteUri, aemConfigResult);
                            this._Helper.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " URI Name", accountName + ".minute.name", sapmonPublicConfig, accountName, aemConfigResult);
                            this._Helper.CheckMonProp("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.CheckMonProp("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.CheckMonProp("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.CheckMonProp("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.CheckMonProp("Azure Enhanced Monitoring Extension for SAP public configuration check: VM Data Disk " + diskNumber + " name", "disk.name." + diskNumber, sapmonPublicConfig, disk.Name, 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
                //#################################################                
                if (this._Helper.GetMonPropertyValue("wad.isenabled", sapmonPublicConfig) == "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);
                            }
                        }

                        var wadstorage = this._Helper.GetMonPropertyValue("wad.name", sapmonPublicConfig);

                        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);
            });
        }