http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java deleted file mode 100644 index f036a72..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudstackIaas.java +++ /dev/null @@ -1,541 +0,0 @@ -package org.apache.stratos.cloud.controller.iaases; - - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.exception.CloudControllerException; -import org.apache.stratos.cloud.controller.exception.InvalidHostException; -import org.apache.stratos.cloud.controller.exception.InvalidRegionException; -import org.apache.stratos.cloud.controller.exception.InvalidZoneException; -import org.apache.stratos.cloud.controller.interfaces.Iaas; -import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil; -import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.util.CloudControllerConstants; -import org.apache.stratos.cloud.controller.validate.CloudstackPartitionValidator; -import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; -import org.jclouds.cloudstack.CloudStackApi; -import org.jclouds.cloudstack.compute.options.CloudStackTemplateOptions; -import org.jclouds.cloudstack.domain.*; -import org.jclouds.cloudstack.features.VolumeApi; -import org.jclouds.cloudstack.options.ListPublicIPAddressesOptions; -import org.jclouds.cloudstack.options.ListZonesOptions; -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.domain.Location; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeoutException; - -public class CloudstackIaas extends Iaas { - - private static final Log log = LogFactory.getLog(CloudstackIaas.class); - - public CloudstackIaas(IaasProvider iaasProvider) { - super(iaasProvider); - } - - @Override - public void buildComputeServiceAndTemplate() { - // builds and sets Compute Service - ComputeServiceBuilderUtil.buildDefaultComputeService(getIaasProvider()); - // builds and sets Template - buildTemplate(); - } - - @Override - public void buildTemplate() { - - IaasProvider iaasInfo = getIaasProvider(); - - //if compute service is not available - if (iaasInfo.getComputeService() == null) { - String msg = "Compute service is null for IaaS provider: " - + iaasInfo.getName(); - log.error(msg); - throw new CloudControllerException(msg); - } - - //create templateBuilder - TemplateBuilder templateBuilder = iaasInfo.getComputeService() - .templateBuilder(); - - //**SET PROPERTIES TO templateBuilder OBJECT**// - - /** - * PROPERTY - 1 - * set image id specified - */ - templateBuilder.imageId(iaasInfo.getImage()); - - /** - * PROPERTY-2 - * if user has specified a zone in cloud-controller.xml, set the zone into templateBuilder object - * (user should provide the zone id for this, because zone name is not unique in cloudstack) - */ - if (iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE) != null) { - Set<? extends Location> locations = iaasInfo.getComputeService().listAssignableLocations(); - for (Location location : locations) { - if (location.getId().equals(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE))) { - //if the zone is valid set the zone to templateBuilder Object - templateBuilder.locationId(location.getId()); - log.info("Zone has been set as " + iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE) - + " with id: " + location.getId()); - break; - } - } - } - - /** - * PROPERTY-3 - * if user has specified an instance type in cloud-controller.xml, set the instance type into templateBuilder - * object.(service offering) - *Important:Specify the Service Offering type ID. Not the name. Because the name is not unique in cloudstack. - */ - if (iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE) != null) { - templateBuilder.hardwareId(iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE)); - } - - //build the template - Template template = templateBuilder.build(); - - /**if you wish to auto assign IPs, instance spawning call should be - * blocking, but if you - * wish to assign IPs manually, it can be non-blocking. - * is auto-assign-ip mode or manual-assign-ip mode? - */ - boolean blockUntilRunning = Boolean.parseBoolean(iaasInfo - .getProperty(CloudControllerConstants.AUTO_ASSIGN_IP)); - template.getOptions().as(TemplateOptions.class) - .blockUntilRunning(blockUntilRunning); - - // this is required in order to avoid creation of additional security - // groups by Jclouds. - template.getOptions().as(TemplateOptions.class) - .inboundPorts(new int[]{}); - - - //**SET CLOUDSTACK SPECIFIC PROPERTIES TO TEMPLATE OBJECT**// - - //set security group - If you are using basic zone - if (iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUP_IDS) != null) { - template.getOptions() - .as(CloudStackTemplateOptions.class) - .securityGroupIds(Arrays.asList(iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUP_IDS) - .split(CloudControllerConstants.ENTRY_SEPARATOR))); - } - - - /** - * set network ID - If you are using advanced zone - * in cloudstack sometimes we get unautorized exception if we didn't specify the - * domain ID and user name - */ - if (iaasInfo.getProperty(CloudControllerConstants.NETWORK_IDS) != null) { - template.getOptions() - .as(CloudStackTemplateOptions.class) - .networks(Arrays.asList(iaasInfo.getProperty(CloudControllerConstants.NETWORK_IDS) - .split(CloudControllerConstants.ENTRY_SEPARATOR))); - } - - //set user name - if (iaasInfo.getProperty(CloudControllerConstants.USER_NAME) != null) { - template.getOptions().as(CloudStackTemplateOptions.class) - .account(iaasInfo.getProperty(CloudControllerConstants.USER_NAME)); - } - //set domain ID - if (iaasInfo.getProperty(CloudControllerConstants.DOMAIN_ID) != null) { - template.getOptions().as(CloudStackTemplateOptions.class) - .domainId(iaasInfo.getProperty(CloudControllerConstants.DOMAIN_ID)); - } - - /** - *Set key pair - * in cloudstack sometimes we get unauthorized exception if we didn't specify the - * domain ID and user name - */ - if (iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR) != null) { - template.getOptions().as(CloudStackTemplateOptions.class) - .keyPair(iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR)); - } - - // ability to define tags - if (iaasInfo.getProperty(CloudControllerConstants.TAGS) != null) { - template.getOptions() - .as(CloudStackTemplateOptions.class) - .tags(Arrays.asList(iaasInfo.getProperty(CloudControllerConstants.TAGS) - .split(CloudControllerConstants.ENTRY_SEPARATOR))); - } - //set disk offering to the instance - if (iaasInfo.getProperty(CloudControllerConstants.DISK_OFFERING) != null) { - template.getOptions() - .as(CloudStackTemplateOptions.class) - .diskOfferingId(iaasInfo.getProperty(CloudControllerConstants.DISK_OFFERING)); - } - - // set Template - iaasInfo.setTemplate(template); - } - - @Override - public void setDynamicPayload() { - IaasProvider iaasInfo = getIaasProvider(); - if (iaasInfo.getTemplate() != null && iaasInfo.getPayload() != null) { - iaasInfo.getTemplate().getOptions().as(CloudStackTemplateOptions.class) - .userMetadata(convertByteArrayToHashMap(iaasInfo.getPayload())); - } - } - - /** - * IMPORTANT - * In cloudstack we can assign public IPs, if we are using an advanced zone only. If we are using a basic zone - * we cannot assign public ips. - * <p/> - * When we use an advanced zone, a public IP address will get automatically assigned to the vm. So we don't need - * to find an unallocated IP address and assign that address to the vm. If you are using a basic zone you cannot - * assign public IPs - * <p/> - * So this method will find the IP that has been assigned to the vm and return it. - */ - @Override - public String associateAddress(NodeMetadata node) { - - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - String ip = null; - - // get all allocated IPs - ListPublicIPAddressesOptions listPublicIPAddressesOptions = new ListPublicIPAddressesOptions(); - listPublicIPAddressesOptions.zoneId(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE)); - - Set<PublicIPAddress> publicIPAddresses = cloudStackApi.getAddressApi() - .listPublicIPAddresses(listPublicIPAddressesOptions); - - String id = node.getProviderId(); //vm ID - - for (PublicIPAddress publicIPAddress : publicIPAddresses) { - if (publicIPAddress.getVirtualMachineId().equals(id)) { //check whether this instance has - // already got an public ip or not - ip = publicIPAddress.getIPAddress(); //A public ip has been successfully assigned to the vm - log.info("Successfully associated an IP address " + ip - + " for node with id: " + node.getId()); - break; - } - - } - - if (ip == null || ip.isEmpty()) { //IP has not been successfully assigned to VM(That means there are - // no more IPs available for the VM) - String msg = "No address associated for node with id: " + node.getId(); - log.warn(msg); - throw new CloudControllerException(msg); - } - - return ip; - } - - @Override - public String associatePredefinedAddress(NodeMetadata node, String ip) { - return ""; - } - - @Override - public void releaseAddress(String ip) { - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - cloudStackApi.getAddressApi().disassociateIPAddress(ip); - } - - @Override - public boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) { - - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - SshKeyPair sshKeyPair = cloudStackApi.getSSHKeyPairApi().createSSHKeyPair(keyPairName); - - if (sshKeyPair != null) { - - iaasInfo.getTemplate().getOptions().as(CloudStackTemplateOptions.class) - .keyPair(sshKeyPair.getName()); - - log.info("A key-pair is created successfully - Key Pair Name: " + sshKeyPair.getName()); - return true; - } - log.error("Key-pair is unable to create"); - return false; - } - - @Override - public boolean isValidRegion(String region) throws InvalidRegionException { - - IaasProvider iaasInfo = getIaasProvider(); - //no such method in Jclouds cloudstack api - String msg = "Invalid region: " + region + " in the iaas: " + iaasInfo.getType(); - log.error(msg); - throw new InvalidRegionException(msg); - } - - @Override - public boolean isValidZone(String region, String zone) throws InvalidZoneException { - - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - ListZonesOptions listZonesOptions = new ListZonesOptions(); - listZonesOptions.available(true); - Set<Zone> zoneSet = cloudStackApi.getZoneApi().listZones(listZonesOptions); - - for (org.jclouds.cloudstack.domain.Zone configuredZone : zoneSet) { - if (configuredZone.getName().equalsIgnoreCase(zone)) { - return true; - } - } - String msg = "Invalid zone: " + zone + " in the iaas: " + iaasInfo.getType(); - log.error(msg); - throw new InvalidZoneException(msg); - } - - @Override - public boolean isValidHost(String zone, String host) throws InvalidHostException { - - IaasProvider iaasInfo = getIaasProvider(); - // there's no such method in jclouds cloustack api - String msg = "Invalid host: " + host + " in the zone: " + zone + " and of the iaas: " + iaasInfo.getType(); - log.error(msg); - throw new InvalidHostException(msg); - - } - - @Override - public PartitionValidator getPartitionValidator() { - return new CloudstackPartitionValidator(); - } - - @Override - public String createVolume(int sizeGB, String snapshotId) { - - // Snapshot id is not there in IaaS.createVolume() method in stratos 4.0.0 - //todo return volume ID if volume is created - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - - String zone = ComputeServiceBuilderUtil.extractZone(iaasInfo); - String diskOfferingID = iaasInfo.getTemplate().getOptions().as(CloudStackTemplateOptions.class) - .getDiskOfferingId(); - if (zone == null && diskOfferingID == null) { - log.error("Could not create a volume in the , [zone] : " + zone + " of Iaas : " + iaasInfo); - return null; - } - - VolumeApi volumeApi = context.unwrapApi(CloudStackApi.class).getVolumeApi(); - - Volume volume; - if (StringUtils.isEmpty(snapshotId)) { - if (log.isInfoEnabled()) { - log.info("Creating a volume in the zone " + zone); - } - - //cloudstack jcloud api does not return a volume object - volumeApi.createVolumeFromCustomDiskOfferingInZone(null, diskOfferingID, zone, sizeGB); - - // volume = blockStoreApi.createVolumeInAvailabilityZone(zone, sizeGB); - } else { - if (log.isInfoEnabled()) { - log.info("Creating a volume in the zone " + zone + " from the snapshot " + snapshotId); - } - volumeApi.createVolumeFromSnapshotInZone(null, diskOfferingID, zone); - } - - return null; - } - - @Override - public String attachVolume(String instanceId, String volumeId, String deviceName) { - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - - //get volume - org.jclouds.cloudstack.domain.Volume volume = cloudStackApi.getVolumeApi().getVolume(volumeId); - - //get current volume state - Volume.State volumeState = volume.getState(); - - if (log.isDebugEnabled()) { - log.debug("Volume " + volumeId + " is in state " + volumeState); - } - - //if volume is not available, not allocated or cannot use - //volume state ALLOCATED means that volume has not been attached to any instance. - - //TODO there is an error with logic. - if (!(volumeState == Volume.State.ALLOCATED || volumeState == Volume.State.CREATING - || volumeState == Volume.State.READY)) { - log.error(String.format("Volume %s can not be attached. Volume status is %s", volumeId, volumeState)); - } - - //check whether the account of volume and instance is same - if (!volume.getAccount().equals(cloudStackApi.getVirtualMachineApi() - .getVirtualMachine(instanceId).getAccount())) { - log.error(String.format("Volume %s can not be attached. Instance account and Volume account " + - "are not the same ", volumeId)); - } - - boolean volumeBecameAvailable = false, volumeBecameAttached = false; - - try { - if (volumeState == Volume.State.CREATING) { - - volumeBecameAvailable = waitForStatus(volumeId, Volume.State.ALLOCATED, 5); - - } else if (volumeState == Volume.State.READY) { - volumeBecameAvailable = true; - } - - } catch (TimeoutException e) { - log.error("[Volume ID] " + volumeId + "did not become ALLOCATED within expected timeout"); - } - - //if volume state is 'ALLOCATED' - if (volumeBecameAvailable) { - - //attach volume into instance - cloudStackApi.getVolumeApi().attachVolume(volumeId, instanceId); - - try { - volumeBecameAttached = waitForStatus(volumeId, Volume.State.READY, 2); - } catch (TimeoutException e) { - log.error("[Volume ID] " + volumeId + "did not become READY within expected timeout"); - } - } - - try { - // waiting 5seconds till volumes are actually attached. - Thread.sleep(5000); - } catch (InterruptedException ignored) { - - } - - //If volume state is not 'READY' - if (!volumeBecameAttached) { - log.error(String.format("[Volume ID] %s attachment is called, but not yet became attached", volumeId)); - } - - log.info(String.format("Volume [id]: %s attachment for instance [id]: %s was successful [status]: Attaching." + - " of Iaas : %s", volumeId, instanceId, iaasInfo)); - - return "Attaching"; - - } - - @Override - public void detachVolume(String instanceId, String volumeId) { - - - IaasProvider iaasInfo = getIaasProvider(); - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - - if (log.isDebugEnabled()) { - log.debug(String.format("Starting to detach volume %s from the instance %s", volumeId, instanceId)); - } - - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - - cloudStackApi.getVolumeApi().detachVolume(volumeId); - - try { - //TODO this is true only for newly created volumes - if (waitForStatus(volumeId, Volume.State.ALLOCATED, 5)) { - log.info(String.format("Detachment of Volume [id]: %s from instance [id]: %s was successful of Iaas : %s", volumeId, instanceId, iaasInfo)); - } - } catch (TimeoutException e) { - log.error(String.format("Detachment of Volume [id]: %s from instance [id]: %s was unsuccessful. [volume Status] : %s", volumeId, instanceId, iaasInfo)); - } - - } - - @Override - public void deleteVolume(String volumeId) { - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - cloudStackApi.getVolumeApi().deleteVolume(volumeId); - log.info("Deletion of Volume [id]: " + volumeId + " was successful. " - + " of Iaas : " + iaasInfo); - } - - @Override - public String getIaasDevice(String device) {//todo implement this method(auto generated method) - return null; - } - - private boolean waitForStatus(String volumeId, Volume.State expectedStatus, int timeoutInMilliseconds) throws TimeoutException { - int timeout = 1000 * 60 * timeoutInMilliseconds; - long timout = System.currentTimeMillis() + timeout; - - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - CloudStackApi cloudStackApi = context.unwrapApi(CloudStackApi.class); - - //get volume - org.jclouds.cloudstack.domain.Volume volume = cloudStackApi.getVolumeApi().getVolume(volumeId); - - Volume.State volumeState = volume.getState(); - - while (volumeState != expectedStatus) { - try { - if (log.isDebugEnabled()) { - log.debug(String.format("Volume %s is still NOT in %s. Current State=%s", volumeId, expectedStatus, volumeState)); - } - if (volumeState == Volume.State.FAILED || volumeState == Volume.State.DESTROYED || volumeState == Volume.State.UNRECOGNIZED) { - log.error("Volume " + volumeId + " is in state" + volumeState); - return false; - } - - Thread.sleep(1000); - volumeState = volume.getState(); - if (System.currentTimeMillis() > timout) { - throw new TimeoutException(); - } - } catch (InterruptedException e) { - // Ignoring the exception - } - } - if (log.isDebugEnabled()) { - log.debug(String.format("Volume %s status became %s", volumeId, expectedStatus)); - } - - return true; - } - - private Map<String, String> convertByteArrayToHashMap(byte[] byteArray) { - - Map<String, String> map = new HashMap<String, String>(); - - String stringFromByteArray = new String(byteArray); - String[] keyValuePairs = stringFromByteArray.split(","); - - for (String keyValuePair : keyValuePairs) { - String[] keyValue = keyValuePair.split("="); - if (keyValue.length > 1) { - map.put(keyValue[0], keyValue[1]); - } - } - - return map; - } -} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java deleted file mode 100644 index 742aed2..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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.apache.stratos.cloud.controller.iaases; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.exception.CloudControllerException; -import org.apache.stratos.cloud.controller.exception.InvalidHostException; -import org.apache.stratos.cloud.controller.exception.InvalidRegionException; -import org.apache.stratos.cloud.controller.exception.InvalidZoneException; -import org.apache.stratos.cloud.controller.interfaces.Iaas; -import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil; -import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.validate.DockerPartitionValidator; -import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; -import org.jclouds.compute.ComputeService; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Template; - -import java.util.Set; - -/** - * Docker iaas provider definition. - */ -public class DockerIaas extends Iaas { - - private static final Log log = LogFactory.getLog(AWSEC2Iaas.class); - - public DockerIaas(IaasProvider iaasProvider) { - super(iaasProvider); - } - - @Override - public void buildComputeServiceAndTemplate() { - // builds and sets Compute Service - ComputeServiceBuilderUtil.buildDefaultComputeService(getIaasProvider()); - - // builds and sets Template - buildTemplate(); - } - - @Override - public void setDynamicPayload() { - log.warn("Not implemented: DockerIaas.setDynamicPayload()"); - } - - @Override - public String associateAddress(NodeMetadata node) { - log.warn("Not implemented: DockerIaas.associateAddress()"); - return null; - } - - @Override - public String associatePredefinedAddress(NodeMetadata node, String ip) { - log.warn("Not implemented: DockerIaas.associatePredefinedAddress()"); - return null; - } - - @Override - public void releaseAddress(String ip) { - log.warn("Not implemented: DockerIaas.releaseAddress()"); - } - - @Override - public boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) { - return false; - } - - @Override - public boolean isValidRegion(String region) throws InvalidRegionException { - return true; - } - - @Override - public boolean isValidZone(String region, String zone) throws InvalidZoneException { - return true; - } - - @Override - public boolean isValidHost(String zone, String host) throws InvalidHostException { - return true; - } - - @Override - public PartitionValidator getPartitionValidator() { - return new DockerPartitionValidator(); - } - - @Override - public void buildTemplate() { - IaasProvider iaasProvider = getIaasProvider(); - ComputeService computeService = iaasProvider.getComputeService(); - Set<? extends Image> images = computeService.listImages(); - Image image = findImage(images, iaasProvider.getImage()); - if(image == null) { - throw new CloudControllerException(String.format("Docker image not found: %s", iaasProvider.getImage())); - } - Template template = computeService.templateBuilder().fromImage(image).build(); - iaasProvider.setTemplate(template); - } - - private Image findImage(Set<? extends Image> images, String name) { - for(Image image : images) { - if(image.getDescription().contains(name)) - return image; - } - return null; - } - - @Override - public String createVolume(int sizeGB, String snapshotId) { - return null; - } - - @Override - public String attachVolume(String instanceId, String volumeId, String deviceName) { - return null; - } - - @Override - public void detachVolume(String instanceId, String volumeId) { - - } - - @Override - public void deleteVolume(String volumeId) { - - } - - @Override - public String getIaasDevice(String device) { - return null; - } -} http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java deleted file mode 100644 index 4fc4db4..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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.apache.stratos.cloud.controller.iaases; - -import java.util.*; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.exception.CloudControllerException; -import org.apache.stratos.cloud.controller.interfaces.Iaas; -import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil; -import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.pojo.NetworkInterface; -import org.apache.stratos.cloud.controller.validate.GCEPartitionValidator; -import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; -import org.apache.stratos.cloud.controller.exception.InvalidHostException; -import org.apache.stratos.cloud.controller.exception.InvalidRegionException; -import org.apache.stratos.cloud.controller.exception.InvalidZoneException; -import org.jclouds.ContextBuilder; -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.domain.Location; -import org.apache.stratos.cloud.controller.util.CloudControllerConstants; -import org.jclouds.collect.IterableWithMarker; -import org.jclouds.googlecomputeengine.GoogleComputeEngineApi; -import org.jclouds.googlecomputeengine.features.DiskApi; -import org.jclouds.googlecomputeengine.features.InstanceApi; -import org.jclouds.googlecomputeengine.features.RegionApi; -import org.jclouds.googlecomputeengine.features.ZoneApi; -import org.jclouds.googlecomputeengine.domain.Disk; -import org.jclouds.googlecomputeengine.domain.Instance; -import org.jclouds.googlecomputeengine.domain.Region; -import org.jclouds.googlecomputeengine.domain.Zone; -import org.jclouds.googlecomputeengine.domain.Operation; -import org.jclouds.googlecomputeengine.options.AttachDiskOptions; -import org.jclouds.googlecomputeengine.options.AttachDiskOptions.DiskType; -import com.google.inject.Key; -import com.google.inject.Injector; -import com.google.inject.TypeLiteral; -import com.google.inject.name.Names; -import static org.jclouds.util.Predicates2.retry; -import static java.util.concurrent.TimeUnit.SECONDS; -import com.google.common.base.Predicate; -import java.util.concurrent.atomic.AtomicReference; -import com.google.common.util.concurrent.Atomics; - -public class GCEIaas extends Iaas { - - - private static final Log log = LogFactory.getLog(GCEIaas.class); - - private static final String PROJECTNAME = "projectName"; - - public GCEIaas(IaasProvider iaasProvider) { - super(iaasProvider); - } - - @Override - public void buildComputeServiceAndTemplate() { - - IaasProvider iaasInfo = getIaasProvider(); - - // builds and sets Compute Service - ComputeServiceBuilderUtil.buildDefaultComputeService(iaasInfo); - - - // builds and sets Template - buildTemplate(); - - } - - public void buildTemplate() { - IaasProvider iaasInfo = getIaasProvider(); - - if (iaasInfo.getComputeService() == null) { - String msg = "Compute service is null for IaaS provider: " - + iaasInfo.getName(); - log.fatal(msg); - throw new CloudControllerException(msg); - } - - log.info("gce buildTemplate"); - - TemplateBuilder templateBuilder = iaasInfo.getComputeService() - .templateBuilder(); - - // set image id specified - templateBuilder.imageId(iaasInfo.getImage()); - - String zone = iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE); - if(zone != null) { - Set<? extends Location> locations = iaasInfo.getComputeService().listAssignableLocations(); - for(Location location : locations) { - if(location.getScope().toString().equalsIgnoreCase(CloudControllerConstants.ZONE_ELEMENT) && - location.getId().equals(zone)) { - templateBuilder.locationId(location.getId()); - log.info("ZONE has been set as " + zone - + " with id: " + location.getId()); - break; - } - } - } - - if (iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE) != null) { - // set instance type eg: m1.large - templateBuilder.hardwareId(iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE)); - } - - // build the Template - Template template = templateBuilder.build(); - - if(zone != null) { - if(!template.getLocation().getId().equals(zone)) { - log.warn("couldn't find assignable ZONE of id :" + zone + - " in the IaaS. Hence using the default location as " + template.getLocation().getScope().toString() + - " with the id " + template.getLocation().getId()); - } - } - - // if you wish to auto assign IPs, instance spawning call should be - // blocking, but if you - // wish to assign IPs manually, it can be non-blocking. - // is auto-assign-ip mode or manual-assign-ip mode? - default mode is - // non-blocking - boolean blockUntilRunning = Boolean.parseBoolean(iaasInfo - .getProperty("autoAssignIp")); - template.getOptions().as(TemplateOptions.class) - .blockUntilRunning(blockUntilRunning); - - // this is required in order to avoid creation of additional security - // groups by Jclouds. - template.getOptions().as(TemplateOptions.class) - .inboundPorts(22, 80, 8080, 443, 8243); - - if (zone != null) { - templateBuilder.locationId(zone); - log.debug("setting location to " + zone); - } - - // ability to define tags with Key-value pairs - Map<String, String> keyValuePairTagsMap = new HashMap<String, String>(); - - for (String propertyKey : iaasInfo.getProperties().keySet()){ - if(propertyKey.startsWith(CloudControllerConstants.TAGS_AS_KEY_VALUE_PAIRS_PREFIX)) { - keyValuePairTagsMap.put(propertyKey.substring(CloudControllerConstants.TAGS_AS_KEY_VALUE_PAIRS_PREFIX.length()), - iaasInfo.getProperties().get(propertyKey)); - template.getOptions() - .userMetadata(keyValuePairTagsMap); - } - log.info("usermeta data key:"+ propertyKey + " value: " + iaasInfo.getProperties().get(propertyKey)); - } - - if (iaasInfo.getNetworkInterfaces() != null) { - List<String> networks = new ArrayList<String>(iaasInfo.getNetworkInterfaces().length); - for (NetworkInterface ni:iaasInfo.getNetworkInterfaces()) { - networks.add(ni.getNetworkUuid()); - log.info("using network interface " + ni.getNetworkUuid()); - } - template.getOptions().as(TemplateOptions.class).networks(networks); - log.info("using network interface " + networks); - } - - // set Template - iaasInfo.setTemplate(template); - } - - @Override - public void setDynamicPayload() { - // in vCloud case we need to run a script - IaasProvider iaasInfo = getIaasProvider(); - - if (iaasInfo.getTemplate() == null || iaasInfo.getPayload() == null) { - if (log.isDebugEnabled()) { - log.debug("Payload for GCE not found"); - } - return; - } - - // Payload is a String value - String payload = new String(iaasInfo.getPayload()); - - log.info("setDynamicPayload " + payload); - - Map<String, String> keyValuePairTagsMap = new HashMap<String, String>(); - keyValuePairTagsMap.put("stratos_usermetadata", payload); - iaasInfo.getTemplate().getOptions().userMetadata(keyValuePairTagsMap); - } - - @Override - public boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) { - - // Not applicable for GCE - Not called by stratos cloud controller as well - return false; - } - - @Override - public String associateAddress(NodeMetadata node) { - - // TODO - return ""; - - } - - @Override - public String associatePredefinedAddress(NodeMetadata node, String ip) { - return ""; - } - - @Override - public void releaseAddress(String ip) { - // TODO - } - - @Override - public boolean isValidRegion(String region) throws InvalidRegionException { - IaasProvider iaasInfo = getIaasProvider(); - - if (region == null || iaasInfo == null) { - String msg = "Region or IaaSProvider is null: region: " + region + " - IaaSProvider: " + iaasInfo; - log.error(msg); - throw new InvalidRegionException(msg); - } - - GoogleComputeEngineApi api = getGCEApi(); - RegionApi regionApi = api.getRegionApiForProject(iaasInfo.getProperty(PROJECTNAME)); - - for(IterableWithMarker<Region> page : regionApi.list()) { - for(Region r : page) { - if (region.equalsIgnoreCase(r.getName())) { - log.debug("Found a matching region: " + region); - return true; - } - } - } - - String msg = "Invalid region: " + region +" in the iaas: "+iaasInfo.getType(); - log.error(msg); - throw new InvalidRegionException(msg); - } - - @Override - public boolean isValidZone(String region, String zone) throws InvalidZoneException { - IaasProvider iaasInfo = getIaasProvider(); - - if (zone == null || iaasInfo == null) { - String msg = "Zone or IaaSProvider is null: region: " + region + - " zone: " + zone + " - IaaSProvider: " + iaasInfo; - log.error(msg); - throw new InvalidZoneException(msg); - } - - GoogleComputeEngineApi api = getGCEApi(); - ZoneApi zoneApi = api.getZoneApiForProject(iaasInfo.getProperty(PROJECTNAME)); - - for(IterableWithMarker<Zone> page : zoneApi.list()) { - for(Zone z : page) { - if (zone.equalsIgnoreCase(z.getName())) { - log.debug("Found a matching zone: " + zone); - return true; - } - } - } - - String msg = "Invalid zone: " + zone + " in the region: " + region + " and of the iaas: " + iaasInfo.getType(); - log.error(msg); - throw new InvalidZoneException(msg); - } - - @Override - public boolean isValidHost(String zone, String host) throws InvalidHostException { - IaasProvider iaasInfo = getIaasProvider(); - - // Not called by cloud controller - // there's no such concept in GCE - - String msg = "Invalid host: " + host + " in the zone: " + zone + " and of the iaas: " + iaasInfo.getType(); - log.error(msg); - throw new InvalidHostException(msg); - } - - @Override - public PartitionValidator getPartitionValidator() { - return new GCEPartitionValidator(); - } - - @Override - public String createVolume(int sizeGB, String snapshotId) { - // generate a random diskname - Random rand = new Random(); - String diskName = "stratos-disk-" + rand.nextInt(100000); - DiskApi diskApi = getGCEDiskApi(); - String zone = getZone(); - - log.debug("Creating volume: " + diskName + " in zone: " + zone + " of size: " + sizeGB); - - Operation oper = diskApi.createInZone(diskName, sizeGB, zone); - - oper = waitGCEOperationDone(oper); - if (oper.getStatus() != Operation.Status.DONE) { - log.error("Failed to create volume: " + diskName + " of size: " + sizeGB + - " in zone: " + zone + " operation: " + oper); - return null; - } - - return diskName; - } - - @Override - public String attachVolume(String instanceId, String volumeId, String deviceName) { - DiskApi diskApi = getGCEDiskApi(); - InstanceApi instApi = getGCEInstanceApi(); - String zone = getZone(); - - log.debug("Trying to attach volume: " + volumeId + " to instance: " + instanceId + - " in zone: " + zone + " at devicename: " + deviceName); - - Disk disk = diskApi.getInZone(zone, volumeId); - if (disk == null) { - log.error("Failed to get volume: " + volumeId + " in zone: " + zone); - return null; - } - - log.debug("Found volumeId: " + volumeId + " volume: " + disk); - - Operation oper = instApi.attachDiskInZone(zone, instanceId, - new AttachDiskOptions().type(DiskType.PERSISTENT) - .source(disk.getSelfLink()) - .mode(AttachDiskOptions.DiskMode.READ_WRITE) - .deviceName(deviceName)); - oper = waitGCEOperationDone(oper); - if (oper.getStatus() != Operation.Status.DONE) { - log.error("Failed to attach volume: " + volumeId + " to instance: " + instanceId + - " in zone: " + zone + " at device: " + deviceName + " operation: " + oper); - return null; - } - - return volumeId; - } - - @Override - public void detachVolume(String instanceId, String volumeId) { - InstanceApi instApi = getGCEInstanceApi(); - String zone = getZone(); - Instance inst = instApi.getInZone(zone, instanceId); - - log.debug("Trying to detach volume: " + volumeId + " from instance: " + instanceId + - " " + inst + " in zone: " + zone); - - if (inst == null) { - log.error("Failed to find instance: " + instanceId + " in zone: " + zone); - return; - } - - for(Instance.AttachedDisk disk : inst.getDisks()) { - Instance.PersistentAttachedDisk persistentDisk = (Instance.PersistentAttachedDisk)disk; - - log.debug("Found disk - src: " + persistentDisk.getSourceDiskName() + - " devicename: " + persistentDisk.getDeviceName()); - - if (persistentDisk.getSourceDiskName().equals(volumeId)) { - Operation oper = instApi.detachDiskInZone(zone, instanceId, persistentDisk.getDeviceName().get()); - oper = waitGCEOperationDone(oper); - if (oper.getStatus() != Operation.Status.DONE) { - log.error("Failed to detach volume: " + volumeId + " to instance: " + instanceId + - " in zone: " + zone + " at device: " + persistentDisk.getDeviceName() + - " result operation: " + oper); - } - return; - } - } - - log.error("Cannot find volume: " + volumeId + " in instance: " + instanceId); - } - - @Override - public void deleteVolume(String volumeId) { - DiskApi diskApi = getGCEDiskApi(); - String zone = getZone(); - - log.debug("Deleting volume: " + volumeId + " in zone: " + zone); - - Operation oper = diskApi.deleteInZone(zone, volumeId); - - oper = waitGCEOperationDone(oper); - if (oper.getStatus() != Operation.Status.DONE) { - log.error("Failed to delete volume: " + volumeId + " in zone: " + zone + - " operation: " + oper); - } - } - - @Override - public String getIaasDevice(String device) { - return device; - } - - private String getZone() { - IaasProvider iaasInfo = getIaasProvider(); - return iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE); - } - - private GoogleComputeEngineApi getGCEApi() { - IaasProvider iaasInfo = getIaasProvider(); - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - GoogleComputeEngineApi api = context.unwrapApi(GoogleComputeEngineApi.class); - - return api; - } - - private DiskApi getGCEDiskApi() { - IaasProvider iaasInfo = getIaasProvider(); - String projectName = iaasInfo.getProperty(PROJECTNAME); - return getGCEApi().getDiskApiForProject(projectName); - } - - private InstanceApi getGCEInstanceApi() { - IaasProvider iaasInfo = getIaasProvider(); - String projectName = iaasInfo.getProperty(PROJECTNAME); - return getGCEApi().getInstanceApiForProject(projectName); - } - - private Operation waitGCEOperationDone(Operation operation) { - int maxWaitTime = 15; // 15 seconds - IaasProvider iaasInfo = getIaasProvider(); - Injector injector = ContextBuilder.newBuilder(iaasInfo.getProvider()) - .credentials(iaasInfo.getIdentity(), iaasInfo.getCredential()) - .buildInjector(); - Predicate<AtomicReference<Operation>> zoneOperationDonePredicate = - injector.getInstance(Key.get(new TypeLiteral<Predicate<AtomicReference<Operation>>>() { - }, Names.named("zone"))); - AtomicReference<Operation> operationReference = Atomics.newReference(operation); - retry(zoneOperationDonePredicate, maxWaitTime, 1, SECONDS).apply(operationReference); - - return operationReference.get(); - } -} - http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java deleted file mode 100644 index 7349d73..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java +++ /dev/null @@ -1,741 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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.apache.stratos.cloud.controller.iaases; - -import com.google.common.base.Optional; -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.exception.CloudControllerException; -import org.apache.stratos.cloud.controller.exception.InvalidHostException; -import org.apache.stratos.cloud.controller.exception.InvalidRegionException; -import org.apache.stratos.cloud.controller.exception.InvalidZoneException; -import org.apache.stratos.cloud.controller.interfaces.Iaas; -import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil; -import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.pojo.NetworkInterface; -import org.apache.stratos.cloud.controller.util.CloudControllerConstants; -import org.apache.stratos.cloud.controller.util.CloudControllerUtil; -import org.apache.stratos.cloud.controller.validate.OpenstackNovaPartitionValidator; -import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; -import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeMetadataBuilder; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.openstack.nova.v2_0.NovaApi; -import org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions; -import org.jclouds.openstack.nova.v2_0.domain.FloatingIP; -import org.jclouds.openstack.nova.v2_0.domain.HostAggregate; -import org.jclouds.openstack.nova.v2_0.domain.KeyPair; -import org.jclouds.openstack.nova.v2_0.domain.Network; -import org.jclouds.openstack.nova.v2_0.domain.Volume; -import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment; -import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone; -import org.jclouds.openstack.nova.v2_0.extensions.AvailabilityZoneApi; -import org.jclouds.openstack.nova.v2_0.extensions.FloatingIPApi; -import org.jclouds.openstack.nova.v2_0.extensions.HostAggregateApi; -import org.jclouds.openstack.nova.v2_0.extensions.KeyPairApi; -import org.jclouds.openstack.nova.v2_0.extensions.VolumeApi; -import org.jclouds.openstack.nova.v2_0.extensions.VolumeAttachmentApi; -import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Set; -import java.util.concurrent.TimeoutException; - -public class OpenstackNovaIaas extends Iaas { - - private static final Log log = LogFactory.getLog(OpenstackNovaIaas.class); - private static final String SUCCESSFUL_LOG_LINE = "A key-pair is created successfully in "; - private static final String FAILED_LOG_LINE = "Key-pair is unable to create in "; - - public OpenstackNovaIaas(IaasProvider iaasProvider) { - super(iaasProvider); - } - - @Override - public void buildComputeServiceAndTemplate() { - - IaasProvider iaasInfo = getIaasProvider(); - - // builds and sets Compute Service - ComputeServiceBuilderUtil.buildDefaultComputeService(iaasInfo); - - // builds and sets Template - buildTemplate(); - - } - - public void buildTemplate() { - IaasProvider iaasInfo = getIaasProvider(); - - if (iaasInfo.getComputeService() == null) { - throw new CloudControllerException( - "Compute service is null for IaaS provider: " - + iaasInfo.getName()); - } - - TemplateBuilder templateBuilder = iaasInfo.getComputeService() - .templateBuilder(); - templateBuilder.imageId(iaasInfo.getImage()); - if(!(iaasInfo instanceof IaasProvider)) { - templateBuilder.locationId(iaasInfo.getType()); - } - - // to avoid creation of template objects in each and every time, we - // create all at once! - - String instanceType; - - // set instance type - if (((instanceType = iaasInfo.getProperty(CloudControllerConstants.INSTANCE_TYPE)) != null)) { - - templateBuilder.hardwareId(instanceType); - } - - Template template = templateBuilder.build(); - - // In Openstack the call to IaaS should be blocking, in order to retrieve - // IP addresses. - boolean blockUntilRunning = true; - if(iaasInfo.getProperty(CloudControllerConstants.BLOCK_UNTIL_RUNNING) != null) { - blockUntilRunning = Boolean.parseBoolean(iaasInfo.getProperty( - CloudControllerConstants.BLOCK_UNTIL_RUNNING)); - } - template.getOptions().as(TemplateOptions.class) - .blockUntilRunning(blockUntilRunning); - - // this is required in order to avoid creation of additional security - // groups by Jclouds. - template.getOptions().as(TemplateOptions.class) - .inboundPorts(new int[] {}); - - if (iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUPS) != null) { - template.getOptions() - .as(NovaTemplateOptions.class) - .securityGroupNames( - iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUPS).split( - CloudControllerConstants.ENTRY_SEPARATOR)); - } - - if (iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR) != null) { - template.getOptions().as(NovaTemplateOptions.class) - .keyPairName(iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR)); - } - - if (iaasInfo.getNetworkInterfaces() != null) { - Set<Network> novaNetworksSet = new LinkedHashSet<Network>(iaasInfo.getNetworkInterfaces().length); - for (NetworkInterface ni:iaasInfo.getNetworkInterfaces()) { - novaNetworksSet.add(Network.builder().networkUuid(ni.getNetworkUuid()).fixedIp(ni.getFixedIp()) - .portUuid(ni.getPortUuid()).build()); - } - template.getOptions().as(NovaTemplateOptions.class).novaNetworks(novaNetworksSet); - } - - if (iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE) != null) { - template.getOptions().as(NovaTemplateOptions.class) - .availabilityZone(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE)); - } - - //TODO -// if (iaas.getProperty(CloudControllerConstants.HOST) != null) { -// template.getOptions().as(NovaTemplateOptions.class) -// .(CloudControllerConstants.HOST); -// } - - // set Template - iaasInfo.setTemplate(template); - } - - @Override - public void setDynamicPayload() { - - IaasProvider iaasInfo = getIaasProvider(); - - if (iaasInfo.getTemplate() != null && iaasInfo.getPayload() != null) { - - iaasInfo.getTemplate().getOptions().as(NovaTemplateOptions.class) - .userData(iaasInfo.getPayload()); - } - - } - - @Override - public synchronized boolean createKeyPairFromPublicKey(String region, String keyPairName, - String publicKey) { - - IaasProvider iaasInfo = getIaasProvider(); - - String openstackNovaMsg = " Openstack-nova. Region: " + region - + " - Name: "; - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - NovaApi novaApi = context.unwrapApi(NovaApi.class); - KeyPairApi api = novaApi.getKeyPairExtensionForZone(region).get(); - - KeyPair keyPair = api.createWithPublicKey(keyPairName, publicKey); - - if (keyPair != null) { - - iaasInfo.getTemplate().getOptions().as(NovaTemplateOptions.class) - .keyPairName(keyPair.getName()); - - log.info(SUCCESSFUL_LOG_LINE + openstackNovaMsg + keyPair.getName()); - return true; - } - - log.error(FAILED_LOG_LINE + openstackNovaMsg); - return false; - - } - - @Override - public synchronized String associateAddress(NodeMetadata node) { - - IaasProvider iaasInfo = getIaasProvider(); - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - - NovaApi novaApi = context.unwrapApi(NovaApi.class); - FloatingIPApi floatingIp = novaApi.getFloatingIPExtensionForZone( - region).get(); - - String ip = null; - // first try to find an unassigned IP. - ArrayList<FloatingIP> unassignedIps = Lists.newArrayList(Iterables - .filter(floatingIp.list(), - new Predicate<FloatingIP>() { - - @Override - public boolean apply(FloatingIP arg0) { - return arg0.getInstanceId() == null; - } - - })); - - if (!unassignedIps.isEmpty()) { - // try to prevent multiple parallel launches from choosing the same - // ip. - Collections.shuffle(unassignedIps); - ip = Iterables.getLast(unassignedIps).getIp(); - } - - // if no unassigned IP is available, we'll try to allocate an IP. - if (ip == null || ip.isEmpty()) { - String defaultFloatingIpPool = iaasInfo.getProperty(CloudControllerConstants.DEFAULT_FLOATING_IP_POOL); - FloatingIP allocatedFloatingIP; - if ((defaultFloatingIpPool == null) || "".equals(defaultFloatingIpPool)) { - allocatedFloatingIP = floatingIp.create(); - } else { - allocatedFloatingIP = floatingIp.allocateFromPool(defaultFloatingIpPool); - } - if (allocatedFloatingIP == null) { - String msg = "Failed to allocate an IP address."; - log.error(msg); - throw new CloudControllerException(msg); - } - ip = allocatedFloatingIP.getIp(); - } - - // wait till the fixed IP address gets assigned - this is needed before - // we associate a public IP - while (node.getPrivateAddresses() == null) { - CloudControllerUtil.sleep(1000); - } - - if (node.getPublicAddresses() != null - && node.getPublicAddresses().iterator().hasNext()) { - log.info("A public IP (" - + node.getPublicAddresses().iterator().next() - + ") is already allocated to the instance [id] : " - + node.getId()); - return null; - } - - int retries = 0; - //TODO make 5 configurable - while (retries < 5 - && !associateIp(floatingIp, ip, node.getProviderId())) { - - // wait for 5s - CloudControllerUtil.sleep(5000); - retries++; - } - - log.info("Successfully associated an IP address " + ip - + " for node with id: " + node.getId()); - - return ip; - } - - @Override - public synchronized String associatePredefinedAddress (NodeMetadata node, String ip) { - if(log.isDebugEnabled()) { - log.debug("OpenstackNovaIaas:associatePredefinedAddress:ip:" + ip); - } - - IaasProvider iaasInfo = getIaasProvider(); - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - - FloatingIPApi floatingIp = context.unwrapApi(NovaApi.class).getFloatingIPExtensionForZone( - region).get(); - - if(log.isDebugEnabled()) { - log.debug("OpenstackNovaIaas:associatePredefinedAddress:floatingip:" + floatingIp); - } - - // get the list of all unassigned IP. - ArrayList<FloatingIP> unassignedIps = Lists.newArrayList(Iterables - .filter(floatingIp.list(), - new Predicate<FloatingIP>() { - - @Override - public boolean apply(FloatingIP arg0) { - // FIXME is this the correct filter? - return arg0.getFixedIp() == null; - } - - })); - - boolean isAvailable = false; - for (FloatingIP fip : unassignedIps) { - if(log.isDebugEnabled()) { - log.debug("OpenstackNovaIaas:associatePredefinedAddress:iterating over available floatingip:" + fip); - } - if (ip.equals(fip.getIp())) { - if(log.isDebugEnabled()) { - log.debug(String.format("OpenstackNovaIaas:associatePredefinedAddress:floating ip in use:%s /ip:%s", fip, ip)); - } - isAvailable = true; - break; - } - } - - if (isAvailable) { - // assign ip - if(log.isDebugEnabled()) { - log.debug("OpenstackNovaIaas:associatePredefinedAddress:assign floating ip:" + ip); - } - // exercise same code as in associateAddress() - // wait till the fixed IP address gets assigned - this is needed before - // we associate a public IP - - while (node.getPrivateAddresses() == null) { - CloudControllerUtil.sleep(1000); - } - - int retries = 0; - while (retries < 5 - && !associateIp(floatingIp, ip, node.getProviderId())) { - - // wait for 5s - CloudControllerUtil.sleep(5000); - retries++; - } - - NodeMetadataBuilder.fromNodeMetadata(node) - .publicAddresses(ImmutableSet.of(ip)).build(); - - log.info("OpenstackNovaIaas:associatePredefinedAddress:Successfully associated an IP address " + ip - + " for node with id: " + node.getId()); - } else { - // unable to allocate predefined ip, - log.info("OpenstackNovaIaas:associatePredefinedAddress:Unable to allocate predefined ip:" - + " for node with id: " + node.getId()); - return ""; - } - - - NodeMetadataBuilder.fromNodeMetadata(node) - .publicAddresses(ImmutableSet.of(ip)).build(); - - log.info("OpenstackNovaIaas:associatePredefinedAddress::Successfully associated an IP address " + ip - + " for node with id: " + node.getId()); - - return ip; - - } - - @Override - public synchronized void releaseAddress(String ip) { - - IaasProvider iaasInfo = getIaasProvider(); - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - - NovaApi novaApi = context.unwrapApi(NovaApi.class); - FloatingIPApi floatingIPApi = novaApi.getFloatingIPExtensionForZone(region).get(); - - for (FloatingIP floatingIP : floatingIPApi.list()) { - if (floatingIP.getIp().equals(ip)) { - floatingIPApi.delete(floatingIP.getId()); - break; - } - } - - } - - private boolean associateIp(FloatingIPApi api, String ip, String id) { - try { - api.addToServer(ip, id); - return true; - } catch (RuntimeException ex) { - return false; - } - } - - @Override - public boolean isValidRegion(String region) throws InvalidRegionException { - IaasProvider iaasInfo = getIaasProvider(); - - // jclouds' zone = region in openstack - if (region == null || iaasInfo == null) { - String msg = - "Region or IaaSProvider is null: region: " + region + " - IaaSProvider: " + - iaasInfo; - log.error(msg); - throw new InvalidRegionException(msg); - } - - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - NovaApi novaApi = context.unwrapApi(NovaApi.class); - Set<String> zones = novaApi.getConfiguredZones(); - for (String configuredZone : zones) { - if (region.equalsIgnoreCase(configuredZone)) { - if (log.isDebugEnabled()) { - log.debug("Found a matching region: " + region); - } - return true; - } - } - - String msg = "Invalid region: " + region +" in the iaas: "+iaasInfo.getType(); - log.error(msg); - throw new InvalidRegionException(msg); - } - - @Override - public boolean isValidZone(String region, String zone) throws InvalidZoneException { - IaasProvider iaasInfo = getIaasProvider(); - - // jclouds availability zone = stratos zone - if (region == null || zone == null || iaasInfo == null) { - String msg = "Host or Zone or IaaSProvider is null: region: " + region + " - zone: " + - zone + " - IaaSProvider: " + iaasInfo; - log.error(msg); - throw new InvalidZoneException(msg); - } - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - NovaApi novaApi = context.unwrapApi(NovaApi.class); - Optional<? extends AvailabilityZoneApi> availabilityZoneApi = novaApi.getAvailabilityZoneApi(region); - for (AvailabilityZone z : availabilityZoneApi.get().list()) { - - if (zone.equalsIgnoreCase(z.getName())) { - if (log.isDebugEnabled()) { - log.debug("Found a matching availability zone: " + zone); - } - return true; - } - } - - String msg = "Invalid zone: " + zone +" in the region: "+region+ " and of the iaas: "+iaasInfo.getType(); - log.error(msg); - throw new InvalidZoneException(msg); - - } - - @Override - public boolean isValidHost(String zone, String host) throws InvalidHostException { - IaasProvider iaasInfo = getIaasProvider(); - - if (host == null || zone == null || iaasInfo == null) { - String msg = String.format("Host or Zone or IaaSProvider is null: host: %s - zone: %s - IaaSProvider: %s", host, zone, iaasInfo); - log.error(msg); - throw new InvalidHostException(msg); - } - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - NovaApi novaApi = context.unwrapApi(NovaApi.class); - HostAggregateApi hostApi = novaApi.getHostAggregateExtensionForZone(zone).get(); - for (HostAggregate hostAggregate : hostApi.list()) { - for (String configuredHost : hostAggregate.getHosts()) { - if (host.equalsIgnoreCase(configuredHost)) { - if (log.isDebugEnabled()) { - log.debug("Found a matching host: " + host); - } - return true; - } - } - } - - String msg = String.format("Invalid host: %s in the zone: %s and of the iaas: %s", host, zone, iaasInfo.getType()); - log.error(msg); - throw new InvalidHostException(msg); - } - - @Override - public PartitionValidator getPartitionValidator() { - return new OpenstackNovaPartitionValidator(); - } - - @Override - public String createVolume(int sizeGB, String snapshotId) { - IaasProvider iaasInfo = getIaasProvider(); - - if (iaasInfo == null) { - log.fatal(String.format("Cannot create a new volume with snapshot ID : %s", snapshotId)); - return null; - } - - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - String zone = ComputeServiceBuilderUtil.extractZone(iaasInfo); - - if (region == null) { - log.fatal(String.format("Cannot create a new volume. Extracted region is null for Iaas : %s", iaasInfo)); - return null; - } - ComputeServiceContext context = iaasInfo.getComputeService().getContext(); - - NovaApi novaApi = context.unwrapApi(NovaApi.class); - VolumeApi volumeApi = novaApi.getVolumeExtensionForZone(region).get(); - Volume volume; - if(StringUtils.isEmpty(snapshotId)){ - if(log.isDebugEnabled()){ - log.info("Creating a volume in the zone " + zone); - } - volume = volumeApi.create(sizeGB, CreateVolumeOptions.Builder.availabilityZone(zone)); - }else{ - if(log.isDebugEnabled()){ - log.info("Creating a volume in the zone " + zone + " from the shanpshot " + snapshotId); - } - volume = volumeApi.create(sizeGB, CreateVolumeOptions.Builder.availabilityZone(zone).snapshotId(snapshotId)); - } - - if (volume == null) { - log.fatal(String.format("Volume creation was unsuccessful. [region] : %s [zone] : %s of Iaas : %s", region, zone, iaasInfo)); - return null; - } - - String volumeId = volume.getId(); - /* - Volume.Status volumeStatus = this.getVolumeStatus(volumeApi, volumeId); - - if(!(volumeStatus == Volume.Status.AVAILABLE || volumeStatus == Volume.Status.CREATING)){ - log.error(String.format("Error while creating [volume id] %s. Volume status is %s", volumeId, volumeStatus)); - return volumeId; - } - try { - if(!waitForStatus(volumeApi, volumeId, Volume.Status.AVAILABLE)){ - log.error("Volume did not become AVAILABLE. Current status is " + volume.getStatus()); - } - } catch (TimeoutException e) { - log.error("[Volume ID] " + volumeId + "did not become AVAILABLE within expected timeout"); - return volumeId; - } - */ - log.info(String.format("Successfully created a new volume [id]: %s in [region] : %s [zone] : %s of Iaas : %s [Volume ID]%s", volume.getId(), region, zone, iaasInfo, volume.getId())); - return volumeId; - } - - private boolean waitForStatus(String volumeId, Volume.Status expectedStatus, int timeoutInMins) throws TimeoutException { - int timeout = 1000 * 60 * timeoutInMins; - long timout = System.currentTimeMillis() + timeout; - - IaasProvider iaasInfo = getIaasProvider(); - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - ComputeServiceContext context = iaasInfo.getComputeService().getContext();; - NovaApi novaApi = context.unwrapApi(NovaApi.class); - VolumeApi volumeApi = novaApi.getVolumeExtensionForZone(region).get(); - Volume.Status volumeStatus = this.getVolumeStatus(volumeApi, volumeId); - - while(volumeStatus != expectedStatus){ - try { - if(log.isDebugEnabled()){ - log.debug(String.format("Volume %s is still NOT in %s. Current State=%s", volumeId, expectedStatus, volumeStatus)); - } - if(volumeStatus == Volume.Status.ERROR){ - log.error("Volume " + volumeId + " is in state ERROR"); - return false; - } - Thread.sleep(1000); - volumeStatus = this.getVolumeStatus(volumeApi, volumeId); - if (System.currentTimeMillis()> timout) { - throw new TimeoutException(); - } - } catch (InterruptedException e) { - // Ignoring the exception - } - } - if(log.isDebugEnabled()){ - log.debug(String.format("Volume %s status became %s", volumeId, expectedStatus)); - } - - return true; - } - - @Override - public String attachVolume(String instanceId, String volumeId, String deviceName) { - IaasProvider iaasInfo = getIaasProvider(); - - if (StringUtils.isEmpty(volumeId)) { - log.error("Volume provided to attach can not be null"); - } - - if (StringUtils.isEmpty(instanceId)) { - log.error("Instance provided to attach can not be null"); - } - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - String device = deviceName == null ? "/dev/vdc" : deviceName; - - if (region == null) { - log.fatal(String.format("Cannot attach the volume [id]: %s. Extracted region is null for Iaas : %s", volumeId, iaasInfo)); - return null; - } - - NovaApi novaApi = context.unwrapApi(NovaApi.class); - VolumeApi volumeApi = novaApi.getVolumeExtensionForZone(region).get(); - VolumeAttachmentApi volumeAttachmentApi = novaApi.getVolumeAttachmentExtensionForZone(region).get(); - - Volume.Status volumeStatus = this.getVolumeStatus(volumeApi, volumeId); - - if (log.isDebugEnabled()) { - log.debug("Volume " + volumeId + " is in state " + volumeStatus); - } - - if (!(volumeStatus == Volume.Status.AVAILABLE || volumeStatus == Volume.Status.CREATING)) { - log.error(String.format("Volume %s can not be attached. Volume status is %s", volumeId, volumeStatus)); - return null; - } - - boolean volumeBecameAvailable = false, volumeBecameAttached = false; - try { - volumeBecameAvailable = waitForStatus(volumeId, Volume.Status.AVAILABLE, 5); - } catch (TimeoutException e) { - log.error("[Volume ID] " + volumeId + "did not become AVAILABLE within expected timeout"); - } - - VolumeAttachment attachment = null; - if (volumeBecameAvailable) { - attachment = volumeAttachmentApi.attachVolumeToServerAsDevice(volumeId, instanceId, device); - - try { - volumeBecameAttached = waitForStatus(volumeId, Volume.Status.IN_USE, 2); - } catch (TimeoutException e) { - log.error("[Volume ID] " + volumeId + "did not become IN_USE within expected timeout"); - } - } - try { - // waiting 5seconds till volumes are actually attached. - Thread.sleep(5000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - if (attachment == null) { - log.fatal(String.format("Volume [id]: %s attachment for instance [id]: %s was unsuccessful. [region] : %s of Iaas : %s", volumeId, instanceId, region, iaasInfo)); - return null; - } - - if(! volumeBecameAttached){ - log.error(String.format("[Volume ID] %s attachment is called, but not yet became attached", volumeId)); - } - - log.info(String.format("Volume [id]: %s attachment for instance [id]: %s was successful [status]: Attaching. [region] : %s of Iaas : %s", volumeId, instanceId, region, iaasInfo)); - return "Attaching"; - } - - @Override - public void detachVolume(String instanceId, String volumeId) { - IaasProvider iaasInfo = getIaasProvider(); - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - - if(region == null) { - log.fatal(String.format("Cannot detach the volume [id]: %s from the instance [id]: %s. Extracted region is null for Iaas : %s", volumeId, instanceId, iaasInfo)); - return; - } - if(log.isDebugEnabled()) { - log.debug(String.format("Starting to detach volume %s from the instance %s", volumeId, instanceId)); - } - - NovaApi novaApi = context.unwrapApi(NovaApi.class); - VolumeAttachmentApi api = novaApi.getVolumeAttachmentExtensionForZone(region).get(); - if (api.detachVolumeFromServer(volumeId, instanceId)) { - log.info(String.format("Detachment of Volume [id]: %s from instance [id]: %s was successful. [region] : %s of Iaas : %s", volumeId, instanceId, region, iaasInfo)); - }else{ - log.error(String.format("Detachment of Volume [id]: %s from instance [id]: %s was unsuccessful. [volume Status] : %s", volumeId, instanceId, region, iaasInfo)); - } - - } - - @Override - public void deleteVolume(String volumeId) { - IaasProvider iaasInfo = getIaasProvider(); - - ComputeServiceContext context = iaasInfo.getComputeService() - .getContext(); - - String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo); - - if(region == null) { - log.fatal(String.format("Cannot delete the volume [id]: %s. Extracted region is null for Iaas : %s", volumeId, iaasInfo)); - return; - } - - NovaApi novaApi = context.unwrapApi(NovaApi.class); - VolumeApi api = novaApi.getVolumeExtensionForZone(region).get(); - if (api.delete(volumeId)) { - log.info(String.format("Deletion of Volume [id]: %s was successful. [region] : %s of Iaas : %s", volumeId, region, iaasInfo)); - } - } - - @Override - public String getIaasDevice(String device) { - return device; - } - - private Volume.Status getVolumeStatus(VolumeApi volumeApi, String volumeId){ - return volumeApi.get(volumeId).getStatus(); - } -} http://git-wip-us.apache.org/repos/asf/stratos/blob/8c359dc1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java deleted file mode 100644 index adf0a5e..0000000 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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.apache.stratos.cloud.controller.iaases; - -import org.apache.commons.io.FileUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.apache.stratos.cloud.controller.exception.CloudControllerException; -import org.apache.stratos.cloud.controller.interfaces.Iaas; -import org.apache.stratos.cloud.controller.jcloud.ComputeServiceBuilderUtil; -import org.apache.stratos.cloud.controller.pojo.IaasProvider; -import org.apache.stratos.cloud.controller.validate.VCloudPartitionValidator; -import org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Template; -import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.compute.options.TemplateOptions; -import org.jclouds.vcloud.compute.options.VCloudTemplateOptions; -import org.jclouds.vcloud.domain.network.IpAddressAllocationMode; -import org.wso2.carbon.utils.CarbonUtils; - -import java.io.File; -import java.io.IOException; - -public class VCloudIaas extends Iaas { - - - private static final Log log = LogFactory.getLog(VCloudIaas.class); - - private static final String SHELL_TYPE = "shellType"; - private static final String SCRIPTS_PATH = "scripts"; - private static final String CUSTOMIZATION_SCRIPT = "customization"; - private static final String PAYLOAD = "PAYLOAD"; - - public VCloudIaas(IaasProvider iaasProvider) { - super(iaasProvider); - } - - @Override - public void buildComputeServiceAndTemplate() { - - IaasProvider iaasInfo = getIaasProvider(); - - // builds and sets Compute Service - ComputeServiceBuilderUtil.buildDefaultComputeService(iaasInfo); - - // builds and sets Template - buildTemplate(); - - } - - public void buildTemplate() { - IaasProvider iaasInfo = getIaasProvider(); - - if (iaasInfo.getComputeService() == null) { - String msg = "Compute service is null for IaaS provider: " - + iaasInfo.getName(); - log.fatal(msg); - throw new CloudControllerException(msg); - } - - TemplateBuilder templateBuilder = iaasInfo.getComputeService() - .templateBuilder(); - - // set image id specified - templateBuilder.imageId(iaasInfo.getImage()); - - // build the Template - Template template = templateBuilder.build(); - - // if you wish to auto assign IPs, instance spawning call should be - // blocking, but if you - // wish to assign IPs manually, it can be non-blocking. - // is auto-assign-ip mode or manual-assign-ip mode? - default mode is - // non-blocking - boolean blockUntilRunning = Boolean.parseBoolean(iaasInfo - .getProperty("autoAssignIp")); - template.getOptions().as(TemplateOptions.class) - .blockUntilRunning(blockUntilRunning); - - // this is required in order to avoid creation of additional security - // groups by Jclouds. - template.getOptions().as(TemplateOptions.class) - .inboundPorts(22, 80, 8080, 443, 8243); - - template.getOptions().as(VCloudTemplateOptions.class) - .ipAddressAllocationMode(IpAddressAllocationMode.POOL); - - // set Template - iaasInfo.setTemplate(template); - } - - @Override - public void setDynamicPayload() { - // in vCloud case we need to run a script - IaasProvider iaasInfo = getIaasProvider(); - - if (iaasInfo.getTemplate() == null || iaasInfo.getPayload() == null) { - if (log.isDebugEnabled()) { - log.debug("Payload for vCloud not found"); - } - return; - } - - String shellType = iaasInfo.getProperty(SHELL_TYPE); - - if (shellType == null || shellType.isEmpty()) { - if (log.isDebugEnabled()) { - log.debug("Shell Type for vCloud Customization script not found from properties"); - } - return; - } - - if (log.isDebugEnabled()) { - log.debug(String.format("Shell Type '%s' will be used for vCloud Customization script", shellType)); - } - - // Payload is a String value - String payload = new String(iaasInfo.getPayload()); - - if (log.isDebugEnabled()) { - log.debug(String.format("Payload '%s' will be used for vCloud Customization script", payload)); - } - - Template template = iaasInfo.getTemplate(); - - File scriptPath = new File(CarbonUtils.getCarbonConfigDirPath(), SCRIPTS_PATH); - - File customizationScriptFile = new File(new File(scriptPath, shellType), CUSTOMIZATION_SCRIPT); - - if (!customizationScriptFile.exists()) { - if (log.isWarnEnabled()) { - log.warn(String.format("The vCloud Customization script '%s' does not exist", - customizationScriptFile.getAbsolutePath())); - } - return; - } - - String customizationScript = null; - - try { - customizationScript = FileUtils.readFileToString(customizationScriptFile); - } catch (IOException e) { - if (log.isErrorEnabled()) { - log.error( - String.format("Error reading the vCloud Customization script '%s'", - customizationScriptFile.getAbsolutePath()), e); - } - } - - if (StringUtils.isEmpty(customizationScript)) { - if (log.isDebugEnabled()) { - log.debug("No content vCloud Customization script not found from properties"); - } - return; - } - - // Set payload - customizationScript = customizationScript.replaceAll(PAYLOAD, payload); - - if (log.isDebugEnabled()) { - log.debug(String.format("The vCloud Customization script\n%s", customizationScript)); - } - - // Run the script - template.getOptions().runScript(customizationScript); - } - - @Override - public boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey) { - - // TODO - return false; - } - - @Override - public String associateAddress(NodeMetadata node) { - - // TODO - return ""; - - } - - @Override - public String associatePredefinedAddress(NodeMetadata node, String ip) { - return ""; - } - - @Override - public void releaseAddress(String ip) { - // TODO - } - - @Override - public boolean isValidRegion(String region) { - // TODO Auto-generated method stub - return false; - } - - @Override - public boolean isValidZone(String region, String zone) { - // TODO Auto-generated method stub - return true; - } - - @Override - public boolean isValidHost(String zone, String host) { - // TODO Auto-generated method stub - return true; - } - - @Override - public PartitionValidator getPartitionValidator() { - return new VCloudPartitionValidator(); - } - - @Override - public String createVolume(int sizeGB, String snapshotId) { - // TODO Auto-generated method stub - return null; - } - - @Override - public String attachVolume(String instanceId, String volumeId, String deviceName) { - // TODO Auto-generated method stub - return null; - } - - @Override - public void detachVolume(String instanceId, String volumeId) { - // TODO Auto-generated method stub - - } - - @Override - public void deleteVolume(String volumeId) { - // TODO Auto-generated method stub - - } - - @Override - public String getIaasDevice(String device) { - return device; - } - -}
