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