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/06/04 19:12:51 UTC

git commit: wait till volume becomes available before attaching.

Repository: stratos
Updated Branches:
  refs/heads/master ed21faeab -> 669c9026b


wait till volume becomes available before attaching.


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

Branch: refs/heads/master
Commit: 669c9026bcda5c5a05f5a39bac567daf7ad8dd65
Parents: ed21fae
Author: Udara Liyanage <ud...@wso2.com>
Authored: Sat May 17 22:49:00 2014 +0530
Committer: Udara Liyanage <ud...@wso2.com>
Committed: Wed Jun 4 22:40:59 2014 +0530

----------------------------------------------------------------------
 .../controller/iaases/OpenstackNovaIaas.java    | 44 +++++++++++++++++---
 1 file changed, 38 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/stratos/blob/669c9026/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 7dd1e99..c327002 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
@@ -539,7 +539,6 @@ public class OpenstackNovaIaas extends Iaas {
         
         RestContext<NovaApi, NovaAsyncApi> nova = context.unwrap();
         VolumeApi api = nova.getApi().getVolumeExtensionForZone(region).get();
-        
         Volume volume;
         if(StringUtils.isEmpty(snapshotId)){
         	if(log.isDebugEnabled()){
@@ -550,7 +549,6 @@ public class OpenstackNovaIaas extends Iaas {
         	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) {
@@ -558,7 +556,7 @@ public class OpenstackNovaIaas extends Iaas {
 					+ " of Iaas : " + iaasInfo);
 			return null;
 		}        
-		
+
 		log.info("Successfully created a new volume [id]: "+volume.getId()
 				+" in [region] : "+region+" [zone] : "+zone+" of Iaas : "+iaasInfo + " [Volume ID]" + volume.getId());
 		return volume.getId();
@@ -579,10 +577,41 @@ public class OpenstackNovaIaas extends Iaas {
 					+" of Iaas : "+iaasInfo);
 			return null;
 		}
-		
+
 		RestContext<NovaApi, NovaAsyncApi> nova = context.unwrap();
-        VolumeAttachmentApi api = nova.getApi().getVolumeAttachmentExtensionForZone(region).get();
-        VolumeAttachment attachment = api.attachVolumeToServerAsDevice(volumeId, instanceId, device);    
+
+        VolumeApi volumeApi = nova.getApi().getVolumeExtensionForZone(region).get();
+
+        Volume.Status volumeStatus = this.getVolumeStatus(volumeApi, volumeId);
+
+        if(log.isDebugEnabled()){
+            log.debug("Volume " + volumeId + " is in state " + volumeStatus);
+        }
+
+        if(!(volumeStatus == Volume.Status.AVAILABLE || volumeStatus == Volume.Status.CREATING)){
+            log.error(String.format("Volume %s can not be attached. Volume status is %s", volumeId, volumeStatus));
+            return null;
+        }
+
+        /* Coming here means @volumeStatus is VAILABLE  or CREATING. waiting till it becomes AVAILABLE. */
+        while(volumeStatus != Volume.Status.AVAILABLE){
+            try {
+                // TODO Use a proper mechanism to wait till volume becomes available.
+                Thread.sleep(100);
+                volumeStatus = this.getVolumeStatus(volumeApi, 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");
+        }
+
+        VolumeAttachmentApi volumeAttachmentApi = nova.getApi().getVolumeAttachmentExtensionForZone(region).get();
+        VolumeAttachment attachment = volumeAttachmentApi.attachVolumeToServerAsDevice(volumeId, instanceId, device);
         if (attachment == null) {
 			log.fatal("Volume [id]: "+volumeId+" attachment for instance [id]: "+instanceId
 					+" was unsuccessful. [region] : " + region
@@ -650,4 +679,7 @@ public class OpenstackNovaIaas extends Iaas {
         return device;
     }
 
+    private Volume.Status getVolumeStatus(VolumeApi volumeApi, String volumeId){
+        return volumeApi.get(volumeId).getStatus();
+    }
 }