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 1be4816395..591daf63a8 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 @@ -50,6 +50,7 @@ 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.network.NetworkConnection; import org.jclouds.vcloud.director.v1_5.domain.network.VAppNetworkConfiguration; +import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection.IpAddressAllocationMode; 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; @@ -298,7 +299,7 @@ public abstract class AbstractVAppApiLiveTest extends BaseVCloudDirectorApiLiveT Status status = test.getStatus(); if (status != Status.POWERED_OFF || test.isDeployed()) { UndeployVAppParams undeployParams = UndeployVAppParams.builder().build(); - Task shutdownVapp = vAppApi.undeploy(vmUrn, undeployParams); + Task shutdownVapp = vmApi.undeploy(vmUrn, undeployParams); assertTaskSucceedsLong(shutdownVapp); } test = vmApi.get(vmUrn); @@ -396,4 +397,27 @@ public abstract class AbstractVAppApiLiveTest extends BaseVCloudDirectorApiLiveT Set vAppNetworkConfigs = vAppApi.getNetworkConfigSection(vApp.getId()).getNetworkConfigs(); return vAppNetworkConfigs; } + + protected void attachVmToVAppNetwork(Vm vm, String vAppNetworkName) { + Set networkConnections = vmApi.getNetworkConnectionSection(vm.getId()) + .getNetworkConnections(); + + NetworkConnectionSection section = NetworkConnectionSection.builder() + .info("info") + .primaryNetworkConnectionIndex(0) + .build(); + + for (NetworkConnection networkConnection : networkConnections) { + NetworkConnection newNetworkConnection = networkConnection.toBuilder() + .network(vAppNetworkName) + .isConnected(true) + .networkConnectionIndex(0) + .ipAddressAllocationMode(IpAddressAllocationMode.POOL) + .build(); + + section = section.toBuilder().networkConnection(newNetworkConnection).build(); + } + Task configureNetwork = vmApi.editNetworkConnectionSection(vm.getId(), section); + assertTaskSucceedsLong(configureNetwork); + } } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/KeyPairsApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/KeyPairsApiLiveTest.java index c30dc31d0f..d654568d9c 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/KeyPairsApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/KeyPairsApiLiveTest.java @@ -214,4 +214,4 @@ public class KeyPairsApiLiveTest extends BaseVCloudDirectorApiLiveTest { assertTrue(retryTaskSuccess.apply(setKeyPair), String.format(TASK_COMPLETE_TIMELY, "setKeyPair")); } -} \ No newline at end of file +} diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java index 50cae58b75..11483c74db 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java @@ -77,7 +77,7 @@ public class OrgApiLiveTest extends BaseVCloudDirectorApiLiveTest { } } } - + /* * Shared state between dependent tests. */ diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java index e4be32e1ec..b66b28fb09 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java @@ -26,7 +26,6 @@ import static org.testng.Assert.assertTrue; import java.net.URI; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @@ -49,6 +48,7 @@ import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; /** @@ -79,6 +79,8 @@ public class QueryApiLiveTest extends BaseVCloudDirectorApiLiveTest { public void setupRequiredApis() { queryApi = context.getApi().getQueryApi(); vAppApi = context.getApi().getVAppApi(); + + cleanUpVAppTemplateInOrg(); } @Test(description = "GET /query") @@ -142,15 +144,21 @@ public class QueryApiLiveTest extends BaseVCloudDirectorApiLiveTest { + "; but only has " + hrefs); } - @Test(description = "GET /vApps/query?filter", dependsOnMethods = { "testQueryAllVApps" }) - public void testQueryVAppsWithFilter() { - QueryResultRecords queryResult = queryApi.vAppsQuery(String.format("name==%s", vApp.getName())); - Set hrefs = toHrefs(queryResult); + @Test(description = "GET /vApps/query?filter", dependsOnMethods = { "testQueryAllVApps" }) + public void testQueryVAppsWithFilter() { + QueryResultRecords queryResult = queryApi.vAppsQuery(String.format( + "name==%s", vApp.getName())); + Set hrefs = toHrefs(queryResult); - assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP, null), QueryResultVAppRecord.class); - assertEquals(hrefs, Collections.singleton(vApp.getHref()), - "VApps query result should have found vApp " + vApp.getHref()); - } + assertRecordTypes(queryResult, + Arrays.asList(VCloudDirectorMediaType.VAPP, null), + QueryResultVAppRecord.class); + String message = "VApps query result should have found vApp " + + vApp.getHref(); + assertTrue( + ImmutableSet.copyOf(hrefs).equals( + ImmutableSet.of(vApp.getHref())), message); + } @Test(description = "GET /vms/query", dependsOnMethods = { "testQueryAllVApps" }) public void testQueryAllVms() { @@ -177,18 +185,24 @@ public class QueryApiLiveTest extends BaseVCloudDirectorApiLiveTest { + hrefs); } - @Test(description = "GET /vms/query?filter", dependsOnMethods = { "testQueryAllVms" }) - public void testQueryAllVmsWithFilter() { - List vms = vApp.getChildren().getVms(); - Set vmHrefs = toHrefs(vms); + @Test(description = "GET /vms/query?filter", dependsOnMethods = { "testQueryAllVms" }) + public void testQueryAllVmsWithFilter() { + List vms = vApp.getChildren().getVms(); + Set vmHrefs = toHrefs(vms); - QueryResultRecords queryResult = queryApi.vmsQuery(String.format("containerName==%s", vApp.getName())); - Set hrefs = toHrefs(queryResult); + QueryResultRecords queryResult = queryApi.vmsQuery(String.format( + "containerName==%s", vApp.getName())); + Set hrefs = toHrefs(queryResult); - assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VM, null), QueryResultVMRecord.class); - assertEquals(hrefs, vmHrefs, "VMs query result should equal vms of vApp " + vApp.getName() + " (" + vmHrefs - + "); but only has " + hrefs); - } + assertRecordTypes(queryResult, + Arrays.asList(VCloudDirectorMediaType.VM, null), + QueryResultVMRecord.class); + String message = "VMs query result should equal vms of vApp " + + vApp.getName() + " (" + vmHrefs + "); but only has " + hrefs; + assertTrue( + ImmutableSet.copyOf(hrefs).equals(ImmutableSet.copyOf(vmHrefs)), + message); + } @Test(description = "GET /mediaList/query") public void testQueryAllMedia() { @@ -230,4 +244,5 @@ public class QueryApiLiveTest extends BaseVCloudDirectorApiLiveTest { } return hrefs; } + } 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 f59ca069b0..131982cb3b 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 @@ -432,57 +432,6 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest { String.format(TASK_COMPLETE_TIMELY, "discardSuspendedState")); } - @Test(description = "POST /vApp/{id}/action/enterMaintenanceMode", groups = { "systemAdmin" }) - public void testEnterMaintenanceMode() { - - // Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only - VApp temp = instantiateVApp(); - DeployVAppParams params = DeployVAppParams.builder() - .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization() - .notPowerOn().build(); - Task deployVApp = vAppApi.deploy(temp.getId(), params); - assertTaskSucceedsLong(deployVApp); - - try { - // Method under test - vAppApi.enterMaintenanceMode(temp.getId()); - - temp = vAppApi.get(temp.getId()); - assertTrue(temp.isInMaintenanceMode(), - String.format(CONDITION_FMT, "InMaintenanceMode", "TRUE", temp.isInMaintenanceMode())); - - // Exit maintenance mode - vAppApi.exitMaintenanceMode(temp.getId()); - } finally { - cleanUpVApp(temp); - } - } - - @Test(description = "POST /vApp/{id}/action/exitMaintenanceMode", dependsOnMethods = { "testEnterMaintenanceMode" }, groups = { "systemAdmin" }) - public void testExitMaintenanceMode() { - // Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only - VApp temp = instantiateVApp(); - DeployVAppParams params = DeployVAppParams.builder() - .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization() - .notPowerOn().build(); - Task deployVApp = vAppApi.deploy(temp.getId(), params); - assertTaskSucceedsLong(deployVApp); - - try { - // Enter maintenance mode - vAppApi.enterMaintenanceMode(temp.getId()); - - // Method under test - vAppApi.exitMaintenanceMode(temp.getId()); - - temp = vAppApi.get(temp.getId()); - assertFalse(temp.isInMaintenanceMode(), - String.format(CONDITION_FMT, "InMaintenanceMode", "FALSE", temp.isInMaintenanceMode())); - } finally { - cleanUpVApp(temp); - } - } - @Test(groups = { "live", "user" }, description = "GET /vApp/{id}/controlAccess", dependsOnMethods = { "testGetVApp" }) public void testGetControlAccess() { // The method under test diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java index 21909786fd..7edb5183b2 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java @@ -189,29 +189,6 @@ public class VAppNetworksLiveTest extends AbstractVAppApiLiveTest { .build(); } - private void attachVmToVAppNetwork(Vm vm, String vAppNetworkName) { - Set networkConnections = vmApi.getNetworkConnectionSection(vm.getId()) - .getNetworkConnections(); - - NetworkConnectionSection section = NetworkConnectionSection.builder() - .info("info") - .primaryNetworkConnectionIndex(0) - .build(); - - for (NetworkConnection networkConnection : networkConnections) { - NetworkConnection newNetworkConnection = networkConnection.toBuilder() - .network(vAppNetworkName) - .isConnected(true) - .networkConnectionIndex(0) - .ipAddressAllocationMode(IpAddressAllocationMode.POOL) - .build(); - - section = section.toBuilder().networkConnection(newNetworkConnection).build(); - } - Task configureNetwork = vmApi.editNetworkConnectionSection(vm.getId(), section); - assertTaskSucceedsLong(configureNetwork); - } - private IpScope addNewIpScope() { IpRange newIpRange = addIpRange(); IpRanges newIpRanges = IpRanges.builder() diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java index 7b458e872d..93e1bed3db 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java @@ -31,6 +31,7 @@ import static org.testng.Assert.fail; import java.util.Map; import java.util.Set; +import org.jclouds.dmtf.ovf.NetworkSection; import org.jclouds.vcloud.director.v1_5.domain.Checks; import org.jclouds.vcloud.director.v1_5.domain.Metadata; import org.jclouds.vcloud.director.v1_5.domain.Reference; @@ -139,9 +140,12 @@ public class VdcApiLiveTest extends BaseVCloudDirectorApiLiveTest { @Test(description = "POST /vdc/{id}/action/captureVApp", dependsOnMethods = { "testInstantiateVAppTemplate" }) public void testCaptureVApp() { + VAppTemplate vAppTemplate = vappTemplateApi.get(vAppTemplateUrn); String name = name("captured-"); - CaptureVAppParams captureVappParams = CaptureVAppParams.builder().name(name).source(instantiatedVApp.getHref()) + CaptureVAppParams captureVappParams = CaptureVAppParams.builder() + .name(name) + .source(instantiatedVApp.getHref()) // TODO: test optional params // .description("") // .sections(sections) // TODO: ovf sections @@ -161,15 +165,16 @@ public class VdcApiLiveTest extends BaseVCloudDirectorApiLiveTest { @Test(description = "POST /vdc/{id}/action/cloneVApp", dependsOnMethods = { "testInstantiateVAppTemplate" }) public void testCloneVApp() { CloneVAppParams cloneVappParams = CloneVAppParams.builder().source(instantiatedVApp.getHref()) - // TODO: test optional params - // .name("") - // .description("") - // .deploy(true) - // .isSourceDelete(true) - // .powerOn(true) - // .instantiationParams(InstantiationParams.builder() - // .sections(sections) // TODO: ovf sections? various tests? - // .build()) + .name(name("vappClone-")) + .deploy(true) + // TODO: test optional params + // .description("") + // .isSourceDelete(true) + // .powerOn(true) + // .instantiationParams(InstantiationParams.builder() + // .sections(sections) + // TODO: ovf sections? various tests? + // .build()) // Reserved. Unimplemented params; may test eventually when implemented // .vAppParent(vAppParentRef) @@ -189,6 +194,7 @@ public class VdcApiLiveTest extends BaseVCloudDirectorApiLiveTest { public void testCloneVAppTemplate() { clonedVAppTemplate = vdcApi.cloneVAppTemplate(vdcUrn, CloneVAppTemplateParams.builder() + .name(name("vappTemplateClone-")) .source(lazyGetVAppTemplate().getHref()) .build()); 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 692911dd4b..e661a733ee 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 @@ -20,7 +20,6 @@ package org.jclouds.vcloud.director.v1_5.features; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_EQUAL; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_EMPTY_OBJECT_FMT; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.MEDIA; @@ -69,14 +68,13 @@ import org.jclouds.vcloud.director.v1_5.domain.VmPendingQuestion; import org.jclouds.vcloud.director.v1_5.domain.VmQuestionAnswer; import org.jclouds.vcloud.director.v1_5.domain.VmQuestionAnswerChoice; import org.jclouds.vcloud.director.v1_5.domain.dmtf.RasdItem; +import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration; import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection; +import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode; import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection.IpAddressAllocationMode; import org.jclouds.vcloud.director.v1_5.domain.params.DeployVAppParams; import org.jclouds.vcloud.director.v1_5.domain.params.MediaInsertOrEjectParams; -import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams; import org.jclouds.vcloud.director.v1_5.domain.params.UndeployVAppParams; -import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecordType; -import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecords; 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.domain.section.OperatingSystemSection; @@ -88,7 +86,9 @@ import org.testng.annotations.Test; import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; @@ -115,14 +115,6 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" }) public void cleanUp() { - if (adminContext != null && mediaUrn != null) { - try { - Task remove = context.getApi().getMediaApi().remove(mediaUrn); - taskDoneEventually(remove); - } catch (Exception e) { - logger.warn("Error when deleting media: %s", e.getMessage()); - } - } if (adminContext != null && testUserCreated && userUrn != null) { try { adminContext.getApi().getUserApi().remove(userUrn); @@ -146,6 +138,8 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { // Check the required fields are set assertEquals(vm.isDeployed(), Boolean.FALSE, String.format(OBJ_FIELD_EQ, VM, "deployed", "FALSE", vm.isDeployed().toString())); + String vAppNetworkName = context.getApi().getNetworkApi().get(networkUrn).getName(); + attachVmToVAppNetwork(vm, vAppNetworkName); // Check status assertVmStatus(vmUrn, Status.POWERED_OFF); @@ -215,7 +209,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { // The method under test Task reboot = vmApi.reboot(vmUrn); - assertTaskSucceedsLong(reboot); + assertTaskSucceedsLong(reboot); // Get the edited Vm vm = vmApi.get(vmUrn); @@ -228,7 +222,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { public void testShutdown() { // Power on Vm vm = powerOnVm(vmUrn); - + // The method under test Task shutdown = vmApi.shutdown(vmUrn); assertTaskSucceedsLong(shutdown); @@ -298,7 +292,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { public void testPowerOffVm() { // Power on Vm vm = powerOnVm(vmUrn); - + // The method under test // NB this will put the vm in partially powered off state Task powerOffVm = vmApi.powerOff(vmUrn); @@ -311,16 +305,6 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { assertVmStatus(vmUrn, Status.POWERED_OFF); } - @Test(description = "POST /vApp/{id}/action/consolidate", dependsOnMethods = { "testDeployVm" }) - public void testConsolidateVm() { - // Power on Vm - vm = powerOnVm(vmUrn); - - // The method under test - Task consolidateVm = vmApi.consolidate(vmUrn); - assertTrue(retryTaskSuccess.apply(consolidateVm), String.format(TASK_COMPLETE_TIMELY, "consolidateVm")); - } - @Test(description = "POST /vApp/{id}/action/discardSuspendedState", dependsOnMethods = { "testDeployVm" }) public void testDiscardSuspendedState() { // Suspend the Vm @@ -342,20 +326,6 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { assertTrue(retryTaskSuccess.apply(installVMwareTools), String.format(TASK_COMPLETE_TIMELY, "installVMwareTools")); } - // NOTE This test is disabled, as it is not possible to look up datastores using the User API - @Test(description = "POST /vApp/{id}/action/relocate", dependsOnMethods = { "testGetVm" }) - public void testRelocate() { - // Relocate to the last of the available datastores - QueryResultRecords records = context.getApi().getQueryApi().queryAll("datastore"); - QueryResultRecordType datastore = Iterables.getLast(records.getRecords()); - RelocateParams params = RelocateParams.builder().datastore(Reference.builder().href(datastore.getHref()).build()) - .build(); - - // The method under test - Task relocate = vmApi.relocate(vmUrn, params); - assertTrue(retryTaskSuccess.apply(relocate), String.format(TASK_COMPLETE_TIMELY, "relocate")); - } - @Test(description = "POST /vApp/{id}/action/upgradeHardwareVersion", dependsOnMethods = { "testGetVm" }) public void testUpgradeHardwareVersion() { // Power off Vm @@ -410,24 +380,27 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { assertEquals(modified, newSection, String.format(ENTITY_EQUAL, "GuestCustomizationSection")); } - // FIXME - // "Error: The requested operation on media "com.vmware.vcloud.entity.media:abfcb4b7-809f-4b50-a0aa-8c97bf09a5b0" is not supported in the current state." - @Test(description = "PUT /vApp/{id}/media/action/insertMedia", dependsOnMethods = { "testGetVm" }) - public void testInsertMedia() { - // Setup media params from configured media id - MediaInsertOrEjectParams params = MediaInsertOrEjectParams.builder() - .media(Reference.builder().href(lazyGetMedia().getHref()).type(MEDIA).build()).build(); + @Test(description = "PUT /vApp/{id}/media/action/insertMedia", dependsOnMethods = { "testGetVm" }) + public void testInsertMedia() { + // Setup media params from configured media id + MediaInsertOrEjectParams params = MediaInsertOrEjectParams + .builder() + .media(Reference.builder().href(lazyGetMedia().getHref()) + .type(MEDIA).build()).build(); - // The method under test - Task insertMedia = vmApi.insertMedia(vmUrn, params); - assertTrue(retryTaskSuccess.apply(insertMedia), String.format(TASK_COMPLETE_TIMELY, "insertMedia")); - } + // The method under test + Task insertMediaTask = vmApi.insertMedia(vmUrn, params); + assertTrue(retryTaskSuccess.apply(insertMediaTask), + String.format(TASK_COMPLETE_TIMELY, "insertMedia")); + } @Test(description = "PUT /vApp/{id}/media/action/ejectMedia", dependsOnMethods = { "testInsertMedia" }) public void testEjectMedia() { + // Setup media params from configured media id MediaInsertOrEjectParams params = MediaInsertOrEjectParams.builder() - .media(Reference.builder().href(lazyGetMedia().getHref()).type(MEDIA).build()).build(); + .media(Reference.builder() + .href(lazyGetMedia().getHref()).type(MEDIA).build()).build(); // The method under test Task ejectMedia = vmApi.ejectMedia(vmUrn, params); @@ -444,39 +417,47 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { }); } - // FIXME "Task error: Unable to perform this action. Contact your cloud administrator." @Test(description = "PUT /vApp/{id}/networkConnectionSection", dependsOnMethods = { "testEditGuestCustomizationSection" }) - public void testEditNetworkConnectionSection() { - powerOffVm(vmUrn); - // Look up a network in the Vdc - Set networks = vdc.getAvailableNetworks(); - Reference network = Iterables.getLast(networks); + public void testEditNetworkConnectionSection() { - // Copy existing section and edit fields - NetworkConnectionSection oldSection = vmApi.getNetworkConnectionSection(vmUrn); - NetworkConnectionSection newSection = oldSection - .toBuilder() - .networkConnection( - NetworkConnection.builder().ipAddressAllocationMode(IpAddressAllocationMode.DHCP.toString()) - .network(network.getName()).build()).build(); + // Look up a network in the Vdc + Set networks = vdc.getAvailableNetworks(); + Reference network = Iterables.getLast(networks); - // The method under test - Task editNetworkConnectionSection = vmApi.editNetworkConnectionSection(vmUrn, newSection); - assertTrue(retryTaskSuccess.apply(editNetworkConnectionSection), - String.format(TASK_COMPLETE_TIMELY, "editNetworkConnectionSection")); + // Copy existing section and edit fields + NetworkConnectionSection oldSection = vmApi + .getNetworkConnectionSection(vmUrn); + NetworkConnection newNetworkConnection = NetworkConnection.builder() + .network(network.getName()).networkConnectionIndex(1) + .ipAddressAllocationMode(IpAddressAllocationMode.DHCP).build(); + NetworkConnectionSection newSection = oldSection.toBuilder() + .networkConnection(newNetworkConnection).build(); - // Retrieve the modified section - NetworkConnectionSection modified = vmApi.getNetworkConnectionSection(vmUrn); + // The method under test + Task editNetworkConnectionSection = vmApi.editNetworkConnectionSection( + vmUrn, newSection); + assertTrue(retryTaskSuccess.apply(editNetworkConnectionSection), + String.format(TASK_COMPLETE_TIMELY, + "editNetworkConnectionSection")); - // Check the retrieved object is well formed - checkNetworkConnectionSection(modified); + // Retrieve the modified section + NetworkConnectionSection modified = vmApi + .getNetworkConnectionSection(vmUrn); - // Check the modified section has an extra network connection - assertEquals(modified.getNetworkConnections().size(), newSection.getNetworkConnections().size() + 1); + // Check the retrieved object is well formed + checkNetworkConnectionSection(modified); - // Check the section was modified correctly - assertEquals(modified, newSection, String.format(ENTITY_EQUAL, "NetworkConnectionSection")); - } + // Check the section was modified correctly + for (NetworkConnection connection : modified.getNetworkConnections()) { + if (connection.getNetwork().equals( + newNetworkConnection.getNetwork())) { + assertTrue(connection.getIpAddressAllocationMode().equals( + newNetworkConnection.getIpAddressAllocationMode())); + assertTrue(connection.getNetworkConnectionIndex() == newNetworkConnection + .getNetworkConnectionIndex()); + } + } + } @Test(description = "GET /vApp/{id}/operatingSystemSection", dependsOnMethods = { "testGetVm" }) public void testGetOperatingSystemSection() { @@ -593,11 +574,10 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { checkRuntimeInfoSection(section); } - // FIXME If still failing, consider escalating? @Test(description = "GET /vApp/{id}/screen", dependsOnMethods = { "testInstallVMwareTools" }) public void testGetScreenImage() { // Power on Vm - vm = powerOnVm(vmUrn); + vm = powerOnVm(vmUrn); // we need to have a way to wait for complete bootstrap // The method under test byte[] image = vmApi.getScreenImage(vmUrn); @@ -880,17 +860,21 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest { String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", metadataValue, newMetadataValue)); } - @Test(description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" }) - public void testGetMetadata() { - // Call the method being tested - Metadata metadata = vmApi.getMetadataApi(vmUrn).get(); + @Test(description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" }) + public void testGetMetadata() { - checkMetadata(metadata); + key = name("key-"); + metadataValue = name("value-"); - // Check requirements for this test - assertTrue(Iterables.isEmpty(metadata.getMetadataEntries()), - String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "vm")); - } + vmApi.getMetadataApi(vmUrn).put(key, metadataValue); + // Call the method being tested + Metadata metadata = vmApi.getMetadataApi(vmUrn).get(); + + checkMetadata(metadata); + + // Check requirements for this test + assertTrue(metadata.containsValue(metadataValue), String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", metadata.get(key), metadataValue)); + } @Test(description = "GET /vApp/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" }) public void testGetOrgMetadataValue() { diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVAppApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVAppApiExpectTest.java new file mode 100644 index 0000000000..3430a429c5 --- /dev/null +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVAppApiExpectTest.java @@ -0,0 +1,525 @@ +/* + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + *(Link.builder().regarding copyright ownership. jclouds licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless(Link.builder().required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jclouds.vcloud.director.v1_5.features.systemadmin; + +import java.net.URI; + +import org.jclouds.dmtf.ovf.NetworkSection; +import org.jclouds.dmtf.ovf.StartupSection; +import org.jclouds.vcloud.director.v1_5.domain.Error; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.jclouds.vcloud.director.v1_5.domain.Owner; +import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList; +import org.jclouds.vcloud.director.v1_5.domain.RasdItemsList; +import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.ScreenTicket; +import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.VApp; +import org.jclouds.vcloud.director.v1_5.domain.VmPendingQuestion; +import org.jclouds.vcloud.director.v1_5.domain.VmQuestionAnswer; +import org.jclouds.vcloud.director.v1_5.domain.dmtf.RasdItem; +import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams; +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.domain.section.NetworkConnectionSection; +import org.jclouds.vcloud.director.v1_5.domain.section.OperatingSystemSection; +import org.jclouds.vcloud.director.v1_5.domain.section.RuntimeInfoSection; +import org.jclouds.vcloud.director.v1_5.domain.section.VirtualHardwareSection; +import org.jclouds.vcloud.director.v1_5.features.VAppApi; +import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest; +import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.internal.annotations.Sets; + +/** + * Allows us to test the {@link VAppApi} allowed to system administrators + * + * @author andrea turli + */ +@Test(groups = { "unit", "systemAdmin" }, singleThreaded = true, testName = "SystemAdminVAppApiExpectTest") +public class SystemAdminVAppApiExpectTest extends VCloudDirectorAdminApiExpectTest { + + private String vAppId = "vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be"; + private URI vAppURI = URI.create(endpoint + vAppId); + + @BeforeClass + public void before() { + } + + @Test(enabled = false) + public void testEnterMaintenanceMode() { + VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("POST", vAppId + "/action/enterMaintenanceMode") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .httpResponseBuilder().statusCode(204).build()); + + // TODO how to test? + api.getVAppApi().enterMaintenanceMode(vAppURI); + } + + @Test(enabled = false) + public void testExitMaintenanceMode() { + VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("POST", vAppId + "/action/exitMaintenanceMode") + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .httpResponseBuilder().statusCode(204).build()); + + // TODO how to test? + api.getVAppApi().exitMaintenanceMode(vAppURI); + } + + public static VApp getVApp() { + // FIXME Does not match XML + VApp vApp = VApp.builder() + .href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be")) +// .link(Link.builder() +// .href(URI.create()) +// .build()) + .build(); + +// +// +// +// +// +// +// +// +// +// +// + + return vApp; + } + + public static Task editVAppTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task removeVAppTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task consolidateVAppTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static ControlAccessParams controlAccessParams() { + ControlAccessParams params = ControlAccessParams.builder() + .build(); + + return params; + } + + public static Task deployTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task discardSuspendedStateTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task installVMwareToolsTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task recomposeVAppTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task relocateTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task undeployTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task upgradeHardwareVersionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task powerOffTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task powerOnTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task rebootTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task resetTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task shutdownTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task suspendTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static ControlAccessParams getAccessControlParams() { + ControlAccessParams params = ControlAccessParams.builder() + .build(); + + return params; + } + + public static GuestCustomizationSection getGuestCustomizationSection() { + GuestCustomizationSection section = GuestCustomizationSection.builder() + .build(); + + return section; + } + + public static Task editGuestCustomizationSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static LeaseSettingsSection getLeaseSettingsSection() { + LeaseSettingsSection section = LeaseSettingsSection.builder() + .build(); + + return section; + } + + public static Task editLeaseSettingsSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task ejectMediaTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task insertMediaTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static NetworkConfigSection getNetworkConfigSection() { + NetworkConfigSection section = NetworkConfigSection.builder() + .build(); + + return section; + } + + public static Task editNetworkConfigSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static NetworkConnectionSection getNetworkConnectionSection() { + NetworkConnectionSection section = NetworkConnectionSection.builder() + .build(); + + return section; + } + + public static Task editNetworkConnectionSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static NetworkSection getNetworkSection() { + NetworkSection section = NetworkSection.builder() + .build(); + + return section; + } + + public static OperatingSystemSection getOperatingSystemSection() { + OperatingSystemSection section = OperatingSystemSection.builder() + .build(); + + return section; + } + + public static Task editOperatingSystemSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Owner getOwner() { + Owner owner = Owner.builder() + .build(); + + return owner; + } + + public static Task editOwnerTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static ProductSectionList getProductSections() { + ProductSectionList sectionItems = ProductSectionList.builder() + .build(); + + return sectionItems; + } + + public static Task editProductSectionsTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static VmPendingQuestion getPendingQuestion() { + VmPendingQuestion question = VmPendingQuestion.builder() + .build(); + + return question; + } + + public static VmQuestionAnswer answerQuestion() { + VmQuestionAnswer answer = null; // = VmQuestionAnswer.builder() +// .build(); + + return answer; + } + + public static RuntimeInfoSection getRuntimeInfoSection() { + RuntimeInfoSection section = RuntimeInfoSection.builder() + .build(); + + return section; + } + + public static byte[] getScreenImage() { + byte[] image = new byte[0]; + + return image; + } + + public static ScreenTicket getScreenTicket() { + ScreenTicket ticket = null; // = ScreenTicket.builder(); +// .build(); + + return ticket; + } + + public static StartupSection getStartupSection() { + StartupSection section = null; // = StartupSection.builder(); +// .build(); + + return section; + } + + public static Task editStartupSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static VirtualHardwareSection getVirtualHardwareSection() { + VirtualHardwareSection section = VirtualHardwareSection.builder() + .build(); + + return section; + } + + public static Task editVirtualHardwareSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItem getVirtualHardwareSectionCpu() { + RasdItem cpu = RasdItem.builder() + .build(); + + return cpu; + } + + public static Task editVirtualHardwareSectionCpuTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionDisks() { + RasdItemsList disks = RasdItemsList.builder() + .build(); + + return disks; + } + + public static Task editVirtualHardwareSectionDisksTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionMedia() { + RasdItemsList media = RasdItemsList.builder() + .build(); + + return media; + } + + public static RasdItem getVirtualHardwareSectionMemory() { + RasdItem memory = RasdItem.builder() + .build(); + + return memory; + } + + public static Task editVirtualHardwareSectionMemoryTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionNetworkCards() { + RasdItemsList networkCards = RasdItemsList.builder() + .build(); + + return networkCards; + } + + public static Task editVirtualHardwareSectionNetworkCardsTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionSerialPorts() { + RasdItemsList serialPorts = RasdItemsList.builder() + .build(); + + return serialPorts; + } + + public static Task editVirtualHardwareSectionSerialPortsTask() { + return task("id", "name", "description", "status", "operation", "operationName", "startTime"); + } + + /** Used by other methods to add a custom {@link Task} object. */ + private static Task task(String taskId, String name, String description, String status, String operation, String operationName, String startTime) { + Task task = Task.builder() + .error(Error.builder().build()) + .org(Reference.builder().build()) + .owner(Reference.builder().build()) + .user(Reference.builder().build()) + .params(null) + .progress(0) + .status(status) + .operation(operation) + .operationName(operationName) + .startTime(dateService.iso8601DateParse(startTime)) + .endTime(null) + .expiryTime(null) + .tasks(Sets.newLinkedHashSet()) + .description(description) + .name(name) + .id("urn:vcloud:" + taskId) + .href(URI.create(endpoint + "/task/" + taskId)) + .links(Sets.newLinkedHashSet()) + .build(); + + return task; + } +} \ No newline at end of file diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVAppApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVAppApiLiveTest.java new file mode 100644 index 0000000000..94f59881ac --- /dev/null +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVAppApiLiveTest.java @@ -0,0 +1,117 @@ +/* + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + *(Link.builder().regarding copyright ownership. jclouds licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless(Link.builder().required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jclouds.vcloud.director.v1_5.features.systemadmin; + +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CONDITION_FMT; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.util.concurrent.TimeUnit; + +import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest; +import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.VApp; +import org.jclouds.vcloud.director.v1_5.domain.params.DeployVAppParams; +import org.jclouds.vcloud.director.v1_5.features.VAppApi; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * Allows us to test the {@link VAppApi} allowed to system administrators + * + * @author andrea turli + */ +@Test(singleThreaded = true, testName = "SystemAdminVAppApiLiveTest") +public class SystemAdminVAppApiLiveTest extends AbstractVAppApiLiveTest { + + private boolean testUserCreated = false; + + @BeforeClass(alwaysRun = true) + protected void setupRequiredEntities() { + + if (adminContext != null) { + userUrn = adminContext.getApi().getUserApi().addUserToOrg(randomTestUser("VAppAccessTest"), org.getId()) + .getId(); + } + } + + @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" }) + public void cleanUp() { + if (adminContext != null && testUserCreated && userUrn != null) { + try { + adminContext.getApi().getUserApi().remove(userUrn); + } catch (Exception e) { + logger.warn(e, "Error when deleting user"); + } + } + } + + @Test(description = "POST /vApp/{id}/action/enterMaintenanceMode", groups = { "systemAdmin" }) + public void testEnterMaintenanceMode() { + + // Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only + VApp temp = instantiateVApp(); + DeployVAppParams params = DeployVAppParams.builder() + .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization() + .notPowerOn().build(); + Task deployVApp = vAppApi.deploy(temp.getId(), params); + assertTaskSucceedsLong(deployVApp); + + try { + // Method under test + vAppApi.enterMaintenanceMode(temp.getId()); + + temp = vAppApi.get(temp.getId()); + assertTrue(temp.isInMaintenanceMode(), + String.format(CONDITION_FMT, "InMaintenanceMode", "TRUE", temp.isInMaintenanceMode())); + + // Exit maintenance mode + vAppApi.exitMaintenanceMode(temp.getId()); + } finally { + cleanUpVApp(temp); + } + } + + @Test(description = "POST /vApp/{id}/action/exitMaintenanceMode", dependsOnMethods = { "testEnterMaintenanceMode" }, groups = { "systemAdmin" }) + public void testExitMaintenanceMode() { + // Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only + VApp temp = instantiateVApp(); + DeployVAppParams params = DeployVAppParams.builder() + .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization() + .notPowerOn().build(); + Task deployVApp = vAppApi.deploy(temp.getId(), params); + assertTaskSucceedsLong(deployVApp); + + try { + // Enter maintenance mode + vAppApi.enterMaintenanceMode(temp.getId()); + + // Method under test + vAppApi.exitMaintenanceMode(temp.getId()); + + temp = vAppApi.get(temp.getId()); + assertFalse(temp.isInMaintenanceMode(), + String.format(CONDITION_FMT, "InMaintenanceMode", "FALSE", temp.isInMaintenanceMode())); + } finally { + cleanUpVApp(temp); + } + } + +} \ No newline at end of file diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVmApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVmApiExpectTest.java new file mode 100644 index 0000000000..648c4080a0 --- /dev/null +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVmApiExpectTest.java @@ -0,0 +1,522 @@ +/* + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + *(Link.builder().regarding copyright ownership. jclouds licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless(Link.builder().required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jclouds.vcloud.director.v1_5.features.systemadmin; + +import static org.testng.Assert.assertEquals; + +import java.net.URI; + +import org.jclouds.dmtf.ovf.NetworkSection; +import org.jclouds.dmtf.ovf.StartupSection; +import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; +import org.jclouds.vcloud.director.v1_5.domain.Error; +import org.jclouds.vcloud.director.v1_5.domain.Link; +import org.jclouds.vcloud.director.v1_5.domain.Owner; +import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList; +import org.jclouds.vcloud.director.v1_5.domain.RasdItemsList; +import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.ScreenTicket; +import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.Vm; +import org.jclouds.vcloud.director.v1_5.domain.VmPendingQuestion; +import org.jclouds.vcloud.director.v1_5.domain.VmQuestionAnswer; +import org.jclouds.vcloud.director.v1_5.domain.dmtf.RasdItem; +import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams; +import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams; +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.domain.section.NetworkConnectionSection; +import org.jclouds.vcloud.director.v1_5.domain.section.OperatingSystemSection; +import org.jclouds.vcloud.director.v1_5.domain.section.RuntimeInfoSection; +import org.jclouds.vcloud.director.v1_5.domain.section.VirtualHardwareSection; +import org.jclouds.vcloud.director.v1_5.features.VmApi; +import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest; +import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.testng.internal.annotations.Sets; + +/** + * Allows us to test the {@link VmApi} allowed to system administrators + * + * @author andrea turli + */ +@Test(groups = { "unit", "systemAdmin" }, singleThreaded = true, testName = "SystemAdminVmApiExpectTest") +public class SystemAdminVmApiExpectTest extends VCloudDirectorAdminApiExpectTest { + + private String vmId = "vm-d0e2b6b9-4381-4ddc-9572-cdfae54059be"; + private URI vmURI = URI.create(endpoint + vmId); + + @BeforeClass + public void before() { + } + + @Test(enabled = false) + public void testRelocate() { + VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, + new VcloudHttpRequestPrimer() + .apiCommand("POST", vmId + "/action/relocate") + .xmlFilePayload("/vApp/relocateParams.xml", VCloudDirectorMediaType.RELOCATE_VM_PARAMS) + .acceptAnyMedia() + .httpRequestBuilder().build(), + new VcloudHttpResponsePrimer() + .xmlFilePayload("/vApp/relocateTask.xml", VCloudDirectorMediaType.TASK) + .httpResponseBuilder().build()); + + RelocateParams params = RelocateParams.builder() + .build(); + + Task expected = relocateTask(); + + assertEquals(api.getVmApi().relocate(vmURI, params), expected); + } + + + public static Vm getVm() { + // FIXME Does not match XML + Vm vm = Vm.builder() + .href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vm-d0e2b6b9-4381-4ddc-9572-cdfae54059be")) +// .link(Link.builder() +// .href(URI.create()) +// .build()) + .build(); + +// +// +// +// +// +// +// +// +// +// +// + + return vm; + } + + public static Task editVmTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task removeVmTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task consolidateVmTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static ControlAccessParams controlAccessParams() { + ControlAccessParams params = ControlAccessParams.builder() + .build(); + + return params; + } + + public static Task deployTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task discardSuspendedStateTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task installVMwareToolsTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task recomposeVmTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task relocateTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task undeployTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task upgradeHardwareVersionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task powerOffTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task powerOnTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task rebootTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task resetTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task shutdownTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task suspendTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static ControlAccessParams getAccessControlParams() { + ControlAccessParams params = ControlAccessParams.builder() + .build(); + + return params; + } + + public static GuestCustomizationSection getGuestCustomizationSection() { + GuestCustomizationSection section = GuestCustomizationSection.builder() + .build(); + + return section; + } + + public static Task editGuestCustomizationSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static LeaseSettingsSection getLeaseSettingsSection() { + LeaseSettingsSection section = LeaseSettingsSection.builder() + .build(); + + return section; + } + + public static Task editLeaseSettingsSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task ejectMediaTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Task insertMediaTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static NetworkConfigSection getNetworkConfigSection() { + NetworkConfigSection section = NetworkConfigSection.builder() + .build(); + + return section; + } + + public static Task editNetworkConfigSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static NetworkConnectionSection getNetworkConnectionSection() { + NetworkConnectionSection section = NetworkConnectionSection.builder() + .build(); + + return section; + } + + public static Task editNetworkConnectionSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static NetworkSection getNetworkSection() { + NetworkSection section = NetworkSection.builder() + .build(); + + return section; + } + + public static OperatingSystemSection getOperatingSystemSection() { + OperatingSystemSection section = OperatingSystemSection.builder() + .build(); + + return section; + } + + public static Task editOperatingSystemSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static Owner getOwner() { + Owner owner = Owner.builder() + .build(); + + return owner; + } + + public static Task editOwnerTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static ProductSectionList getProductSections() { + ProductSectionList sectionItems = ProductSectionList.builder() + .build(); + + return sectionItems; + } + + public static Task editProductSectionsTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static VmPendingQuestion getPendingQuestion() { + VmPendingQuestion question = VmPendingQuestion.builder() + .build(); + + return question; + } + + public static VmQuestionAnswer answerQuestion() { + VmQuestionAnswer answer = null; // = VmQuestionAnswer.builder() +// .build(); + + return answer; + } + + public static RuntimeInfoSection getRuntimeInfoSection() { + RuntimeInfoSection section = RuntimeInfoSection.builder() + .build(); + + return section; + } + + public static byte[] getScreenImage() { + byte[] image = new byte[0]; + + return image; + } + + public static ScreenTicket getScreenTicket() { + ScreenTicket ticket = null; // = ScreenTicket.builder(); +// .build(); + + return ticket; + } + + public static StartupSection getStartupSection() { + StartupSection section = null; // = StartupSection.builder(); +// .build(); + + return section; + } + + public static Task editStartupSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static VirtualHardwareSection getVirtualHardwareSection() { + VirtualHardwareSection section = VirtualHardwareSection.builder() + .build(); + + return section; + } + + public static Task editVirtualHardwareSectionTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItem getVirtualHardwareSectionCpu() { + RasdItem cpu = RasdItem.builder() + .build(); + + return cpu; + } + + public static Task editVirtualHardwareSectionCpuTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionDisks() { + RasdItemsList disks = RasdItemsList.builder() + .build(); + + return disks; + } + + public static Task editVirtualHardwareSectionDisksTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionMedia() { + RasdItemsList media = RasdItemsList.builder() + .build(); + + return media; + } + + public static RasdItem getVirtualHardwareSectionMemory() { + RasdItem memory = RasdItem.builder() + .build(); + + return memory; + } + + public static Task editVirtualHardwareSectionMemoryTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionNetworkCards() { + RasdItemsList networkCards = RasdItemsList.builder() + .build(); + + return networkCards; + } + + public static Task editVirtualHardwareSectionNetworkCardsTask() { + Task task = Task.builder() + .build(); + + return task; + } + + public static RasdItemsList getVirtualHardwareSectionSerialPorts() { + RasdItemsList serialPorts = RasdItemsList.builder() + .build(); + + return serialPorts; + } + + public static Task editVirtualHardwareSectionSerialPortsTask() { + return task("id", "name", "description", "status", "operation", "operationName", "startTime"); + } + + /** Used by other methods to add a custom {@link Task} object. */ + private static Task task(String taskId, String name, String description, String status, String operation, String operationName, String startTime) { + Task task = Task.builder() + .error(Error.builder().build()) + .org(Reference.builder().build()) + .owner(Reference.builder().build()) + .user(Reference.builder().build()) + .params(null) + .progress(0) + .status(status) + .operation(operation) + .operationName(operationName) + .startTime(dateService.iso8601DateParse(startTime)) + .endTime(null) + .expiryTime(null) + .tasks(Sets.newLinkedHashSet()) + .description(description) + .name(name) + .id("urn:vcloud:" + taskId) + .href(URI.create(endpoint + "/task/" + taskId)) + .links(Sets.newLinkedHashSet()) + .build(); + + return task; + } +} \ No newline at end of file diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVmApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVmApiLiveTest.java new file mode 100644 index 0000000000..c06106919a --- /dev/null +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/systemadmin/SystemAdminVmApiLiveTest.java @@ -0,0 +1,136 @@ +/* + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + *(Link.builder().regarding copyright ownership. jclouds licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless(Link.builder().required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.jclouds.vcloud.director.v1_5.features.systemadmin; + +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY; +import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVm; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; + +import java.util.concurrent.TimeUnit; + +import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest; +import org.jclouds.vcloud.director.v1_5.domain.Reference; +import org.jclouds.vcloud.director.v1_5.domain.ResourceEntity.Status; +import org.jclouds.vcloud.director.v1_5.domain.Task; +import org.jclouds.vcloud.director.v1_5.domain.params.DeployVAppParams; +import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams; +import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecordType; +import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecords; +import org.jclouds.vcloud.director.v1_5.features.VmApi; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import com.google.common.collect.Iterables; + +/** + * Tests behavior of the {@link VmApi}. + * + * @author andrea turli + */ +@Test(groups = { "live", "systemAdmin" }, singleThreaded = true, testName = "SystemAdminVmApiLiveTest") +public class SystemAdminVmApiLiveTest extends AbstractVAppApiLiveTest { + + private boolean testUserCreated = false; + + @BeforeClass(alwaysRun = true) + protected void setupRequiredEntities() { + + if (adminContext != null) { + userUrn = adminContext.getApi().getUserApi().addUserToOrg(randomTestUser("VAppAccessTest"), org.getId()) + .getId(); + } + } + + @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" }) + public void cleanUp() { + if (adminContext != null && testUserCreated && userUrn != null) { + try { + adminContext.getApi().getUserApi().remove(userUrn); + } catch (Exception e) { + logger.warn("Error when deleting user: %s", e.getMessage()); + } + } + } + + /** + * @see VmApi#get(String) + */ + @Test(description = "GET /vApp/{id}") + public void testGetVm() { + // The method under test + vm = vmApi.get(vmUrn); + + // Check the retrieved object is well formed + checkVm(vm); + + // Check the required fields are set + assertEquals(vm.isDeployed(), Boolean.FALSE, + String.format(OBJ_FIELD_EQ, VM, "deployed", "FALSE", vm.isDeployed().toString())); + + // Check status + assertVmStatus(vmUrn, Status.POWERED_OFF); + } + + // NOTE This test is disabled, as it is not possible to look up datastores using the User API + @Test(description = "POST /vApp/{id}/action/relocate", dependsOnMethods = { "testGetVm" }) + public void testRelocate() { + // Relocate to the last of the available datastores + QueryResultRecords records = adminContext.getApi().getQueryApi().queryAll("datastore"); + QueryResultRecordType datastore = Iterables.getLast(records.getRecords()); + RelocateParams params = RelocateParams.builder().datastore(Reference.builder().href(datastore.getHref()).build()) + .build(); + + // The method under test + Task relocate = vmApi.relocate(vmUrn, params); + assertTrue(retryTaskSuccess.apply(relocate), String.format(TASK_COMPLETE_TIMELY, "relocate")); + } + + @Test(description = "POST /vApp/{id}/action/deploy", dependsOnMethods = { "testGetVm" }) + public void testDeployVm() { + DeployVAppParams params = DeployVAppParams.builder() + .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization() + .notPowerOn().build(); + + // The method under test + Task deployVm = vmApi.deploy(vmUrn, params); + assertTrue(retryTaskSuccessLong.apply(deployVm), String.format(TASK_COMPLETE_TIMELY, "deployVm")); + + // Get the edited Vm + vm = vmApi.get(vmUrn); + + // Check the required fields are set + assertTrue(vm.isDeployed(), String.format(OBJ_FIELD_EQ, VM, "deployed", "TRUE", vm.isDeployed().toString())); + + // Check status + assertVmStatus(vmUrn, Status.POWERED_OFF); + } + + @Test(description = "POST /vApp/{id}/action/consolidate", dependsOnMethods = { "testDeployVm" }) + public void testConsolidateVm() { + // Power on Vm + vm = powerOnVm(vmUrn); + + // The method under test + Task consolidateVm = vmApi.consolidate(vmUrn); + assertTrue(retryTaskSuccess.apply(consolidateVm), String.format(TASK_COMPLETE_TIMELY, "consolidateVm")); + } +} \ No newline at end of file diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java index 2c1413f0f9..503b895e71 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java @@ -29,6 +29,7 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.E import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CATALOG; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.MEDIA; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG_NETWORK; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.USER; @@ -36,7 +37,6 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP_TEMPLATE; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VDC; import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VM; -import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.MEDIA; import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals; import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals; import static org.testng.Assert.assertEquals; @@ -89,8 +89,6 @@ import org.jclouds.vcloud.director.v1_5.domain.org.Org; import org.jclouds.vcloud.director.v1_5.domain.params.InstantiateVAppTemplateParams; import org.jclouds.vcloud.director.v1_5.domain.params.InstantiationParams; import org.jclouds.vcloud.director.v1_5.domain.params.UndeployVAppParams; -import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecordType; -import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecords; import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection; import org.jclouds.vcloud.director.v1_5.features.TaskApi; import org.jclouds.vcloud.director.v1_5.features.VAppApi; @@ -470,6 +468,30 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< }); } + public void cleanUpVAppTemplateInOrg() { + FluentIterable vAppTemplates = FluentIterable + .from(vdc.getResourceEntities()) + .filter(ReferencePredicates + . typeEquals(VAPP_TEMPLATE)) + .transform(new Function() { + + @Override + public VAppTemplate apply(Reference in) { + return context.getApi().getVAppTemplateApi() + .get(in.getHref()); + } + }).filter(Predicates.notNull()); + + Iterables.removeIf(vAppTemplates, new Predicate() { + + @Override + public boolean apply(VAppTemplate input) { + if(input.getName().startsWith("captured-") || input.getName().startsWith("uploaded-") || input.getName().startsWith("vappTemplateClone-")) + context.getApi().getVAppTemplateApi().remove(input.getHref()); + return false; + }}); + } + protected Vdc lazyGetVdc() { if (vdc == null) { assertNotNull(vdcUrn, String.format(URN_REQ_LIVE, VDC)); @@ -530,9 +552,9 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest< assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask")); media = context.getApi().getMediaApi().get(media.getId()); } - mediaUrn = media.getId(); - } + } else + media = context.getApi().getMediaApi().get(mediaUrn); } return media; }