mirror of https://github.com/apache/jclouds.git
Merge branch 'issue-830-vapp-metadata' of https://github.com/aledsage/jclouds
* 'issue-830-vapp-metadata' of https://github.com/aledsage/jclouds: Issue #830: added metadata live tests for VApp
This commit is contained in:
commit
ef84b65b6a
|
@ -22,6 +22,7 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.C
|
||||||
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.MUST_BE_WELL_FORMED_FMT;
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.MUST_BE_WELL_FORMED_FMT;
|
||||||
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.MUST_CONTAIN_FMT;
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.MUST_CONTAIN_FMT;
|
||||||
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_NULL_OBJECT_FMT;
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_NULL_OBJECT_FMT;
|
||||||
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL;
|
||||||
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_ATTRB_REQ;
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_ATTRB_REQ;
|
||||||
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ;
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ;
|
||||||
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_GTE_0;
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_GTE_0;
|
||||||
|
@ -37,6 +38,7 @@ import static org.testng.Assert.fail;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
@ -59,6 +61,7 @@ import org.jclouds.vcloud.director.v1_5.domain.ovf.VirtualHardwareSection;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.ovf.VirtualSystem;
|
import org.jclouds.vcloud.director.v1_5.domain.ovf.VirtualSystem;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.ovf.environment.EnvironmentType;
|
import org.jclouds.vcloud.director.v1_5.domain.ovf.environment.EnvironmentType;
|
||||||
|
|
||||||
|
import com.beust.jcommander.internal.Maps;
|
||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
import com.google.common.net.InetAddresses;
|
import com.google.common.net.InetAddresses;
|
||||||
|
@ -542,18 +545,42 @@ public class Checks {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkMetadataValueFor(String client, MetadataValue metadataValue) {
|
public static void checkMetadataValueFor(String client, MetadataValue metadataValue) {
|
||||||
|
checkMetadataValueFor(client, metadataValue, "value");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void checkMetadataValueFor(String client, MetadataValue metadataValue, String expectedValue) {
|
||||||
// Check required fields
|
// Check required fields
|
||||||
String value = metadataValue.getValue();
|
String value = metadataValue.getValue();
|
||||||
assertNotNull(value,
|
assertNotNull(value,
|
||||||
String.format(OBJ_FIELD_ATTRB_REQ, client, "MetadataEntry",
|
String.format(OBJ_FIELD_ATTRB_REQ, client, "MetadataEntry",
|
||||||
metadataValue.toString(), "value"));
|
metadataValue.toString(), "value"));
|
||||||
assertEquals(value, "value",
|
assertEquals(value, expectedValue,
|
||||||
String.format(OBJ_FIELD_EQ, client, "metadataEntry.value", "value", value));
|
String.format(OBJ_FIELD_EQ, client, "metadataEntry.value", expectedValue, value));
|
||||||
|
|
||||||
// Check parent type
|
// Check parent type
|
||||||
checkResourceType(metadataValue);
|
checkResourceType(metadataValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void checkMetadataKeyAbsentFor(String client, Metadata metadata, String key) {
|
||||||
|
Map<String,String> metadataMap = metadataToMap(metadata);
|
||||||
|
assertFalse(metadataMap.containsKey(key),
|
||||||
|
String.format(OBJ_DEL, client+" metadata key", key));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void checkMetadataFor(String client, Metadata metadata, Map<String, String> expectedMap) {
|
||||||
|
Map<String,String> actualMap = Checks.metadataToMap(metadata);
|
||||||
|
assertEquals(actualMap, expectedMap,
|
||||||
|
String.format(OBJ_FIELD_EQ, client, "metadata entries", expectedMap, actualMap));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<String,String> metadataToMap(Metadata metadata) {
|
||||||
|
Map<String,String> result = Maps.newLinkedHashMap();
|
||||||
|
for (MetadataEntry entry : metadata.getMetadataEntries()) {
|
||||||
|
result.put(entry.getKey(), entry.getValue());
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
public static void checkVApp(VApp vApp) {
|
public static void checkVApp(VApp vApp) {
|
||||||
// Check optional fields
|
// Check optional fields
|
||||||
Owner owner = vApp.getOwner();
|
Owner owner = vApp.getOwner();
|
||||||
|
|
|
@ -42,6 +42,9 @@ import static org.testng.Assert.assertTrue;
|
||||||
import static org.testng.Assert.fail;
|
import static org.testng.Assert.fail;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -49,6 +52,7 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
|
||||||
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
|
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.AccessSetting;
|
import org.jclouds.vcloud.director.v1_5.domain.AccessSetting;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.AccessSettings;
|
import org.jclouds.vcloud.director.v1_5.domain.AccessSettings;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.Checks;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.ControlAccessParams;
|
import org.jclouds.vcloud.director.v1_5.domain.ControlAccessParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.DeployVAppParams;
|
import org.jclouds.vcloud.director.v1_5.domain.DeployVAppParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.GuestCustomizationSection;
|
import org.jclouds.vcloud.director.v1_5.domain.GuestCustomizationSection;
|
||||||
|
@ -56,6 +60,9 @@ import org.jclouds.vcloud.director.v1_5.domain.InstantiateVAppTemplateParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.InstantiationParams;
|
import org.jclouds.vcloud.director.v1_5.domain.InstantiationParams;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.LeaseSettingsSection;
|
import org.jclouds.vcloud.director.v1_5.domain.LeaseSettingsSection;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.MediaInsertOrEjectParams;
|
import org.jclouds.vcloud.director.v1_5.domain.MediaInsertOrEjectParams;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.NetworkConfigSection;
|
import org.jclouds.vcloud.director.v1_5.domain.NetworkConfigSection;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.NetworkConfiguration;
|
import org.jclouds.vcloud.director.v1_5.domain.NetworkConfiguration;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.NetworkConnectionSection;
|
import org.jclouds.vcloud.director.v1_5.domain.NetworkConnectionSection;
|
||||||
|
@ -91,8 +98,10 @@ import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.base.Strings;
|
import com.google.common.base.Strings;
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of {@code VAppClient}
|
* Tests behavior of {@code VAppClient}
|
||||||
|
@ -115,7 +124,7 @@ public class VAppClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
protected VAppClient vAppClient;
|
protected VAppClient vAppClient;
|
||||||
protected VAppTemplateClient vAppTemplateClient;
|
protected VAppTemplateClient vAppTemplateClient;
|
||||||
protected VdcClient vdcClient;
|
protected VdcClient vdcClient;
|
||||||
protected MetadataClient metadataClient;
|
protected MetadataClient.Writeable metadataClient;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Objects shared between tests.
|
* Objects shared between tests.
|
||||||
|
@ -127,6 +136,8 @@ public class VAppClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
private VApp vApp;
|
private VApp vApp;
|
||||||
private VAppTemplate vAppTemplate;
|
private VAppTemplate vAppTemplate;
|
||||||
|
|
||||||
|
private final Random random = new Random();
|
||||||
|
|
||||||
@BeforeClass(inheritGroups = true)
|
@BeforeClass(inheritGroups = true)
|
||||||
@Override
|
@Override
|
||||||
public void setupRequiredClients() {
|
public void setupRequiredClients() {
|
||||||
|
@ -771,6 +782,68 @@ public class VAppClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
// assertEquals(modified.getInfo(), "New Info");
|
// assertEquals(modified.getInfo(), "New Info");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(testName = "GET /vApp/{id}/metadata", dependsOnMethods = { "testGetVApp" })
|
||||||
|
public void testGetMetadata() {
|
||||||
|
Metadata metadata = metadataClient.getMetadata(vApp.getHref());
|
||||||
|
|
||||||
|
Checks.checkMetadataFor(VAPP, metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(testName = "PUT & GET /vApp/{id}/metadata", dependsOnMethods = { "testGetMetadata" })
|
||||||
|
public void testSetAndGetMetadataValue() {
|
||||||
|
// Store a value
|
||||||
|
String key = ""+random.nextInt();
|
||||||
|
String value = ""+random.nextInt();
|
||||||
|
MetadataValue metadataValue = MetadataValue.builder().value(value).build();
|
||||||
|
metadataClient.setMetadata(vApp.getHref(), key, metadataValue);
|
||||||
|
|
||||||
|
// Retrieve the value, and assert it was set correctly
|
||||||
|
MetadataValue newMetadataValue = metadataClient.getMetadataValue(vApp.getHref(), key);
|
||||||
|
Checks.checkMetadataValueFor(VAPP, newMetadataValue, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(testName = "DELETE /vApp/{id}/metadata/{key}", dependsOnMethods = { "testSetAndGetMetadataValue" })
|
||||||
|
public void testDeleteMetadataEntry() {
|
||||||
|
// Store a value, to be deleted
|
||||||
|
String key = ""+random.nextInt();
|
||||||
|
MetadataValue metadataValue = MetadataValue.builder().value("myval").build();
|
||||||
|
metadataClient.setMetadata(vApp.getHref(), key, metadataValue);
|
||||||
|
|
||||||
|
// Delete the entry
|
||||||
|
Task task = metadataClient.deleteMetadataEntry(vApp.getHref(), key);
|
||||||
|
retryTaskSuccess.apply(task);
|
||||||
|
|
||||||
|
// Confirm the entry has been deleted
|
||||||
|
Metadata newMetadata = metadataClient.getMetadata(vApp.getHref());
|
||||||
|
Checks.checkMetadataKeyAbsentFor(VAPP, newMetadata, key);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(testName = "POST /vApp/{id}/metadata", dependsOnMethods = { "testGetMetadata" })
|
||||||
|
public void testMergeMetadata() {
|
||||||
|
Metadata oldMetadata = metadataClient.getMetadata(vApp.getHref());
|
||||||
|
Map<String,String> oldMetadataMap = Checks.metadataToMap(oldMetadata);
|
||||||
|
|
||||||
|
// Store a value, to be deleted
|
||||||
|
String key = ""+random.nextInt();
|
||||||
|
String value = ""+random.nextInt();
|
||||||
|
Metadata addedMetadata = Metadata.builder()
|
||||||
|
.entry(MetadataEntry.builder()
|
||||||
|
.key(key)
|
||||||
|
.value(value)
|
||||||
|
.build())
|
||||||
|
.build();
|
||||||
|
Task task = metadataClient.mergeMetadata(vApp.getHref(), addedMetadata);
|
||||||
|
retryTaskSuccess.apply(task);
|
||||||
|
|
||||||
|
// Confirm the entry contains everything that was there, and everything that was being added
|
||||||
|
Metadata newMetadata = metadataClient.getMetadata(vApp.getHref());
|
||||||
|
Map<String,String> expectedMetadataMap = ImmutableMap.<String,String>builder()
|
||||||
|
.putAll(oldMetadataMap)
|
||||||
|
.put(key, value)
|
||||||
|
.build();
|
||||||
|
Checks.checkMetadataFor(VAPP, newMetadata, expectedMetadataMap);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see VAppClient#deleteVApp(URI)
|
* @see VAppClient#deleteVApp(URI)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -53,8 +53,8 @@ import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorClientLiveTes
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.beust.jcommander.internal.Maps;
|
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
@ -200,6 +200,7 @@ public class VAppTemplateClientLiveTest extends BaseVCloudDirectorClientLiveTest
|
||||||
// FIXME Cleanup after ourselves..
|
// FIXME Cleanup after ourselves..
|
||||||
|
|
||||||
Metadata oldMetadata = vappTemplateClient.getVAppTemplateMetadata(vAppTemplateURI);
|
Metadata oldMetadata = vappTemplateClient.getVAppTemplateMetadata(vAppTemplateURI);
|
||||||
|
Map<String,String> oldMetadataMap = Checks.metadataToMap(oldMetadata);
|
||||||
|
|
||||||
String uid = ""+random.nextInt();
|
String uid = ""+random.nextInt();
|
||||||
String key = "mykey-"+uid;
|
String key = "mykey-"+uid;
|
||||||
|
@ -211,16 +212,11 @@ public class VAppTemplateClientLiveTest extends BaseVCloudDirectorClientLiveTest
|
||||||
retryTaskSuccess.apply(task);
|
retryTaskSuccess.apply(task);
|
||||||
|
|
||||||
Metadata newMetadata = vappTemplateClient.getVAppTemplateMetadata(vAppTemplateURI);
|
Metadata newMetadata = vappTemplateClient.getVAppTemplateMetadata(vAppTemplateURI);
|
||||||
Map<String,String> newMetadataMap = metadataToMap(newMetadata);
|
Map<String,String> expectedMetadataMap = ImmutableMap.<String,String>builder()
|
||||||
assertEquals(newMetadataMap.get(key), val, "newMetadata="+newMetadata);
|
.putAll(oldMetadataMap)
|
||||||
}
|
.put(key, val)
|
||||||
|
.build();
|
||||||
private Map<String,String> metadataToMap(Metadata metadata) {
|
Checks.checkMetadataFor("vAppTemplate", newMetadata, expectedMetadataMap);
|
||||||
Map<String,String> result = Maps.newLinkedHashMap();
|
|
||||||
for (MetadataEntry entry : metadata.getMetadataEntries()) {
|
|
||||||
result.put(entry.getKey(), entry.getValue());
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -247,12 +243,13 @@ public class VAppTemplateClientLiveTest extends BaseVCloudDirectorClientLiveTest
|
||||||
final Task task = vappTemplateClient.editVAppTemplateMetadataValue(vAppTemplateURI, key, metadataValue);
|
final Task task = vappTemplateClient.editVAppTemplateMetadataValue(vAppTemplateURI, key, metadataValue);
|
||||||
retryTaskSuccess.apply(task);
|
retryTaskSuccess.apply(task);
|
||||||
|
|
||||||
|
// Then delete the entry
|
||||||
final Task deletionTask = vappTemplateClient.deleteVAppTemplateMetadataValue(vAppTemplateURI, key);
|
final Task deletionTask = vappTemplateClient.deleteVAppTemplateMetadataValue(vAppTemplateURI, key);
|
||||||
retryTaskSuccess.apply(deletionTask);
|
retryTaskSuccess.apply(deletionTask);
|
||||||
|
|
||||||
|
// Then confirm the entry is not there
|
||||||
Metadata newMetadata = vappTemplateClient.getVAppTemplateMetadata(vAppTemplateURI);
|
Metadata newMetadata = vappTemplateClient.getVAppTemplateMetadata(vAppTemplateURI);
|
||||||
Map<String,String> newMetadataMap = metadataToMap(newMetadata);
|
Checks.checkMetadataKeyAbsentFor("vAppTemplate", newMetadata, key);
|
||||||
assertFalse(newMetadataMap.containsKey(key), "newMetadata="+newMetadata);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test // FIXME Failing because template does not have a guest customization section to be got
|
@Test // FIXME Failing because template does not have a guest customization section to be got
|
||||||
|
|
Loading…
Reference in New Issue