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();
+ }
}