mirror of https://github.com/apache/jclouds.git
Updates and fixes for existing clients, domain objects and tests, including:
- Changed MetadataEntry to MetadataValue where required - Added more standardised assertion/error check messages - Completed CatalogClientLiveTest
This commit is contained in:
parent
973ef7e167
commit
d8390da9b4
|
@ -46,8 +46,8 @@ public class Link extends ReferenceType<Link> {
|
||||||
public static final String UP = "up";
|
public static final String UP = "up";
|
||||||
public static final String DOWN = "down";
|
public static final String DOWN = "down";
|
||||||
public static final String EDIT = "edit";
|
public static final String EDIT = "edit";
|
||||||
public static final String DELETE = "delete";
|
|
||||||
public static final String ADD = "add";
|
public static final String ADD = "add";
|
||||||
|
public static final String DELETE = "delete";
|
||||||
public static final String REMOVE = "remove";
|
public static final String REMOVE = "remove";
|
||||||
public static final String CATALOG_ITEM = "catalogItem";
|
public static final String CATALOG_ITEM = "catalogItem";
|
||||||
public static final String TASK_CANCEL = "task:cancel";
|
public static final String TASK_CANCEL = "task:cancel";
|
||||||
|
@ -58,7 +58,7 @@ public class Link extends ReferenceType<Link> {
|
||||||
public static final String FIRST_PAGE = "firstPage";
|
public static final String FIRST_PAGE = "firstPage";
|
||||||
|
|
||||||
public static final List<String> ALL = Arrays.asList(
|
public static final List<String> ALL = Arrays.asList(
|
||||||
UP, DOWN, EDIT, DELETE, ADD, REMOVE, CATALOG_ITEM, TASK_CANCEL,
|
UP, DOWN, EDIT, ADD, DELETE, REMOVE, CATALOG_ITEM, TASK_CANCEL,
|
||||||
ALTERNATE, NEXT_PAGE, PREVIOUS_PAGE, LAST_PAGE, FIRST_PAGE
|
ALTERNATE, NEXT_PAGE, PREVIOUS_PAGE, LAST_PAGE, FIRST_PAGE
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,7 +188,7 @@ public class QueryResultReferences<T extends ReferenceType<T>> extends Container
|
||||||
@XmlElementRefs({
|
@XmlElementRefs({
|
||||||
@XmlElementRef(type = CatalogReference.class)
|
@XmlElementRef(type = CatalogReference.class)
|
||||||
})
|
})
|
||||||
protected List<T> references;
|
protected List<T> references = Lists.newArrayList();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set of references representing query results.
|
* Set of references representing query results.
|
||||||
|
|
|
@ -37,7 +37,6 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
|
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
|
import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
|
||||||
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.MetadataEntry;
|
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
||||||
|
@ -93,7 +92,7 @@ public interface CatalogAsyncClient {
|
||||||
@Consumes
|
@Consumes
|
||||||
@JAXBResponseParser
|
@JAXBResponseParser
|
||||||
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
||||||
ListenableFuture<MetadataEntry> getCatalogMetadataEntry(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogRef,
|
ListenableFuture<MetadataValue> getCatalogMetadataValue(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogRef,
|
||||||
@PathParam("key") String key);
|
@PathParam("key") String key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -155,7 +154,7 @@ public interface CatalogAsyncClient {
|
||||||
@Consumes
|
@Consumes
|
||||||
@JAXBResponseParser
|
@JAXBResponseParser
|
||||||
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
||||||
ListenableFuture<MetadataEntry> getCatalogItemMetadataEntry(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogItemRef,
|
ListenableFuture<MetadataValue> getCatalogItemMetadataValue(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogItemRef,
|
||||||
@PathParam("key") String key);
|
@PathParam("key") String key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -167,7 +166,7 @@ public interface CatalogAsyncClient {
|
||||||
@Produces(VCloudDirectorMediaType.METADATA_VALUE)
|
@Produces(VCloudDirectorMediaType.METADATA_VALUE)
|
||||||
@JAXBResponseParser
|
@JAXBResponseParser
|
||||||
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
||||||
ListenableFuture<Task> setCatalogItemMetadataEntry(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogItemRef,
|
ListenableFuture<Task> setCatalogItemMetadataValue(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogItemRef,
|
||||||
@PathParam("key") String key, @BinderParam(BindToXMLPayload.class) MetadataValue metadataValue);
|
@PathParam("key") String key, @BinderParam(BindToXMLPayload.class) MetadataValue metadataValue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -178,6 +177,6 @@ public interface CatalogAsyncClient {
|
||||||
@Consumes
|
@Consumes
|
||||||
@JAXBResponseParser
|
@JAXBResponseParser
|
||||||
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
||||||
ListenableFuture<Task> deleteCatalogItemMetadataEntry(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogItemRef,
|
ListenableFuture<Task> deleteCatalogItemMetadataValue(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> catalogItemRef,
|
||||||
@PathParam("key") String key);
|
@PathParam("key") String key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ import org.jclouds.concurrent.Timeout;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
|
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
|
import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
|
||||||
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.MetadataEntry;
|
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
import org.jclouds.vcloud.director.v1_5.domain.Task;
|
||||||
|
@ -84,9 +83,9 @@ public interface CatalogClient {
|
||||||
*
|
*
|
||||||
* @param catalogRef the reference for the catalog
|
* @param catalogRef the reference for the catalog
|
||||||
* @param key the metadata entry key
|
* @param key the metadata entry key
|
||||||
* @return the catalog metadata entry
|
* @return the catalog metadata value
|
||||||
*/
|
*/
|
||||||
MetadataEntry getCatalogMetadataEntry(ReferenceType<?> catalogRef, String key);
|
MetadataValue getCatalogMetadataValue(ReferenceType<?> catalogRef, String key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves a catalog item.
|
* Retrieves a catalog item.
|
||||||
|
@ -158,9 +157,9 @@ public interface CatalogClient {
|
||||||
*
|
*
|
||||||
* @param catalogItemRef the reference for the catalog item
|
* @param catalogItemRef the reference for the catalog item
|
||||||
* @param key the metadata entry key
|
* @param key the metadata entry key
|
||||||
* @return the catalog item metadata entry
|
* @return the catalog item metadata value
|
||||||
*/
|
*/
|
||||||
MetadataEntry getCatalogItemMetadataEntry(ReferenceType<?> catalogItemRef, String key);
|
MetadataValue getCatalogItemMetadataValue(ReferenceType<?> catalogItemRef, String key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the metadata for the particular key for the catalog item to the value provided.
|
* Sets the metadata for the particular key for the catalog item to the value provided.
|
||||||
|
@ -174,7 +173,7 @@ public interface CatalogClient {
|
||||||
* @param value the metadata value
|
* @param value the metadata value
|
||||||
* @return a task for the set operation
|
* @return a task for the set operation
|
||||||
*/
|
*/
|
||||||
Task setCatalogItemMetadataEntry(ReferenceType<?> catalogItemRef, String key, MetadataValue value);
|
Task setCatalogItemMetadataValue(ReferenceType<?> catalogItemRef, String key, MetadataValue value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes the metadata for the particular key for the catalog item.
|
* Deletes the metadata for the particular key for the catalog item.
|
||||||
|
@ -187,5 +186,5 @@ public interface CatalogClient {
|
||||||
* @param key the metadata entry key
|
* @param key the metadata entry key
|
||||||
* @return a task for the delete operation
|
* @return a task for the delete operation
|
||||||
*/
|
*/
|
||||||
Task deleteCatalogItemMetadataEntry(ReferenceType<?> catalogItemRef, String key);
|
Task deleteCatalogItemMetadataValue(ReferenceType<?> catalogItemRef, String key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
import org.jclouds.rest.annotations.JAXBResponseParser;
|
import org.jclouds.rest.annotations.JAXBResponseParser;
|
||||||
import org.jclouds.rest.annotations.RequestFilters;
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
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.MetadataEntry;
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
||||||
|
@ -81,6 +81,6 @@ public interface OrgAsyncClient {
|
||||||
@Consumes
|
@Consumes
|
||||||
@JAXBResponseParser
|
@JAXBResponseParser
|
||||||
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
@ExceptionParser(ThrowVCloudErrorOn4xx.class)
|
||||||
ListenableFuture<MetadataEntry> getOrgMetadataEntry(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> orgRef,
|
ListenableFuture<MetadataValue> getOrgMetadataValue(@EndpointParam(parser = ReferenceToEndpoint.class) ReferenceType<?> orgRef,
|
||||||
@PathParam("key") String key);
|
@PathParam("key") String key);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.jclouds.concurrent.Timeout;
|
import org.jclouds.concurrent.Timeout;
|
||||||
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.MetadataEntry;
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
import org.jclouds.vcloud.director.v1_5.domain.ReferenceType;
|
||||||
|
@ -58,7 +58,6 @@ public interface OrgClient {
|
||||||
* @return the org or null if not found
|
* @return the org or null if not found
|
||||||
*/
|
*/
|
||||||
Org getOrg(ReferenceType<?> orgRef);
|
Org getOrg(ReferenceType<?> orgRef);
|
||||||
// FIXME throws exception on not found currently
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves an list of the organization's metadata
|
* Retrieves an list of the organization's metadata
|
||||||
|
@ -80,6 +79,5 @@ public interface OrgClient {
|
||||||
*
|
*
|
||||||
* @return the metadata entry or null if not found
|
* @return the metadata entry or null if not found
|
||||||
*/
|
*/
|
||||||
MetadataEntry getOrgMetadataEntry(ReferenceType<?> orgRef, String key);
|
MetadataValue getOrgMetadataValue(ReferenceType<?> orgRef, String key);
|
||||||
// FIXME throws exception on not found currently
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,22 @@ public class VCloudDirectorLiveTestConstants {
|
||||||
public static final String TASK_COMPLETE_TIMELY = "Task %s should complete in a timely fashion";
|
public static final String TASK_COMPLETE_TIMELY = "Task %s should complete in a timely fashion";
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static final String FIELD_NOT_NULL_FMT = "The %s field of the %s must not be null";
|
public static final String NOT_NULL_OBJECT_FMT = "The %s field of the %s must not be null";
|
||||||
|
|
||||||
|
public static final String NOT_EMPTY_OBJECT_FMT = "One or more %s fields of the %s must be present";
|
||||||
|
|
||||||
|
public static final String REQUIRED_VALUE_OBJECT_FMT = "The %s field of the %s must not be '%s'";
|
||||||
|
|
||||||
|
public static final String REQUIRED_VALUE_FMT = "The %s field must not be '%s'";
|
||||||
|
|
||||||
|
public static final String MUST_BE_WELL_FORMED_FMT = "The %s field must be well formed: '%s'";
|
||||||
|
|
||||||
|
public static final String MUST_EXIST_FMT = "The '%s' %s must exist";
|
||||||
|
|
||||||
|
public static final String MUST_CONTAIN_FMT = "The %s field must contain '%s': '%s'";
|
||||||
|
|
||||||
|
public static final String CONDITION_FMT = "The %s field must be %s: '%s'";
|
||||||
|
|
||||||
|
public static final String CORRECT_VALUE_OBJECT_FMT = "The %s field of the %s must be '%s': '%s'";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.vcloud.director.v1_5.domain;
|
package org.jclouds.vcloud.director.v1_5.domain;
|
||||||
|
|
||||||
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.*;
|
||||||
|
import static org.jclouds.vcloud.director.v1_5.domain.Checks.*;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertNotNull;
|
import static org.testng.Assert.assertNotNull;
|
||||||
import static org.testng.Assert.assertTrue;
|
import static org.testng.Assert.assertTrue;
|
||||||
|
@ -51,7 +53,7 @@ public class Checks {
|
||||||
|
|
||||||
public static void checkEntityType(EntityType<?> entity) {
|
public static void checkEntityType(EntityType<?> entity) {
|
||||||
// Check required fields
|
// Check required fields
|
||||||
assertNotNull(entity.getName(), "The Name attribute of an EntityType must be set");
|
assertNotNull(entity.getName(), String.format(NOT_NULL_OBJECT_FMT, "Name", "EntityType"));
|
||||||
|
|
||||||
// Check optional fields
|
// Check optional fields
|
||||||
// NOTE description cannot be checked
|
// NOTE description cannot be checked
|
||||||
|
@ -66,7 +68,7 @@ public class Checks {
|
||||||
|
|
||||||
public static void checkReferenceType(ReferenceType<?> reference) {
|
public static void checkReferenceType(ReferenceType<?> reference) {
|
||||||
// Check required fields
|
// Check required fields
|
||||||
assertNotNull(reference.getHref(), "The Href attribute of a ReferenceType must be set");
|
assertNotNull(reference.getHref(), String.format(NOT_NULL_OBJECT_FMT, "Href", "ReferenceType"));
|
||||||
|
|
||||||
// Check optional fields
|
// Check optional fields
|
||||||
String id = reference.getId();
|
String id = reference.getId();
|
||||||
|
@ -90,21 +92,18 @@ public class Checks {
|
||||||
|
|
||||||
public static void checkId(String id) {
|
public static void checkId(String id) {
|
||||||
Iterable<String> parts = Splitter.on(':').split(id);
|
Iterable<String> parts = Splitter.on(':').split(id);
|
||||||
assertEquals(Iterables.size(parts), 4, "The Id must be well formed");
|
assertEquals(Iterables.size(parts), 4, String.format(MUST_BE_WELL_FORMED_FMT, "Id", id));
|
||||||
assertEquals(Iterables.get(parts, 0), "urn", "The Id must start with 'urn'");
|
assertEquals(Iterables.get(parts, 0), "urn", String.format(MUST_CONTAIN_FMT, "Id", "urn", id));
|
||||||
assertEquals(Iterables.get(parts, 1), "vcloud", "The Id must include 'vcloud'");
|
assertEquals(Iterables.get(parts, 1), "vcloud", String.format(MUST_CONTAIN_FMT, "Id", "vcloud", id));
|
||||||
try {
|
try {
|
||||||
UUID uuid = UUID.fromString(Iterables.get(parts, 3));
|
UUID.fromString(Iterables.get(parts, 3));
|
||||||
assertNotNull(uuid, "The UUID part of an Id must be well formed");
|
|
||||||
} catch (IllegalArgumentException iae) {
|
} catch (IllegalArgumentException iae) {
|
||||||
fail("The UUID part of an Id must be well formed");
|
fail(String.format(MUST_BE_WELL_FORMED_FMT, "Id", id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkType(String type) {
|
public static void checkType(String type) {
|
||||||
assertTrue(VCloudDirectorMediaType.ALL.contains(type),
|
assertTrue(VCloudDirectorMediaType.ALL.contains(type), String.format(REQUIRED_VALUE_FMT, "Type", type, Iterables.toString(VCloudDirectorMediaType.ALL)));
|
||||||
String.format("The Type (%s) must be a valid media type - %s", type,
|
|
||||||
Iterables.toString(VCloudDirectorMediaType.ALL)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE this does not currently check anything
|
// NOTE this does not currently check anything
|
||||||
|
@ -120,10 +119,8 @@ public class Checks {
|
||||||
|
|
||||||
public static void checkLink(Link link) {
|
public static void checkLink(Link link) {
|
||||||
// Check required fields
|
// Check required fields
|
||||||
assertNotNull(link.getRel(), "The Rel attribute of a Link must be set");
|
assertNotNull(link.getRel(), String.format(NOT_NULL_OBJECT_FMT, "Rel", "Link"));
|
||||||
// XXX choose one
|
assertTrue(Link.Rel.ALL.contains(link.getRel()), String.format(REQUIRED_VALUE_OBJECT_FMT, "Rel", "Link", link.getRel(), Iterables.toString(Link.Rel.ALL)));
|
||||||
assertTrue(Link.Rel.ALL.contains(link.getRel()), String.format("The Rel attribute of a Link must be from the allowed list: %s", Iterables.toString(Link.Rel.ALL)));
|
|
||||||
assertTrue(Link.Rel.ALL.contains(link.getRel()), String.format("The Rel attribute of a Link cannot be '%s'", link.getRel()));
|
|
||||||
|
|
||||||
// Check parent type
|
// Check parent type
|
||||||
checkReferenceType(link);
|
checkReferenceType(link);
|
||||||
|
@ -131,10 +128,8 @@ public class Checks {
|
||||||
|
|
||||||
public static void checkTask(Task task) {
|
public static void checkTask(Task task) {
|
||||||
// Check required fields
|
// Check required fields
|
||||||
assertNotNull(task.getStatus(), "The Status attribute of a Task must be set");
|
assertNotNull(task.getStatus(), String.format(NOT_NULL_OBJECT_FMT, "Status", "Task"));
|
||||||
// XXX choose one
|
assertTrue(Task.Status.ALL.contains(task.getStatus()), String.format(REQUIRED_VALUE_OBJECT_FMT, "Status", "Task", task.getStatus(), Iterables.toString(Link.Rel.ALL)));
|
||||||
assertTrue(Task.Status.ALL.contains(task.getStatus()), String.format("The Status of a Task must be from the allowed list: %s", Iterables.toString(Task.Status.ALL)));
|
|
||||||
assertTrue(Task.Status.ALL.contains(task.getStatus()), String.format("The Status of a Task cannot be '%s'", task.getStatus()));
|
|
||||||
|
|
||||||
// Check optional fields
|
// Check optional fields
|
||||||
// NOTE operation cannot be checked
|
// NOTE operation cannot be checked
|
||||||
|
@ -177,7 +172,9 @@ public class Checks {
|
||||||
public static void checkMetadata(Metadata metadata) {
|
public static void checkMetadata(Metadata metadata) {
|
||||||
Set<MetadataEntry> metadataEntries = metadata.getMetadataEntries();
|
Set<MetadataEntry> metadataEntries = metadata.getMetadataEntries();
|
||||||
if (metadataEntries != null && !metadataEntries.isEmpty()) {
|
if (metadataEntries != null && !metadataEntries.isEmpty()) {
|
||||||
for (MetadataEntry metadataEntry : metadataEntries) checkMetadataEntry(metadataEntry);
|
for (MetadataEntry metadataEntry : metadataEntries) {
|
||||||
|
checkMetadataEntry(metadataEntry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check parent type
|
// Check parent type
|
||||||
|
@ -185,27 +182,43 @@ public class Checks {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkMetadataEntry(MetadataEntry metadataEntry) {+ // Check required fields
|
public static void checkMetadataEntry(MetadataEntry metadataEntry) {+ // Check required fields
|
||||||
assertNotNull(metadataEntry.getKey(), "The Key attribute of a MetadataEntry must be set");
|
assertNotNull(metadataEntry.getKey(), String.format(NOT_NULL_OBJECT_FMT, "Key", "MetadataEntry"));
|
||||||
assertNotNull(metadataEntry.getValue(), "The Value attribute of a MetadataEntry must be set");
|
assertNotNull(metadataEntry.getValue(), String.format(NOT_NULL_OBJECT_FMT, "Value", "MetadataEntry"));
|
||||||
|
|
||||||
// Check parent type
|
// Check parent type
|
||||||
checkResourceType(metadataEntry);
|
checkResourceType(metadataEntry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void checkMetadataValue(MetadataValue metadataValue) {
|
||||||
|
// Check required elements and attributes
|
||||||
|
assertNotNull(metadataValue.getValue(), String.format(NOT_NULL_OBJECT_FMT, "Value", "MetadataValue"));
|
||||||
|
|
||||||
|
// Check parent type
|
||||||
|
checkResourceType(metadataValue);
|
||||||
|
}
|
||||||
|
|
||||||
public static void checkProgress(Integer progress) {
|
public static void checkProgress(Integer progress) {
|
||||||
assertTrue(progress >= 0 && progress <= 100, "The Progress attribute must be between 0 and 100");
|
assertTrue(progress >= 0 && progress <= 100, String.format(CONDITION_FMT, "Progress", "between 0 and 100", Integer.toString(progress)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkError(Error error) {
|
public static void checkError(Error error) {
|
||||||
// Check required fields
|
// Check required fields
|
||||||
assertNotNull(error.getMessage(), "The Message attribute of an Error must be set");
|
assertNotNull(error.getMessage(), String.format(NOT_NULL_OBJECT_FMT, "Message", "Error"));
|
||||||
assertNotNull(error.getMajorErrorCode(), "The MajorErrorCode attribute of an Error must be set");
|
assertNotNull(error.getMajorErrorCode(), String.format(NOT_NULL_OBJECT_FMT, "MajorErrorCode", "Error"));
|
||||||
assertNotNull(error.getMinorErrorCode(), "The MinorErrorCode attribute of an Error must be set");
|
assertNotNull(error.getMinorErrorCode(), String.format(NOT_NULL_OBJECT_FMT, "MinorErrorCode", "Error"));
|
||||||
|
|
||||||
// NOTE vendorSpecificErrorCode cannot be checked
|
// NOTE vendorSpecificErrorCode cannot be checked
|
||||||
// NOTE stackTrace cannot be checked
|
// NOTE stackTrace cannot be checked
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void checkOrg(Org org) {
|
||||||
|
// Check required elements and attributes
|
||||||
|
assertNotNull(org.getFullName(), String.format(NOT_NULL_OBJECT_FMT, "FullName", "Org"));
|
||||||
|
|
||||||
|
// Check parent type
|
||||||
|
checkEntityType(org);
|
||||||
|
}
|
||||||
|
|
||||||
public static void checkCatalog(Catalog catalog) {
|
public static void checkCatalog(Catalog catalog) {
|
||||||
// Check optional elements/attributes
|
// Check optional elements/attributes
|
||||||
Entity owner = catalog.getOwner();
|
Entity owner = catalog.getOwner();
|
||||||
|
|
|
@ -165,7 +165,7 @@ public class CatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectT
|
||||||
|
|
||||||
HttpResponse catalogResponse = HttpResponse.builder()
|
HttpResponse catalogResponse = HttpResponse.builder()
|
||||||
.statusCode(200)
|
.statusCode(200)
|
||||||
.payload(payloadFromResourceWithContentType("/catalog/catalogMetadataEntry.xml", VCloudDirectorMediaType.METADATA_ENTRY))
|
.payload(payloadFromResourceWithContentType("/catalog/catalogMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, catalogRequest, catalogResponse);
|
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, catalogRequest, catalogResponse);
|
||||||
|
@ -176,9 +176,9 @@ public class CatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectT
|
||||||
.href(URI.create(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
|
.href(URI.create(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
MetadataEntry expected = metadataEntry();
|
MetadataValue expected = metadataValue();
|
||||||
|
|
||||||
assertEquals(client.getCatalogClient().getCatalogMetadataEntry(catalogRef, "KEY"), expected);
|
assertEquals(client.getCatalogClient().getCatalogMetadataValue(catalogRef, "KEY"), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -349,7 +349,7 @@ public class CatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectT
|
||||||
|
|
||||||
HttpResponse catalogItemResponse = HttpResponse.builder()
|
HttpResponse catalogItemResponse = HttpResponse.builder()
|
||||||
.statusCode(200)
|
.statusCode(200)
|
||||||
.payload(payloadFromResourceWithContentType("/catalog/catalogItemMetadataEntry.xml", VCloudDirectorMediaType.METADATA_ENTRY + ";version=1.5"))
|
.payload(payloadFromResourceWithContentType("/catalog/catalogItemMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE + ";version=1.5"))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
|
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
|
||||||
|
@ -360,9 +360,9 @@ public class CatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectT
|
||||||
.href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
MetadataEntry expected = itemMetadataEntry();
|
MetadataValue expected = itemMetadataValue();
|
||||||
|
|
||||||
assertEquals(client.getCatalogClient().getCatalogItemMetadataEntry(catalogItemReference, "KEY"), expected);
|
assertEquals(client.getCatalogClient().getCatalogItemMetadataValue(catalogItemReference, "KEY"), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -394,7 +394,7 @@ public class CatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectT
|
||||||
|
|
||||||
Task expected = setMetadataValueTask();
|
Task expected = setMetadataValueTask();
|
||||||
|
|
||||||
assertEquals(client.getCatalogClient().setCatalogItemMetadataEntry(catalogItemReference, "KEY", value), expected);
|
assertEquals(client.getCatalogClient().setCatalogItemMetadataValue(catalogItemReference, "KEY", value), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -423,7 +423,7 @@ public class CatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectT
|
||||||
|
|
||||||
Task expected = deleteMetadataEntryTask();
|
Task expected = deleteMetadataEntryTask();
|
||||||
|
|
||||||
assertEquals(client.getCatalogClient().deleteCatalogItemMetadataEntry(catalogItemReference, "KEY"), expected);
|
assertEquals(client.getCatalogClient().deleteCatalogItemMetadataValue(catalogItemReference, "KEY"), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Catalog catalog() {
|
public static final Catalog catalog() {
|
||||||
|
@ -524,6 +524,30 @@ public class CatalogClientExpectTest extends BaseVCloudDirectorRestClientExpectT
|
||||||
.entry("KEY", "VALUE")
|
.entry("KEY", "VALUE")
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static MetadataValue metadataValue() {
|
||||||
|
return MetadataValue.builder()
|
||||||
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata/KEY"))
|
||||||
|
.link(Link.builder()
|
||||||
|
.rel("up")
|
||||||
|
.type("application/vnd.vmware.vcloud.metadata+xml")
|
||||||
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata"))
|
||||||
|
.build())
|
||||||
|
.value("VALUE")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MetadataValue itemMetadataValue() {
|
||||||
|
return MetadataValue.builder()
|
||||||
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY"))
|
||||||
|
.link(Link.builder()
|
||||||
|
.rel("up")
|
||||||
|
.type("application/vnd.vmware.vcloud.metadata+xml")
|
||||||
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"))
|
||||||
|
.build())
|
||||||
|
.value("VALUE")
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
public static CatalogItem catalogItem() {
|
public static CatalogItem catalogItem() {
|
||||||
return CatalogItem.builder()
|
return CatalogItem.builder()
|
||||||
|
|
|
@ -18,13 +18,14 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.vcloud.director.v1_5.features;
|
package org.jclouds.vcloud.director.v1_5.features;
|
||||||
|
|
||||||
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.*;
|
||||||
import static org.jclouds.vcloud.director.v1_5.domain.Checks.*;
|
import static org.jclouds.vcloud.director.v1_5.domain.Checks.*;
|
||||||
import static org.testng.Assert.*;
|
import static org.testng.Assert.*;
|
||||||
|
|
||||||
import org.jclouds.predicates.RetryablePredicate;
|
|
||||||
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
|
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
|
import org.jclouds.vcloud.director.v1_5.domain.Catalog;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
|
import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.Error;
|
||||||
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.MetadataEntry;
|
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.MetadataValue;
|
||||||
|
@ -37,7 +38,6 @@ import org.testng.annotations.BeforeGroups;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,11 +45,9 @@ import com.google.common.collect.Iterables;
|
||||||
*
|
*
|
||||||
* @author grkvlt@apache.org
|
* @author grkvlt@apache.org
|
||||||
*/
|
*/
|
||||||
@Test(groups = { "live", "apitests" }, testName = "CatalogClientLiveTest")
|
@Test(groups = { "live", "apitests" }, testName = "CatalogClientLiveTest", singleThreaded = true)
|
||||||
public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
|
|
||||||
private static final String CATALOG_NAME = "QunyingTestCatalog"; // TODO add as test configuration property
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Convenience references to API clients.
|
* Convenience references to API clients.
|
||||||
*/
|
*/
|
||||||
|
@ -74,11 +72,12 @@ public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
catalogClient = context.getApi().getCatalogClient();
|
catalogClient = context.getApi().getCatalogClient();
|
||||||
queryClient = context.getApi().getQueryClient();
|
queryClient = context.getApi().getQueryClient();
|
||||||
}
|
}
|
||||||
|
private Metadata catalogItemMetadata;
|
||||||
|
|
||||||
@Test(testName = "GET /catalog/{id}")
|
@Test(testName = "GET /catalog/{id}")
|
||||||
public void testGetCatalog() {
|
public void testGetCatalog() {
|
||||||
CatalogReferences catalogReferences = queryClient.catalogReferencesQuery(String.format("name==%s", CATALOG_NAME));
|
CatalogReferences catalogReferences = queryClient.catalogReferencesQuery(String.format("name==%s", catalogName));
|
||||||
assertEquals(Iterables.size(catalogReferences.getReferences()), 1, String.format("The %s Catalog must exist", CATALOG_NAME));
|
assertEquals(Iterables.size(catalogReferences.getReferences()), 1, String.format(MUST_EXIST_FMT, catalogName, "Catalog"));
|
||||||
catalogRef = Iterables.getOnlyElement(catalogReferences.getReferences());
|
catalogRef = Iterables.getOnlyElement(catalogReferences.getReferences());
|
||||||
catalog = catalogClient.getCatalog(catalogRef);
|
catalog = catalogClient.getCatalog(catalogRef);
|
||||||
}
|
}
|
||||||
|
@ -93,7 +92,7 @@ public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
|
|
||||||
// NOTE for this test to work, we need to be able to upload a new vAppTemplate to a vDC first
|
// NOTE for this test to work, we need to be able to upload a new vAppTemplate to a vDC first
|
||||||
// NOTE we could do this with a test environment property -Dtest.vcloud-director.vappTemplateId=vapptemplate-abcd
|
// NOTE we could do this with a test environment property -Dtest.vcloud-director.vappTemplateId=vapptemplate-abcd
|
||||||
@Test(testName = "POST /catalog/{id}/catalogItems", dependsOnMethods = { "testGetCatalogItem" }, enabled = false)
|
@Test(testName = "POST /catalog/{id}/catalogItems", dependsOnMethods = { "testGetCatalog" }, enabled = false)
|
||||||
public void testAddCatalogItem() {
|
public void testAddCatalogItem() {
|
||||||
CatalogItem editedCatalogItem = CatalogItem.builder()
|
CatalogItem editedCatalogItem = CatalogItem.builder()
|
||||||
.name("newitem")
|
.name("newitem")
|
||||||
|
@ -123,7 +122,7 @@ public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
assertEquals(newCatalogItem.getName(), "UPDATEDNAME");
|
assertEquals(newCatalogItem.getName(), "UPDATEDNAME");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(testName = "DELETE /catalogItem/{id}", dependsOnMethods = { "testUpdateCatalogItem" }, enabled = false)
|
@Test(testName = "DELETE /catalogItem/{id}", dependsOnMethods = { "testAddCatalogItem" }, enabled = false)
|
||||||
public void testDeleteCatalogItem() {
|
public void testDeleteCatalogItem() {
|
||||||
catalogClient.deleteCatalogItem(newCatalogItemRef);
|
catalogClient.deleteCatalogItem(newCatalogItemRef);
|
||||||
try {
|
try {
|
||||||
|
@ -131,6 +130,7 @@ public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
fail("The CatalogItem should have been deleted");
|
fail("The CatalogItem should have been deleted");
|
||||||
} catch (VCloudDirectorException vcde) {
|
} catch (VCloudDirectorException vcde) {
|
||||||
checkError(vcde.getError());
|
checkError(vcde.getError());
|
||||||
|
// XXX
|
||||||
assertEquals(vcde.getError().getMajorErrorCode(), Integer.valueOf(403), "The majorErrorCode should be 403 since the item has been deleted");
|
assertEquals(vcde.getError().getMajorErrorCode(), Integer.valueOf(403), "The majorErrorCode should be 403 since the item has been deleted");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,50 +144,123 @@ public class CatalogClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
|
|
||||||
// NOTE for this test to work, we need to be able to create metadata on a Catalog, specifically { "KEY", "VALUE" }
|
// NOTE for this test to work, we need to be able to create metadata on a Catalog, specifically { "KEY", "VALUE" }
|
||||||
@Test(testName = "GET /catalog/{id}/metadata/{key}", dependsOnMethods = { "testGetCatalogMetadata" }, enabled = false)
|
@Test(testName = "GET /catalog/{id}/metadata/{key}", dependsOnMethods = { "testGetCatalogMetadata" }, enabled = false)
|
||||||
public void testGetCatalogMetadataEntry() {
|
public void testGetCatalogMetadataValue() {
|
||||||
MetadataEntry existingMetadataEntry = Iterables.find(catalogMetadata.getMetadataEntries(), new Predicate<MetadataEntry>() {
|
MetadataEntry existingMetadataEntry = Iterables.find(catalogMetadata.getMetadataEntries(), new Predicate<MetadataEntry>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(MetadataEntry input) {
|
public boolean apply(MetadataEntry input) {
|
||||||
return input.getKey().equals("KEY");
|
return input.getKey().equals("KEY");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
MetadataEntry metadataEntry = catalogClient.getCatalogMetadataEntry(catalogRef, "KEY");
|
MetadataValue metadataValue = catalogClient.getCatalogMetadataValue(catalogRef, "KEY");
|
||||||
assertEquals(existingMetadataEntry.getValue(), metadataEntry.getValue());
|
// XXX
|
||||||
checkMetadataEntry(metadataEntry);
|
assertEquals(metadataValue.getValue(), existingMetadataEntry.getValue(),
|
||||||
|
"The MetadataValue for KEY should have the same Value as the existing MetadataEntry");
|
||||||
|
checkMetadataValue(metadataValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(testName = "POST /catalogItem/{id}/metadata", dependsOnMethods = { "testGetCatalogItem" })
|
@Test(testName = "GET /catalogItem/{id}/metadata", dependsOnMethods = { "testGetCatalogItem" })
|
||||||
|
public void testGetCatalogItemMetadata() {
|
||||||
|
resetCatalogItemMetadata(catalogItemRef);
|
||||||
|
catalogItemMetadata = catalogClient.getCatalogItemMetadata(catalogItemRef);
|
||||||
|
// XXX
|
||||||
|
assertEquals(catalogItemMetadata.getMetadataEntries().size(), 1, "There should be a single MetadataEntry");
|
||||||
|
checkMetadata(catalogItemMetadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(testName = "POST /catalogItem/{id}/metadata", dependsOnMethods = { "testGetCatalogItemMetadata" })
|
||||||
public void testMergeCatalogItemMetadata() {
|
public void testMergeCatalogItemMetadata() {
|
||||||
Metadata newMetadata = Metadata.builder()
|
Metadata newMetadata = Metadata.builder()
|
||||||
.entry(MetadataEntry.builder().entry("KEY", "VALUE").build())
|
.entry(MetadataEntry.builder().entry("KEY", "MARMALADE").build())
|
||||||
|
.entry(MetadataEntry.builder().entry("VEGIMITE", "VALUE").build())
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
Task task = catalogClient.mergeCatalogItemMetadata(catalogItemRef, newMetadata);
|
Task mergeCatalogItemMetadata = catalogClient.mergeCatalogItemMetadata(catalogItemRef, newMetadata);
|
||||||
// TODO wait until task no longer running...
|
checkTask(mergeCatalogItemMetadata);
|
||||||
}
|
// TODO requires code from dan to be merged
|
||||||
|
// assertTrue(taskTester.apply(mergeCatalogItemMetadata.getHref()),
|
||||||
@Test(testName = "GET /catalogItem/{id}/metadata", dependsOnMethods = { "testMergeCatalogItemMetadata" })
|
// String.format(TASK_COMPLETE_TIMELY, "mergeCatalogItemMetadata"));
|
||||||
public void testGetCatalogItemMetadata() {
|
|
||||||
Metadata metadata = catalogClient.getCatalogItemMetadata(catalogItemRef);
|
Metadata mergedCatalogItemMetadata = catalogClient.getCatalogItemMetadata(catalogItemRef);
|
||||||
|
// XXX
|
||||||
|
assertEquals(mergedCatalogItemMetadata.getMetadataEntries().size(), catalogItemMetadata.getMetadataEntries().size() + 1,
|
||||||
|
"Should have added another MetadataEntry to the CatalogItem");
|
||||||
|
|
||||||
|
MetadataValue keyMetadataValue = catalogClient.getCatalogItemMetadataValue(catalogItemRef, "KEY");
|
||||||
|
// XXX
|
||||||
|
assertEquals(keyMetadataValue.getValue(), "MARMALADE", "The Value of the MetadataValue for KEY should have changed");
|
||||||
|
checkMetadataValue(keyMetadataValue);
|
||||||
|
|
||||||
|
MetadataValue newKeyMetadataValue = catalogClient.getCatalogItemMetadataValue(catalogItemRef, "VEGIMITE");
|
||||||
|
// XXX
|
||||||
|
assertEquals(newKeyMetadataValue.getValue(), "VALUE", "The Value of the MetadataValue for NEW_KEY should have been set");
|
||||||
|
checkMetadataValue(newKeyMetadataValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO escalate
|
||||||
// XXX org.jclouds.vcloud.director.v1_5.VCloudDirectorException: Error: The access to the resource metadata_item with id KEY is forbidden
|
// XXX org.jclouds.vcloud.director.v1_5.VCloudDirectorException: Error: The access to the resource metadata_item with id KEY is forbidden
|
||||||
@Test(testName = "GET /catalog/{id}/metadata/{key}", dependsOnMethods = { "testMergeCatalogItemMetadata" }, enabled = false)
|
@Test(testName = "GET /catalog/{id}/metadata/{key}", dependsOnMethods = { "testGetCatalogItemMetadata" })
|
||||||
public void testGetCatalogItemMetadataEntry() {
|
public void testGetCatalogItemMetadataValue() {
|
||||||
MetadataEntry metadataEntry = catalogClient.getCatalogItemMetadataEntry(catalogItemRef, "KEY");
|
MetadataEntry existingMetadataEntry = Iterables.find(catalogItemMetadata.getMetadataEntries(), new Predicate<MetadataEntry>() {
|
||||||
|
@Override
|
||||||
|
public boolean apply(MetadataEntry input) {
|
||||||
|
return input.getKey().equals("KEY");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
MetadataValue metadataValue = catalogClient.getCatalogItemMetadataValue(catalogItemRef, "KEY");
|
||||||
|
assertEquals(existingMetadataEntry.getValue(), metadataValue.getValue());
|
||||||
|
checkMetadataValue(metadataValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(testName = "PUT /catalog/{id}/metadata/{key}", dependsOnMethods = { "testMergeCatalogItemMetadata" })
|
@Test(testName = "PUT /catalog/{id}/metadata/{key}", dependsOnMethods = { "testGetCatalogItemMetadataValue" })
|
||||||
public void testSetCatalogItemMetadataEntry() {
|
public void testSetCatalogItemMetadataValue() {
|
||||||
MetadataValue newMetadataValue = MetadataValue.builder().value("NEW").build();
|
MetadataValue newMetadataValue = MetadataValue.builder().value("NEW").build();
|
||||||
|
|
||||||
Task task = catalogClient.setCatalogItemMetadataEntry(catalogItemRef, "KEY", newMetadataValue);
|
Task setCatalogItemMetadataValue = catalogClient.setCatalogItemMetadataValue(catalogItemRef, "KEY", newMetadataValue);
|
||||||
// TODO wait until task no longer running...
|
checkTask(setCatalogItemMetadataValue);
|
||||||
|
// TODO requires code from dan to be merged
|
||||||
|
// assertTrue(taskTester.apply(setCatalogItemMetadataValue.getHref()),
|
||||||
|
// String.format(TASK_COMPLETE_TIMELY, "setCatalogItemMetadataValue"));
|
||||||
|
|
||||||
|
MetadataValue updatedMetadataValue = catalogClient.getCatalogItemMetadataValue(catalogItemRef, "KEY");
|
||||||
|
assertEquals(updatedMetadataValue.getValue(), newMetadataValue.getValue(),
|
||||||
|
String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", newMetadataValue.getValue(), updatedMetadataValue.getValue()));
|
||||||
|
checkMetadataValue(updatedMetadataValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(testName = "DELETE /catalog/{id}/metadata/{key}", dependsOnMethods = { "testMergeCatalogItemMetadata" })
|
@Test(testName = "DELETE /catalog/{id}/metadata/{key}", dependsOnMethods = { "testSetCatalogItemMetadataValue" })
|
||||||
public void testDeleteCatalogItemMetadataEntry() {
|
public void testDeleteCatalogItemMetadataValue() {
|
||||||
Task task = catalogClient.deleteCatalogItemMetadataEntry(catalogItemRef, "KEY");
|
Task deleteCatalogItemMetadataValue = catalogClient.deleteCatalogItemMetadataValue(catalogItemRef, "KEY");
|
||||||
// TODO wait until task no longer running...
|
checkTask(deleteCatalogItemMetadataValue);
|
||||||
|
// TODO requires code from dan to be merged
|
||||||
|
// assertTrue(taskTester.apply(deleteCatalogItemMetadataValue.getHref()),
|
||||||
|
// String.format(TASK_COMPLETE_TIMELY, "deleteCatalogItemMetadataValue"));
|
||||||
|
try {
|
||||||
|
catalogClient.getCatalogItemMetadataValue(catalogItemRef, "KEY");
|
||||||
|
fail("The CatalogItem MetadataValue for KEY should have been deleted");
|
||||||
|
} catch (VCloudDirectorException vcde) {
|
||||||
|
Error error = vcde.getError();
|
||||||
|
checkError(error);
|
||||||
|
Integer majorErrorCode = error.getMajorErrorCode();
|
||||||
|
assertEquals(majorErrorCode, Integer.valueOf(403),
|
||||||
|
String.format(CORRECT_VALUE_OBJECT_FMT, "MajorErrorCode", "Error", "403",Integer.toString(majorErrorCode)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteAllCatalogItemMetadata(ReferenceType<?> catalogItemRef) {
|
||||||
|
Metadata currentMetadata = catalogClient.getCatalogItemMetadata(catalogItemRef);
|
||||||
|
for (MetadataEntry currentMetadataEntry : currentMetadata.getMetadataEntries()) {
|
||||||
|
catalogClient.deleteCatalogItemMetadataValue(catalogItemRef, currentMetadataEntry.getKey());
|
||||||
|
}
|
||||||
|
Metadata emptyMetadata = catalogClient.getCatalogItemMetadata(catalogItemRef);
|
||||||
|
assertTrue(emptyMetadata.getMetadataEntries().isEmpty(), "The catalogItem Metadata should be empty");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void resetCatalogItemMetadata(ReferenceType<?> catalogItemRef) {
|
||||||
|
deleteAllCatalogItemMetadata(catalogItemRef);
|
||||||
|
Metadata newMetadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "VALUE").build()).build();
|
||||||
|
Task mergeCatalogItemMetadata = catalogClient.mergeCatalogItemMetadata(catalogItemRef, newMetadata);
|
||||||
|
// TODO requires code from dan to be merged
|
||||||
|
// assertTrue(taskTester.apply(mergeCatalogItemMetadata.getHref()),
|
||||||
|
// String.format(TASK_COMPLETE_TIMELY, "mergeCatalogItemMetadata"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@ 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.Metadata;
|
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.MetadataEntry;
|
||||||
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Reference;
|
import org.jclouds.vcloud.director.v1_5.domain.Reference;
|
||||||
|
@ -197,18 +198,18 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testGetOrgMetadataEntry() {
|
public void testGetOrgMetadataValue() {
|
||||||
URI orgUri = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0");
|
URI orgUri = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0");
|
||||||
|
|
||||||
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse,
|
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse,
|
||||||
getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"),
|
getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"),
|
||||||
getStandardPayloadResponse("/org/orgMetadataEntry.xml", VCloudDirectorMediaType.METADATA_ENTRY));
|
getStandardPayloadResponse("/org/orgMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE));
|
||||||
|
|
||||||
MetadataEntry expected = metadataEntry();
|
MetadataValue expected = metadataValue();
|
||||||
|
|
||||||
Reference orgRef = Reference.builder().href(orgUri).build();
|
Reference orgRef = Reference.builder().href(orgUri).build();
|
||||||
|
|
||||||
assertEquals(client.getOrgClient().getOrgMetadataEntry(orgRef, "KEY"), expected);
|
assertEquals(client.getOrgClient().getOrgMetadataValue(orgRef, "KEY"), expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Org org() {
|
public static Org org() {
|
||||||
|
@ -263,13 +264,25 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest
|
||||||
|
|
||||||
public static MetadataEntry metadataEntry() {
|
public static MetadataEntry metadataEntry() {
|
||||||
return MetadataEntry.builder()
|
return MetadataEntry.builder()
|
||||||
.href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"))
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"))
|
||||||
.link(Link.builder()
|
.link(Link.builder()
|
||||||
.rel("up")
|
.rel("up")
|
||||||
.type("application/vnd.vmware.vcloud.metadata+xml")
|
.type("application/vnd.vmware.vcloud.metadata+xml")
|
||||||
.href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"))
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"))
|
||||||
.build())
|
.build())
|
||||||
.entry("KEY", "VALUE")
|
.entry("KEY", "VALUE")
|
||||||
.build();
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MetadataValue metadataValue() {
|
||||||
|
return MetadataValue.builder()
|
||||||
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY"))
|
||||||
|
.link(Link.builder()
|
||||||
|
.rel("up")
|
||||||
|
.type("application/vnd.vmware.vcloud.metadata+xml")
|
||||||
|
.href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"))
|
||||||
|
.build())
|
||||||
|
.value("VALUE")
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ import static org.testng.Assert.*;
|
||||||
|
|
||||||
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
|
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
|
||||||
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.MetadataEntry;
|
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
import org.jclouds.vcloud.director.v1_5.domain.Org;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
|
||||||
import org.jclouds.vcloud.director.v1_5.domain.Reference;
|
import org.jclouds.vcloud.director.v1_5.domain.Reference;
|
||||||
|
@ -68,11 +68,11 @@ public class OrgClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
|
|
||||||
// NOTE The environment MUST have at least one organisation configured
|
// NOTE The environment MUST have at least one organisation configured
|
||||||
|
|
||||||
// Check required elements and attributes
|
// Check test requirements
|
||||||
assertFalse(Iterables.isEmpty(orgList.getOrgs()), "There must always be Org elements in the OrgList");
|
assertFalse(Iterables.isEmpty(orgList.getOrgs()), String.format(NOT_EMPTY_OBJECT_FMT, "Org", "OrgList"));
|
||||||
|
|
||||||
for (Reference orgRef : orgList.getOrgs()) {
|
for (Reference orgRef : orgList.getOrgs()) {
|
||||||
assertEquals(orgRef.getType(), VCloudDirectorMediaType.ORG, "The Refernce must be to an Org type");
|
assertEquals(orgRef.getType(), VCloudDirectorMediaType.ORG, String.format(CONDITION_FMT, "Reference.Type", VCloudDirectorMediaType.ORG, orgRef.getType()));
|
||||||
checkReferenceType(orgRef);
|
checkReferenceType(orgRef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -84,11 +84,7 @@ public class OrgClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
// Call the method being tested
|
// Call the method being tested
|
||||||
org = orgClient.getOrg(orgRef);
|
org = orgClient.getOrg(orgRef);
|
||||||
|
|
||||||
// Check required elements and attributes
|
checkOrg(org);
|
||||||
assertNotNull(org.getFullName(), String.format(FIELD_NOT_NULL_FMT, "FullName", "Org"));
|
|
||||||
|
|
||||||
// Check parent type
|
|
||||||
checkEntityType(org);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(testName = "GET /org/{id}/metadata/", dependsOnMethods = { "testGetOrg" })
|
@Test(testName = "GET /org/{id}/metadata/", dependsOnMethods = { "testGetOrg" })
|
||||||
|
@ -98,36 +94,22 @@ public class OrgClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
|
|
||||||
// NOTE The environment MUST have at one metadata entry for the first organisation configured
|
// NOTE The environment MUST have at one metadata entry for the first organisation configured
|
||||||
|
|
||||||
// Check required elements and attributes
|
checkMetadata(metadata);
|
||||||
assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), "There must always be MetadataEntry elements in the Org");
|
|
||||||
|
|
||||||
// Check parent type
|
// Check requirements for this test
|
||||||
checkResourceType(metadata);
|
assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "Org"));
|
||||||
|
|
||||||
for (MetadataEntry entry : metadata.getMetadataEntries()) {
|
|
||||||
// Check required elements and attributes
|
|
||||||
assertNotNull(entry.getKey(), String.format(FIELD_NOT_NULL_FMT, "Key", "MetadataEntry"));
|
|
||||||
assertNotNull(entry.getValue(), String.format(FIELD_NOT_NULL_FMT, "Value", "MetadataEntry"));
|
|
||||||
|
|
||||||
// Check parent type
|
|
||||||
checkResourceType(entry);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(testName = "GET /org/{id}/metadata/{key}", dependsOnMethods = { "testGetOrgMetadata" })
|
@Test(testName = "GET /org/{id}/metadata/{key}", dependsOnMethods = { "testGetOrgMetadata" })
|
||||||
public void testGetOrgMetadataEntry() {
|
public void testGetOrgMetadataValue() {
|
||||||
// Call the method being tested
|
// Call the method being tested
|
||||||
MetadataEntry entry = orgClient.getOrgMetadataEntry(orgRef, "KEY");
|
MetadataValue value = orgClient.getOrgMetadataValue(orgRef, "KEY");
|
||||||
|
|
||||||
// NOTE The environment MUST have configured the metadata entry as '{ key="KEY", value="VALUE" )'
|
// NOTE The environment MUST have configured the metadata entry as '{ key="KEY", value="VALUE" )'
|
||||||
|
|
||||||
// Check required elements and attributes
|
String expected = "VALUE";
|
||||||
assertNotNull(entry.getKey(), String.format(FIELD_NOT_NULL_FMT, "Key", "MetadataEntry"));
|
|
||||||
assertEquals(entry.getKey(), "KEY", "The Key field must have the value \"KEY\"");
|
checkMetadataValue(value);
|
||||||
assertNotNull(entry.getValue(), String.format(FIELD_NOT_NULL_FMT, "Value", "MetadataEntry"));
|
assertEquals(value.getValue(), expected, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, value.getValue()));
|
||||||
assertEquals(entry.getValue(), "VALUE", "The Value field must have the value \"VALUE\"");
|
|
||||||
|
|
||||||
// Check parent type
|
|
||||||
checkResourceType(entry);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.vcloud.director.v1_5.features;
|
package org.jclouds.vcloud.director.v1_5.features;
|
||||||
|
|
||||||
|
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.*;
|
||||||
import static org.jclouds.vcloud.director.v1_5.domain.Checks.*;
|
import static org.jclouds.vcloud.director.v1_5.domain.Checks.*;
|
||||||
import static org.testng.Assert.*;
|
import static org.testng.Assert.*;
|
||||||
|
|
||||||
|
@ -75,7 +76,7 @@ public class TaskClientLiveTest extends BaseVCloudDirectorClientLiveTest {
|
||||||
// NOTE The environment MUST have ...
|
// NOTE The environment MUST have ...
|
||||||
|
|
||||||
// Check required elements and attributes
|
// Check required elements and attributes
|
||||||
assertFalse(Iterables.isEmpty(taskList.getTasks()), "There must always be Task elements in the TaskList");
|
assertFalse(Iterables.isEmpty(taskList.getTasks()), String.format(NOT_EMPTY_OBJECT_FMT, "Task", "TaskList"));
|
||||||
|
|
||||||
for (Task task : taskList.getTasks()) {
|
for (Task task : taskList.getTasks()) {
|
||||||
checkTask(task);
|
checkTask(task);
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<MetadataEntry xmlns="http://www.vmware.com/vcloud/v1.5" href="https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
|
<MetadataValue xmlns="http://www.vmware.com/vcloud/v1.5" href="https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
|
||||||
<Link rel="up" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"/>
|
<Link rel="up" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"/>
|
||||||
<Key>KEY</Key>
|
|
||||||
<Value>VALUE</Value>
|
<Value>VALUE</Value>
|
||||||
</MetadataEntry>
|
</MetadataValue>
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<MetadataEntry xmlns="http://www.vmware.com/vcloud/v1.5" href="https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata/KEY" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
|
<MetadataValue xmlns="http://www.vmware.com/vcloud/v1.5" href="https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata/KEY" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
|
||||||
<Link rel="up" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata"/>
|
<Link rel="up" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata"/>
|
||||||
<Key>KEY</Key>
|
|
||||||
<Value>VALUE</Value>
|
<Value>VALUE</Value>
|
||||||
</MetadataEntry>
|
</MetadataValue>
|
|
@ -1,6 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<MetadataEntry xmlns="http://www.vmware.com/vcloud/v1.5" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
|
<MetadataValue xmlns="http://www.vmware.com/vcloud/v1.5" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
|
||||||
<Link rel="up" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"/>
|
<Link rel="up" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"/>
|
||||||
<Key>KEY</Key>
|
|
||||||
<Value>VALUE</Value>
|
<Value>VALUE</Value>
|
||||||
</MetadataEntry>
|
</MetadataValue>
|
Loading…
Reference in New Issue