Unfortunately, the whole history of this file has been lost :-( On Mon, Nov 24, 2014 at 5:36 PM, Imesh Gunaratne <[email protected]> wrote:
> [Resending due to a mail failure] > > Yes while fixing the class names issue due some reason it has marked the > files as removed. I just reverted this commit and pushed it with commit > revision: de05f5c551eea399327a10dd1555b4edf52d2786 > > On Wed, Nov 19, 2014 at 5:15 PM, Nirmal Fernando <[email protected]> > wrote: > >> Hi Imesh, >> >> Any idea where is CloudStackIaas class? >> >> On Thu, Nov 13, 2014 at 8:26 PM, Nirmal Fernando <[email protected]> >> wrote: >> >>> Hi Imesh, >>> >>> You have removed the CloudStackIaas class?? >>> https://git-wip-us.apache.org/repos/asf?p=stratos.git;a=tree;f=components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases;h=c6d52c93f78927b5e8d07c5614f871a984297138;hb=HEAD >>> >>> On Thu, Nov 13, 2014 at 5:59 PM, <[email protected]> wrote: >>> >>>> Repository: stratos >>>> Updated Branches: >>>> refs/heads/master a80085efa -> e04f271ce >>>> >>>> >>>> Fixing file name mismatch issue >>>> >>>> >>>> Project: http://git-wip-us.apache.org/repos/asf/stratos/repo >>>> Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/e04f271c >>>> Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/e04f271c >>>> Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/e04f271c >>>> >>>> Branch: refs/heads/master >>>> Commit: e04f271ceb9d861170fe47841d762e8ff84cb17f >>>> Parents: a80085e >>>> Author: Imesh Gunaratne <[email protected]> >>>> Authored: Thu Nov 13 22:29:06 2014 +0530 >>>> Committer: Imesh Gunaratne <[email protected]> >>>> Committed: Thu Nov 13 22:29:06 2014 +0530 >>>> >>>> ---------------------------------------------------------------------- >>>> .../cloud/controller/iaases/CloudStackIaas.java | 540 >>>> ------------------- >>>> .../validate/CloudStackPartitionValidator.java | 53 -- >>>> 2 files changed, 593 deletions(-) >>>> ---------------------------------------------------------------------- >>>> >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/e04f271c/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 c38ce0a..0000000 >>>> --- >>>> a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/CloudStackIaas.java >>>> +++ /dev/null >>>> @@ -1,540 +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) { >>>> - >>>> - //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; >>>> - } >>>> -} >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/stratos/blob/e04f271c/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/CloudStackPartitionValidator.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/CloudStackPartitionValidator.java >>>> b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/CloudStackPartitionValidator.java >>>> deleted file mode 100644 >>>> index 4f3fbce..0000000 >>>> --- >>>> a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/validate/CloudStackPartitionValidator.java >>>> +++ /dev/null >>>> @@ -1,53 +0,0 @@ >>>> -package org.apache.stratos.cloud.controller.validate; >>>> - >>>> -import org.apache.commons.logging.Log; >>>> -import org.apache.commons.logging.LogFactory; >>>> -import >>>> org.apache.stratos.cloud.controller.exception.InvalidPartitionException; >>>> -import org.apache.stratos.cloud.controller.interfaces.Iaas; >>>> -import org.apache.stratos.cloud.controller.pojo.IaasProvider; >>>> -import >>>> org.apache.stratos.cloud.controller.util.CloudControllerConstants; >>>> -import org.apache.stratos.cloud.controller.util.CloudControllerUtil; >>>> -import >>>> org.apache.stratos.cloud.controller.validate.interfaces.PartitionValidator; >>>> -import org.apache.stratos.messaging.domain.topology.Scope; >>>> - >>>> -import java.util.Properties; >>>> - >>>> - >>>> -public class CloudStackPartitionValidator implements >>>> PartitionValidator { >>>> - >>>> - >>>> - private static final Log log = >>>> LogFactory.getLog(AWSEC2PartitionValidator.class); >>>> - private IaasProvider iaasProvider; >>>> - private Iaas iaas; >>>> - >>>> - >>>> - @Override >>>> - public void setIaasProvider(IaasProvider iaas) { >>>> - this.iaasProvider = iaas; >>>> - this.iaas = iaas.getIaas(); >>>> - } >>>> - >>>> - @Override >>>> - public IaasProvider validate(String partitionId, Properties >>>> properties) throws InvalidPartitionException { >>>> - >>>> - try { >>>> - IaasProvider updatedIaasProvider = new >>>> IaasProvider(iaasProvider); >>>> - Iaas updatedIaas = >>>> CloudControllerUtil.getIaas(updatedIaasProvider); >>>> - updatedIaas.setIaasProvider(updatedIaasProvider); >>>> - >>>> - if (properties.containsKey(Scope.zone.toString())) { >>>> - String zone = >>>> properties.getProperty(Scope.zone.toString()); >>>> - iaas.isValidZone(null, zone); >>>> - >>>> updatedIaasProvider.setProperty(CloudControllerConstants.AVAILABILITY_ZONE, >>>> zone); >>>> - updatedIaas = >>>> CloudControllerUtil.getIaas(updatedIaasProvider); >>>> - updatedIaas.setIaasProvider(updatedIaasProvider); >>>> - } >>>> - >>>> - } catch (Exception ex) { >>>> - String msg = "Invalid Partition Detected : "+partitionId+". >>>> Cause: "+ex.getMessage(); >>>> - log.error(msg, ex); >>>> - throw new InvalidPartitionException(msg, ex); >>>> - } >>>> - return iaasProvider; >>>> - } >>>> -} >>>> >>>> >>> >>> >>> -- >>> Best Regards, >>> Nirmal >>> >>> Nirmal Fernando. >>> PPMC Member & Committer of Apache Stratos, >>> Senior Software Engineer, WSO2 Inc. >>> >>> Blog: http://nirmalfdo.blogspot.com/ >>> >> >> >> >> -- >> Best Regards, >> Nirmal >> >> Nirmal Fernando. >> PPMC Member & Committer of Apache Stratos, >> Senior Software Engineer, WSO2 Inc. >> >> Blog: http://nirmalfdo.blogspot.com/ >> > > > > -- > Imesh Gunaratne > > Technical Lead, WSO2 > Committer & PMC Member, Apache Stratos > -- Best Regards, Nirmal Nirmal Fernando. PPMC Member & Committer of Apache Stratos, Senior Software Engineer, WSO2 Inc. Blog: http://nirmalfdo.blogspot.com/
