/****************************************************************************** * Copyright (c) 2012 GigaSpaces Technologies Ltd. All rights reserved * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * ******************************************************************************/ package org.cloudifysource.esc.driver.provisioning.azure.client; import java.io.UnsupportedEncodingException; import java.util.List; import org.cloudifysource.esc.driver.provisioning.azure.model.AddressSpace; import org.cloudifysource.esc.driver.provisioning.azure.model.ConfigurationSets; import org.cloudifysource.esc.driver.provisioning.azure.model.CreateAffinityGroup; import org.cloudifysource.esc.driver.provisioning.azure.model.CreateHostedService; import org.cloudifysource.esc.driver.provisioning.azure.model.CreateStorageServiceInput; import org.cloudifysource.esc.driver.provisioning.azure.model.Deployment; import org.cloudifysource.esc.driver.provisioning.azure.model.GlobalNetworkConfiguration; import org.cloudifysource.esc.driver.provisioning.azure.model.InputEndpoints; import org.cloudifysource.esc.driver.provisioning.azure.model.LinuxProvisioningConfigurationSet; import org.cloudifysource.esc.driver.provisioning.azure.model.Listener; import org.cloudifysource.esc.driver.provisioning.azure.model.Listeners; import org.cloudifysource.esc.driver.provisioning.azure.model.NetworkConfigurationSet; import org.cloudifysource.esc.driver.provisioning.azure.model.OSVirtualHardDisk; import org.cloudifysource.esc.driver.provisioning.azure.model.RestartRoleOperation; import org.cloudifysource.esc.driver.provisioning.azure.model.Role; import org.cloudifysource.esc.driver.provisioning.azure.model.RoleList; import org.cloudifysource.esc.driver.provisioning.azure.model.VirtualNetworkConfiguration; import org.cloudifysource.esc.driver.provisioning.azure.model.VirtualNetworkSite; import org.cloudifysource.esc.driver.provisioning.azure.model.VirtualNetworkSites; import org.cloudifysource.esc.driver.provisioning.azure.model.WinRM; import org.cloudifysource.esc.driver.provisioning.azure.model.WindowsProvisioningConfigurationSet; import com.sun.jersey.core.util.Base64; /***************************************************************************************** * this class is used for creating object instances representing the azure domain model. * @author elip * ******************************************************************************************/ public class MicrosoftAzureRequestBodyBuilder { private static final String UTF_8 = "UTF-8"; private String affinityPrefix; private String cloudServicePrefix; private String storagePrefix; public MicrosoftAzureRequestBodyBuilder(final String affinityPrefix, final String cloudServicePrefix, final String storagePrefix) { this.affinityPrefix = affinityPrefix; this.cloudServicePrefix = cloudServicePrefix; this.storagePrefix = storagePrefix; } private static final int UUID_LENGTH = 8; /** * * @param name * - the affinity group name. * @param location * - the affinity group location. * @return - an object representing a body of the create affinity request. <br> * see <a href= * "http://msdn.microsoft.com/en-us/library/windowsazure/gg715317.aspx" * >Create Affinity Group</a> */ public CreateAffinityGroup buildCreateAffinity(final String name, final String location) { CreateAffinityGroup affinityGroup = new CreateAffinityGroup(); affinityGroup.setName(name); String affinityGroupName = affinityPrefix + generateRandomUUID(UUID_LENGTH); try { affinityGroup.setLabel(new String(Base64.encode(affinityGroupName), UTF_8)); } catch (UnsupportedEncodingException e) { // ignore } affinityGroup.setLocation(location); return affinityGroup; } /** * * @param affinityGroup * - the affinity group to be associated with the cloud service * @return - an object representing a body of the create cloud service * request. <br> * see <a href= * "http://msdn.microsoft.com/en-us/library/windowsazure/gg441304.aspx" * >Create Hosted Service</a> */ public CreateHostedService buildCreateCloudService( final String affinityGroup) { CreateHostedService hostedService = new CreateHostedService(); hostedService.setAffinityGroup(affinityGroup); String randomUID = generateRandomUUID(UUID_LENGTH); try { hostedService.setLabel(new String(Base64 .encode(cloudServicePrefix + randomUID), UTF_8)); } catch (UnsupportedEncodingException e) { // ignore } hostedService.setServiceName(cloudServicePrefix + randomUID); return hostedService; } /** * * @param addressPrefix * - CIDR notation address space range * @param affinityGroupName * - the affinity group associated with the network * @param networkName * - the name of the network to create. * @return - an object representing a body of the set network configuration * request. <br> * see <a href= * "http://msdn.microsoft.com/en-us/library/windowsazure/jj157181.aspx" * >Set Network Configuration</a> */ public GlobalNetworkConfiguration buildGlobalNetworkConfiguration( final String addressPrefix, final String affinityGroupName, final String networkName) { GlobalNetworkConfiguration networkConfiguration = new GlobalNetworkConfiguration(); VirtualNetworkConfiguration virtualNetworkConfiguration = new VirtualNetworkConfiguration(); VirtualNetworkSites virtualNetworkSites = new VirtualNetworkSites(); VirtualNetworkSite virtualNetworkSite = new VirtualNetworkSite(); AddressSpace addressSpace = new AddressSpace(); addressSpace.setAddressPrefix(addressPrefix); virtualNetworkSite.setAddressSpace(addressSpace); virtualNetworkSite.setAffinityGroup(affinityGroupName); virtualNetworkSite.setName(networkName); virtualNetworkSites.getVirtualNetworkSites().add(virtualNetworkSite); virtualNetworkConfiguration.setVirtualNetworkSites(virtualNetworkSites); networkConfiguration .setVirtualNetworkConfiguration(virtualNetworkConfiguration); return networkConfiguration; } /** * * @param sites - virtual network sites to deploy. * @return - an object representing a body of the set network configuration * request. <br> * see <a href= * "http://msdn.microsoft.com/en-us/library/windowsazure/jj157181.aspx" * >Set Network Configuration</a> */ public GlobalNetworkConfiguration buildGlobalNetworkConfiguration( final List<VirtualNetworkSite> sites) { GlobalNetworkConfiguration networkConfiguration = new GlobalNetworkConfiguration(); VirtualNetworkConfiguration virtualNetworkConfiguration = new VirtualNetworkConfiguration(); VirtualNetworkSites virtualNetworkSites = new VirtualNetworkSites(); virtualNetworkSites.setVirtualNetworkSites(sites); virtualNetworkConfiguration.setVirtualNetworkSites(virtualNetworkSites); networkConfiguration .setVirtualNetworkConfiguration(virtualNetworkConfiguration); return networkConfiguration; } /** * * @param desc . * @return - an object representing a body of the create virtual machine deployment * request. <br> * see <a href= * "http://msdn.microsoft.com/en-us/library/windowsazure/jj157194.aspx" * >Create Virtual Machine Deployment</a> */ public Deployment buildDeployment(final CreatePersistentVMRoleDeploymentDescriptor desc, final boolean isWindows) { String deploymentSlot = desc.getDeploymentSlot(); String imageName = desc.getImageName(); String storageAccountName = desc.getStorageAccountName(); String userName = desc.getUserName(); String password = desc.getPassword(); String networkName = desc.getNetworkName(); String size = desc.getSize(); String deploymentName = desc.getDeploymentName(); InputEndpoints endPoints = desc.getInputEndpoints(); String roleName = desc.getRoleName(); Deployment deployment = new Deployment(); deployment.setDeploymentSlot(deploymentSlot); deployment.setDeploymentName(roleName); deployment.setVirtualNetworkName(networkName); deployment.setLabel(deploymentName); deployment.setName(deploymentName); RoleList roleList = new RoleList(); Role role = new Role(); role.setRoleType("PersistentVMRole"); role.setRoleName(roleName); role.setRoleSize(size); OSVirtualHardDisk osVirtualHardDisk = new OSVirtualHardDisk(); osVirtualHardDisk.setSourceImageName(imageName); String mediaLink = "https://" + storageAccountName + ".blob.core.windows.net/vhds/" + deploymentName + ".vhd"; osVirtualHardDisk.setMediaLink(mediaLink); role.setOSVirtualHardDisk(osVirtualHardDisk); ConfigurationSets configurationSets = new ConfigurationSets(); if ( isWindows ) { // Windows Specific : roleName de la forme cloudify_manager_roled57f => ROLED57F (15 car limit size limit) String[] computerNameArray = roleName.split("_"); String computerName = (computerNameArray[2]).toUpperCase(); WindowsProvisioningConfigurationSet windowsProvisioningSet = new WindowsProvisioningConfigurationSet(); // windowsProvisioningSet.setDisableSshPasswordAuthentication(true); // windowsProvisioningSet.setHostName(roleName); // windowsProvisioningSet.setUserName(userName); // windowsProvisioningSet.setUserPassword(password); windowsProvisioningSet.setAdminUsername(userName); windowsProvisioningSet.setAdminPassword(password); windowsProvisioningSet.setComputerName(computerName); // (not optional) Windows ComputerName configurationSets.getConfigurationSets().add(windowsProvisioningSet); // Set WinRM : HTTP without Certificate WinRM winRM = new WinRM(); Listeners listeners = new Listeners(); Listener listener = new Listener(); listener.setCertificateThumbprint(null); // Configure for Secure Winrm command (?) listener.setProtocol("Https"); listeners.getListeners().add(listener); winRM.setListeners(listeners); windowsProvisioningSet.setWinRM(winRM); } else { LinuxProvisioningConfigurationSet linuxProvisioningSet = new LinuxProvisioningConfigurationSet(); // linuxProvisioningSet.setDisableSshPasswordAuthentication(true); linuxProvisioningSet.setHostName(roleName); linuxProvisioningSet.setUserName(userName); linuxProvisioningSet.setUserPassword(password); configurationSets.getConfigurationSets().add(linuxProvisioningSet); } // NetworkConfiguration NetworkConfigurationSet networkConfiguration = new NetworkConfigurationSet(); networkConfiguration.setInputEndpoints(endPoints); configurationSets.getConfigurationSets().add(networkConfiguration); role.setConfigurationSets(configurationSets); roleList.getRoles().add(role); deployment.setRoleList(roleList); return deployment; } /** * * @param affinityGroupName - * the affinity group associated with this storage account. * @param storageAccountName - * the storage account name. * * @return - an object representing a body of the create storage service input * request. <br> * see <a href= * "http://msdn.microsoft.com/en-us/library/windowsazure/hh264518.aspx" * >Create Storage Service</a> */ public CreateStorageServiceInput buildCreateStorageAccount( final String affinityGroupName, final String storageAccountName) { CreateStorageServiceInput storageAccount = new CreateStorageServiceInput(); storageAccount.setAffinityGroup(affinityGroupName); try { storageAccount.setLabel(new String(Base64 .encode(storagePrefix), UTF_8)); } catch (UnsupportedEncodingException e) { // ignore } storageAccount.setServiceName(storageAccountName); return storageAccount; } /** * * @return - an object representing a body of the restart role * request. <br> * see <a href= * "http://msdn.microsoft.com/en-us/library/windowsazure/jj157197" * >Restart Role</a> */ public RestartRoleOperation buildRestartRoleOperation() { return new RestartRoleOperation(); } private static String generateRandomUUID(final int length) { return UUIDHelper.generateRandomUUID(length); } }