From 9454aeb257dfec2af683358802d08fdb8581a405 Mon Sep 17 00:00:00 2001 From: Andrea Turli Date: Mon, 6 Aug 2012 19:41:30 +0200 Subject: [PATCH] issue 830: fixing vAppTemplateApi*Test, vAppApiLiveTest and vmApiLiveTest --- .../domain/network/NetworkConnection.java | 4 +- .../v1_5/features/VAppTemplateApi.java | 42 ----- .../v1_5/features/VAppTemplateAsyncApi.java | 33 ---- .../v1_5/AbstractVAppApiLiveTest.java | 14 +- .../v1_5/features/VAppApiLiveTest.java | 2 +- .../features/VAppTemplateApiExpectTest.java | 149 ------------------ .../features/VAppTemplateApiLiveTest.java | 89 +---------- .../director/v1_5/features/VmApiLiveTest.java | 60 ++++--- 8 files changed, 52 insertions(+), 341 deletions(-) diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java index 54faf16f1b..9a30e64d4b 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java @@ -222,8 +222,8 @@ public class NetworkConnection { this.externalIpAddress = externalIpAddress; this.isConnected = connected; this.macAddress = macAddress; - this.ipAddressAllocationMode = ipAddressAllocationMode; - this.network = network; + this.ipAddressAllocationMode = checkNotNull(ipAddressAllocationMode, "ipAddressAllocationMode"); + this.network = checkNotNull(network, "network"); this.needsCustomization = needsCustomization; } diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java index 8cc3ab6203..38df0a4cef 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java @@ -165,20 +165,6 @@ public interface VAppTemplateApi { */ CustomizationSection getCustomizationSection(URI templateUri); - /** - * Modifies the vApp template customization information. - * - *
-    * PUT /vAppTemplate/{id}/customizationSection
-    * 
- * - * @param templateUri the URI of the template - * @param section the new configuration to apply - * @return the task performing the action. This operation is asynchronous and the user should monitor the returned - * task status in order to check when it is completed. - */ - Task modifyCustomizationSection(URI templateUri, CustomizationSection section); - /** * Retrieves the Guest Customization Section of a VM * @@ -243,20 +229,6 @@ public interface VAppTemplateApi { */ NetworkConfigSection getNetworkConfigSection(URI templateUri); - /** - * Modifies the network config section of a vApp. - * - *
-    * PUT /vAppTemplate/{id}/networkConfigSection
-    * 
- * - * @param templateUri the URI of the template - * @param section the new configuration to apply - * @return the task performing the action. This operation is asynchronous and the user should monitor the returned - * task status in order to check when it is completed. - */ - Task modifyNetworkConfigSection(URI templateUri, NetworkConfigSection section); - /** * Retrieves the network connection section of a VM * @@ -269,20 +241,6 @@ public interface VAppTemplateApi { */ NetworkConnectionSection getNetworkConnectionSection(URI templateUri); - /** - * Modifies the network connection section of a VM. - * - *
-    * PUT /vAppTemplate/{id}/networkConnectionSection
-    * 
- * - * @param templateUri the URI of the template - * @param section the new configuration to apply - * @return the task performing the action. This operation is asynchronous and the user should monitor the returned - * task status in order to check when it is completed. - */ - Task modifyNetworkConnectionSection(URI templateUri, NetworkConnectionSection section); - /** * Retrieves the network section of a vApp or vApp template. * diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java index 0e0826a17c..ff643b08ea 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java @@ -147,17 +147,6 @@ public interface VAppTemplateAsyncApi { @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture getCustomizationSection(@EndpointParam URI templateURI); - /** - * @see VAppTemplateApi#modifyCustomizationSection(URI, CustomizationSection) - */ - @PUT - @Produces(CUSTOMIZATION_SECTION) - @Consumes(TASK) - @Path("/customizationSection") - @JAXBResponseParser - ListenableFuture modifyCustomizationSection(@EndpointParam URI templateURI, - @BinderParam(BindToXMLPayload.class) CustomizationSection sectionType); - /** * @see VAppTemplateApi#getGuestCustomizationSection(URI) */ @@ -220,17 +209,6 @@ public interface VAppTemplateAsyncApi { @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture getNetworkConfigSection(@EndpointParam URI templateURI); - /** - * @see VAppTemplateApi#modifyNetworkConfigSection(URI, NetworkConfigSection) - */ - @PUT - @Produces(NETWORK_CONFIG_SECTION) - @Consumes(TASK) - @Path("/networkConfigSection") - @JAXBResponseParser - ListenableFuture modifyNetworkConfigSection(@EndpointParam URI templateURI, - @BinderParam(BindToXMLPayload.class) NetworkConfigSection section); - /** * @see VAppTemplateApi#getNetworkConnectionSection(URI) */ @@ -241,17 +219,6 @@ public interface VAppTemplateAsyncApi { @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture getVAppTemplateNetworkConnectionSection(@EndpointParam URI templateURI); - /** - * @see VAppTemplateApi#modifyNetworkConnectionSection(URI, NetworkConnectionSection) - */ - @PUT - @Produces(NETWORK_CONNECTION_SECTION) - @Consumes(TASK) - @Path("/networkConnectionSection") - @JAXBResponseParser - ListenableFuture modifyNetworkConnectionSection(@EndpointParam URI templateURI, - @BinderParam(BindToXMLPayload.class) NetworkConnectionSection section); - /** * @see VAppTemplateApi#getNetworkSection(URI) */ diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java index 81c68f6328..ced21c917f 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java @@ -47,6 +47,7 @@ import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; import org.jclouds.vcloud.director.v1_5.domain.Vdc; import org.jclouds.vcloud.director.v1_5.domain.Vm; import org.jclouds.vcloud.director.v1_5.domain.dmtf.RasdItem; +import org.jclouds.vcloud.director.v1_5.domain.params.UndeployVAppParams; import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection; import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConnectionSection; import org.jclouds.vcloud.director.v1_5.features.CatalogApi; @@ -112,7 +113,6 @@ public abstract class AbstractVAppApiLiveTest extends BaseVCloudDirectorApiLiveT * @see BaseVCloudDirectorApiLiveTest#setupRequiredApis() */ @Override - @BeforeClass(alwaysRun = true, description = "Retrieves the required apis from the REST API context") protected void setupRequiredApis() { assertNotNull(context.getApi()); @@ -122,14 +122,13 @@ public abstract class AbstractVAppApiLiveTest extends BaseVCloudDirectorApiLiveT vAppTemplateApi = context.getApi().getVAppTemplateApi(); vdcApi = context.getApi().getVdcApi(); vmApi = context.getApi().getVmApi(); - - setupEnvironment(); } - + /** * Sets up the environment. Retrieves the test {@link Vdc} and {@link VAppTemplate} from their * configured {@link URI}s. Instantiates a new test VApp. */ + @BeforeClass(alwaysRun = true, description = "Retrieves the required apis from the REST API context") protected void setupEnvironment() { // Get the configured Vdc for the tests vdc = vdcApi.getVdc(vdcURI); @@ -295,9 +294,10 @@ public abstract class AbstractVAppApiLiveTest extends BaseVCloudDirectorApiLiveT protected Vm powerOffVm(final URI testVmURI) { Vm test = vmApi.getVm(testVmURI); Status status = test.getStatus(); - if (status != Status.POWERED_OFF) { - Task powerOff = vmApi.powerOff(vm.getHref()); - assertTaskSucceedsLong(powerOff); + if (status != Status.POWERED_OFF || test.isDeployed()) { + UndeployVAppParams undeployParams = UndeployVAppParams.builder().build(); + Task shutdownVapp = vAppApi.undeploy(test.getHref(), undeployParams); + assertTaskSucceedsLong(shutdownVapp); } test = vmApi.getVm(testVmURI); assertStatus(VM, test, Status.POWERED_OFF); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java index f30706eedf..edd22c5a49 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java @@ -103,7 +103,7 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest { private boolean mediaCreated = false; private boolean testUserCreated = false; - @BeforeClass(alwaysRun = true, dependsOnMethods = { "setupRequiredApis" }) + @BeforeClass(alwaysRun = true) protected void setupRequiredEntities() { Set links = vdcApi.getVdc(vdcURI).getLinks(); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java index 36a7a8b85d..2fc651d457 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java @@ -49,24 +49,10 @@ import org.jclouds.vcloud.director.v1_5.domain.Owner; import org.jclouds.vcloud.director.v1_5.domain.Reference; import org.jclouds.vcloud.director.v1_5.domain.Task; import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; -import org.jclouds.vcloud.director.v1_5.domain.network.FirewallRule; -import org.jclouds.vcloud.director.v1_5.domain.network.FirewallRuleProtocols; -import org.jclouds.vcloud.director.v1_5.domain.network.FirewallService; -import org.jclouds.vcloud.director.v1_5.domain.network.IpRange; -import org.jclouds.vcloud.director.v1_5.domain.network.IpRanges; -import org.jclouds.vcloud.director.v1_5.domain.network.IpScope; -import org.jclouds.vcloud.director.v1_5.domain.network.NatOneToOneVmRule; -import org.jclouds.vcloud.director.v1_5.domain.network.NatRule; -import org.jclouds.vcloud.director.v1_5.domain.network.NatService; -import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode; -import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration; -import org.jclouds.vcloud.director.v1_5.domain.network.NetworkFeatures; -import org.jclouds.vcloud.director.v1_5.domain.network.VAppNetworkConfiguration; import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams; import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection; import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection; import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection; -import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection; import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest; import org.testng.annotations.Test; @@ -256,27 +242,6 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest api.relocateVm(uri, params); } - @Test - public void testCustomizationSection() { - final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"; - URI uri = URI.create(endpoint + templateId); - - VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse, - new VcloudHttpRequestPrimer().apiCommand("GET", templateId + "/customizationSection").acceptMedia(CUSTOMIZATION_SECTION).httpRequestBuilder().build(), - new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/customizationSection.xml", CUSTOMIZATION_SECTION).httpResponseBuilder().build(), - new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/customizationSection").xmlFilePayload("/vapptemplate/customizationSection.xml", CUSTOMIZATION_SECTION).acceptMedia(TASK).httpRequestBuilder().build(), - new VcloudHttpResponsePrimer().xmlFilePayload("/task/task.xml", TASK).httpResponseBuilder().build() - ).getVAppTemplateApi(); - - assertNotNull(api); - CustomizationSection section = api.getCustomizationSection(uri); - - assertEquals(section, exampleCustomizationSection()); - - Task task = api.modifyCustomizationSection(uri, exampleCustomizationSection()); - assertNotNull(task); - } - public void testErrorGetCustomizationSection() { final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"; URI uri = URI.create(endpoint + templateId); @@ -288,18 +253,6 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest assertNull(api.getCustomizationSection(uri)); } - @Test(expectedExceptions = ResourceNotFoundException.class) - public void testErrorEditCustomizationSection() { - final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"; - URI uri = URI.create(endpoint + templateId); - - VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse, - new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/customizationSection").xmlFilePayload("/vapptemplate/customizationSection.xml", CUSTOMIZATION_SECTION).acceptMedia(TASK).httpRequestBuilder().build(), - new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi(); - - api.modifyCustomizationSection(uri, exampleCustomizationSection()); - } - public void testGuestCustomizationSection() { final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"; URI uri = URI.create(endpoint + templateId); @@ -490,27 +443,6 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest api.getMetadataApi().deleteMetadataEntry(uri, "12345"); } - - public void testNetworkConfigSection() throws ParseException { - final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"; - URI uri = URI.create(endpoint + templateId); - - VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse, - new VcloudHttpRequestPrimer().apiCommand("GET", templateId + "/networkConfigSection").acceptMedia(NETWORK_CONFIG_SECTION).httpRequestBuilder().build(), - new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/networkConfigSection.xml", NETWORK_CONFIG_SECTION).httpResponseBuilder().build(), - new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/networkConfigSection").xmlFilePayload("/vapptemplate/networkConfigSection.xml", NETWORK_CONFIG_SECTION).acceptMedia(TASK).httpRequestBuilder().build(), - new VcloudHttpResponsePrimer().xmlFilePayload("/task/task.xml", TASK).httpResponseBuilder().build() - ).getVAppTemplateApi(); - - assertNotNull(api); - - NetworkConfigSection section = api.getNetworkConfigSection(uri); - - assertEquals(section, exampleNetworkConfigSection()); - - Task task = api.modifyNetworkConfigSection(uri, exampleNetworkConfigSection()); - assertNotNull(task); - } @Test(expectedExceptions = VCloudDirectorException.class) public void testErrorGetNetworkConfigSection() { @@ -524,18 +456,6 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest api.getNetworkConfigSection(uri); } - @Test(expectedExceptions = VCloudDirectorException.class) - public void testErrorEditNetworkConfigSection() throws ParseException { - final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"; - URI uri = URI.create(endpoint + templateId); - - VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse, - new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/networkConfigSection").xmlFilePayload("/vapptemplate/networkConfigSection.xml", NETWORK_CONFIG_SECTION).acceptMedia(TASK).httpRequestBuilder().build(), - new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi(); - - api.modifyNetworkConfigSection(uri, exampleNetworkConfigSection()); - } - private VAppTemplate exampleTemplate() { Link aLink = Link.builder().href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07")) .type("application/vnd.vmware.vcloud.vdc+xml").rel("up").build(); @@ -575,20 +495,6 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest .build(); } - private CustomizationSection exampleCustomizationSection() { - return CustomizationSection.builder() - .links(ImmutableSet.of( - Link.builder().href(URI.create("https://vcloudbeta.bluelock.com/api/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9/customizationSection/")) - .type("application/vnd.vmware.vcloud.customizationSection+xml").rel("edit").build() - )) - .type("application/vnd.vmware.vcloud.customizationSection+xml") - .info("VApp template customization section") - .customizeOnInstantiate(true) - .href(URI.create("https://vcloudbeta.bluelock.com/api/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9/customizationSection/")) - .required(false) - .build(); - } - private GuestCustomizationSection exampleGuestCustomizationSection() { return GuestCustomizationSection.builder() .links(ImmutableSet.of( @@ -640,59 +546,4 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest return MetadataValue.builder().value("some value").build(); } - private NetworkConfigSection exampleNetworkConfigSection() throws ParseException { - - FirewallService firewallService = - FirewallService.builder() - .enabled(true) - .firewallRules( - ImmutableSet.of( - FirewallRule.builder() - .isEnabled(true) - .description("FTP Rule") - .policy("allow") - .protocols(FirewallRuleProtocols.builder().tcp(true).build()) - .port(21) - .destinationIp("10.147.115.1") - .build(), - FirewallRule.builder() - .isEnabled(true) - .description("SSH Rule") - .policy("allow") - .protocols(FirewallRuleProtocols.builder().tcp(true).build()) - .port(22) - .destinationIp("10.147.115.1") - .build())).build(); - - NatService natService = NatService.builder().enabled(true).natType("ipTranslation").policy("allowTraffic") - .natRules(ImmutableSet.of(NatRule.builder().oneToOneVmRule( - NatOneToOneVmRule.builder().mappingMode("manual").externalIpAddress("64.100.10.1").vAppScopedVmId("20ea086f-1a6a-4fb2-8e2e-23372facf7de").vmNicId(0).build()).build() - )).build(); - - NetworkConfiguration networkConfiguration = NetworkConfiguration.builder().ipScope( - IpScope.builder() - .isInherited(false) - .gateway("10.147.56.253") - .netmask("255.255.255.0") - .dns1("10.147.115.1") - .dns2("10.147.115.2") - .dnsSuffix("example.com") - .ipRanges(IpRanges.builder().ipRange(IpRange.builder().startAddress("10.147.56.1").endAddress("10.147.56.1").build()).build()) - .build()) - .parentNetwork(Reference.builder().href(URI.create("http://vcloud.example.com/api/v1.0/network/54")).type("application/vnd.vmware.vcloud.network+xml").name("Internet").build()) - .fenceMode(FenceMode.NAT_ROUTED) - .features(NetworkFeatures.builder().services(ImmutableSet.of(firewallService, natService)).build()) - .build(); - - return NetworkConfigSection.builder() - .info("Configuration parameters for logical networks") - .networkConfigs( - ImmutableSet.of( - VAppNetworkConfiguration.builder() - .networkName("vAppNetwork") - .configuration( - networkConfiguration - ).build() - )).build(); - } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java index e0e2c04c14..40cf401429 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java @@ -26,7 +26,6 @@ import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataFor; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataKeyAbsentFor; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkNetworkConfigSection; -import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkNetworkConnectionSection; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOvfEnvelope; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOvfNetworkSection; import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOwner; @@ -60,8 +59,6 @@ import org.jclouds.vcloud.director.v1_5.domain.References; import org.jclouds.vcloud.director.v1_5.domain.Task; import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate; import org.jclouds.vcloud.director.v1_5.domain.dmtf.Envelope; -import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection; -import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection.IpAddressAllocationMode; import org.jclouds.vcloud.director.v1_5.domain.params.CloneVAppTemplateParams; import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams; import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection; @@ -89,7 +86,7 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest { private String key; private String val; - + @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" }) protected void tidyUp() { if (key != null) { @@ -101,11 +98,12 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest { } } } - - // FIXME cloneVAppTemplate is giving back 500 error + private VAppTemplate cloneVAppTemplate(boolean waitForTask) throws Exception { CloneVAppTemplateParams cloneVAppTemplateParams = CloneVAppTemplateParams.builder() .source(Reference.builder().href(vAppTemplateURI).build()) + .isSourceDelete(false) + .name("clone") .build(); VAppTemplate clonedVappTemplate = vdcApi.cloneVAppTemplate(vdcURI, cloneVAppTemplateParams); @@ -114,7 +112,6 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest { assertNotNull(cloneTask, "vdcApi.cloneVAppTemplate returned VAppTemplate that did not contain any tasks"); assertTaskSucceeds(cloneTask); } - return clonedVappTemplate; } @@ -306,34 +303,15 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest { assertEquals(modified.getComputerName(), computerName); } - @Test(description = "PUT /vAppTemplate/{id}/customizationSection") - public void testEditCustomizationSection() { - boolean oldVal = vAppTemplateApi.getCustomizationSection(vAppTemplateURI).isCustomizeOnInstantiate(); - boolean newVal = !oldVal; - - CustomizationSection customizationSection = CustomizationSection.builder() - .info("") - .customizeOnInstantiate(newVal) - .build(); - - final Task task = vAppTemplateApi.modifyCustomizationSection(vAppTemplateURI, customizationSection); - assertTaskSucceeds(task); - - CustomizationSection newCustomizationSection = vAppTemplateApi.getCustomizationSection(vAppTemplateURI); - assertEquals(newCustomizationSection.isCustomizeOnInstantiate(), newVal); - } - - // FIXME deploymentLeaseInSeconds returned is null + // NOTE vAppTemplate supports only storageLease (deployment lease applies to vApp too) @Test(description = "PUT /vAppTemplate/{id}/leaseSettingsSection") public void testEditLeaseSettingsSection() throws Exception { - int deploymentLeaseInSeconds = random.nextInt(10000)+1; // NOTE use smallish number for storageLeaseInSeconds; it seems to be capped at 5184000? int storageLeaseInSeconds = random.nextInt(10000)+1; LeaseSettingsSection leaseSettingSection = LeaseSettingsSection.builder() .info("my info") .storageLeaseInSeconds(storageLeaseInSeconds) - .deploymentLeaseInSeconds(deploymentLeaseInSeconds) .build(); final Task task = vAppTemplateApi.modifyLeaseSettingsSection(vAppTemplateURI, leaseSettingSection); @@ -341,65 +319,8 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest { LeaseSettingsSection newLeaseSettingsSection = vAppTemplateApi.getLeaseSettingsSection(vAppTemplateURI); assertEquals(newLeaseSettingsSection.getStorageLeaseInSeconds(), (Integer) storageLeaseInSeconds); - assertEquals(newLeaseSettingsSection.getDeploymentLeaseInSeconds(), (Integer) deploymentLeaseInSeconds); } - @Test(description = "PUT /vAppTemplate/{id}/networkConfigSection") - public void testEditNetworkConfigSection() { - // TODO What to modify? - - NetworkConfigSection oldSection = vAppTemplateApi.getNetworkConfigSection(vApp.getHref()); - NetworkConfigSection newSection = oldSection.toBuilder().build(); - -// String networkName = ""+random.nextInt(); -// NetworkConfiguration networkConfiguration = NetworkConfiguration.builder() -// .fenceMode("isolated") -// .build(); -// VAppNetworkConfiguration vappNetworkConfiguration = VAppNetworkConfiguration.builder() -// .networkName(networkName) -// .configuration(networkConfiguration) -// .build(); -// Set vappNetworkConfigurations = ImmutableSet.of(vappNetworkConfiguration); -// NetworkConfigSection networkConfigSection = NetworkConfigSection.builder() -// .info("my info") -// .networkConfigs(vappNetworkConfigurations) -// .build(); - - final Task task = vAppTemplateApi.modifyNetworkConfigSection(vApp.getHref(), newSection); - assertTaskSucceeds(task); - - NetworkConfigSection modified = vAppTemplateApi.getNetworkConfigSection(vAppTemplateURI); - checkNetworkConfigSection(modified); - -// assertEquals(modifiedĀ§.getNetworkConfigs().size(), 1); -// -// VAppNetworkConfiguration newVAppNetworkConfig = Iterables.get(modifiedĀ§.getNetworkConfigs(), 0); -// assertEquals(newVAppNetworkConfig.getNetworkName(), networkName); - } - - @Test(description = "PUT /vAppTemplate/{id}/networkConnectionSection") - public void testEditNetworkConnectionSection() { - // Look up a network in the Vdc - Set networks = vdc.getAvailableNetworks(); - Reference network = Iterables.getLast(networks); - - // Copy existing section and update fields - NetworkConnectionSection oldSection = vAppTemplateApi.getNetworkConnectionSection(vm.getHref()); - NetworkConnectionSection newSection = oldSection.toBuilder() - .networkConnection(NetworkConnection.builder() - .ipAddressAllocationMode(IpAddressAllocationMode.DHCP.toString()) - .network(network.getName()) - .build()) - .build(); - - Task task = vAppTemplateApi.modifyNetworkConnectionSection(vm.getHref(), newSection); - assertTaskSucceeds(task); - - NetworkConnectionSection modified = vAppTemplateApi.getNetworkConnectionSection(vm.getHref()); - checkNetworkConnectionSection(modified); - } - - // FIXME cloneVAppTemplate is giving back 500 error @Test(description = "DELETE /vAppTemplate/{id}", dependsOnMethods = { "testGetVAppTemplate" }) public void testDeleteVAppTemplate() throws Exception { VAppTemplate clonedVappTemplate = cloneVAppTemplate(true); diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java index 27b122303c..0e65613714 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java @@ -121,7 +121,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { private boolean mediaCreated = false; private boolean testUserCreated = false; - @BeforeClass(alwaysRun = true, dependsOnMethods = { "setupRequiredApis" }) + @BeforeClass(alwaysRun = true) protected void setupRequiredEntities() { Set links = vdcApi.getVdc(vdcURI).getLinks(); @@ -280,23 +280,20 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { assertVmStatus(vmURI, Status.POWERED_OFF); } - @Test(description = "POST /vApp/{id}/power/action/shutdown", dependsOnMethods = { "testDeployVm" }) + @Test(description = "POST /vApp/{id}/power/action/shutdown", dependsOnMethods = { "testInstallVMwareTools" }) public void testShutdown() { // Power on Vm vm = powerOnVm(vm.getHref()); // The method under test - Task shutdown = vmApi.shutdown(vmURI); + Task shutdown = vmApi.shutdown(vm.getHref()); assertTaskSucceedsLong(shutdown); // Get the updated Vm - vm = vmApi.getVm(vmURI); + vm = vmApi.getVm(vm.getHref()); // Check status - assertVmStatus(vmURI, Status.POWERED_OFF); - - // Power on the Vm again - vm = powerOnVm(vm.getHref()); + assertVmStatus(vm.getHref(), Status.POWERED_OFF); } @Test(description = "POST /vApp/{id}/power/action/suspend", dependsOnMethods = { "testDeployVm" }) @@ -359,6 +356,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { vm = powerOnVm(vm.getHref()); // The method under test + // NB this will put the vm in partially powered off state Task powerOffVm = vmApi.powerOff(vm.getHref()); assertTrue(retryTaskSuccess.apply(powerOffVm), String.format(TASK_COMPLETE_TIMELY, "powerOffVm")); @@ -391,8 +389,8 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { @Test(description = "POST /vApp/{id}/action/installVMwareTools", dependsOnMethods = { "testDeployVm" }) public void testInstallVMwareTools() { - // First ensure the vApp is powered n - vm = powerOnVm(vm.getHref()); + // First ensure the vApp is powered on + vm = powerOnVm(vm.getHref()); // The method under test Task installVMwareTools = vmApi.installVMwareTools(vm.getHref()); @@ -420,6 +418,9 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { // The method under test Task upgradeHardwareVersion = vmApi.upgradeHardwareVersion(vm.getHref()); assertTrue(retryTaskSuccess.apply(upgradeHardwareVersion), String.format(TASK_COMPLETE_TIMELY, "upgradeHardwareVersion")); + + // Power on the Vm again + vm = powerOnVm(vm.getHref()); } @Test(description = "GET /vApp/{id}/guestCustomizationSection", dependsOnMethods = { "testGetVm" }) @@ -438,7 +439,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { GuestCustomizationSection oldSection = vmApi.getGuestCustomizationSection(vm.getHref()); GuestCustomizationSection newSection = oldSection.toBuilder() .computerName(name("n")) - .enabled(Boolean.FALSE) + .enabled(Boolean.TRUE) .adminPassword(null) // Not allowed .build(); @@ -454,7 +455,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { // Check the modified section fields are set correctly assertEquals(modified.getComputerName(), newSection.getComputerName()); - assertFalse(modified.isEnabled()); + assertTrue(modified.isEnabled()); // Reset the admin password in the retrieved GuestCustomizationSection for equality check modified = modified.toBuilder().adminPassword(null).build(); @@ -499,8 +500,9 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { } // FIXME "Task error: Unable to perform this action. Contact your cloud administrator." - @Test(description = "PUT /vApp/{id}/networkConnectionSection", dependsOnMethods = { "testGetNetworkConnectionSection" }) + @Test(description = "PUT /vApp/{id}/networkConnectionSection", dependsOnMethods = { "testModifyGuestCustomizationSection" }) public void testModifyNetworkConnectionSection() { + powerOffVm(vm.getHref()); // Look up a network in the Vdc Set networks = vdc.getAvailableNetworks(); Reference network = Iterables.getLast(networks); @@ -574,6 +576,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { @Test(description = "PUT /vApp/{id}/productSections", dependsOnMethods = { "testGetProductSections" }) public void testModifyProductSections() { + powerOffVm(vm.getHref()); // Copy existing section and update fields ProductSectionList oldSections = vmApi.getProductSections(vm.getHref()); ProductSectionList newSections = oldSections.toBuilder() @@ -600,7 +603,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { assertEquals(modified.getProductSections().size(), oldSections.getProductSections().size() + 1); // Check the section was modified correctly - assertEquals(modified, newSections, String.format(ENTITY_EQUAL, "ProductSectionList")); + assertEquals(modified, newSections); } // FIXME How do we force it to ask a question? @@ -646,7 +649,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { } // FIXME If still failing, consider escalating? - @Test(description = "GET /vApp/{id}/screen", dependsOnMethods = { "testDeployVm" }) + @Test(description = "GET /vApp/{id}/screen", dependsOnMethods = { "testInstallVMwareTools" }) public void testGetScreenImage() { // Power on Vm vm = powerOnVm(vm.getHref()); @@ -933,18 +936,23 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { checkMetadata(metadata); // Check requirements for this test - assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "vm")); + assertTrue(Iterables.isEmpty(metadata.getMetadataEntries()), String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "vm")); } @Test(description = "GET /vApp/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" }) public void testGetOrgMetadataValue() { + key = name("key-"); + String value = name("value-"); + metadataValue = MetadataValue.builder().value(value).build(); + vmApi.getMetadataApi().setMetadata(vm.getHref(), key, metadataValue); + // Call the method being tested - MetadataValue value = vmApi.getMetadataApi().getMetadataValue(vm.getHref(), key); + MetadataValue metadataValue = vmApi.getMetadataApi().getMetadataValue(vm.getHref(), key); String expected = metadataValue.getValue(); - checkMetadataValue(value); - assertEquals(value.getValue(), expected, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, value.getValue())); + checkMetadataValue(metadataValue); + assertEquals(metadataValue.getValue(), expected, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, metadataValue.getValue())); } @Test(description = "DELETE /vApp/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" }) @@ -1002,11 +1010,17 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { // Get the updated VApp and the Vm delete = vAppApi.getVApp(delete.getHref()); - Vm temp = Iterables.getOnlyElement(delete.getChildren().getVms()); - - // Power off the Vm - temp = powerOffVm(temp.getHref()); + List vms = delete.getChildren().getVms(); + Vm temp = Iterables.get(vms, 0); + // otherwise it's impossible to stop a running vApp with no vms + if(vms.size() == 1) { + UndeployVAppParams undeployParams = UndeployVAppParams.builder().build(); + Task shutdownVapp = vAppApi.undeploy(delete.getHref(), undeployParams); + assertTaskSucceedsLong(shutdownVapp); + } else { + powerOffVm(temp.getHref()); + } // The method under test Task deleteVm = vmApi.deleteVm(temp.getHref()); assertTrue(retryTaskSuccess.apply(deleteVm), String.format(TASK_COMPLETE_TIMELY, "deleteVm"));