mirror of https://github.com/apache/jclouds.git
Merge pull request #824 from andreaturli/vdir
issue 830: added systemadmin package; more tests fixed
This commit is contained in:
commit
b3907ebf77
|
@ -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<VAppNetworkConfiguration> vAppNetworkConfigs = vAppApi.getNetworkConfigSection(vApp.getId()).getNetworkConfigs();
|
||||
return vAppNetworkConfigs;
|
||||
}
|
||||
|
||||
protected void attachVmToVAppNetwork(Vm vm, String vAppNetworkName) {
|
||||
Set<NetworkConnection> 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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<URI> 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<URI> 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<Vm> vms = vApp.getChildren().getVms();
|
||||
Set<URI> vmHrefs = toHrefs(vms);
|
||||
@Test(description = "GET /vms/query?filter", dependsOnMethods = { "testQueryAllVms" })
|
||||
public void testQueryAllVmsWithFilter() {
|
||||
List<Vm> vms = vApp.getChildren().getVms();
|
||||
Set<URI> vmHrefs = toHrefs(vms);
|
||||
|
||||
QueryResultRecords queryResult = queryApi.vmsQuery(String.format("containerName==%s", vApp.getName()));
|
||||
Set<URI> hrefs = toHrefs(queryResult);
|
||||
QueryResultRecords queryResult = queryApi.vmsQuery(String.format(
|
||||
"containerName==%s", vApp.getName()));
|
||||
Set<URI> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -189,29 +189,6 @@ public class VAppNetworksLiveTest extends AbstractVAppApiLiveTest {
|
|||
.build();
|
||||
}
|
||||
|
||||
private void attachVmToVAppNetwork(Vm vm, String vAppNetworkName) {
|
||||
Set<NetworkConnection> 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()
|
||||
|
|
|
@ -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());
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
@ -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<Reference> 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<Reference> 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() {
|
||||
|
|
|
@ -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();
|
||||
|
||||
// <Link rel="power:powerOn" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/power/action/powerOn"/>
|
||||
// <Link rel="deploy" type="application/vnd.vmware.vcloud.deployVAppParams+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/action/deploy"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.vAppNetwork+xml" name="orgNet-cloudsoft-External" href="https://mycloud.greenhousedata.com/api/network/2a2e2da4-446a-4ebc-a086-06df7c9570f0"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.controlAccess+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/controlAccess/"/>
|
||||
// <Link rel="controlAccess" type="application/vnd.vmware.vcloud.controlAccess+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/action/controlAccess"/>
|
||||
// <Link rel="recompose" type="application/vnd.vmware.vcloud.recomposeVAppParams+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/action/recomposeVApp"/>
|
||||
// <Link rel="up" type="application/vnd.vmware.vcloud.vdc+xml" href="https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"/>
|
||||
// <Link rel="edit" type="application/vnd.vmware.vcloud.vApp+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be"/>
|
||||
// <Link rel="remove" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.owner+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/owner"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.metadata+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/metadata"/>
|
||||
|
||||
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.<Task>newLinkedHashSet())
|
||||
.description(description)
|
||||
.name(name)
|
||||
.id("urn:vcloud:" + taskId)
|
||||
.href(URI.create(endpoint + "/task/" + taskId))
|
||||
.links(Sets.<Link>newLinkedHashSet())
|
||||
.build();
|
||||
|
||||
return task;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
|
||||
// <Link rel="power:powerOn" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/power/action/powerOn"/>
|
||||
// <Link rel="deploy" type="application/vnd.vmware.vcloud.deployVAppParams+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/action/deploy"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.vAppNetwork+xml" name="orgNet-cloudsoft-External" href="https://mycloud.greenhousedata.com/api/network/2a2e2da4-446a-4ebc-a086-06df7c9570f0"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.controlAccess+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/controlAccess/"/>
|
||||
// <Link rel="controlAccess" type="application/vnd.vmware.vcloud.controlAccess+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/action/controlAccess"/>
|
||||
// <Link rel="recompose" type="application/vnd.vmware.vcloud.recomposeVAppParams+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/action/recomposeVApp"/>
|
||||
// <Link rel="up" type="application/vnd.vmware.vcloud.vdc+xml" href="https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"/>
|
||||
// <Link rel="edit" type="application/vnd.vmware.vcloud.vApp+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be"/>
|
||||
// <Link rel="remove" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.owner+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/owner"/>
|
||||
// <Link rel="down" type="application/vnd.vmware.vcloud.metadata+xml" href="https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/metadata"/>
|
||||
|
||||
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.<Task>newLinkedHashSet())
|
||||
.description(description)
|
||||
.name(name)
|
||||
.id("urn:vcloud:" + taskId)
|
||||
.href(URI.create(endpoint + "/task/" + taskId))
|
||||
.links(Sets.<Link>newLinkedHashSet())
|
||||
.build();
|
||||
|
||||
return task;
|
||||
}
|
||||
}
|
|
@ -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"));
|
||||
}
|
||||
}
|
|
@ -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<VAppTemplate> vAppTemplates = FluentIterable
|
||||
.from(vdc.getResourceEntities())
|
||||
.filter(ReferencePredicates
|
||||
.<Reference> typeEquals(VAPP_TEMPLATE))
|
||||
.transform(new Function<Reference, VAppTemplate>() {
|
||||
|
||||
@Override
|
||||
public VAppTemplate apply(Reference in) {
|
||||
return context.getApi().getVAppTemplateApi()
|
||||
.get(in.getHref());
|
||||
}
|
||||
}).filter(Predicates.notNull());
|
||||
|
||||
Iterables.removeIf(vAppTemplates, new Predicate<VAppTemplate>() {
|
||||
|
||||
@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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue