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