mirror of https://github.com/apache/jclouds.git
Merge pull request #776 from andreaturli/vcloud-director
added compose and recompose vapp live test
This commit is contained in:
commit
d2d476e912
|
@ -74,7 +74,7 @@ public class VAppTemplate extends ResourceEntity {
|
||||||
|
|
||||||
public static abstract class Builder<B extends Builder<B>> extends ResourceEntity.Builder<B> {
|
public static abstract class Builder<B extends Builder<B>> extends ResourceEntity.Builder<B> {
|
||||||
private Owner owner;
|
private Owner owner;
|
||||||
private Set<VAppTemplate> children = Sets.newLinkedHashSet();
|
private Set<Vm> children = Sets.newLinkedHashSet();
|
||||||
private Set<SectionType> sections = Sets.newLinkedHashSet();
|
private Set<SectionType> sections = Sets.newLinkedHashSet();
|
||||||
private String vAppScopedLocalId;
|
private String vAppScopedLocalId;
|
||||||
private Boolean ovfDescriptorUploaded;
|
private Boolean ovfDescriptorUploaded;
|
||||||
|
@ -91,7 +91,7 @@ public class VAppTemplate extends ResourceEntity {
|
||||||
/**
|
/**
|
||||||
* @see VAppTemplate#getChildren()
|
* @see VAppTemplate#getChildren()
|
||||||
*/
|
*/
|
||||||
public B children(Iterable<VAppTemplate> children) {
|
public B children(Iterable<Vm> children) {
|
||||||
this.children = Sets.newLinkedHashSet(checkNotNull(children, "children"));
|
this.children = Sets.newLinkedHashSet(checkNotNull(children, "children"));
|
||||||
return self();
|
return self();
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ public class VAppTemplate extends ResourceEntity {
|
||||||
private Owner owner;
|
private Owner owner;
|
||||||
@XmlElementWrapper(name = "Children")
|
@XmlElementWrapper(name = "Children")
|
||||||
@XmlElement(name = "Vm")
|
@XmlElement(name = "Vm")
|
||||||
private Set<VAppTemplate> children = Sets.newLinkedHashSet();
|
private Set<Vm> children = Sets.newLinkedHashSet();
|
||||||
@XmlElementRefs({
|
@XmlElementRefs({
|
||||||
@XmlElementRef(type = VirtualHardwareSection.class),
|
@XmlElementRef(type = VirtualHardwareSection.class),
|
||||||
@XmlElementRef(type = LeaseSettingsSection.class),
|
@XmlElementRef(type = LeaseSettingsSection.class),
|
||||||
|
@ -179,7 +179,7 @@ public class VAppTemplate extends ResourceEntity {
|
||||||
protected VAppTemplate(Builder<?> builder) {
|
protected VAppTemplate(Builder<?> builder) {
|
||||||
super(builder);
|
super(builder);
|
||||||
this.owner = builder.owner;
|
this.owner = builder.owner;
|
||||||
this.children = builder.children.isEmpty() ? Collections.<VAppTemplate>emptySet() : ImmutableSet.copyOf(builder.children);
|
this.children = builder.children.isEmpty() ? Collections.<Vm>emptySet() : ImmutableSet.copyOf(builder.children);
|
||||||
this.sections = builder.sections.isEmpty() ? null : ImmutableSet.copyOf(builder.sections);
|
this.sections = builder.sections.isEmpty() ? null : ImmutableSet.copyOf(builder.sections);
|
||||||
this.vAppScopedLocalId = builder.vAppScopedLocalId;
|
this.vAppScopedLocalId = builder.vAppScopedLocalId;
|
||||||
this.ovfDescriptorUploaded = builder.ovfDescriptorUploaded;
|
this.ovfDescriptorUploaded = builder.ovfDescriptorUploaded;
|
||||||
|
@ -200,7 +200,7 @@ public class VAppTemplate extends ResourceEntity {
|
||||||
/**
|
/**
|
||||||
* Gets the value of the children property.
|
* Gets the value of the children property.
|
||||||
*/
|
*/
|
||||||
public Set<VAppTemplate> getChildren() {
|
public Set<Vm> getChildren() {
|
||||||
return children;
|
return children;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,7 @@ public class ControlAccessParams {
|
||||||
this.accessSettings = null;
|
this.accessSettings = null;
|
||||||
} else {
|
} else {
|
||||||
this.everyoneAccessLevel = null;
|
this.everyoneAccessLevel = null;
|
||||||
this.accessSettings = Iterables.isEmpty(checkNotNull(accessSettings, "accessSettings")) ? null : ImmutableList.copyOf(accessSettings);
|
this.accessSettings = Iterables.isEmpty(checkNotNull(accessSettings, "accessSettings")) ? null : ImmutableList.copyOf(accessSettings);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,5 +180,4 @@ public interface VdcApi {
|
||||||
*/
|
*/
|
||||||
@Delegate
|
@Delegate
|
||||||
MetadataApi.Readable getMetadataApi();
|
MetadataApi.Readable getMetadataApi();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -691,8 +691,8 @@ public class Checks {
|
||||||
// Check optional fields
|
// Check optional fields
|
||||||
Owner owner = template.getOwner();
|
Owner owner = template.getOwner();
|
||||||
if (owner != null) checkOwner(owner);
|
if (owner != null) checkOwner(owner);
|
||||||
for (VAppTemplate child : template.getChildren()) {
|
for (Vm child : template.getChildren()) {
|
||||||
checkVAppTemplate(child);
|
checkVm(child);
|
||||||
}
|
}
|
||||||
for (SectionType section : template.getSections()) {
|
for (SectionType section : template.getSections()) {
|
||||||
checkSectionType(section);
|
checkSectionType(section);
|
||||||
|
@ -735,8 +735,8 @@ public class Checks {
|
||||||
if (params.isSharedToEveryone()) {
|
if (params.isSharedToEveryone()) {
|
||||||
assertNotNull(params.getEveryoneAccessLevel(), String.format(OBJ_FIELD_REQ, "ControlAccessParams", "EveryoneAccessLevel"));
|
assertNotNull(params.getEveryoneAccessLevel(), String.format(OBJ_FIELD_REQ, "ControlAccessParams", "EveryoneAccessLevel"));
|
||||||
assertNotNull(params.getAccessSettings(), String.format(OBJ_FIELD_REQ, "ControlAccessParams", "AccessSettings when isSharedToEveryone"));
|
assertNotNull(params.getAccessSettings(), String.format(OBJ_FIELD_REQ, "ControlAccessParams", "AccessSettings when isSharedToEveryone"));
|
||||||
assertTrue(params.getAccessSettings().size() >= 1, String.format(OBJ_FIELD_GTE_1, "ControlAccessParams", "AccessSettings.size", params.getAccessSettings().size()));
|
|
||||||
} else {
|
} else {
|
||||||
|
assertTrue(params.getAccessSettings().size() >= 1, String.format(OBJ_FIELD_GTE_1, "ControlAccessParams", "AccessSettings.size", params.getAccessSettings().size()));
|
||||||
for (AccessSetting setting : params.getAccessSettings()) {
|
for (AccessSetting setting : params.getAccessSettings()) {
|
||||||
checkAccessSetting(setting);
|
checkAccessSetting(setting);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,7 @@ import static org.testng.Assert.assertNull;
|
||||||
import static org.testng.Assert.assertTrue;
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -75,19 +76,36 @@ 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.ResourceEntity.Status;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
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.VApp;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.Vm;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.network.NetworkAssignment;
|
||||||
|
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.params.ComposeVAppParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams;
|
import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.DeployVAppParams;
|
import org.jclouds.vcloud.director.v1_5.domain.params.DeployVAppParams;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.params.InstantiationParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.RecomposeVAppParams;
|
import org.jclouds.vcloud.director.v1_5.domain.params.RecomposeVAppParams;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.params.SourcedCompositionItemParam;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.UndeployVAppParams;
|
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.LeaseSettingsSection;
|
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.NetworkConfigSection;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConnectionSection;
|
||||||
import org.testng.annotations.AfterClass;
|
import org.testng.annotations.AfterClass;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.base.CharMatcher;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of the {@link VAppApi}.
|
* Tests behavior of the {@link VAppApi}.
|
||||||
|
@ -191,6 +209,62 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
assertVAppStatus(vAppURI, Status.POWERED_OFF);
|
assertVAppStatus(vAppURI, Status.POWERED_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(description = "POST /vApp/{id}/action/recomposeVApp")
|
||||||
|
public void testRecomposeVApp() {
|
||||||
|
Set<Vm> vms = getAvailableVMsFromVAppTemplates();
|
||||||
|
|
||||||
|
VApp composedVApp = vdcApi.composeVApp(vdcURI, ComposeVAppParams.builder()
|
||||||
|
.name(name("composed-"))
|
||||||
|
.instantiationParams(instantiationParams())
|
||||||
|
.build());
|
||||||
|
|
||||||
|
// get the first vm to be added to vApp
|
||||||
|
Vm toAddVm = Iterables.get(vms, 0);
|
||||||
|
RecomposeVAppParams params = createRecomposeParams(composedVApp, toAddVm);
|
||||||
|
|
||||||
|
// The method under test
|
||||||
|
Task recomposeVApp = vAppApi.recompose(composedVApp.getHref(), params);
|
||||||
|
assertTaskSucceedsLong(recomposeVApp);
|
||||||
|
|
||||||
|
// add another vm instance to vApp
|
||||||
|
params = createRecomposeParams(composedVApp, toAddVm);
|
||||||
|
recomposeVApp = vAppApi.recompose(composedVApp.getHref(), params);
|
||||||
|
assertTaskSucceedsLong(recomposeVApp);
|
||||||
|
|
||||||
|
// delete a vm
|
||||||
|
VApp configured = vAppApi.getVApp(composedVApp.getHref());
|
||||||
|
List<Vm> vmsToBeDeleted = configured.getChildren().getVms();
|
||||||
|
Vm toBeDeleted = Iterables.get(vmsToBeDeleted, 0);
|
||||||
|
Task deleteVm = vmApi.deleteVm(toBeDeleted.getHref());
|
||||||
|
assertTaskSucceedsLong(deleteVm);
|
||||||
|
|
||||||
|
Task deleteVApp = vAppApi.deleteVApp(composedVApp.getHref());
|
||||||
|
assertTaskSucceedsLong(deleteVApp);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<Vm> getAvailableVMsFromVAppTemplates() {
|
||||||
|
Set<Vm> vms = Sets.newLinkedHashSet();
|
||||||
|
QueryResultRecords templatesRecords = queryApi.vAppTemplatesQueryAll();
|
||||||
|
for (QueryResultRecordType templateRecord : templatesRecords.getRecords()) {
|
||||||
|
VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(templateRecord.getHref());
|
||||||
|
vms.addAll(vAppTemplate.getChildren());
|
||||||
|
}
|
||||||
|
return ImmutableSet.copyOf(Iterables.filter(vms, new Predicate<Vm>() {
|
||||||
|
// filter out vms in the vApp template with computer name that contains underscores, dots, or both.
|
||||||
|
@Override
|
||||||
|
public boolean apply(Vm input) {
|
||||||
|
GuestCustomizationSection guestCustomizationSection = vmApi.getGuestCustomizationSection(input.getHref());
|
||||||
|
String computerName = guestCustomizationSection.getComputerName();
|
||||||
|
String retainComputerName = CharMatcher.inRange('0', '9')
|
||||||
|
.or(CharMatcher.inRange('a', 'z'))
|
||||||
|
.or(CharMatcher.inRange('A', 'Z'))
|
||||||
|
.or(CharMatcher.is('-'))
|
||||||
|
.retainFrom(computerName);
|
||||||
|
return computerName.equals(retainComputerName);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see VAppApi#modifyVApp(URI, VApp)
|
* @see VAppApi#modifyVApp(URI, VApp)
|
||||||
*/
|
*/
|
||||||
|
@ -217,7 +291,7 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
@Test(description = "POST /vApp/{id}/action/deploy", dependsOnMethods = { "testGetVApp" })
|
@Test(description = "POST /vApp/{id}/action/deploy", dependsOnMethods = { "testGetVApp" })
|
||||||
public void testDeployVApp() {
|
public void testDeployVApp() {
|
||||||
DeployVAppParams params = DeployVAppParams.builder()
|
DeployVAppParams params = DeployVAppParams.builder()
|
||||||
.deploymentLeaseSeconds((int)TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS))
|
.deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS))
|
||||||
.notForceCustomization()
|
.notForceCustomization()
|
||||||
.notPowerOn()
|
.notPowerOn()
|
||||||
.build();
|
.build();
|
||||||
|
@ -274,14 +348,14 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
vApp = powerOnVApp(vApp.getHref());
|
vApp = powerOnVApp(vApp.getHref());
|
||||||
|
|
||||||
// The method under test
|
// The method under test
|
||||||
Task shutdown = vAppApi.shutdown(vAppURI);
|
Task shutdown = vAppApi.shutdown(vApp.getHref());
|
||||||
assertTaskSucceedsLong(shutdown);
|
assertTaskSucceedsLong(shutdown);
|
||||||
|
|
||||||
// Get the updated VApp
|
// Get the updated VApp
|
||||||
vApp = vAppApi.getVApp(vAppURI);
|
vApp = vAppApi.getVApp(vApp.getHref());
|
||||||
|
|
||||||
// Check status
|
// Check status
|
||||||
assertVAppStatus(vAppURI, Status.POWERED_OFF);
|
assertVAppStatus(vApp.getHref(), Status.POWERED_OFF);
|
||||||
|
|
||||||
// Power on the VApp again
|
// Power on the VApp again
|
||||||
vApp = powerOnVApp(vApp.getHref());
|
vApp = powerOnVApp(vApp.getHref());
|
||||||
|
@ -378,6 +452,7 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
|
|
||||||
@Test(description = "POST /vApp/{id}/action/controlAccess", dependsOnMethods = { "testControlAccessUser" })
|
@Test(description = "POST /vApp/{id}/action/controlAccess", dependsOnMethods = { "testControlAccessUser" })
|
||||||
public void testControlAccessEveryone() {
|
public void testControlAccessEveryone() {
|
||||||
|
|
||||||
ControlAccessParams params = ControlAccessParams.builder()
|
ControlAccessParams params = ControlAccessParams.builder()
|
||||||
.sharedToEveryone()
|
.sharedToEveryone()
|
||||||
.everyoneAccessLevel("FullControl")
|
.everyoneAccessLevel("FullControl")
|
||||||
|
@ -404,8 +479,9 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
assertTrue(retryTaskSuccess.apply(discardSuspendedState), String.format(TASK_COMPLETE_TIMELY, "discardSuspendedState"));
|
assertTrue(retryTaskSuccess.apply(discardSuspendedState), String.format(TASK_COMPLETE_TIMELY, "discardSuspendedState"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(description = "POST /vApp/{id}/action/enterMaintenanceMode")
|
@Test(description = "POST /vApp/{id}/action/enterMaintenanceMode", groups = {"systemAdmin"})
|
||||||
public void testEnterMaintenanceMode() {
|
public void testEnterMaintenanceMode() {
|
||||||
|
|
||||||
// Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only
|
// Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only
|
||||||
VApp temp = instantiateVApp();
|
VApp temp = instantiateVApp();
|
||||||
DeployVAppParams params = DeployVAppParams.builder()
|
DeployVAppParams params = DeployVAppParams.builder()
|
||||||
|
@ -430,7 +506,7 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(description = "POST /vApp/{id}/action/exitMaintenanceMode", dependsOnMethods = { "testEnterMaintenanceMode" })
|
@Test(description = "POST /vApp/{id}/action/exitMaintenanceMode", dependsOnMethods = { "testEnterMaintenanceMode" }, groups = {"systemAdmin"})
|
||||||
public void testExitMaintenanceMode() {
|
public void testExitMaintenanceMode() {
|
||||||
// Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only
|
// Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only
|
||||||
VApp temp = instantiateVApp();
|
VApp temp = instantiateVApp();
|
||||||
|
@ -456,18 +532,6 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME "Could not bind object to request[method=POST, endpoint=https://mycloud.greenhousedata.com/api/vApp/vapp-e124f3f0-adb9-4268-ad49-e54fb27e40af/action/recomposeVApp,
|
|
||||||
// headers={Accept=[application/vnd.vmware.vcloud.task+xml]}, payload=[content=true, contentMetadata=[contentDisposition=null, contentEncoding=null, contentLanguage=null,
|
|
||||||
// contentLength=0, contentMD5=null, contentType=application/vnd.vmware.vcloud.recomposeVAppParams+xml], written=false]]: Could not marshall object"
|
|
||||||
@Test(description = "POST /vApp/{id}/action/recomposeVApp", dependsOnMethods = { "testGetVApp" })
|
|
||||||
public void testRecomposeVApp() {
|
|
||||||
RecomposeVAppParams params = RecomposeVAppParams.builder().build();
|
|
||||||
|
|
||||||
// The method under test
|
|
||||||
Task recomposeVApp = vAppApi.recompose(vApp.getHref(), params);
|
|
||||||
assertTrue(retryTaskSuccess.apply(recomposeVApp), String.format(TASK_COMPLETE_TIMELY, "recomposeVApp"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(description = "GET /vApp/{id}/controlAccess", dependsOnMethods = { "testGetVApp" })
|
@Test(description = "GET /vApp/{id}/controlAccess", dependsOnMethods = { "testGetVApp" })
|
||||||
public void testGetControlAccess() {
|
public void testGetControlAccess() {
|
||||||
// The method under test
|
// The method under test
|
||||||
|
@ -640,7 +704,7 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
assertEquals(modified.getProductSections().size(), oldSections.getProductSections().size() + 1);
|
assertEquals(modified.getProductSections().size(), oldSections.getProductSections().size() + 1);
|
||||||
|
|
||||||
// Check the section was modified correctly
|
// Check the section was modified correctly
|
||||||
assertEquals(modified, newSections, String.format(ENTITY_EQUAL, "ProductSectionList"));
|
assertEquals(modified, newSections);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(description = "GET /vApp/{id}/startupSection", dependsOnMethods = { "testGetVApp" })
|
@Test(description = "GET /vApp/{id}/startupSection", dependsOnMethods = { "testGetVApp" })
|
||||||
|
@ -689,6 +753,11 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
|
|
||||||
@Test(description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" })
|
@Test(description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" })
|
||||||
public void testGetMetadata() {
|
public void testGetMetadata() {
|
||||||
|
key = name("key-");
|
||||||
|
String value = name("value-");
|
||||||
|
metadataValue = MetadataValue.builder().value(value).build();
|
||||||
|
vAppApi.getMetadataApi().setMetadata(vApp.getHref(), key, metadataValue);
|
||||||
|
|
||||||
// Call the method being tested
|
// Call the method being tested
|
||||||
Metadata metadata = vAppApi.getMetadataApi().getMetadata(vApp.getHref());
|
Metadata metadata = vAppApi.getMetadataApi().getMetadata(vApp.getHref());
|
||||||
|
|
||||||
|
@ -762,4 +831,73 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
|
||||||
VApp deleted = vAppApi.getVApp(temp.getHref());
|
VApp deleted = vAppApi.getVApp(temp.getHref());
|
||||||
assertNull(deleted, "The VApp "+temp.getName()+" should have been deleted");
|
assertNull(deleted, "The VApp "+temp.getName()+" should have been deleted");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the recompose vapp params.
|
||||||
|
*
|
||||||
|
* @param vappTemplateRef
|
||||||
|
* @param vdc
|
||||||
|
* @return
|
||||||
|
* @throws VCloudException
|
||||||
|
*/
|
||||||
|
public RecomposeVAppParams createRecomposeParams(VApp vApp, Vm vm) {
|
||||||
|
|
||||||
|
// creating an item element. this item will contain the vm which should be added to the vapp.
|
||||||
|
Reference reference = Reference.builder().name(name("vm-")).href(vm.getHref()).type(vm.getType()).build();
|
||||||
|
SourcedCompositionItemParam vmItem = SourcedCompositionItemParam.builder().source(reference).build();
|
||||||
|
|
||||||
|
InstantiationParams vmInstantiationParams = null;
|
||||||
|
|
||||||
|
// if the vm contains a network connection and the vApp does not contain any configured network
|
||||||
|
if (vmHasNetworkConnectionConfigured(vm) && vAppHasNetworkConfigured(vApp)) {
|
||||||
|
// creating empty network connection section for the vm.
|
||||||
|
NetworkConnectionSection networkConnectionSection = NetworkConnectionSection.builder()
|
||||||
|
.info("Empty network configuration parameters")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
// adding the network connection section to the instantiation params of the vapp.
|
||||||
|
vmInstantiationParams = InstantiationParams.builder().sections(ImmutableSet.of(networkConnectionSection)).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the vm already contains a network connection section and if the vapp contains a configured network -> vm could be mapped to that network.
|
||||||
|
NetworkAssignment networkAssignment = null;
|
||||||
|
if (vmHasNetworkConnectionConfigured(vm) && !vAppHasNetworkConfigured(vApp)) {
|
||||||
|
for (NetworkConnection networkConnection : vmApi.getNetworkConnectionSection(vm.getHref())
|
||||||
|
.getNetworkConnections()) {
|
||||||
|
if (networkConnection.getNetworkConnectionIndex() == vmApi.getNetworkConnectionSection(vm.getHref())
|
||||||
|
.getPrimaryNetworkConnectionIndex()) {
|
||||||
|
networkAssignment = NetworkAssignment.builder().innerNetwork(networkConnection.getNetwork())
|
||||||
|
.containerNetwork(getVAppNetworkConfig(vApp).getNetworkName()).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (vmInstantiationParams != null)
|
||||||
|
vmItem = SourcedCompositionItemParam.builder().fromSourcedCompositionItemParam(vmItem)
|
||||||
|
.instantiationParams(vmInstantiationParams)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
if (networkAssignment != null)
|
||||||
|
vmItem = SourcedCompositionItemParam.builder().fromSourcedCompositionItemParam(vmItem)
|
||||||
|
.networkAssignment(ImmutableSet.of(networkAssignment))
|
||||||
|
.build();
|
||||||
|
|
||||||
|
return RecomposeVAppParams.builder().name(name("recompose-"))
|
||||||
|
// adding the vm item.
|
||||||
|
.sourcedItems(ImmutableList.of(vmItem)).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
private VAppNetworkConfiguration getVAppNetworkConfig(VApp vApp) {
|
||||||
|
Set<VAppNetworkConfiguration> vAppNetworkConfigs = vAppApi.getNetworkConfigSection(vApp.getHref()).getNetworkConfigs();
|
||||||
|
return Iterables.tryFind(vAppNetworkConfigs, Predicates.notNull()).orNull();
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean vAppHasNetworkConfigured(VApp vApp) {
|
||||||
|
return getVAppNetworkConfig(vApp) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean vmHasNetworkConnectionConfigured(Vm vm) {
|
||||||
|
return vmApi.getNetworkConnectionSection(vm.getHref()).getNetworkConnections().size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,7 @@ import org.jclouds.vcloud.director.v1_5.domain.Owner;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Reference;
|
import org.jclouds.vcloud.director.v1_5.domain.Reference;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
|
import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.Vm;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams;
|
import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection;
|
import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection;
|
import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection;
|
||||||
|
@ -482,7 +483,7 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
|
||||||
|
|
||||||
return VAppTemplate.builder().href(URI.create("https://vcloudbeta.bluelock.com/api/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"))
|
return VAppTemplate.builder().href(URI.create("https://vcloudbeta.bluelock.com/api/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"))
|
||||||
.links(ImmutableSet.of(aLink, bLink))
|
.links(ImmutableSet.of(aLink, bLink))
|
||||||
.children(ImmutableSet.<VAppTemplate>of())
|
.children(ImmutableSet.<Vm>of())
|
||||||
.type("application/vnd.vmware.vcloud.vAppTemplate+xml")
|
.type("application/vnd.vmware.vcloud.vAppTemplate+xml")
|
||||||
.description("For testing")
|
.description("For testing")
|
||||||
.id("urn:vcloud:vapptemplate:ef4415e6-d413-4cbb-9262-f9bbec5f2ea9")
|
.id("urn:vcloud:vapptemplate:ef4415e6-d413-4cbb-9262-f9bbec5f2ea9")
|
||||||
|
|
|
@ -23,6 +23,9 @@ import static org.testng.Assert.assertNull;
|
||||||
import static org.testng.Assert.fail;
|
import static org.testng.Assert.fail;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
|
import java.text.ParseException;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
|
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
|
||||||
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
|
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
|
||||||
|
@ -32,6 +35,9 @@ import org.jclouds.vcloud.director.v1_5.domain.ComputeCapacity;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Error;
|
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.Link;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Media;
|
import org.jclouds.vcloud.director.v1_5.domain.Media;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.Owner;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.User;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Media.ImageType;
|
import org.jclouds.vcloud.director.v1_5.domain.Media.ImageType;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
|
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
|
@ -39,6 +45,7 @@ import org.jclouds.vcloud.director.v1_5.domain.Reference;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.VApp;
|
import org.jclouds.vcloud.director.v1_5.domain.VApp;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
|
import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Vdc;
|
import org.jclouds.vcloud.director.v1_5.domain.Vdc;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.org.Org;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.CaptureVAppParams;
|
import org.jclouds.vcloud.director.v1_5.domain.params.CaptureVAppParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
|
import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.params.CloneVAppParams;
|
import org.jclouds.vcloud.director.v1_5.domain.params.CloneVAppParams;
|
||||||
|
@ -217,11 +224,11 @@ public class VdcApiExpectTest extends VCloudDirectorAdminApiExpectTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(enabled = false)
|
@Test(enabled = false)
|
||||||
public void testComposeVApp() {
|
public void testComposeVApp() throws ParseException {
|
||||||
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
|
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
|
||||||
new VcloudHttpRequestPrimer()
|
new VcloudHttpRequestPrimer()
|
||||||
.apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/composeVApp")
|
.apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/action/composeVApp")
|
||||||
.xmlFilePayload("/vdc/params/composeVApp.xml", VCloudDirectorMediaType.COMPOSE_VAPP_PARAMS)
|
.xmlFilePayload("/vdc/composeVAppParams.xml", VCloudDirectorMediaType.COMPOSE_VAPP_PARAMS)
|
||||||
.acceptAnyMedia()
|
.acceptAnyMedia()
|
||||||
.httpRequestBuilder().build(),
|
.httpRequestBuilder().build(),
|
||||||
new VcloudHttpResponsePrimer()
|
new VcloudHttpResponsePrimer()
|
||||||
|
@ -513,9 +520,56 @@ public class VdcApiExpectTest extends VCloudDirectorAdminApiExpectTest {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private VApp composeVApp() {
|
private VApp composeVApp() throws ParseException {
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
return VApp
|
||||||
|
.builder()
|
||||||
|
.status(0)
|
||||||
|
.name("test-vapp")
|
||||||
|
.id("urn:vcloud:vapp:d0e2b6b9-4381-4ddc-9572-cdfae54059be")
|
||||||
|
.type("application/vnd.vmware.vcloud.vApp+xml")
|
||||||
|
.description("Test VApp")
|
||||||
|
.href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be"))
|
||||||
|
.link(Link
|
||||||
|
.builder()
|
||||||
|
.name("orgNet-cloudsoft-External")
|
||||||
|
.rel("down")
|
||||||
|
.type("application/vnd.vmware.vcloud.vAppNetwork+xml")
|
||||||
|
.href(URI.create("https://mycloud.greenhousedata.com/api/network/2a2e2da4-446a-4ebc-a086-06df7c9570f0"))
|
||||||
|
.build())
|
||||||
|
.link(Link
|
||||||
|
.builder()
|
||||||
|
.rel("down")
|
||||||
|
.type("application/vnd.vmware.vcloud.controlAccess+xml")
|
||||||
|
.href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/controlAccess/"))
|
||||||
|
.build())
|
||||||
|
.link(Link
|
||||||
|
.builder()
|
||||||
|
.rel("up")
|
||||||
|
.type("application/vnd.vmware.vcloud.vdc+xml")
|
||||||
|
.href(URI.create("https://mycloud.greenhousedata.com/api/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f"))
|
||||||
|
.build())
|
||||||
|
.link(Link
|
||||||
|
.builder()
|
||||||
|
.rel("down")
|
||||||
|
.type("application/vnd.vmware.vcloud.owner+xml")
|
||||||
|
.href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/owner"))
|
||||||
|
.build())
|
||||||
|
.link(Link
|
||||||
|
.builder()
|
||||||
|
.rel("down")
|
||||||
|
.type("application/vnd.vmware.vcloud.metadata+xml")
|
||||||
|
.href(URI.create("https://mycloud.greenhousedata.com/api/vApp/vapp-d0e2b6b9-4381-4ddc-9572-cdfae54059be/metadata"))
|
||||||
|
.build())
|
||||||
|
.owner(Owner
|
||||||
|
.builder()
|
||||||
|
.type("application/vnd.vmware.vcloud.owner+xml")
|
||||||
|
.user(User
|
||||||
|
.builder()
|
||||||
|
.type("application/vnd.vmware.admin.user+xml")
|
||||||
|
.name("acole")
|
||||||
|
.href(URI.create("https://mycloud.greenhousedata.com/api/admin/user/c090335b-708c-4c1c-9e3d-89560d002120"))
|
||||||
|
.build().getRole()).build()).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private VApp instantiateVAppTemplate() {
|
private VApp instantiateVAppTemplate() {
|
||||||
|
@ -537,4 +591,5 @@ public class VdcApiExpectTest extends VCloudDirectorAdminApiExpectTest {
|
||||||
// TODO Auto-generated method stub
|
// TODO Auto-generated method stub
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -358,7 +358,7 @@ public abstract class BaseVCloudDirectorApiLiveTest extends BaseContextLiveTest<
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Build an {@link InstantiationParams} object. */
|
/** Build an {@link InstantiationParams} object. */
|
||||||
private InstantiationParams instantiationParams() {
|
protected InstantiationParams instantiationParams() {
|
||||||
InstantiationParams instantiationParams = InstantiationParams.builder()
|
InstantiationParams instantiationParams = InstantiationParams.builder()
|
||||||
.sections(ImmutableSet.of(networkConfigSection()))
|
.sections(ImmutableSet.of(networkConfigSection()))
|
||||||
.build();
|
.build();
|
||||||
|
|
Loading…
Reference in New Issue