You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ni...@apache.org on 2014/12/01 14:15:03 UTC

[4/4] stratos git commit: Moving Cloud controller's iaas package back to iaases, since this involves config changes, which we shouldn't be doing.

Moving Cloud controller's iaas package back to iaases, since this involves config changes, which we shouldn't be doing.


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

Branch: refs/heads/master
Commit: 0984bcef2528ca67d4434bda0d232c3394348f6e
Parents: e4ec3ee
Author: Nirmal Fernando <ni...@gmail.com>
Authored: Mon Dec 1 18:45:55 2014 +0530
Committer: Nirmal Fernando <ni...@gmail.com>
Committed: Mon Dec 1 18:45:55 2014 +0530

----------------------------------------------------------------------
 .../concurrent/PartitionValidatorCallable.java  |   4 +-
 .../cloud/controller/domain/IaasProvider.java   |   6 +-
 .../cloud/controller/iaas/AWSEC2Iaas.java       | 637 ----------------
 .../cloud/controller/iaas/CloudstackIaas.java   | 540 --------------
 .../cloud/controller/iaas/DockerIaas.java       | 151 ----
 .../stratos/cloud/controller/iaas/GCEIaas.java  | 454 ------------
 .../stratos/cloud/controller/iaas/Iaas.java     | 173 -----
 .../controller/iaas/OpenstackNovaIaas.java      | 740 -------------------
 .../cloud/controller/iaas/VCloudIaas.java       | 262 -------
 .../validators/AWSEC2PartitionValidator.java    | 122 ---
 .../CloudstackPartitionValidator.java           |  52 --
 .../validators/DockerPartitionValidator.java    |  78 --
 .../iaas/validators/GCEPartitionValidator.java  |  53 --
 .../OpenstackNovaPartitionValidator.java        | 121 ---
 .../iaas/validators/PartitionValidator.java     |  47 --
 .../validators/VCloudPartitionValidator.java    |  55 --
 .../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   | 173 +++++
 .../controller/iaases/OpenstackNovaIaas.java    | 740 +++++++++++++++++++
 .../cloud/controller/iaases/VCloudIaas.java     | 262 +++++++
 .../validators/AWSEC2PartitionValidator.java    | 122 +++
 .../CloudstackPartitionValidator.java           |  52 ++
 .../validators/DockerPartitionValidator.java    |  78 ++
 .../validators/GCEPartitionValidator.java       |  53 ++
 .../OpenstackNovaPartitionValidator.java        | 121 +++
 .../iaases/validators/PartitionValidator.java   |  47 ++
 .../validators/VCloudPartitionValidator.java    |  55 ++
 .../impl/CloudControllerServiceImpl.java        |   4 +-
 .../controller/util/CloudControllerUtil.java    |   3 +-
 32 files changed, 3498 insertions(+), 3494 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/0984bcef/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 dd32202..0b56eee 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
@@ -25,11 +25,11 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.domain.Partition;
 import org.apache.stratos.cloud.controller.exception.InvalidIaasProviderException;
 import org.apache.stratos.cloud.controller.exception.InvalidPartitionException;
-import org.apache.stratos.cloud.controller.iaas.Iaas;
 import org.apache.stratos.cloud.controller.domain.Cartridge;
 import org.apache.stratos.cloud.controller.domain.IaasProvider;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
-import org.apache.stratos.cloud.controller.iaas.validators.PartitionValidator;
+import org.apache.stratos.cloud.controller.iaases.Iaas;
+import org.apache.stratos.cloud.controller.iaases.validators.PartitionValidator;
 
 public class PartitionValidatorCallable implements Callable<IaasProvider> {
 	

http://git-wip-us.apache.org/repos/asf/stratos/blob/0984bcef/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 3cf25fb..0f5dd25 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
@@ -21,7 +21,7 @@ package org.apache.stratos.cloud.controller.domain;
 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.iaas.Iaas;
+import org.apache.stratos.cloud.controller.iaases.Iaas;
 import org.apache.stratos.cloud.controller.util.CloudControllerUtil;
 import org.jclouds.compute.ComputeService;
 import org.jclouds.compute.domain.Template;
@@ -45,7 +45,7 @@ public class IaasProvider implements Serializable{
 
 
     /**
-     * Fully qualified class name of an implementation of {@link org.apache.stratos.cloud.controller.iaas.Iaas}
+     * Fully qualified class name of an implementation of {@link org.apache.stratos.cloud.controller.iaases.Iaas}
      */
     private String className;
     
@@ -78,7 +78,7 @@ public class IaasProvider implements Serializable{
     private byte[] payload;
     
     /** 
-     * Corresponding {@link org.apache.stratos.cloud.controller.iaas.Iaas} implementation
+     * Corresponding {@link org.apache.stratos.cloud.controller.iaases.Iaas} implementation
      */
     private transient Iaas iaas;
     

http://git-wip-us.apache.org/repos/asf/stratos/blob/0984bcef/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/AWSEC2Iaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/AWSEC2Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/AWSEC2Iaas.java
deleted file mode 100644
index 4f1b850..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/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.iaas;
-
-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.iaas.validators.AWSEC2PartitionValidator;
-import org.apache.stratos.cloud.controller.iaas.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/0984bcef/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/CloudstackIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/CloudstackIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/CloudstackIaas.java
deleted file mode 100644
index 0f0a910..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/CloudstackIaas.java
+++ /dev/null
@@ -1,540 +0,0 @@
-package org.apache.stratos.cloud.controller.iaas;
-
-
-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.iaas.validators.CloudstackPartitionValidator;
-import org.apache.stratos.cloud.controller.iaas.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/0984bcef/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/DockerIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/DockerIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/DockerIaas.java
deleted file mode 100644
index 4062a0b..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/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.iaas;
-
-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.iaas.validators.DockerPartitionValidator;
-import org.apache.stratos.cloud.controller.iaas.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/0984bcef/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/GCEIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/GCEIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/GCEIaas.java
deleted file mode 100644
index 6852d23..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/GCEIaas.java
+++ /dev/null
@@ -1,454 +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.iaas;
-
-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.iaas.validators.GCEPartitionValidator;
-import org.apache.stratos.cloud.controller.iaas.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/0984bcef/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/Iaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/Iaas.java
deleted file mode 100644
index 5f05971..0000000
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaas/Iaas.java
+++ /dev/null
@@ -1,173 +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.iaas;
-
-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.IaasProvider;
-import org.apache.stratos.cloud.controller.iaas.validators.PartitionValidator;
-
-/**
- * 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.
-     */
-    public abstract void setDynamicPayload();
-    
-    /**
-     * 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.
-     */
-    public abstract String associateAddress(NodeMetadata node);
-    
-    /**
-     * 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.
-     */
-    public abstract String associatePredefinedAddress(NodeMetadata node, String ip);
-    
-    /**
-     * This will deallocate/release the given IP address back to pool.
-     * @param iaasInfo corresponding {@link IaasProvider}
-     * @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 
-     * @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 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.
-     */
-    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. 
-     * For an instance /dev/sdf maps to /dev/xvdf in EC2.
-     */
-    public abstract String getIaasDevice(String device);
-}