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);
            });
        }
        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.Instance.ClientFactory.CreateArmClient <StorageManagementClient>(DefaultProfile.DefaultContext, AzureEnvironment.Endpoint.ResourceManager), this.DefaultContext.Subscription);

            base.ExecuteCmdlet();

            ExecuteClientAction(() =>
            {
                if (this.DisableWAD)
                {
                    this._Helper.WriteWarning("The parameter DisableWAD is deprecated. Windows Azure Diagnostics is disabled by default.");
                }

                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).Body.InstanceView;

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

                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.role", Value = "IaaS"
                });
                sapmonPublicConfig.Add(new KeyValuePair()
                {
                    Key = "vm.memory.isovercommitted", Value = memOvercommit
                });
                sapmonPublicConfig.Add(new KeyValuePair()
                {
                    Key = "vm.cpu.isovercommitted", Value = cpuOvercommit
                });
                sapmonPublicConfig.Add(new KeyValuePair()
                {
                    Key = "script.version", Value = AEMExtensionConstants.CurrentScriptVersion
                });
                sapmonPublicConfig.Add(new KeyValuePair()
                {
                    Key = "verbose", Value = "0"
                });
                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);
                if (osdisk.ManagedDisk == null)
                {
                    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 = this._Helper.GetDiskName(osdisk.Vhd.Uri)
                    });
                    sapmonPublicConfig.Add(new KeyValuePair()
                    {
                        Key = "osdisk.caching", Value = caching
                    });
                    sapmonPublicConfig.Add(new KeyValuePair()
                    {
                        Key = "osdisk.account", Value = accountName
                    });
                    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")
                        });
                    }
                }
                else
                {
                    var osDiskMD = ComputeClient.ComputeManagementClient.Disks.Get(this._Helper.GetResourceGroupFromId(osdisk.ManagedDisk.Id),
                                                                                   this._Helper.GetResourceNameFromId(osdisk.ManagedDisk.Id));
                    if (osDiskMD.AccountType == StorageAccountTypes.PremiumLRS)
                    {
                        WriteVerbose("OS Disk Storage Account is a premium account - adding SLAs for OS disk");
                        var sla = this._Helper.GetDiskSLA(osDiskMD.DiskSizeGB, null);
                        sapmonPublicConfig.Add(new KeyValuePair()
                        {
                            Key = "osdisk.type", Value = AEMExtensionConstants.DISK_TYPE_PREMIUM_MD
                        });
                        sapmonPublicConfig.Add(new KeyValuePair()
                        {
                            Key = "osdisk.sla.throughput", Value = sla.TP
                        });
                        sapmonPublicConfig.Add(new KeyValuePair()
                        {
                            Key = "osdisk.sla.iops", Value = sla.IOPS
                        });
                    }
                    else
                    {
                        this._Helper.WriteWarning("[WARN] Standard Managed Disks are not supported. Extension will be installed but no disk metrics will be available.");
                    }
                }

                // Get Storage accounts from disks
                var diskNumber = 1;
                foreach (var disk in disks)
                {
                    if (disk.ManagedDisk != null)
                    {
                        var diskMD = ComputeClient.ComputeManagementClient.Disks.Get(this._Helper.GetResourceGroupFromId(disk.ManagedDisk.Id),
                                                                                     this._Helper.GetResourceNameFromId(disk.ManagedDisk.Id));

                        if (diskMD.AccountType == StorageAccountTypes.PremiumLRS)
                        {
                            this._Helper.WriteVerbose("Data Disk {0} is a Premium Managed Disk - adding SLAs for disk", diskNumber.ToString());
                            var sla = this._Helper.GetDiskSLA(diskMD.DiskSizeGB, null);
                            sapmonPublicConfig.Add(new KeyValuePair()
                            {
                                Key = "disk.type." + diskNumber, Value = AEMExtensionConstants.DISK_TYPE_PREMIUM_MD
                            });
                            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} is a Premium Managed Disk - adding SLAs for disk", diskNumber.ToString());
                        }
                        else
                        {
                            this._Helper.WriteWarning("[WARN] Standard Managed Disks are not supported. Extension will be installed but no disk metrics will be available.");
                        }
                        continue;
                    }

                    var accountName = this._Helper.GetStorageAccountFromUri(disk.Vhd.Uri);
                    if (!accounts.ContainsKey(accountName))
                    {
                        var storageKey = this._Helper.GetAzureStorageKeyFromCache(accountName);
                        accounts.Add(accountName, storageKey);
                    }

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

                    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.EnableWAD.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. Please use parameter WADStorageAccountName to specify a standard storage account you want to use for this VM.");
                        return;
                    }

                    selectedVM = SetAzureVMDiagnosticsExtensionC(selectedVM, selectedVMStatus, wadstorage.Key, wadstorage.Value as string);

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

                Version aemVersion = this._Helper.GetExtensionVersion(selectedVM, selectedVMStatus, OSType, AEMExtensionConstants.AEMExtensionType[OSType], AEMExtensionConstants.AEMExtensionPublisher[OSType]);

                var op = this.VirtualMachineExtensionClient.CreateOrUpdateWithHttpMessagesAsync(
                    this.ResourceGroupName, this.VMName, AEMExtensionConstants.AEMExtensionDefaultName[OSType],
                    new VirtualMachineExtension()
                {
                    Publisher = AEMExtensionConstants.AEMExtensionPublisher[OSType],
                    VirtualMachineExtensionType = AEMExtensionConstants.AEMExtensionType[OSType],
                    TypeHandlerVersion          = aemVersion.ToString(2),
                    Settings                = jsonPublicConfig,
                    ProtectedSettings       = jsonPrivateConfig,
                    Location                = selectedVM.Location,
                    AutoUpgradeMinorVersion = true,
                    ForceUpdateTag          = DateTime.Now.Ticks.ToString()
                }).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);
            });
        }