/**
* 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.VirtualMachine;
import com.microsoft.azure.management.compute.VirtualMachineSizeTypes;
import com.microsoft.azure.management.network.Network;
import com.microsoft.azure.management.network.PublicIPAddress;
import com.microsoft.azure.management.resources.ResourceGroup;
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
import com.microsoft.azure.management.resources.fluentcore.model.Creatable;
import com.microsoft.azure.management.resources.fluentcore.model.CreatedResources;
import com.microsoft.azure.management.resources.fluentcore.utils.SdkContext;
import com.microsoft.azure.management.storage.StorageAccount;
import com.microsoft.azure.management.trafficmanager.TrafficManagerProfile;
import com.microsoft.rest.LogLevel;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.time.StopWatch;
/**
* Azure compute sample for creating multiple virtual machines in parallel.
*/
public final class CreateVirtualMachinesInParallel {
/**
* 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 String rgName = SdkContext.randomResourceName("rgCOPD", 24);
final String userName = "tirekicker";
final String sshKey = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCfSPC2K7LZcFKEO+/t3dzmQYtrJFZNxOsbVgOVKietqHyvmYGHEC0J2wPdAqQ/63g/hhAEFRoyehM+rbeDri4txB3YFfnOK58jqdkyXzupWqXzOrlKY4Wz9SKjjN765+dqUITjKRIaAip1Ri137szRg71WnrmdP3SphTRlCx1Bk2nXqWPsclbRDCiZeF8QOTi4JqbmJyK5+0UqhqYRduun8ylAwKKQJ1NJt85sYIHn9f1Rfr6Tq2zS0wZ7DHbZL+zB5rSlAr8QyUdg/GQD+cmSs6LvPJKL78d6hMGk84ARtFo4A79ovwX/Fj01znDQkU6nJildfkaolH2rWFG/qttD azjava@javalib.com";
Map<Region, Integer> virtualMachinesByLocation = new HashMap<Region, Integer>();
// debug target
/**
virtualMachinesByLocation.put(Region.US_EAST, 5);
virtualMachinesByLocation.put(Region.US_SOUTH_CENTRAL, 5);
*/
// final demo target
virtualMachinesByLocation.put(Region.US_EAST, 12);
virtualMachinesByLocation.put(Region.US_SOUTH_CENTRAL, 12);
virtualMachinesByLocation.put(Region.US_WEST, 12);
virtualMachinesByLocation.put(Region.US_NORTH_CENTRAL, 12);
// virtualMachinesByLocation.put(Region.BRAZIL_SOUTH, 5);
// virtualMachinesByLocation.put(Region.EUROPE_NORTH, 5);
// virtualMachinesByLocation.put(Region.EUROPE_WEST, 5);
// virtualMachinesByLocation.put(Region.UK_WEST, 5);
// virtualMachinesByLocation.put(Region.ASIA_SOUTHEAST, 5);
// virtualMachinesByLocation.put(Region.INDIA_SOUTH, 5);
// virtualMachinesByLocation.put(Region.JAPAN_EAST, 5);
// virtualMachinesByLocation.put(Region.JAPAN_WEST, 5);
try {
//=============================================================
// Create a resource group (Where all resources gets created)
//
ResourceGroup resourceGroup = azure.resourceGroups().define(rgName)
.withRegion(Region.US_EAST)
.create();
System.out.println("Created a new resource group - " + resourceGroup.id());
List<String> publicIpCreatableKeys = new ArrayList<>();
// Prepare a batch of Creatable definitions
//
List<Creatable<VirtualMachine>> creatableVirtualMachines = new ArrayList<>();
for (Map.Entry<Region, Integer> entry : virtualMachinesByLocation.entrySet()) {
Region region = entry.getKey();
Integer vmCount = entry.getValue();
//=============================================================
// Create 1 network creatable per region
// Prepare Creatable Network definition (Where all the virtual machines get added to)
//
String networkName = SdkContext.randomResourceName("vnetCOPD-", 20);
Creatable<Network> networkCreatable = azure.networks().define(networkName)
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withAddressSpace("172.16.0.0/16");
//=============================================================
// Create 1 storage creatable per region (For storing VMs disk)
//
String storageAccountName = SdkContext.randomResourceName("stgcopd", 20);
Creatable<StorageAccount> storageAccountCreatable = azure.storageAccounts().define(storageAccountName)
.withRegion(region)
.withExistingResourceGroup(resourceGroup);
String linuxVMNamePrefix = SdkContext.randomResourceName("vm-", 15);
for (int i = 1; i <= vmCount; i++) {
//=============================================================
// Create 1 public IP address creatable
//
Creatable<PublicIPAddress> publicIPAddressCreatable = azure.publicIPAddresses()
.define(String.format("%s-%d", linuxVMNamePrefix, i))
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withLeafDomainLabel(SdkContext.randomResourceName("pip", 10));
publicIpCreatableKeys.add(publicIPAddressCreatable.key());
//=============================================================
// Create 1 virtual machine creatable
Creatable<VirtualMachine> virtualMachineCreatable = azure.virtualMachines()
.define(String.format("%s-%d", linuxVMNamePrefix, i))
.withRegion(region)
.withExistingResourceGroup(resourceGroup)
.withNewPrimaryNetwork(networkCreatable)
.withPrimaryPrivateIPAddressDynamic()
.withNewPrimaryPublicIPAddress(publicIPAddressCreatable)
.withPopularLinuxImage(KnownLinuxVirtualMachineImage.UBUNTU_SERVER_16_04_LTS)
.withRootUsername(userName)
.withSsh(sshKey)
.withSize(VirtualMachineSizeTypes.STANDARD_DS3_V2)
.withNewStorageAccount(storageAccountCreatable);
creatableVirtualMachines.add(virtualMachineCreatable);
}
}
//=============================================================
// Create !!
StopWatch stopwatch = new StopWatch();
System.out.println("Creating the virtual machines");
stopwatch.start();
CreatedResources<VirtualMachine> virtualMachines = azure.virtualMachines().create(creatableVirtualMachines);
stopwatch.stop();
System.out.println("Created virtual machines");
for (VirtualMachine virtualMachine : virtualMachines.values()) {
System.out.println(virtualMachine.id());
}
System.out.println("Virtual Machines created: (took " + (stopwatch.getTime() / 1000) + " seconds to create) == " + virtualMachines.size() + " == virtual machines");
List<String> publicIpResourceIds = new ArrayList<>();
for (String publicIpCreatableKey : publicIpCreatableKeys) {
PublicIPAddress pip = (PublicIPAddress) virtualMachines.createdRelatedResource(publicIpCreatableKey);
publicIpResourceIds.add(pip.id());
}
//=============================================================
// Create 1 Traffic Manager Profile
//
String trafficManagerName = SdkContext.randomResourceName("tra", 15);
TrafficManagerProfile.DefinitionStages.WithEndpoint profileWithEndpoint = azure.trafficManagerProfiles().define(trafficManagerName)
.withExistingResourceGroup(resourceGroup)
.withLeafDomainLabel(trafficManagerName)
.withPerformanceBasedRouting();
int endpointPriority = 1;
TrafficManagerProfile.DefinitionStages.WithCreate profileWithCreate = null;
for (String publicIpResourceId : publicIpResourceIds) {
String endpointName = String.format("azendpoint-%d", endpointPriority);
if (endpointPriority == 1) {
profileWithCreate = profileWithEndpoint.defineAzureTargetEndpoint(endpointName)
.toResourceId(publicIpResourceId)
.withRoutingPriority(endpointPriority)
.attach();
} else {
profileWithCreate = profileWithCreate.defineAzureTargetEndpoint(endpointName)
.toResourceId(publicIpResourceId)
.withRoutingPriority(endpointPriority)
.attach();
}
endpointPriority++;
}
System.out.println("Creating a traffic manager profile for the VMs");
stopwatch.reset();
stopwatch.start();
TrafficManagerProfile trafficManagerProfile = profileWithCreate.create();
stopwatch.stop();
System.out.println("Created a traffic manager profile (took " + (stopwatch.getTime() / 1000) + " seconds to create): " + trafficManagerProfile.id());
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
//
System.out.println("AZURE_AUTH_LOCATION_2=" + System.getenv("AZURE_AUTH_LOCATION_2"));
final File credFile = new File(System.getenv("AZURE_AUTH_LOCATION_2"));
Azure azure = Azure
.configure()
.withLogLevel(LogLevel.NONE)
.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 CreateVirtualMachinesInParallel() {
}
}