var setAzureVMEnhancedMonitorForLinux = function()

in AzureEnhancedMonitor/nodejs/setaem.js [85:302]


var setAzureVMEnhancedMonitorForLinux = function(rgpName, vmName){
    var azureProfile;
    var currSubscription;
    var computeClient;
    var storageClient;
    var selectedVM;
    var osdiskAccount;
    var accounts = [];
    var aemConfig = new AemConfig();

    return getAzureProfile().then(function(profile){
        azureProfile = profile;
        return getDefaultSubscription(profile);
    }).then(function(subscription){
        console.log("[INFO]Using subscription: " + subscription.name);
        debug && console.log(JSON.stringify(subscription, null, 4));
        currSubscription = subscription;
        var cred = getCloudCredential(subscription);
        var baseUri = subscription.managementEndpointUrl;
        computeClient = computeMgmt.createComputeManagementClient(cred, baseUri);
        storageClient = storageMgmt.createStorageManagementClient(cred, baseUri);
    }).then(function(){
        return getVirtualMachine(computeClient, rgpName, vmName);
    }).then(function(vm){
        //Set vm role basic config
        console.log("[INFO]Found VM: " + vm.oSProfile.computerName);
        debug && console.log(JSON.stringify(vm, null, 4));
        /*
        vm:
        { extensions: [ [Object] ],
          tags: {},
          hardwareProfile: { virtualMachineSize: 'Standard_A1' },
          storageProfile: { dataDisks: [], imageReference: [Object], oSDisk: [Object] },
          oSProfile:
          { secrets: [],
            computerName: 'zhongyiubuntu4',
            adminUsername: 'zhongyi',
            linuxConfiguration: [Object] },
          networkProfile: { networkInterfaces: [Object] },
          diagnosticsProfile: { bootDiagnostics: [Object] },
          provisioningState: 'Succeeded',
          id: '/subscriptions/4be8920b-2978-43d7-ab14-04d8549c1d05/resourceGroups/zhongyiubuntu4/providers/Microsoft.Compute/virtualMachines/zhongyiubuntu4',
          name: 'zhongyiubuntu4',
          type: 'Microsoft.Compute/virtualMachines',
          location: 'eastasia' }}
        */
        selectedVM = vm;
        var cpuOverCommitted = 0;
        if(selectedVM.hardwareProfile.virtualMachineSize === 'ExtralSmall'){
            cpuOverCommitted = 1
        }
        aemConfig.setPublic('vmsize', selectedVM.hardwareProfile.virtualMachineSize);
        aemConfig.setPublic('vm.role', 'IaaS');
        aemConfig.setPublic('vm.memory.isovercommitted', 0);
        aemConfig.setPublic('vm.cpu.isovercommitted', cpuOverCommitted);
        aemConfig.setPublic('script.version', CurrentScriptVersion);
        aemConfig.setPublic('verbose', '0');
        aemConfig.setPublic('href', 'http://aka.ms/sapaem');
    }).then(function(){
        //Set vm disk config
        /*
        osDisk:
        { operatingSystemType: 'Linux',
          name: 'zhongyiubuntu4',
          virtualHardDisk: { uri: 'https://zhongyiubuntu44575.blob.core.windows.net/vhds/zhongyiubuntu4.vhd' },
          caching: 'ReadWrite',
          createOption: 'FromImage' }
        */
        var osdisk = selectedVM.storageProfile.oSDisk;
        osdiskAccount = getStorageAccountFromUri(osdisk.virtualHardDisk.uri);
        console.log("[INFO]Adding configure for OS disk.");
        aemConfig.setPublic('osdisk.account', osdiskAccount);
        aemConfig.setPublic('osdisk.name', osdisk.name);
        //aemConfig.setPublic('osdisk.caching', osdisk.caching);
        aemConfig.setPublic('osdisk.connminute', osdiskAccount + ".minute");
        aemConfig.setPublic('osdisk.connhour', osdiskAccount + ".hour");
        accounts.push({
            name: osdiskAccount,
        });        
        /*
        dataDisk:
        { lun: 0,
          name: 'zhongyiubuntu4-20151112-140433',
          virtualHardDisk: { uri: 'https://zhongyiubuntu44575.blob.core.windows.net/vhds/zhongyiubuntu4-20151112-140433.vhd' },
          caching: 'None',
          createOption: 'Empty',
          diskSizeGB: 1023 }
        */
        for(var i = 0; i < selectedVM.storageProfile.dataDisks.length; i++){
            var dataDisk = selectedVM.storageProfile.dataDisks[i];
            console.log("[INFO]Adding configure for data disk: " + 
                        dataDisk.name);
            var datadiskAccount = getStorageAccountFromUri(dataDisk.virtualHardDisk.uri);
            accounts.push({
                name:datadiskAccount
            });
            //The default lun value is 0
            var lun = dataDisk.lun;
            aemConfig.setPublic('disk.lun.' + i, lun);
            aemConfig.setPublic('disk.name.' + i, dataDisk.name);
            aemConfig.setPublic('disk.caching.' + i, dataDisk.name);
            aemConfig.setPublic('disk.account.' + i, datadiskAccount);
            aemConfig.setPublic('disk.connminute.' + i, 
                                datadiskAccount + ".minute");
            aemConfig.setPublic('disk.connhour.' + i, datadiskAccount + ".hour");
        }
    }).then(function(){        
        //Set storage account config
        var promises = [];
        var i = -2;
        Object(accounts).forEach(function(account){
            var promise = getResourceGroupName(storageClient, account.name)
              .then(function(rgpName){
                account.rgp = rgpName;
                console.log("!!!!rgp",rgpName);
                return getStorageAccountKey(storageClient, rgpName, account.name);
            }).then(function(accountKey){
                console.log("!!!!key",accountKey);
                account.key = accountKey;
                aemConfig.setPrivate(account.name + ".minute.key", accountKey);
                aemConfig.setPrivate(account.name + ".hour.key", accountKey);
                return getStorageAccountProperties(storageClient, account.rgp, account.name);
            }).then(function(properties){
                //ispremium
                i += 1;
                if (properties.accountType.startsWith("Standard")) {
                    if (i >= 0)
                        aemConfig.setPublic('disk.type.' + i, "Standard");
                    else
                        aemConfig.setPublic('osdisk.type' + i, "Standard");
                } else {
                    if (i >= 0)
                        aemConfig.setPublic('disk.type.' + i, "Premium");
                    else
                        aemConfig.setPublic('osdisk.type' + i, "Premium");
                    aemConfig.setPublic(account.name + ".hour.ispremium", 1);
                    aemConfig.setPublic(account.name + ".minute.ispremium", 1);
                }
                
                //endpoints
                var endpoints = properties.primaryEndpoints;
                
                var tableEndpoint;
                var blobEndpoint;
                endpoints.forEach(function(endpoint){
                    if(endpoint.match(/.*table.*/)){
                        tableEndpoint = endpoint;
                    }else if(endpoint.match(/.*blob.*/)){
                        blobEndpoint = endpoint;
                    }
                });
                account.tableEndpoint = tableEndpoint;
                account.blobEndpoint = blobEndpoint;
                var minuteUri = tableEndpoint + BlobMetricsMinuteTable;
                var hourUri = tableEndpoint + BlobMetricsHourTable;
                account.minuteUri = minuteUri
                aemConfig.setPublic(account.name + ".hour.uri", hourUri);
                aemConfig.setsetPrivate(account.name + ".hour.key", account.key);
                aemConfig.setPublic(account.name + ".minute.uri", minuteUri);
                aemConfig.setsetPrivate(account.name + ".minute.key", account.key);
                aemConfig.setPublic(account.name + ".hour.name", account.name);
                aemConfig.setPublic(account.name + ".minute.name", account.name);
            }).then(function(){
                return checkStorageAccountAnalytics(account.name, 
                                                    account.key,
                                                    account.blobEndpoint);
            });
            promises.push(promise);
        });
        return Promise.all(promises);
    }).then(function(res){
        //Set Linux diagnostic config
        aemConfig.setPublic("wad.name", accounts[0].name);
        aemConfig.setPublic("wad.isenabled", 1);
        var ladUri = accounts[0].tableEndpoint + ladMetricesTable;
        console.log("[INFO]Your endpoint is: "+accounts[0].tableEndpoint);
        aemConfig.setPublic("wad.uri", ladUri);
        aemConfig.setPrivate("wad.key", accounts[0].key);
    }).then(function(){
        //Update vm
        var extensions = [];
        var ladExtConfig = {
            'name' : ladExtName,
            'referenceName' : ladExtName,
            'publisher' : ladExtPublisher,
            'version' : ladExtVersion,
            'state': 'Enable',
            'resourceExtensionParameterValues' : [{
                'key' : ladExtName + "PrivateConfigParameter",
                'value' : JSON.stringify({
                    'storageAccountName' : accounts[0].name,
                    'storageAccountKey' : accounts[0].key,
                    'endpoint' : accounts[0].tableEndpoint.substring((accounts[0].tableEndpoint.search(/\./)) + 1, accounts[0].tableEndpoint.length)
                }),
                'type':'Private'
            }]
        };
        var aemExtConfig = {
            'name' : aemExtName,
            'referenceName' : aemExtName,
            'publisher' : aemExtPublisher,
            'version' : aemExtVersion,
            'state': 'Enable',
            'resourceExtensionParameterValues' : [
                aemConfig.getPublic(), 
                aemConfig.getPrivate()
            ]
        };
        extensions.push(ladExtConfig);
        extensions.push(aemExtConfig);
        selectedVM.provisionGuestAgent = true;
        selectedVM.resourceExtensionReferences = extensions;
        console.log("[INFO]Updating configuration for VM: " + selectedVM.roleName);
        console.log("[INFO]This could take a few minutes. Please wait.")
        debug && console.log(JSON.stringify(selectedVM, null, 4)) 
        return updateVirtualMachine(computeClient, svcName, vmName, selectedVM);
    });
}