From b6e063bf51298a893fdfcb8b3ff3e5d36b62cc0f Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Mon, 29 Mar 2010 10:43:42 -0700 Subject: [PATCH] Issue 217: call undeploy before deleting a vapp --- .../compute/BaseVCloudComputeClient.java | 14 +++++++- .../compute/TerremarkVCloudComputeClient.java | 35 ++++++++++++++----- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java index f0453273e4..191427b921 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java @@ -145,7 +145,19 @@ public class BaseVCloudComputeClient implements VCloudComputeClient { if (!taskTester.apply(task.getId())) { throw new TaskException("powerOff", vApp, task); } - logger.debug("<< off vApp(%s)", vApp.getId()); + vApp = client.getVApp(id); + logger.debug("<< %s vApp(%s)", vApp.getStatus(), vApp.getId()); + } + if (vApp.getStatus() != VAppStatus.UNRESOLVED) { + logger + .debug(">> undeploying vApp(%s), current status: %s", vApp.getId(), vApp + .getStatus()); + Task task = client.undeployVApp(vApp.getId()); + if (!taskTester.apply(task.getId())) { + throw new TaskException("undeploy", vApp, task); + } + vApp = client.getVApp(id); + logger.debug("<< %s vApp(%s)", vApp.getStatus(), vApp.getId()); } logger.debug(">> deleting vApp(%s)", vApp.getId()); client.deleteVApp(id); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java index 521d70469d..0051f3cbf3 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java @@ -31,6 +31,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeState; import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; @@ -125,14 +126,6 @@ public class TerremarkVCloudComputeClient extends BaseVCloudComputeClient { return ip != null ? ip.getAddress() : null; } - @Override - public void stop(String id) { - VApp vApp = client.getVApp(id); - Set ipAddresses = deleteInternetServicesAndNodesAssociatedWithVApp(vApp); - deletePublicIpAddressesWithNoServicesAttached(ipAddresses); - super.stop(id); - } - private Set deleteInternetServicesAndNodesAssociatedWithVApp(VApp vApp) { Set ipAddresses = Sets.newHashSet(); SERVICE: for (InternetService service : client.getAllInternetServicesInVDC(vApp.getVDC() @@ -173,6 +166,32 @@ public class TerremarkVCloudComputeClient extends BaseVCloudComputeClient { } } + /** + * deletes the internet service and nodes associated with the vapp. Deletes the IP address, if + * there are no others using it. Finally, it powers off and deletes the vapp. Note that we do not + * call undeploy, as terremark does not support the command. + */ + @Override + public void stop(String id) { + VApp vApp = client.getVApp(id); + Set ipAddresses = deleteInternetServicesAndNodesAssociatedWithVApp(vApp); + deletePublicIpAddressesWithNoServicesAttached(ipAddresses); + if (vApp.getStatus() != VAppStatus.OFF) { + logger.debug(">> powering off vApp(%s), current status: %s", vApp.getId(), vApp + .getStatus()); + Task task = client.powerOffVApp(vApp.getId()); + if (!taskTester.apply(task.getId())) { + throw new TaskException("powerOff", vApp, task); + } + vApp = client.getVApp(id); + logger.debug("<< %s vApp(%s)", vApp.getStatus(), vApp.getId()); + } + logger.debug(">> deleting vApp(%s)", vApp.getId()); + client.deleteVApp(id); + boolean successful = notFoundTester.apply(vApp); + logger.debug("<< deleted vApp(%s) completed(%s)", vApp.getId(), successful); + } + @Override public Set getPrivateAddresses(String id) { VApp vApp = client.getVApp(id);