com.microsoft.azure.management.compute.VirtualMachineExtensionOperationsTests.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.azure.management.compute.VirtualMachineExtensionOperationsTests.java

Source

/**
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License. See License.txt in the project root for
 * license information.
 */

package com.microsoft.azure.management.compute;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.storage.StorageAccount;
import com.microsoft.rest.RestClient;
import org.apache.commons.codec.binary.Base64;
import org.junit.Assert;
import org.junit.Test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class VirtualMachineExtensionOperationsTests extends ComputeManagementTest {
    private static String RG_NAME = "";
    private static Region REGION = Region.US_SOUTH_CENTRAL;

    @Override
    protected void initializeClients(RestClient restClient, String defaultSubscription, String domain) {
        RG_NAME = generateRandomResourceName("vmexttest", 15);
        super.initializeClients(restClient, defaultSubscription, domain);
    }

    @Override
    protected void cleanUpResources() {
        resourceManager.resourceGroups().deleteByName(RG_NAME);
    }

    @Test
    public void canEnableDiagnosticsExtension() throws Exception {
        final String STORAGEACCOUNTNAME = generateRandomResourceName("stg", 15);
        final String VMNAME = "javavm1";

        // Creates a storage account
        StorageAccount storageAccount = storageManager.storageAccounts().define(STORAGEACCOUNTNAME)
                .withRegion(REGION).withNewResourceGroup(RG_NAME).create();

        // Create a Linux VM
        //
        VirtualMachine vm = computeManager.virtualMachines().define(VMNAME).withRegion(REGION)
                .withExistingResourceGroup(RG_NAME).withNewPrimaryNetwork("10.0.0.0/28")
                .withPrimaryPrivateIPAddressDynamic().withoutPrimaryPublicIPAddress()
                .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_14_04_LTS)
                .withRootUsername("Foo12").withRootPassword("BaR@12abc!")
                .withSize(VirtualMachineSizeTypes.STANDARD_D3).withExistingStorageAccount(storageAccount).create();

        final InputStream embeddedJsonConfig = VirtualMachineExtensionOperationsTests.class
                .getResourceAsStream("/linux_diagnostics_public_config.json");
        String jsonConfig = ((new ObjectMapper()).readTree(embeddedJsonConfig)).toString();
        jsonConfig = jsonConfig.replace("%VirtualMachineResourceId%", vm.id());

        // Update Linux VM to enable Diagnostics
        vm.update().defineNewExtension("LinuxDiagnostic").withPublisher("Microsoft.OSTCExtensions")
                .withType("LinuxDiagnostic").withVersion("2.3")
                .withPublicSetting("ladCfg", new String(Base64.encodeBase64(jsonConfig.getBytes())))
                .withPublicSetting("storageAccount", storageAccount.name())
                .withProtectedSetting("storageAccountName", storageAccount.name())
                .withProtectedSetting("storageAccountKey", storageAccount.getKeys().get(0).value())
                .withProtectedSetting("storageAccountEndPoint", "https://core.windows.net:443/").attach().apply();
    }

    @Test
    public void canResetPasswordUsingVMAccessExtension() throws Exception {
        final String VMNAME = "javavm2";

        // Create a Linux VM
        //
        VirtualMachine vm = computeManager.virtualMachines().define(VMNAME).withRegion(REGION)
                .withNewResourceGroup(RG_NAME).withNewPrimaryNetwork("10.0.0.0/28")
                .withPrimaryPrivateIPAddressDynamic().withoutPrimaryPublicIPAddress()
                .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_14_04_LTS)
                .withRootUsername("Foo12").withRootPassword("BaR@12abc!")
                .withSize(VirtualMachineSizeTypes.STANDARD_D3).create();

        // Using VMAccess Linux extension to reset the password for the existing user 'Foo12'
        // https://github.com/Azure/azure-linux-extensions/blob/master/VMAccess/README.md
        //
        vm.update().defineNewExtension("VMAccessForLinux").withPublisher("Microsoft.OSTCExtensions")
                .withType("VMAccessForLinux").withVersion("1.4").withProtectedSetting("username", "Foo12")
                .withProtectedSetting("password", "B12a6@12xyz!").withProtectedSetting("reset_ssh", "true").attach()
                .apply();

        Assert.assertTrue(vm.listExtensions().size() > 0);
        Assert.assertTrue(vm.listExtensions().containsKey("VMAccessForLinux"));

        // Update the VMAccess Linux extension to reset password again for the user 'Foo12'
        //
        vm.update().updateExtension("VMAccessForLinux").withProtectedSetting("username", "Foo12")
                .withProtectedSetting("password", "muy!234OR").withProtectedSetting("reset_ssh", "true").parent()
                .apply();
    }

    @Test
    public void canInstallUninstallCustomExtension() throws Exception {
        final String VMNAME = "javavm3";

        final String mySqlInstallScript = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/4397e808d07df60ff3cdfd1ae40999f0130eb1b3/mysql-standalone-server-ubuntu/scripts/install_mysql_server_5.6.sh";
        final String installCommand = "bash install_mysql_server_5.6.sh Abc.123x(";
        List<String> fileUris = new ArrayList<>();
        fileUris.add(mySqlInstallScript);

        // Create Linux VM with a custom extension to install MySQL
        //
        VirtualMachine vm = computeManager.virtualMachines().define(VMNAME).withRegion(REGION)
                .withNewResourceGroup(RG_NAME).withNewPrimaryNetwork("10.0.0.0/28")
                .withPrimaryPrivateIPAddressDynamic().withoutPrimaryPublicIPAddress()
                .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_14_04_LTS)
                .withRootUsername("Foo12").withRootPassword("BaR@12abc!")
                .withSize(VirtualMachineSizeTypes.STANDARD_D3).defineNewExtension("CustomScriptForLinux")
                .withPublisher("Microsoft.OSTCExtensions").withType("CustomScriptForLinux").withVersion("1.4")
                .withMinorVersionAutoUpgrade().withPublicSetting("fileUris", fileUris)
                .withPublicSetting("commandToExecute", installCommand).attach().create();

        Assert.assertTrue(vm.listExtensions().size() > 0);
        Assert.assertTrue(vm.listExtensions().containsKey("CustomScriptForLinux"));
        VirtualMachineExtension customScriptExtension = vm.listExtensions().get("CustomScriptForLinux");
        Assert.assertEquals(customScriptExtension.publisherName(), "Microsoft.OSTCExtensions");
        Assert.assertEquals(customScriptExtension.typeName(), "CustomScriptForLinux");
        Assert.assertEquals(customScriptExtension.autoUpgradeMinorVersionEnabled(), true);

        // Remove the custom extension
        //
        vm.update().withoutExtension("CustomScriptForLinux").apply();

        Assert.assertTrue(vm.listExtensions().size() == 0);
    }

    @Test
    public void canHandleExtensionReference() throws Exception {
        final String VMNAME = "javavm4";

        // Create a Linux VM
        //
        VirtualMachine vm = computeManager.virtualMachines().define(VMNAME).withRegion(REGION)
                .withNewResourceGroup(RG_NAME).withNewPrimaryNetwork("10.0.0.0/28")
                .withPrimaryPrivateIPAddressDynamic().withoutPrimaryPublicIPAddress()
                .withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_14_04_LTS)
                .withRootUsername("Foo12").withRootPassword("BaR@12abc!")
                .withSize(VirtualMachineSizeTypes.STANDARD_D3).defineNewExtension("VMAccessForLinux")
                .withPublisher("Microsoft.OSTCExtensions").withType("VMAccessForLinux").withVersion("1.4")
                .withProtectedSetting("username", "Foo12").withProtectedSetting("password", "B12a6@12xyz!")
                .withProtectedSetting("reset_ssh", "true").attach().create();

        Assert.assertTrue(vm.listExtensions().size() > 0);

        // Get the created virtual machine via VM List not by VM GET
        List<VirtualMachine> virtualMachines = computeManager.virtualMachines().listByGroup(RG_NAME);
        VirtualMachine vmWithExtensionReference = null;
        for (VirtualMachine virtualMachine : virtualMachines) {
            if (virtualMachine.name().equalsIgnoreCase(VMNAME)) {
                vmWithExtensionReference = virtualMachine;
                break;
            }
        }
        // The VM retrieved from the list will contain extensions as reference (i.e. with only id)
        Assert.assertNotNull(vmWithExtensionReference);

        // Update the extension
        VirtualMachine vmWithExtensionUpdated = vmWithExtensionReference.update()
                .updateExtension("VMAccessForLinux").withProtectedSetting("username", "Foo12")
                .withProtectedSetting("password", "muy!234OR").withProtectedSetting("reset_ssh", "true").parent()
                .apply();

        // Again getting VM with extension reference
        virtualMachines = computeManager.virtualMachines().listByGroup(RG_NAME);
        vmWithExtensionReference = null;
        for (VirtualMachine virtualMachine : virtualMachines) {
            vmWithExtensionReference = virtualMachine;
        }
        Assert.assertNotNull(vmWithExtensionReference);

        VirtualMachineExtension accessExtension = null;
        for (VirtualMachineExtension extension : vmWithExtensionReference.listExtensions().values()) {
            if (extension.name().equalsIgnoreCase("VMAccessForLinux")) {
                accessExtension = extension;
                break;
            }
        }
        // Even though VM's inner contain just extension reference VirtualMachine::getExtensions()
        // should resolve the reference and get full extension.
        Assert.assertNotNull(accessExtension);
        Assert.assertNotNull(accessExtension.publisherName());
        Assert.assertNotNull(accessExtension.typeName());
        Assert.assertNotNull(accessExtension.versionName());
    }
}