You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by ud...@apache.org on 2014/05/10 08:42:29 UTC

[2/4] git commit: Adding feature to create an volume from an snapshot.

Adding feature to create an volume from an snapshot.

Signed-off-by: Udara Liyanage <ud...@wso2.com>


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

Branch: refs/heads/master
Commit: ffa5f1ec81fa2e9137a08577820094ad9de8dde0
Parents: 5ebdf86
Author: Udara Liyanage <ud...@wso2.com>
Authored: Sat May 10 00:12:56 2014 +0530
Committer: Udara Liyanage <ud...@wso2.com>
Committed: Sat May 10 00:29:58 2014 +0530

----------------------------------------------------------------------
 .../cloud/controller/iaases/AWSEC2Iaas.java     |  17 +-
 .../controller/iaases/OpenstackNovaIaas.java    |  28 +-
 .../cloud/controller/iaases/VCloudIaas.java     |   2 +-
 .../impl/CloudControllerServiceImpl.java        |   4 +-
 .../cloud/controller/interfaces/Iaas.java       |   2 +-
 .../stratos/cloud/controller/pojo/Volume.java   |  11 +-
 .../bean/cartridge/definition/VolumeBean.java   |   2 +
 .../bean/util/converter/PojoConverter.java      |   1 +
 .../main/resources/CloudControllerService.wsdl  | 814 +++++++++----------
 9 files changed, 452 insertions(+), 429 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/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
index eafbade..e4d5477 100644
--- 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
@@ -22,6 +22,7 @@ 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;
@@ -457,7 +458,7 @@ public class AWSEC2Iaas extends Iaas {
     }
 
 	@Override
-	public String createVolume(int sizeGB) {
+	public String createVolume(int sizeGB, String snapshotId) {
 		IaasProvider iaasInfo = getIaasProvider();
 
 		ComputeServiceContext context = iaasInfo.getComputeService()
@@ -474,7 +475,19 @@ public class AWSEC2Iaas extends Iaas {
 		
 		ElasticBlockStoreApi blockStoreApi = context.unwrapApi(AWSEC2Api.class).getElasticBlockStoreApiForRegion(region).get();
 		
-		Volume volume = blockStoreApi.createVolumeInAvailabilityZone(zone, sizeGB);
+		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

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
index dccbb2e..cc6f376 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/OpenstackNovaIaas.java
@@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.stratos.cloud.controller.exception.CloudControllerException;
@@ -43,6 +44,7 @@ import org.jclouds.compute.domain.NodeMetadataBuilder;
 import org.jclouds.compute.domain.Template;
 import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.options.TemplateOptions;
+import org.jclouds.ec2.options.CreateSnapshotOptions;
 import org.jclouds.openstack.nova.v2_0.NovaApi;
 import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
 import org.jclouds.openstack.nova.v2_0.NovaAsyncApi;
@@ -53,6 +55,7 @@ import org.jclouds.openstack.nova.v2_0.domain.KeyPair;
 import org.jclouds.openstack.nova.v2_0.domain.Network;
 import org.jclouds.openstack.nova.v2_0.domain.Volume;
 import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment;
+import org.jclouds.openstack.nova.v2_0.domain.VolumeSnapshot;
 import org.jclouds.openstack.nova.v2_0.domain.zonescoped.AvailabilityZone;
 import org.jclouds.openstack.nova.v2_0.extensions.AvailabilityZoneAPI;
 import org.jclouds.openstack.nova.v2_0.extensions.FloatingIPApi;
@@ -61,6 +64,7 @@ import org.jclouds.openstack.nova.v2_0.extensions.KeyPairApi;
 import org.jclouds.openstack.nova.v2_0.extensions.VolumeApi;
 import org.jclouds.openstack.nova.v2_0.extensions.VolumeAttachmentApi;
 import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions;
+import org.jclouds.openstack.nova.v2_0.options.CreateVolumeSnapshotOptions;
 import org.jclouds.rest.RestContext;
 
 import java.util.ArrayList;
@@ -515,7 +519,7 @@ public class OpenstackNovaIaas extends Iaas {
     }
 
 	@Override
-	public String createVolume(int sizeGB) {
+	public String createVolume(int sizeGB, String snapshotId) {
 		IaasProvider iaasInfo = getIaasProvider();
 		String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo);
 		String zone = ComputeServiceBuilderUtil.extractZone(iaasInfo);
@@ -529,15 +533,28 @@ public class OpenstackNovaIaas extends Iaas {
         
         RestContext<NovaApi, NovaAsyncApi> nova = context.unwrap();
         VolumeApi api = nova.getApi().getVolumeExtensionForZone(region).get();
-        Volume volume = api.create(sizeGB, CreateVolumeOptions.Builder.availabilityZone(zone));
+        
+        Volume volume;
+        if(StringUtils.isEmpty(snapshotId)){
+        	if(log.isDebugEnabled()){
+        		log.info("Creating a volume in the zone " + zone);
+        	}
+        	volume = api.create(sizeGB, CreateVolumeOptions.Builder.availabilityZone(zone));
+        }else{
+        	if(log.isDebugEnabled()){
+        		log.info("Creating a volume in the zone " + zone + " from the shanpshot " + snapshotId);
+        	}
+        	System.out.println(("Creating a volume in the zone " + zone + " from the shanpshot " + snapshotId));
+        	volume = api.create(sizeGB, CreateVolumeOptions.Builder.availabilityZone(zone).snapshotId(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);
+				+" in [region] : "+region+" [zone] : "+zone+" of Iaas : "+iaasInfo + " [Volume ID]" + volume.getId());
 		return volume.getId();
 	}
 
@@ -559,8 +576,7 @@ public class OpenstackNovaIaas extends Iaas {
 		
 		RestContext<NovaApi, NovaAsyncApi> nova = context.unwrap();
         VolumeAttachmentApi api = nova.getApi().getVolumeAttachmentExtensionForZone(region).get();
-        VolumeAttachment attachment = api.attachVolumeToServerAsDevice(volumeId, instanceId, device);
-        
+        VolumeAttachment attachment = api.attachVolumeToServerAsDevice(volumeId, instanceId, device);    
         if (attachment == null) {
 			log.fatal("Volume [id]: "+volumeId+" attachment for instance [id]: "+instanceId
 					+" was unsuccessful. [region] : " + region

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
index 9332d7f..b3d1384 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/VCloudIaas.java
@@ -231,7 +231,7 @@ public class VCloudIaas extends Iaas {
     }
 
 	@Override
-	public String createVolume(int sizeGB) {
+	public String createVolume(int sizeGB, String snapshotId) {
 		// TODO Auto-generated method stub
 		return null;
 	}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
index 4eb0ab3..8f9f52e 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/impl/CloudControllerServiceImpl.java
@@ -111,7 +111,6 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 
     public void deployCartridgeDefinition(CartridgeConfig cartridgeConfig) throws InvalidCartridgeDefinitionException, 
     InvalidIaasProviderException {
-
         if (cartridgeConfig == null) {
             String msg = "Invalid Cartridge Definition: Definition is null.";
             log.error(msg);
@@ -423,7 +422,8 @@ public class CloudControllerServiceImpl implements CloudControllerService {
 		Iaas iaas = iaasProvider.getIaas();
 		
 		int sizeGB = volume.getSize();
-		String volumeId = iaas.createVolume(sizeGB);
+		String snapshotId =  volume.getSnapshotId();
+		String volumeId = iaas.createVolume(sizeGB, snapshotId);
 		volume.setId(volumeId);
 		volume.setIaasType(iaasProvider.getType());
 	}

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java
index 492171d..1ae7dc5 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/interfaces/Iaas.java
@@ -141,7 +141,7 @@ public abstract class Iaas {
      * @param sizeGB size of the volume in Giga Bytes.
      * @return Id of the created volume.
      */
-    public abstract String createVolume(int sizeGB);
+    public abstract String createVolume(int sizeGB, String snapshotId);
    
     /**
      * Attach a given volume to an instance at the specified device path.

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/Volume.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/Volume.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/Volume.java
index b35f965..e687898 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/Volume.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/pojo/Volume.java
@@ -29,10 +29,11 @@ public class Volume implements Serializable {
 	private boolean removeOntermination;
     private String mappingPath;
     private String iaasType;
+    private String snapshotId;
 
     public String toString () {
         return "Persistence Required: " + ", Size: " + getSize() + ", device: " + getDevice() +
-                " mapping path : " + mappingPath + " remove on termination " + isRemoveOntermination();
+                " mapping path : " + mappingPath + " remove on termination " + isRemoveOntermination() + " SnaphotId " + snapshotId;
     }
 
     public int getSize() {
@@ -107,4 +108,12 @@ public class Volume implements Serializable {
 	public void setIaasType(String iaasType) {
 		this.iaasType = iaasType;
 	}
+
+	public String getSnapshotId() {
+		return snapshotId;
+	}
+
+	public void setSnapshotId(String snapshotId) {
+		this.snapshotId = snapshotId;
+	}
 }

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
index 7eabb45..9a1b212 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/cartridge/definition/VolumeBean.java
@@ -30,6 +30,8 @@ public class VolumeBean {
     public boolean removeOnTermination;
 
     public String mappingPath;
+    
+    public String snapshotId;
 
     public String toString () {
         return " [ Persistence Required : " + ", Size: " + size + ", device: " +

http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/ffa5f1ec/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
index 50cbbb6..0162203 100644
--- a/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
+++ b/components/org.apache.stratos.rest.endpoint/src/main/java/org/apache/stratos/rest/endpoint/bean/util/converter/PojoConverter.java
@@ -159,6 +159,7 @@ public class PojoConverter {
             volume.setDevice(volumeBean[i].device);
             volume.setRemoveOntermination(volumeBean[i].removeOnTermination);
             volume.setMappingPath(volumeBean[i].mappingPath);
+            volume.setSnapshotId(volumeBean[i].snapshotId);
             volumes[i] = volume;
         }
         persistence.setVolumes(volumes);