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 <[email protected]>
Authored: Sat May 17 22:49:00 2014 +0530
Committer: Udara Liyanage <[email protected]>
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();
+    }
 }

Reply via email to