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 2015/03/25 06:38:45 UTC

stratos git commit: persistence support fix

Repository: stratos
Updated Branches:
  refs/heads/master c022a4501 -> bddd48bd2


persistence support fix


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

Branch: refs/heads/master
Commit: bddd48bd216eb5e463452f7021b4e18f6c73b9d2
Parents: c022a45
Author: Udara Liyanage <ud...@wso2.com>
Authored: Wed Mar 25 11:01:43 2015 +0530
Committer: Udara Liyanage <ud...@wso2.com>
Committed: Wed Mar 25 11:02:17 2015 +0530

----------------------------------------------------------------------
 .../cloud/controller/iaases/JcloudsIaas.java    |  5 ++
 .../iaases/openstack/OpenstackIaas.java         | 94 +++++++++++++-------
 .../services/impl/InstanceCreator.java          |  8 +-
 3 files changed, 71 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/bddd48bd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
index 8d43cff..099b991 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/JcloudsIaas.java
@@ -323,6 +323,7 @@ public abstract class JcloudsIaas extends Iaas {
      */
     private void destroyNode(String nodeId, MemberContext memberContext) {
         // Detach volumes if any
+
         detachVolume(memberContext);
 
         // Destroy the node via jclouds
@@ -351,6 +352,9 @@ public abstract class JcloudsIaas extends Iaas {
                         return;
                     }
                     detachVolume(ctxt.getInstanceId(), volumeId);
+                    if(volume.isRemoveOntermination()){
+                        deleteVolume(volumeId);
+                    }
                 } catch (ResourceNotFoundException ignore) {
                     if (log.isDebugEnabled()) {
                         log.debug(ignore);
@@ -360,6 +364,7 @@ public abstract class JcloudsIaas extends Iaas {
         }
     }
 
+
     public NodeMetadata findNodeMetadata(String nodeId) {
         ComputeService computeService = getIaasProvider().getComputeService();
         return computeService.getNodeMetadata(nodeId);

http://git-wip-us.apache.org/repos/asf/stratos/blob/bddd48bd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/OpenstackIaas.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/OpenstackIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/OpenstackIaas.java
index c3dbba8..ab2b3ea 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/OpenstackIaas.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/openstack/OpenstackIaas.java
@@ -18,11 +18,7 @@
  */
 package org.apache.stratos.cloud.controller.iaases.openstack;
 
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeoutException;
-
+import com.google.common.base.Optional;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -33,10 +29,10 @@ 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.iaases.JcloudsIaas;
+import org.apache.stratos.cloud.controller.iaases.PartitionValidator;
 import org.apache.stratos.cloud.controller.iaases.openstack.networking.NeutronNetworkingApi;
 import org.apache.stratos.cloud.controller.iaases.openstack.networking.NovaNetworkingApi;
 import org.apache.stratos.cloud.controller.iaases.openstack.networking.OpenstackNetworkingApi;
-import org.apache.stratos.cloud.controller.iaases.PartitionValidator;
 import org.apache.stratos.cloud.controller.util.CloudControllerConstants;
 import org.apache.stratos.cloud.controller.util.ComputeServiceBuilderUtil;
 import org.jclouds.compute.ComputeService;
@@ -47,20 +43,15 @@ import org.jclouds.compute.domain.TemplateBuilder;
 import org.jclouds.compute.options.TemplateOptions;
 import org.jclouds.openstack.nova.v2_0.NovaApi;
 import org.jclouds.openstack.nova.v2_0.compute.options.NovaTemplateOptions;
-import org.jclouds.openstack.nova.v2_0.domain.HostAggregate;
-import org.jclouds.openstack.nova.v2_0.domain.KeyPair;
-import org.jclouds.openstack.nova.v2_0.domain.Network;
-import org.jclouds.openstack.nova.v2_0.domain.Volume;
-import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment;
+import org.jclouds.openstack.nova.v2_0.domain.*;
 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.HostAggregateApi;
-import org.jclouds.openstack.nova.v2_0.extensions.KeyPairApi;
-import org.jclouds.openstack.nova.v2_0.extensions.VolumeApi;
-import org.jclouds.openstack.nova.v2_0.extensions.VolumeAttachmentApi;
+import org.jclouds.openstack.nova.v2_0.extensions.*;
 import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions;
 
-import com.google.common.base.Optional;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.TimeoutException;
 
 public class OpenstackIaas extends JcloudsIaas {
 
@@ -473,7 +464,8 @@ public class OpenstackIaas extends JcloudsIaas {
 
         VolumeAttachment attachment = null;
         if (volumeBecameAvailable) {
-            attachment = volumeAttachmentApi.attachVolumeToServerAsDevice(volumeId, instanceId, device);
+
+            attachment = volumeAttachmentApi.attachVolumeToServerAsDevice(volumeId, removeRegionPrefix(instanceId), device);
 
             try {
                 volumeBecameAttached = waitForStatus(volumeId, Volume.Status.IN_USE, 2);
@@ -481,11 +473,6 @@ public class OpenstackIaas extends JcloudsIaas {
                 log.error("[Volume ID] " + volumeId + "did not become IN_USE within expected timeout");
             }
         }
-        try {
-            // waiting 5seconds till volumes are actually attached.
-            Thread.sleep(5000);
-        } catch (InterruptedException ignore) {
-        }
 
         if (attachment == null) {
 			log.fatal(String.format("Volume [id]: %s attachment for instance [id]: %s was unsuccessful. [region] : %s of Iaas : %s", volumeId, instanceId, region, iaasInfo));
@@ -500,7 +487,16 @@ public class OpenstackIaas extends JcloudsIaas {
 		return "Attaching";
 	}
 
-	@Override
+    private String removeRegionPrefix(String instanceId) {
+        String instaneIdDelimeter = "/";
+        if(instanceId.contains(instaneIdDelimeter)) {
+            return instanceId.split(instaneIdDelimeter)[1];
+        }else{
+            return instanceId;
+        }
+    }
+
+    @Override
 	public void detachVolume(String instanceId, String volumeId) {
 		IaasProvider iaasInfo = getIaasProvider();
 
@@ -508,6 +504,10 @@ public class OpenstackIaas extends JcloudsIaas {
 				.getContext();
 		
 		String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo);
+
+
+        //NovaApi novaApi = context.unwrapApi(NovaApi.class);
+        //VolumeApi api = novaApi.getVolumeExtensionForZone(region).get();
 		
 		if(region == null) {
 			log.fatal(String.format("Cannot detach the volume [id]: %s from the instance [id]: %s. Extracted region is null for Iaas : %s", volumeId, instanceId, iaasInfo));
@@ -518,13 +518,14 @@ public class OpenstackIaas extends JcloudsIaas {
         }
 
         NovaApi novaApi = context.unwrapApi(NovaApi.class);
-        VolumeAttachmentApi api = novaApi.getVolumeAttachmentExtensionForZone(region).get();
-        if (api.detachVolumeFromServer(volumeId, instanceId)) {
+        VolumeAttachmentApi attachmentApiapi = novaApi.getVolumeAttachmentExtensionForZone(region).get();
+        VolumeApi volumeApi = novaApi.getVolumeExtensionForZone(region).get();
+
+        if (attachmentApiapi.detachVolumeFromServer(volumeId, removeRegionPrefix(instanceId))) {
         	log.info(String.format("Detachment of Volume [id]: %s from instance [id]: %s was successful. [region] : %s of Iaas : %s", volumeId, instanceId, region, iaasInfo));
         }else{
-            log.error(String.format("Detachment of Volume [id]: %s from instance [id]: %s was unsuccessful. [volume Status] : %s", volumeId, instanceId, region, iaasInfo));
+            log.error(String.format("Detachment of Volume [id]: %s from instance [id]: %s was unsuccessful. [region] : %s [volume Status] : %s", volumeId, instanceId, region, getVolumeStatus(volumeApi, volumeId)));
         }
-        
 	}
 
 	@Override
@@ -535,16 +536,40 @@ public class OpenstackIaas extends JcloudsIaas {
 				.getContext();
 		
 		String region = ComputeServiceBuilderUtil.extractRegion(iaasInfo);
-		
+        NovaApi novaApi = context.unwrapApi(NovaApi.class);
+        VolumeApi api = novaApi.getVolumeExtensionForZone(region).get();
+
+
 		if(region == null) {
 			log.fatal(String.format("Cannot delete the volume [id]: %s. Extracted region is null for Iaas : %s", volumeId, iaasInfo));
 			return;
 		}
 
-        NovaApi novaApi = context.unwrapApi(NovaApi.class);
-		VolumeApi api = novaApi.getVolumeExtensionForZone(region).get();
+        Volume volume = api.get(volumeId);
+        if(volume == null){
+            log.warn(String.format("Could not remove volume [id] %s since volume does not exist" , volumeId));
+            return;
+        }
+
+        Volume.Status volumeStatus = volume.getStatus();
+
+        if(volumeStatus == Volume.Status.IN_USE){
+            try {
+                waitForStatus(volumeId, Volume.Status.AVAILABLE, 2);
+            } catch (TimeoutException e) {
+                //Timeout Exception is occurred if the instance did not become available withing expected time period.
+                //Hence volume will not be deleted.
+
+                log.error("[Volume ID] " + volumeId + "did not become AVAILABLE within expected timeout, hence returning without deleting the volume");
+                return;
+            }
+        }
+
+        // Coming here means either AVAILABLE or ERROR
         if (api.delete(volumeId)) {
         	log.info(String.format("Deletion of Volume [id]: %s was successful. [region] : %s of Iaas : %s", volumeId, region, iaasInfo));
+        }else{
+            log.error(String.format("Deletion of Volume [id]: %s was unsuccessful. [region] : %s of Iaas : %s", volumeId, region, iaasInfo));
         }
 	}
 
@@ -554,6 +579,11 @@ public class OpenstackIaas extends JcloudsIaas {
     }
 
     private Volume.Status getVolumeStatus(VolumeApi volumeApi, String volumeId){
-        return volumeApi.get(volumeId).getStatus();
+        Volume volume = volumeApi.get(volumeId);
+        if(volume != null) {
+            return volume.getStatus();
+        }
+
+        return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/stratos/blob/bddd48bd/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
----------------------------------------------------------------------
diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
index dc0c1c1..2d0d6f9 100644
--- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
+++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/services/impl/InstanceCreator.java
@@ -58,7 +58,6 @@ public class InstanceCreator implements Runnable {
             ClusterContext clusterContext = CloudControllerContext.getInstance().getClusterContext(clusterId);
             Iaas iaas = iaasProvider.getIaas();
 
-            // Start instance
             memberContext = startInstance(iaas, memberContext);
 
             if (log.isInfoEnabled()) {
@@ -69,8 +68,9 @@ public class InstanceCreator implements Runnable {
                         memberContext.getDefaultPublicIP()));
             }
 
-            // Attach volumes
-            attachVolumes(iaas, clusterContext, memberContext);
+            if(clusterContext.isVolumeRequired()) {
+                attachVolumes(iaas, clusterContext, memberContext);
+            }
 
             // Allocate IP addresses
             iaas.allocateIpAddresses(clusterId, memberContext, partition);
@@ -133,7 +133,7 @@ public class InstanceCreator implements Runnable {
                     } catch (Exception e) {
                         // continue without throwing an exception, since
                         // there is an instance already running
-                        log.error(String.format("Could not attache volume, [instance] %s [volume] %s ",
+                        log.error(String.format("Could not attach volume, [instance] %s [volume] %s ",
                                 memberContext.getInstanceId(), volume.toString()), e);
                     }
                 }