stratos-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From im...@apache.org
Subject [4/4] stratos git commit: Introducing a mock iaas for cloud controller
Date Mon, 08 Dec 2014 07:33:28 GMT
Introducing a mock iaas for cloud controller


Project: http://git-wip-us.apache.org/repos/asf/stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/49eadd6e
Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/49eadd6e
Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/49eadd6e

Branch: refs/heads/master
Commit: 49eadd6efc65dbe9fe4398d99d97985e721eb267
Parents: d830fab
Author: Imesh Gunaratne <imesh@apache.org>
Authored: Sun Dec 7 13:27:53 2014 +0530
Committer: Imesh Gunaratne <imesh@apache.org>
Committed: Mon Dec 8 13:03:16 2014 +0530

----------------------------------------------------------------------
 .../concurrent/PartitionValidatorCallable.java  |  26 +-
 .../context/CloudControllerContext.java         |  17 +
 .../cloud/controller/domain/IaasProvider.java   |   6 +-
 .../cloud/controller/iaases/AWSEC2Iaas.java     | 637 -------------------
 .../cloud/controller/iaases/CloudstackIaas.java | 540 ----------------
 .../cloud/controller/iaases/DockerIaas.java     | 151 -----
 .../cloud/controller/iaases/GCEIaas.java        | 459 -------------
 .../stratos/cloud/controller/iaases/Iaas.java   | 135 ++--
 .../iaases/JcloudsCloudStackIaas.java           | 543 ++++++++++++++++
 .../controller/iaases/JcloudsDockerIaas.java    | 152 +++++
 .../cloud/controller/iaases/JcloudsEC2Iaas.java | 634 ++++++++++++++++++
 .../cloud/controller/iaases/JcloudsGCEIaas.java | 456 +++++++++++++
 .../cloud/controller/iaases/JcloudsIaas.java    | 306 +++++++++
 .../controller/iaases/JcloudsIaasUtil.java      |  90 +++
 .../controller/iaases/JcloudsOpenstackIaas.java | 559 ++++++++++++++++
 .../controller/iaases/JcloudsVCloudIaas.java    | 261 ++++++++
 .../controller/iaases/OpenstackNovaIaas.java    | 567 -----------------
 .../cloud/controller/iaases/VCloudIaas.java     | 262 --------
 .../iaases/mock/MockIPAddressPool.java          |  99 +++
 .../cloud/controller/iaases/mock/MockIaas.java  | 176 +++++
 .../controller/iaases/mock/MockMember.java      |  85 +++
 .../iaases/mock/MockMemberContext.java          |  68 ++
 .../iaases/mock/MockMemberEventPublisher.java   | 122 ++++
 .../iaases/mock/MockNodeMetadata.java           | 143 +++++
 .../iaases/mock/MockPartitionValidator.java     |  44 ++
 .../MockHealthStatisticsNotifier.java           |  82 +++
 .../MockHealthStatisticsPublisher.java          |  89 +++
 .../validators/AWSEC2PartitionValidator.java    |  10 +-
 .../CloudstackPartitionValidator.java           |   6 +-
 .../validators/DockerPartitionValidator.java    |   6 +-
 .../OpenstackNovaPartitionValidator.java        |  10 +-
 .../impl/CloudControllerServiceImpl.java        |  45 +-
 .../impl/CloudControllerServiceUtil.java        |  12 +-
 .../services/impl/InstanceCreator.java          | 264 ++------
 .../services/impl/InstanceTerminator.java       |  57 +-
 .../controller/util/CloudControllerUtil.java    |  66 +-
 .../util/ComputeServiceBuilderUtil.java         |  12 +-
 .../main/resources/conf/cloud-controller.xml    |  18 +-
 .../modules/distribution/src/bin/stratos.sh     |   2 +
 .../all/repository/conf/cloud-controller.xml    |   8 +-
 .../cc/repository/conf/cloud-controller.xml     |   6 +-
 41 files changed, 4151 insertions(+), 3080 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/49eadd6e/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java
index b13d6fe..625fbbd 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/concurrent/PartitionValidatorCallable.java
@@ -34,19 +34,19 @@ import org.apache.stratos.cloud.controller.iaases.validators.IaasBasedPartitionV
 import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator;
 
 public class PartitionValidatorCallable implements Callable<IaasProvider> {
-	
-	private static final Log log = LogFactory.getLog(PartitionValidatorCallable.class);
-	private Partition partition;
-	private Cartridge cartridge;
-	
-	public PartitionValidatorCallable(Partition partition, Cartridge cartridge) {
-		this.partition = partition;
-		this.cartridge = cartridge;
-	}
 
-	@Override
-	public IaasProvider call() throws Exception {
-		
+    private static final Log log = LogFactory.getLog(PartitionValidatorCallable.class);
+    private Partition partition;
+    private Cartridge cartridge;
+
+    public PartitionValidatorCallable(Partition partition, Cartridge cartridge) {
+        this.partition = partition;
+        this.cartridge = cartridge;
+    }
+
+    @Override
+    public IaasProvider call() throws Exception {
+
         if (log.isDebugEnabled()) {
             log.debug("Partition validation started for " + partition + " of " + cartridge);
         }
@@ -62,6 +62,6 @@ public class PartitionValidatorCallable implements Callable<IaasProvider> {
         }
 
         return updatedIaasProvider;
-	}
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/49eadd6e/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
index ff2dc62..56ddd48 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/context/CloudControllerContext.java
@@ -326,6 +326,23 @@ public class CloudControllerContext implements Serializable {
         }
     }
 
+    public void updateMemberContext(MemberContext memberContext) {
+        memberIdToMemberContextMap.put(memberContext.getMemberId(), memberContext);
+
+        List<MemberContext> memberContextList;
+        if ((memberContextList = clusterIdToMemberContextListMap.get(memberContext.getClusterId())) == null) {
+            memberContextList = new ArrayList<MemberContext>();
+        }
+        if (memberContextList.contains(memberContext)) {
+            memberContextList.remove(memberContext);
+        }
+        memberContextList.add(memberContext);
+        clusterIdToMemberContextListMap.put(memberContext.getClusterId(), memberContextList);
+        if (log.isDebugEnabled()) {
+            log.debug("Member context updated in the cloud controller context: " + memberContext);
+        }
+    }
+
     public void addScheduledFutureJob(String memberId, ScheduledFuture<?> job) {
         memberIdToScheduledTaskMap.put(memberId, job);
     }

http://git-wip-us.apache.org/repos/asf/stratos/blob/49eadd6e/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
index 0f5dd25..36380c8 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/IaasProvider.java
@@ -22,7 +22,7 @@ import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
 import org.apache.stratos.cloud.controller.iaases.Iaas;
-import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
+import org.apache.stratos.cloud.controller.iaases.JcloudsIaasUtil;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.Template;
 
@@ -34,7 +34,7 @@ import java.util.Map;
  * This is the basic data structure which holds an IaaS specific details.
  * NOTE: If you add a new attribute, please assign it in the constructor too.
  */
-public class IaasProvider implements Serializable{
+public class IaasProvider implements Serializable {
    
     private static final long serialVersionUID = -940288190885166118L;
 
@@ -217,7 +217,7 @@ public class IaasProvider implements Serializable{
     public Iaas getIaas() {
     	if (iaas == null) {
     		try {
-				iaas = CloudControllerUtil.getIaas(this);
+				iaas = JcloudsIaasUtil.createIaasInstance(this);
 			} catch (InvalidIaasProviderException e) {
 				return null;
 			}

http://git-wip-us.apache.org/repos/asf/stratos/blob/49eadd6e/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
deleted file mode 100644
index 6519dfb..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/AWSEC2Iaas.java
+++ /dev/null
@@ -1,637 +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.Predicate;
-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.util.ComputeServiceBuilderUtil;
-import org.apache.stratos.cloud.controller.domain.IaasProvider;
-import org.apache.stratos.cloud.controller.domain.NetworkInterface;
-import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
-import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
-import org.apache.stratos.cloud.controller.iaases.validators.AWSEC2PartitionValidator;
-import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator;
-import org.jclouds.aws.ec2.AWSEC2Api;
-import org.jclouds.aws.ec2.compute.AWSEC2TemplateOptions;
-import org.jclouds.aws.ec2.features.AWSKeyPairApi;
-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.jclouds.ec2.domain.Attachment;
-import org.jclouds.ec2.domain.AvailabilityZoneInfo;
-import org.jclouds.ec2.domain.KeyPair;
-import org.jclouds.ec2.domain.PublicIpInstanceIdPair;
-import org.jclouds.ec2.domain.Volume;
-import org.jclouds.ec2.features.AvailabilityZoneAndRegionApi;
-import org.jclouds.ec2.features.ElasticBlockStoreApi;
-import org.jclouds.ec2.features.ElasticIPAddressApi;
-import org.jclouds.ec2.options.DescribeAvailabilityZonesOptions;
-import org.jclouds.ec2.options.DetachVolumeOptions;
-
-import java.util.*;
-
-public class AWSEC2Iaas extends Iaas {
-
-	public AWSEC2Iaas(IaasProvider iaasProvider) {
-		super(iaasProvider);
-	}
-
-	private static final Log log = LogFactory.getLog(AWSEC2Iaas.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 ";
-
-	@Override
-	public void buildComputeServiceAndTemplate() {
-
-		// builds and sets Compute Service
-		ComputeServiceBuilderUtil.buildDefaultComputeService(getIaasProvider());
-		// 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());
-
-        if(!(iaasInfo instanceof IaasProvider)) {
-           templateBuilder.locationId(iaasInfo.getType());
-        }
-
-        if(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE) != null) {
-            Set<? extends Location> locations = iaasInfo.getComputeService().listAssignableLocations();
-            for(Location location : locations) {
-                if(location.getScope().toString().equalsIgnoreCase(CloudControllerConstants.ZONE_ELEMENT) &&
-                        location.getId().equals(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE))) {
-                    templateBuilder.locationId(location.getId());
-                    log.info("ZONE has been set as " + iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_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(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE) != null) {
-            if(!template.getLocation().getId().equals(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE))) {
-                log.warn("couldn't find assignable ZONE of id :" +
-                        iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_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?
-		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 EC2 specific options
-
-
-        if (iaasInfo.getProperty(CloudControllerConstants.ASSOCIATE_PUBLIC_IP_ADDRESS) != null) {
-              boolean associatePublicIp =  Boolean.parseBoolean(iaasInfo.getProperty(
-                      CloudControllerConstants.ASSOCIATE_PUBLIC_IP_ADDRESS));
-            if(associatePublicIp){
-                  template.getOptions().as(AWSEC2TemplateOptions.class)
-                      .associatePublicIpAddress();
-              }
-        }
-
-		if (iaasInfo.getProperty(CloudControllerConstants.SUBNET_ID) != null) {
-			template.getOptions().as(AWSEC2TemplateOptions.class)
-					.subnetId(iaasInfo.getProperty(CloudControllerConstants.SUBNET_ID));
-		}
-
-		if (iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE) != null) {
-			template.getOptions().as(AWSEC2TemplateOptions.class)
-					.placementGroup(iaasInfo.getProperty(CloudControllerConstants.AVAILABILITY_ZONE));
-		}
-
-        // security group names
-		if (iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUPS) != null) {
-			template.getOptions()
-					.as(AWSEC2TemplateOptions.class)
-					.securityGroups(iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUPS).split(
-                            CloudControllerConstants.ENTRY_SEPARATOR));
-
-		}
-
-        // ability to define tags
-        if (iaasInfo.getProperty(CloudControllerConstants.TAGS) != null) {
-            template.getOptions()
-                    .as(AWSEC2TemplateOptions.class)
-                    .tags(Arrays.asList(iaasInfo.getProperty(CloudControllerConstants.TAGS)
-                                        .split(CloudControllerConstants.ENTRY_SEPARATOR)));
-
-        }
-
-        // 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()
-                    .as(AWSEC2TemplateOptions.class)
-                    .userMetadata(keyValuePairTagsMap);
-            }
-
-        }
-        
-
-        if (iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUP_IDS) != null) {
-            template.getOptions()
-                    .as(AWSEC2TemplateOptions.class)
-                    .securityGroupIds(iaasInfo.getProperty(CloudControllerConstants.SECURITY_GROUP_IDS)
-                                        .split(CloudControllerConstants.ENTRY_SEPARATOR));
-
-        }
-
-
-		if (iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR) != null) {
-			template.getOptions().as(AWSEC2TemplateOptions.class)
-					.keyPair(iaasInfo.getProperty(CloudControllerConstants.KEY_PAIR));
-		}
-
-
-
-        if (iaasInfo.getNetworkInterfaces() != null) {
-            List<String> networks = new ArrayList<String>(iaasInfo.getNetworkInterfaces().length);
-            for (NetworkInterface ni:iaasInfo.getNetworkInterfaces()) {
-                networks.add(ni.getNetworkUuid());
-            }
-            template.getOptions().as(AWSEC2TemplateOptions.class).networks(networks);
-        }
-
-		// set Template
-		iaasInfo.setTemplate(template);
-	}
-
-	@Override
-	public void setDynamicPayload() {
-		IaasProvider iaasInfo = getIaasProvider();
-		if (iaasInfo.getTemplate() != null && iaasInfo.getPayload() != null) {
-
-			iaasInfo.getTemplate().getOptions().as(AWSEC2TemplateOptions.class)
-					.userData(iaasInfo.getPayload());
-		}
-
-	}
-
-	@Override
-	public synchronized boolean createKeyPairFromPublicKey(String region, String keyPairName,
-			String publicKey) {
-		
-		IaasProvider iaasInfo = getIaasProvider();
-
-		String ec2Msg = " ec2. Region: " + region + " - Key Pair Name: ";
-
-		ComputeServiceContext context = iaasInfo.getComputeService()
-				.getContext();
-		
-		AWSKeyPairApi keyPairApi = context.unwrapApi(AWSEC2Api.class).getKeyPairApiForRegion(region).get();
-
-		KeyPair keyPair = keyPairApi.importKeyPairInRegion(region, keyPairName, publicKey);
-		
-		if (keyPair != null) {
-
-			iaasInfo.getTemplate().getOptions().as(AWSEC2TemplateOptions.class)
-					.keyPair(keyPair.getKeyName());
-
-			log.info(SUCCESSFUL_LOG_LINE + ec2Msg + keyPair.getKeyName());
-			return true;
-		}
-
-		log.error(FAILED_LOG_LINE + ec2Msg);
-
-		return false;
-	}
-
-	@Override
-	public synchronized String associateAddress(NodeMetadata node) {
-
-		IaasProvider iaasInfo = getIaasProvider();
-		
-		ComputeServiceContext context = iaasInfo.getComputeService()
-				.getContext();
-		
-		ElasticIPAddressApi elasticIPAddressApi = context.unwrapApi(AWSEC2Api.class).getElasticIPAddressApi().get();
-		String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-		
-		String ip = null;
-
-		// first try to find an unassigned IP.
-		ArrayList<PublicIpInstanceIdPair> unassignedIps = Lists
-				.newArrayList(Iterables.filter(elasticIPAddressApi.describeAddressesInRegion(region, new String[0]),
-						new Predicate<PublicIpInstanceIdPair>() {
-
-							@Override
-							public boolean apply(PublicIpInstanceIdPair 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).getPublicIp();
-		}
-
-		// if no unassigned IP is available, we'll try to allocate an IP.
-		if (ip == null || ip.isEmpty()) {
-			try {
-				ip = elasticIPAddressApi
-						.allocateAddressInRegion(region);
-				log.info("Allocated ip [" + ip + "]");
-
-			} catch (Exception e) {
-				String msg = "Failed to allocate an IP address. All IP addresses are in use.";
-				log.error(msg, e);
-				throw new CloudControllerException(msg, e);
-			}
-		}
-
-		String id = node.getProviderId();
-
-		// 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 < 12 && !associatePublicIp(elasticIPAddressApi, region, ip, id)) {
-
-			// wait for 5s
-			CloudControllerUtil.sleep(5000);
-			retries++;
-		}
-
-		log.debug("Successfully associated an IP address " + ip
-				+ " for node with id: " + node.getId());
-
-		return ip;
-
-	}
-	
-	@Override
-	public String associatePredefinedAddress(NodeMetadata node, String ip) {
-    	return "";
-    }
-
-	/**
-	 * @param addressApi
-	 * @param region
-	 * @param ip
-	 * @param id
-	 */
-	private boolean associatePublicIp(ElasticIPAddressApi addressApi, String region,
-			String ip, String id) {
-		try {
-			addressApi.associateAddressInRegion(
-					region, ip, id);
-			log.info("Successfully associated public IP ");
-			return true;
-		} catch (Exception e) {
-			log.debug("Exception in associating public IP " + e.getMessage());
-			return false;
-		}
-	}
-
-	@Override
-	public synchronized void releaseAddress(String ip) {
-
-		IaasProvider iaasInfo = getIaasProvider();
-		
-		ComputeServiceContext context = iaasInfo.getComputeService()
-				.getContext();
-		ElasticIPAddressApi elasticIPAddressApi = context.unwrapApi(AWSEC2Api.class).getElasticIPAddressApi().get();
-		String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-
-		elasticIPAddressApi.disassociateAddressInRegion(
-				region, ip);
-		elasticIPAddressApi.releaseAddressInRegion(region,
-				ip);
-	}
-
-    @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);
-        }
-        
-        ComputeServiceContext context = iaasInfo.getComputeService().getContext();
-        Set<String> regions = context.unwrapApi(AWSEC2Api.class).getConfiguredRegions();
-        for (String configuredRegion : regions) {
-            if (region.equalsIgnoreCase(configuredRegion)) {
-                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();
-    	
-        if (zone == null || iaasInfo == null) {
-            String msg =
-                         "Zone or IaaSProvider is null: zone: " + zone + " - IaaSProvider: " +
-                                 iaasInfo;
-            log.error(msg);
-            throw new InvalidZoneException(msg);
-        }
-        ComputeServiceContext context = iaasInfo.getComputeService().getContext();
-        AvailabilityZoneAndRegionApi zoneRegionApi = context.unwrapApi(AWSEC2Api.class).
-        		getAvailabilityZoneAndRegionApiForRegion(region).get();
-        
-        Set<AvailabilityZoneInfo> availabilityZones =
-                                                      zoneRegionApi.describeAvailabilityZonesInRegion(region,
-                                                              new DescribeAvailabilityZonesOptions[0]);
-        for (AvailabilityZoneInfo zoneInfo : availabilityZones) {
-            String configuredZone = zoneInfo.getZone();
-            if (zone.equalsIgnoreCase(configuredZone)) {
-                if (log.isDebugEnabled()) {
-                    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();
-    	
-        // there's no such concept in EC2
-        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 AWSEC2PartitionValidator();
-    }
-
-	@Override
-	public String createVolume(int sizeGB, String snapshotId) {
-		IaasProvider iaasInfo = getIaasProvider();
-
-		ComputeServiceContext context = iaasInfo.getComputeService()
-				.getContext();
-		
-		String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-		String zone = ComputeServiceBuilderUtil.extractZone(iaasInfo);
-		
-		if(region == null || zone == null) {
-			log.fatal("Cannot create a new volume in the [region] : "+region
-					+", [zone] : "+zone+" of Iaas : "+iaasInfo);
-			return null;
-		}
-		
-		ElasticBlockStoreApi blockStoreApi = context.unwrapApi(AWSEC2Api.class).getElasticBlockStoreApiForRegion(region).get();
-		
-		Volume volume;
-		if(StringUtils.isEmpty(snapshotId)){
-			if(log.isDebugEnabled()){
-        		log.info("Creating a volume in the zone " + zone);
-        	}
-			volume = blockStoreApi.createVolumeInAvailabilityZone(zone, sizeGB);
-		}else{
-			if(log.isDebugEnabled()){
-        		log.info("Creating a volume in the zone " + zone + " from the shanpshot " + snapshotId);
-        	}
-			volume = blockStoreApi.createVolumeFromSnapshotInAvailabilityZone(zone, snapshotId);
-		}
-		 
-		
-		if (volume == null) {
-			log.fatal("Volume creation was unsuccessful. [region] : " + region
-					+ ", [zone] : " + zone + " of Iaas : " + iaasInfo);
-			return null;
-		}
-		
-		log.info("Successfully created a new volume [id]: "+volume.getId()
-				+" in [region] : "+region+", [zone] : "+zone+" of Iaas : "+iaasInfo);
-		return volume.getId();
-	}
-
-	@Override
-	public String attachVolume(String instanceId, String volumeId, String deviceName) {
-		IaasProvider iaasInfo = getIaasProvider();
-
-		ComputeServiceContext context = iaasInfo.getComputeService()
-				.getContext();
-		
-		String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-		String zone = ComputeServiceBuilderUtil.extractZone(iaasInfo);
-		String device = deviceName == null ? "/dev/sdh" : deviceName;
-		
-		if(region == null || zone == null) {
-			log.fatal("Cannot attach the volume [id]: "+volumeId+" in the [region] : "+region
-					+", [zone] : "+zone+" of Iaas : "+iaasInfo);
-			return null;
-		}
-		
-		ElasticBlockStoreApi blockStoreApi = context.unwrapApi(AWSEC2Api.class).getElasticBlockStoreApiForRegion(region).get();
-
-        Volume.Status volumeStatus = this.getVolumeStatus(blockStoreApi, region, volumeId);
-
-        if(log.isDebugEnabled()){
-            log.debug("Volume " + volumeId + " is in state " + volumeStatus);
-        }
-
-        while(volumeStatus != Volume.Status.AVAILABLE){
-            try {
-                // TODO Use a proper mechanism to wait till volume becomes available.
-                Thread.sleep(1000);
-                volumeStatus = this.getVolumeStatus(blockStoreApi, region, volumeId);
-                if(log.isDebugEnabled()){
-                    log.debug("Volume " + volumeId + " is still NOT in AVAILABLE. Current State=" + volumeStatus);
-                }
-            } catch (InterruptedException e) {
-                // Ignoring the exception
-            }
-        }
-        if(log.isDebugEnabled()){
-            log.debug("Volume " + volumeId + " became  AVAILABLE");
-        }
-
-		Attachment attachment = blockStoreApi.attachVolumeInRegion(region, volumeId, instanceId, device);
-
-		if (attachment == null) {
-			log.fatal("Volume [id]: "+volumeId+" attachment for instance [id]: "+instanceId
-					+" was unsuccessful. [region] : " + region
-					+ ", [zone] : " + zone + " of Iaas : " + iaasInfo);
-			return null;
-		}
-		
-		log.info("Volume [id]: "+volumeId+" attachment for instance [id]: "+instanceId
-				+" was successful [status]: "+attachment.getStatus().value()+". [region] : " + region
-				+ ", [zone] : " + zone + " of Iaas : " + iaasInfo);
-		return attachment.getStatus().value();
-	}
-
-    private Volume.Status getVolumeStatus(ElasticBlockStoreApi blockStoreApi, String region, String volumeId){
-        Set<Volume> volumeDescriptions = blockStoreApi.describeVolumesInRegion(region, volumeId);
-        Iterator<Volume> it = volumeDescriptions.iterator();
-        return it.next().getStatus();
-    }
-
-	@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("Cannot detach the volume [id]: "+volumeId+" from the instance [id]: "+instanceId
-					+" of the [region] : "+region
-					+" of Iaas : "+iaasInfo);
-			return;
-		}
-
-		ElasticBlockStoreApi blockStoreApi = context.unwrapApi(AWSEC2Api.class).getElasticBlockStoreApiForRegion(region).get();
-
-        Set<Volume> volumeDescriptions = blockStoreApi.describeVolumesInRegion(region, volumeId);
-        Iterator<Volume> it = volumeDescriptions.iterator();
-
-        while(it.hasNext()){
-            Volume.Status status  = it.next().getStatus();
-
-            if(status == Volume.Status.AVAILABLE){
-                log.warn(String.format("Volume %s is already in AVAILABLE state. Volume seems to be detached somehow", volumeId));
-                return;
-            }
-        }
-
-		blockStoreApi.detachVolumeInRegion(region, volumeId, true, DetachVolumeOptions.Builder.fromInstance(instanceId));
-
-		log.info("Detachment of Volume [id]: "+volumeId+" from instance [id]: "+instanceId
-				+" was successful. [region] : " + region
-				+ " of Iaas : " + 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("Cannot delete the volume [id]: "+volumeId+" of the [region] : "+region
-					+" of Iaas : "+iaasInfo);
-			return;
-		}
-		
-		ElasticBlockStoreApi blockStoreApi = context.unwrapApi(AWSEC2Api.class).getElasticBlockStoreApiForRegion(region).get();
-		blockStoreApi.deleteVolumeInRegion(region, volumeId);
-		
-		log.info("Deletion of Volume [id]: "+volumeId+" was successful. [region] : " + region
-				+ " of Iaas : " + iaasInfo);
-	}
-
-    @Override
-    /*
-        Converts the user defined volume device to Ec2 specific device.
-        For example /dev/sdf is converted to /dev/xvdf
-     */
-    public String getIaasDevice(String device) {
-        String[] split = device.split("/");
-        String x = split[split.length-1];
-        StringBuilder ec2Device = new StringBuilder();
-        ec2Device.append("/" + split[1]);
-        ec2Device.append("/xvd");
-        ec2Device.append(x.charAt(x.length()-1));
-        return  ec2Device.toString();
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/stratos/blob/49eadd6e/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 a67fe8d..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.util.ComputeServiceBuilderUtil;
-import org.apache.stratos.cloud.controller.domain.IaasProvider;
-import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
-import org.apache.stratos.cloud.controller.iaases.validators.CloudstackPartitionValidator;
-import org.apache.stratos.cloud.controller.iaases.validators.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/49eadd6e/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 da2916b..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/DockerIaas.java
+++ /dev/null
@@ -1,151 +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.util.ComputeServiceBuilderUtil;
-import org.apache.stratos.cloud.controller.domain.IaasProvider;
-import org.apache.stratos.cloud.controller.iaases.validators.DockerPartitionValidator;
-import org.apache.stratos.cloud.controller.iaases.validators.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/49eadd6e/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 ba186b2..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/GCEIaas.java
+++ /dev/null
@@ -1,459 +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.util.ComputeServiceBuilderUtil;
-import org.apache.stratos.cloud.controller.domain.IaasProvider;
-import org.apache.stratos.cloud.controller.domain.NetworkInterface;
-import org.apache.stratos.cloud.controller.iaases.validators.GCEPartitionValidator;
-import org.apache.stratos.cloud.controller.iaases.validators.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/49eadd6e/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
index b42f8b9..341d6f1 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/Iaas.java
@@ -18,155 +18,142 @@
  */
 package org.apache.stratos.cloud.controller.iaases;
 
-import org.jclouds.compute.ComputeService;
-import org.jclouds.compute.domain.NodeMetadata;
-import org.jclouds.compute.domain.Template;
-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.domain.ClusterContext;
 import org.apache.stratos.cloud.controller.domain.IaasProvider;
+import org.apache.stratos.cloud.controller.domain.MemberContext;
+import org.apache.stratos.cloud.controller.domain.Partition;
+import org.apache.stratos.cloud.controller.exception.*;
 import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator;
+import org.jclouds.compute.domain.NodeMetadata;
 
 /**
  * All IaaSes that are going to support by Cloud Controller, should extend this abstract class.
  */
 public abstract class Iaas {
-	/**
-	 * Reference to the corresponding {@link IaasProvider}
-	 */
-	private IaasProvider iaasProvider;
-	
-	public Iaas(IaasProvider iaasProvider) {
-		this.setIaasProvider(iaasProvider);
-	}
-	
-	public IaasProvider getIaasProvider() {
-		return iaasProvider;
-	}
-
-	public void setIaasProvider(IaasProvider iaasProvider) {
-		this.iaasProvider = iaasProvider;
-	}
-	
-    /**
-     * This should build the {@link ComputeService} object and the {@link Template} object,
-     * using the information from {@link IaasProvider} and should set the built 
-     * {@link ComputeService} object in the {@link IaasProvider#setComputeService(ComputeService)}
-     * and also should set the built {@link Template} object in the 
-     * {@link IaasProvider#setTemplate(Template)}.
-     */
-    public abstract void buildComputeServiceAndTemplate();
-    
     /**
-     * This method provides a way to set payload that can be obtained from {@link IaasProvider#getPayload()}
-     * in the {@link Template} of this IaaS.
+     * Reference to the corresponding {@link IaasProvider}
      */
-    public abstract void setDynamicPayload();
-    
+    private IaasProvider iaasProvider;
+
+    public Iaas(IaasProvider iaasProvider) {
+        this.setIaasProvider(iaasProvider);
+    }
+
+    public IaasProvider getIaasProvider() {
+        return iaasProvider;
+    }
+
+    public void setIaasProvider(IaasProvider iaasProvider) {
+        this.iaasProvider = iaasProvider;
+    }
+
     /**
-     * This will obtain an IP address from the allocated list and associate that IP with this node.
-     * @param node Node to be associated with an IP.
-     * @return associated public IP.
+     * Initialize the iaas object.
      */
-    public abstract String associateAddress(NodeMetadata node);
-    
+    public abstract void initialize();
+
     /**
-     * This will obtain a predefined IP address and associate that IP with this node, if ip is already in use allocate ip from pool 
-     * (through associateAddress())
-     * @param node Node to be associated with an IP.
-     * @ip preallocated floating Ip
-     * @return associated public IP.
+     * Create vm/container instance.
+     *
+     * @param clusterContext
+     * @param memberContext
+     * @return
      */
-    public abstract String associatePredefinedAddress(NodeMetadata node, String ip);
-    
+    public abstract NodeMetadata createInstance(ClusterContext clusterContext, MemberContext memberContext);
+
     /**
      * This will deallocate/release the given IP address back to pool.
+     *
      * @param ip public IP address to be released.
      */
     public abstract void releaseAddress(String ip);
-    
-    /**
-     * This method should create a Key Pair corresponds to a given public key in the respective region having the name given.
-     * Also should override the value of the key pair in the {@link Template} of this IaaS.
-     * @param region region that the key pair will get created.
-     * @param keyPairName name of the key pair. NOTE: Jclouds adds a prefix : <code>jclouds#</code>
-     * @param publicKey public key, from which the key pair will be created.
-     * @return whether the key pair creation is successful or not.
-     */
-    public abstract boolean createKeyPairFromPublicKey(String region, String keyPairName, String publicKey);
-    
+
     /**
      * Validate a given region name against a particular IaaS.
      * If a particular IaaS doesn't have a concept called region, it can simply throw {@link InvalidRegionException}.
+     *
      * @param region name of the region.
      * @return whether the region is valid.
      * @throws InvalidRegionException if the region is invalid.
      */
     public abstract boolean isValidRegion(String region) throws InvalidRegionException;
-    
+
     /**
      * Validate a given zone name against a particular region in an IaaS.
      * If a particular IaaS doesn't have a concept called zone, it can simply throw {@link InvalidZoneException}.
+     *
      * @param region region of the IaaS that the zone belongs to.
-     * @param zone 
+     * @param zone
      * @return whether the zone is valid in the given region or not.
      * @throws InvalidZoneException if the zone is invalid in a given region.
      */
     public abstract boolean isValidZone(String region, String zone) throws InvalidZoneException, InvalidRegionException;
-    
+
     /**
      * Validate a given host id against a particular zone in an IaaS.
      * If a particular IaaS doesn't have a concept called hosts, it can simply throw {@link InvalidHostException}.
+     *
      * @param zone zone of the IaaS that the host belongs to.
      * @param host
      * @return whether the host is valid in the given zone or not.
      * @throws InvalidHostException if the host is invalid in a given zone.
      */
     public abstract boolean isValidHost(String zone, String host) throws InvalidHostException;
-    
+
     /**
      * provides the {@link PartitionValidator} corresponds to this particular IaaS.
+     *
      * @return {@link PartitionValidator}
      */
     public abstract PartitionValidator getPartitionValidator();
 
     /**
-     * Builds only the jclouds {@link Template}
-     */
-    public abstract void buildTemplate();
-    
-    /**
      * Create a new volume in the respective Iaas.
+     *
      * @param sizeGB size of the volume in Giga Bytes.
      * @return Id of the created volume.
      */
     public abstract String createVolume(int sizeGB, String snapshotId);
-   
+
+
     /**
      * Attach a given volume to an instance at the specified device path.
+     *
      * @param instanceId of the instance.
-     * @param volumeId volume id of the volume to be attached.
+     * @param volumeId   volume id of the volume to be attached.
      * @param deviceName name of the device that the volume would bind to.
      * @return the status of the attachment.
      */
     public abstract String attachVolume(String instanceId, String volumeId, String deviceName);
-    
+
     /**
      * Detach a given volume from the given instance.
+     *
      * @param instanceId of the instance.
-     * @param volumeId volume id of the volume to be detached.
+     * @param volumeId   volume id of the volume to be detached.
      */
     public abstract void detachVolume(String instanceId, String volumeId);
-    
+
     /**
      * Delete a given volume.
+     *
      * @param volumeId volume id of the volume to be detached.
      */
     public abstract void deleteVolume(String volumeId);
 
     /**
-     * This returns the device of the volume specified by the user. This is depends on IAAS. 
+     * This returns the device of the volume specified by the user. This is depends on IAAS.
      * For an instance /dev/sdf maps to /dev/xvdf in EC2.
      */
     public abstract String getIaasDevice(String device);
+
+    public abstract void allocateIpAddress(String clusterId, MemberContext memberContext, Partition partition,
+                                           String cartridgeType, NodeMetadata node);
+
+    /**
+     * This method provides a way to set payload.
+     */
+    public abstract void setDynamicPayload(byte[] payload);
+
+    public abstract void terminateInstance(MemberContext memberContext) throws InvalidCartridgeTypeException, InvalidMemberException;
 }


Mime
View raw message