/**
* 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.samples;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.compute.KnownLinuxVirtualMachineImage;
import com.microsoft.azure.management.compute.KnownWindowsVirtualMachineImage;
import com.microsoft.azure.management.compute.VirtualMachine;
import com.microsoft.azure.management.compute.VirtualMachineSizeTypes;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.resources.fluentcore.utils.SdkContext;
import com.microsoft.azure.management.samples.Utils;
import com.microsoft.rest.LogLevel;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* Azure Compute sample for managing virtual machine extensions. -
* - Create a Linux and Windows virtual machine
* - Add three users (user names and passwords for windows, SSH keys for Linux)
* - Resets user credentials
* - Remove a user
* - Install MySQL on Linux | Choco and MySQL on Windows
* - Remove extensions
*/
public final class ManageVirtualMachineExtension {
/**
* Main function which runs the actual sample.
* @param azure instance of the azure client
* @return true if sample runs successfully
*/
public static boolean runSample(Azure azure) {
final Region region = Region.US_WEST_CENTRAL;
final String linuxVMName = SdkContext.randomResourceName("lVM", 10);
final String windowsVMName = SdkContext.randomResourceName("wVM", 10);
final String rgName = SdkContext.randomResourceName("rgCOVE", 15);
final String pipDnsLabelLinuxVM = SdkContext.randomResourceName("rgPip1", 25);
final String pipDnsLabelWindowsVM = SdkContext.randomResourceName("rgPip2", 25);
// Linux configurations
//
final String firstLinuxUserName = "tirekicker";
final String firstLinuxUserPassword = "12NewPA$$w0rd!";
final String firstLinuxUserNewPassword = "muy!234OR";
final String secondLinuxUserName = "seconduser";
final String secondLinuxUserPassword = "B12a6@12xyz!";
final String secondLinuxUserExpiration = "2020-12-31";
final String thirdLinuxUserName = "thirduser";
final String thirdLinuxUserPassword = "12xyz!B12a6@";
final String thirdLinuxUserExpiration = "2020-12-31";
final String linuxCustomScriptExtensionName = "CustomScriptForLinux";
final String linuxCustomScriptExtensionPublisherName = "Microsoft.OSTCExtensions";
final String linuxCustomScriptExtensionTypeName = "CustomScriptForLinux";
final String linuxCustomScriptExtensionVersionName = "1.4";
final String mySqlLinuxInstallScript = "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/4397e808d07df60ff3cdfd1ae40999f0130eb1b3/mysql-standalone-server-ubuntu/scripts/install_mysql_server_5.6.sh";
final String installMySQLLinuxCommand = "bash install_mysql_server_5.6.sh Abc.123x(";
final List<String> linuxScriptFileUris = new ArrayList<>();
linuxScriptFileUris.add(mySqlLinuxInstallScript);
final String windowsCustomScriptExtensionName = "CustomScriptExtension";
final String windowsCustomScriptExtensionPublisherName = "Microsoft.Compute";
final String windowsCustomScriptExtensionTypeName = "CustomScriptExtension";
final String windowsCustomScriptExtensionVersionName = "1.7";
final String mySqlWindowsInstallScript = "https://raw.githubusercontent.com/Azure/azure-sdk-for-java/master/azure-samples/src/main/resources/installMySQL.ps1";
final String installMySQLWindowsCommand = "powershell.exe -ExecutionPolicy Unrestricted -File installMySQL.ps1";
final List<String> windowsScriptFileUris = new ArrayList<>();
windowsScriptFileUris.add(mySqlWindowsInstallScript);
final String linuxVMAccessExtensionName = "VMAccessForLinux";
final String linuxVMAccessExtensionPublisherName = "Microsoft.OSTCExtensions";
final String linuxVMAccessExtensionTypeName = "VMAccessForLinux";
final String linuxVMAccessExtensionVersionName = "1.4";
// Windows configurations
//
final String firstWindowsUserName = "tirekicker";
final String firstWindowsUserPassword = "12NewPA$$w0rd!";
final String firstWindowsUserNewPassword = "muy!234OR";
final String secondWindowsUserName = "seconduser";
final String secondWindowsUserPassword = "B12a6@12xyz!";
final String thirdWindowsUserName = "thirduser";
final String thirdWindowsUserPassword = "12xyz!B12a6@";
final String windowsVMAccessExtensionName = "VMAccessAgent";
final String windowsVMAccessExtensionPublisherName = "Microsoft.Compute";
final String windowsVMAccessExtensionTypeName = "VMAccessAgent";
final String windowsVMAccessExtensionVersionName = "2.3";
try {
//=============================================================
// Create a Linux VM with root (sudo) user
System.out.println("Creating a Linux VM");
VirtualMachine linuxVM = azure.virtualMachines().define(linuxVMName)
.withRegion(region)
.withNewResourceGroup(rgName)
.withNewPrimaryNetwork("10.0.0.0/28")
.withPrimaryPrivateIPAddressDynamic()
.withNewPrimaryPublicIPAddress(pipDnsLabelLinuxVM)
.withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_14_04_LTS)
.withRootUsername(firstLinuxUserName)
.withRootPassword(firstLinuxUserPassword)
.withSize(VirtualMachineSizeTypes.STANDARD_D3_V2)
.create();
System.out.println("Created a Linux VM with" + linuxVM.id());
Utils.print(linuxVM);
//=============================================================
// Add a second sudo user to Linux VM using VMAccess extension
linuxVM.update()
.defineNewExtension(linuxVMAccessExtensionName)
.withPublisher(linuxVMAccessExtensionPublisherName)
.withType(linuxVMAccessExtensionTypeName)
.withVersion(linuxVMAccessExtensionVersionName)
.withProtectedSetting("username", secondLinuxUserName)
.withProtectedSetting("password", secondLinuxUserPassword)
.withProtectedSetting("expiration", secondLinuxUserExpiration)
.attach()
.apply();
System.out.println("Added a second sudo user to the Linux VM");
//=============================================================
// Add a third sudo user to Linux VM by updating VMAccess extension
linuxVM.update()
.updateExtension(linuxVMAccessExtensionName)
.withProtectedSetting("username", thirdLinuxUserName)
.withProtectedSetting("password", thirdLinuxUserPassword)
.withProtectedSetting("expiration", thirdLinuxUserExpiration)
.parent()
.apply();
System.out.println("Added a third sudo user to the Linux VM");
//=============================================================
// Reset ssh password of first user of Linux VM by updating VMAccess extension
linuxVM.update()
.updateExtension(linuxVMAccessExtensionName)
.withProtectedSetting("username", firstLinuxUserName)
.withProtectedSetting("password", firstLinuxUserNewPassword)
.withProtectedSetting("reset_ssh", "true")
.parent()
.apply();
System.out.println("Password of first user of Linux VM has been updated");
//=============================================================
// Removes the second sudo user from Linux VM using VMAccess extension
linuxVM.update()
.updateExtension(linuxVMAccessExtensionName)
.withProtectedSetting("remove_user", secondLinuxUserName)
.parent()
.apply();
//=============================================================
// Install MySQL in Linux VM using CustomScript extension
linuxVM.update()
.defineNewExtension(linuxCustomScriptExtensionName)
.withPublisher(linuxCustomScriptExtensionPublisherName)
.withType(linuxCustomScriptExtensionTypeName)
.withVersion(linuxCustomScriptExtensionVersionName)
.withMinorVersionAutoUpgrade()
.withPublicSetting("fileUris", linuxScriptFileUris)
.withPublicSetting("commandToExecute", installMySQLLinuxCommand)
.attach()
.apply();
System.out.println("Installed MySql using custom script extension");
Utils.print(linuxVM);
//=============================================================
// Removes the extensions from Linux VM
linuxVM.update()
.withoutExtension(linuxCustomScriptExtensionName)
.withoutExtension(linuxVMAccessExtensionName)
.apply();
System.out.println("Removed the custom script and VM Access extensions from Linux VM");
Utils.print(linuxVM);
//=============================================================
// Create a Windows VM with admin user and install choco package manager and MySQL using custom script
System.out.println("Creating a Windows VM");
VirtualMachine windowsVM = azure.virtualMachines().define(windowsVMName)
.withRegion(region)
.withExistingResourceGroup(rgName)
.withNewPrimaryNetwork("10.0.0.0/28")
.withPrimaryPrivateIPAddressDynamic()
.withNewPrimaryPublicIPAddress(pipDnsLabelWindowsVM)
.withPopularWindowsImage(KnownWindowsVirtualMachineImage.WINDOWS_SERVER_2012_R2_DATACENTER)
.withAdminUsername(firstWindowsUserName)
.withAdminPassword(firstWindowsUserPassword)
.withSize(VirtualMachineSizeTypes.STANDARD_D3_V2)
.defineNewExtension(windowsCustomScriptExtensionName)
.withPublisher(windowsCustomScriptExtensionPublisherName)
.withType(windowsCustomScriptExtensionTypeName)
.withVersion(windowsCustomScriptExtensionVersionName)
.withMinorVersionAutoUpgrade()
.withPublicSetting("fileUris", windowsScriptFileUris)
.withPublicSetting("commandToExecute", installMySQLWindowsCommand)
.attach()
.create();
System.out.println("Created a Windows VM" + windowsVM.id());
Utils.print(windowsVM);
//=============================================================
// Add a second admin user to Windows VM using VMAccess extension
windowsVM.update()
.defineNewExtension(windowsVMAccessExtensionName)
.withPublisher(windowsVMAccessExtensionPublisherName)
.withType(windowsVMAccessExtensionTypeName)
.withVersion(windowsVMAccessExtensionVersionName)
.withProtectedSetting("username", secondWindowsUserName)
.withProtectedSetting("password", secondWindowsUserPassword)
.attach()
.apply();
System.out.println("Added a second admin user to the Windows VM");
//=============================================================
// Add a third admin user to Windows VM by updating VMAccess extension
windowsVM.update()
.updateExtension(windowsVMAccessExtensionName)
.withProtectedSetting("username", thirdWindowsUserName)
.withProtectedSetting("password", thirdWindowsUserPassword)
.parent()
.apply();
System.out.println("Added a third admin user to the Windows VM");
//=============================================================
// Reset admin password of first user of Windows VM by updating VMAccess extension
windowsVM.update()
.updateExtension(windowsVMAccessExtensionName)
.withProtectedSetting("username", firstWindowsUserName)
.withProtectedSetting("password", firstWindowsUserNewPassword)
.parent()
.apply();
System.out.println("Password of first user of Windows VM has been updated");
//=============================================================
// Removes the extensions from Windows VM
windowsVM.update()
.withoutExtension(windowsVMAccessExtensionName)
.apply();
System.out.println("Removed the VM Access extensions from Windows VM");
Utils.print(windowsVM);
return true;
} catch (Exception f) {
System.out.println(f.getMessage());
f.printStackTrace();
} finally {
try {
System.out.println("Deleting Resource Group: " + rgName);
azure.resourceGroups().deleteByName(rgName);
System.out.println("Deleted Resource Group: " + rgName);
} catch (NullPointerException npe) {
System.out.println("Did not create any resources in Azure. No clean up is necessary");
} catch (Exception g) {
g.printStackTrace();
}
}
return false;
}
/**
* Main entry point.
* @param args the parameters
*/
public static void main(String[] args) {
try {
//=============================================================
// Authenticate
final File credFile = new File(System.getenv("AZURE_AUTH_LOCATION"));
Azure azure = Azure.configure()
.withLogLevel(LogLevel.BASIC)
.authenticate(credFile)
.withDefaultSubscription();
// Print selected subscription
System.out.println("Selected subscription: " + azure.subscriptionId());
runSample(azure);
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
private ManageVirtualMachineExtension() {
}
}