decrufted metadataapi

This commit is contained in:
Adrian Cole 2012-08-24 00:19:49 -07:00
parent 03326849e0
commit 7db0519d0b
30 changed files with 511 additions and 657 deletions

View File

@ -0,0 +1,49 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.vcloud.director.v1_5.binders;
import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.binders.BindToXMLPayload;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.xml.XMLParser;
/**
* Changes a Map to the crufty {@link Metadata type}
*/
@Singleton
public class BindMapAsMetadata extends BindToXMLPayload {
@Inject
public BindMapAsMetadata(final XMLParser xmlParser) {
super(xmlParser);
}
@SuppressWarnings("unchecked")
@Override
public <R extends HttpRequest> R bindToRequest(final R request, final Object input) {
return super.bindToRequest(request, Metadata.toMetadata(Map.class.cast(checkNotNull(input, "input"))));
}
}

View File

@ -0,0 +1,66 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.vcloud.director.v1_5.binders;
import static com.google.common.base.Preconditions.checkNotNull;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.jclouds.http.HttpRequest;
import org.jclouds.rest.binders.BindToXMLPayload;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.Resource;
import org.jclouds.xml.XMLParser;
/**
* Changes a String to the crufty {@link MetadataValue type}
*/
@Singleton
public class BindStringAsMetadataValue extends BindToXMLPayload {
@XmlRootElement(name = "MetadataValue")
public static class MetadataValue extends Resource {
public static final String MEDIA_TYPE = VCloudDirectorMediaType.METADATA_VALUE;
public MetadataValue() {
}
public MetadataValue(String value) {
super(Resource.builder());
this.value = value;
}
@XmlElement(name = "Value", required = true)
private String value;
}
@Inject
public BindStringAsMetadataValue(final XMLParser xmlParser) {
super(xmlParser);
}
@Override
public <R extends HttpRequest> R bindToRequest(final R request, final Object input) {
return super.bindToRequest(request, new MetadataValue(checkNotNull(input, "input").toString()));
}
}

View File

@ -1,4 +1,4 @@
/**
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
@ -16,21 +16,20 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.carrenza.vcloud.director;
import org.jclouds.vcloud.director.v1_5.HttpClientLiveTest;
import org.testng.annotations.Test;
/**
* {@inheritDoc}
*
* @author danikov
* @author grkvlt
*/
@Test(groups = { "live", "user" }, singleThreaded = true, testName = "CarrenzaVCloudDirectorHttpClientLiveTest")
public class CarrenzaVCloudDirectorHttpClientLiveTest extends HttpClientLiveTest {
public CarrenzaVCloudDirectorHttpClientLiveTest() {
provider = "carrenza-vcloud-director";
@XmlSchema(namespace = VCLOUD_1_5_NS,
elementFormDefault = XmlNsForm.QUALIFIED,
xmlns = {
@XmlNs(prefix = "", namespaceURI = VCLOUD_1_5_NS)
}
}
)
@XmlAccessorType(XmlAccessType.FIELD)
package org.jclouds.vcloud.director.v1_5.binders;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.VCLOUD_1_5_NS;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlNs;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;

View File

@ -49,6 +49,16 @@ import com.google.common.collect.Sets;
@XmlRootElement(name = "Metadata")
public class Metadata extends Resource implements Map<String, String> {
public static Metadata toMetadata(Map<String, String> input) {
if (input instanceof Metadata)
return Metadata.class.cast(input);
Builder<?> builder = builder();
for (Map.Entry<String, String> entry : input.entrySet()) {
builder.entry(MetadataEntry.builder().entry(entry.getKey(), entry.getValue()).build());
}
return builder.build();
}
public static final String MEDIA_TYPE = VCloudDirectorMediaType.METADATA;
public static Builder<?> builder() {

View File

@ -42,116 +42,3 @@ import com.google.common.collect.Sets;
*
* @author grkvlt@apache.org
*/
@XmlRootElement(name = "MetadataValue")
public class MetadataValue extends Resource {
public static final String MEDIA_TYPE = VCloudDirectorMediaType.METADATA_ENTRY;
public static Builder<?> builder() {
return new ConcreteBuilder();
}
@Override
public Builder<?> toBuilder() {
return builder().fromMetadataValue(this);
}
private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
}
public static abstract class Builder<B extends Builder<B>> extends Resource.Builder<B> {
private String value;
/**
* @see MetadataValue#getValue
*/
public B value(String value) {
this.value = value;
return self();
}
@Override
public MetadataValue build() {
return new MetadataValue(this);
}
/**
* @see ResourceType#getHref()
*/
@Override
public B href(URI href) {
super.href(href);
return self();
}
/**
* @see ResourceType#getType()
*/
@Override
public B type(String type) {
super.type(type);
return self();
}
/**
* @see ResourceType#getLinks()
*/
@Override
public B links(Set<Link> links) {
super.links(Sets.newLinkedHashSet(checkNotNull(links, "links")));
return self();
}
/**
* @see ResourceType#getLinks()
*/
@Override
public B link(Link link) {
super.link(link);
return self();
}
public B fromMetadataValue(MetadataValue in) {
return fromResource(in).value(value);
}
}
protected MetadataValue() {
// For JAXB
}
protected MetadataValue(Builder<?> builder) {
super(builder);
this.value = checkNotNull(builder.value, "value");
}
@XmlElement(name = "Value", required = true)
private String value;
/**
* The value.
*/
public String getValue() {
return value;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
MetadataValue that = MetadataValue.class.cast(o);
return super.equals(that) && equal(this.value, that.value);
}
@Override
public int hashCode() {
return Objects.hashCode(super.hashCode(), value);
}
@Override
public ToStringHelper string() {
return super.string().add("value", value);
}
}

View File

@ -18,18 +18,18 @@
*/
package org.jclouds.vcloud.director.v1_5.features;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
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.Task;
/**
* Provides synchronous access to {@link Metadata}.
*
* @see MetadataAsyncApi
* @author danikov
* @author danikov, Adrian Cole
*/
public interface MetadataApi {
@ -47,7 +47,7 @@ public interface MetadataApi {
*
* @return the metadata value, or null if not found
*/
MetadataValue getValue(String key);
String get(String key);
}
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
@ -56,27 +56,30 @@ public interface MetadataApi {
/**
* Merges the metadata for a media with the information provided.
*
* @return a task. This operation is asynchronous and the user should monitor the returned
* task status in order to check when it is completed.
* @return a task. This operation is asynchronous and the user should
* monitor the returned task status in order to check when it is
* completed.
*/
Task merge(Metadata metadata);
Task putAll(Map<String, String> metadata);
/**
* Sets the metadata for the particular key for the media to the value provided. Note: this
* will replace any existing metadata information
* Sets the metadata for the particular key for the media to the value
* provided. Note: this will replace any existing metadata information
*
* @return a task. This operation is asynchronous and the user should monitor the returned
* task status in order to check when it is completed.
* @return a task. This operation is asynchronous and the user should
* monitor the returned task status in order to check when it is
* completed.
*/
Task putEntry(String key, MetadataValue metadataValue);
Task put(String key, String value);
/**
* Deletes a metadata entry.
*
* @return a task. This operation is asynchronous and the user should monitor the returned
* task status in order to check when it is completed.
* @return a task. This operation is asynchronous and the user should
* monitor the returned task status in order to check when it is
* completed.
*/
Task removeEntry(String key);
Task remove(String key);
}
}

View File

@ -18,7 +18,7 @@
*/
package org.jclouds.vcloud.director.v1_5.features;
import java.net.URI;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
@ -33,29 +33,29 @@ import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.JAXBResponseParser;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.binders.BindToXMLPayload;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.binders.BindMapAsMetadata;
import org.jclouds.vcloud.director.v1_5.binders.BindStringAsMetadataValue;
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.Task;
import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
import org.jclouds.vcloud.director.v1_5.functions.RegexValueParser;
import com.google.common.util.concurrent.ListenableFuture;
/**
* @see MetadataApi
* @author danikov
* @author Adrian Cole, danikov
*/
// TODO: take out the endpoint params and supply them in the Delegate calls.
public interface MetadataAsyncApi {
@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
public static interface Readable extends MetadataAsyncApi {
/**
* @see MetadataApi.Readable#get(URI)
* @see MetadataApi.Readable#get()
*/
@GET
@Path("/metadata")
@ -65,14 +65,14 @@ public interface MetadataAsyncApi {
ListenableFuture<Metadata> get();
/**
* @see MetadataApi.Readable#getValue(String)
* @see MetadataApi.Readable#get(String)
*/
@GET
@Path("/metadata/{key}")
@Consumes
@JAXBResponseParser
@ResponseParser(RegexValueParser.class)
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<MetadataValue> getValue(@PathParam("key") String key);
ListenableFuture<String> get(@PathParam("key") String key);
}
@ -80,35 +80,34 @@ public interface MetadataAsyncApi {
public static interface Writeable extends Readable {
/**
* @see MetadataApi.Writable#merge(Metadata)
* @see MetadataApi.Writable#putAll
*/
@POST
@Path("/metadata")
@Consumes(VCloudDirectorMediaType.TASK)
@Produces(VCloudDirectorMediaType.METADATA)
@JAXBResponseParser
ListenableFuture<Task> merge(@BinderParam(BindToXMLPayload.class) Metadata metadata);
ListenableFuture<Task> putAll(@BinderParam(BindMapAsMetadata.class) Map<String, String> metadata);
/**
* @see MetadataApi.Writeable#putEntry(String, MetadataEntry)
* @see MetadataApi.Writeable#put
*/
@PUT
@Path("/metadata/{key}")
@Consumes(VCloudDirectorMediaType.TASK)
@Produces(VCloudDirectorMediaType.METADATA_VALUE)
@JAXBResponseParser
// TODO: this is rediculous. get rid of the MetadataValue type, as it is only a string!
ListenableFuture<Task> putEntry(@PathParam("key") String key,
@BinderParam(BindToXMLPayload.class) MetadataValue metadataValue);
ListenableFuture<Task> put(@PathParam("key") String key,
@BinderParam(BindStringAsMetadataValue.class) String metadataValue);
/**
* @see MetadataApi.Writable#removeEntry(String)
* @see MetadataApi.Writable#remove
*/
@DELETE
@Path("/metadata/{key}")
@Consumes(VCloudDirectorMediaType.TASK)
@JAXBResponseParser
ListenableFuture<Task> removeEntry(@PathParam("key") String key);
ListenableFuture<Task> remove(@PathParam("key") String key);
}
}

View File

@ -0,0 +1,58 @@
/**
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.vcloud.director.v1_5.functions;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.inject.Inject;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ReturnStringIf2xx;
import com.google.common.base.Function;
import com.google.inject.Singleton;
/**
*
* @author Adrian Cole
*/
@Singleton
public class RegexValueParser implements Function<HttpResponse, String> {
Pattern pattern = Pattern.compile("<Value>([^<]+)</Value>");
private final ReturnStringIf2xx returnStringIf200;
@Inject
RegexValueParser(ReturnStringIf2xx returnStringIf200) {
this.returnStringIf200 = returnStringIf200;
}
@Override
public String apply(HttpResponse response) {
String content = returnStringIf200.apply(response);
if (content != null) {
Matcher matcher = pattern.matcher(content);
if (matcher.find()) {
return matcher.group(1);
}
}
return null;
}
}

View File

@ -1,107 +0,0 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.vcloud.director.v1_5;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import org.jclouds.crypto.CryptoStreams;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
import org.jclouds.rest.HttpClient;
import org.jclouds.util.Strings2;
import org.jclouds.vcloud.director.v1_5.domain.SessionWithToken;
import org.jclouds.vcloud.director.v1_5.domain.org.OrgList;
import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorApiLiveTest;
import org.jclouds.xml.internal.JAXBParser;
import org.testng.annotations.Test;
import com.google.common.collect.Iterables;
/**
* Tests live behavior of operations that use {@link HttpClient}.
*
* @author danikov
*/
@Test(groups = { "live", "user" }, singleThreaded = true, testName = "HttpClientLiveTest")
public class HttpClientLiveTest extends BaseVCloudDirectorApiLiveTest {
private JAXBParser parser = new JAXBParser("true");
private SessionWithToken sessionWithToken;
@Override
protected void setupRequiredApis() {
}
@Test(description = "POST /login")
public void testPostLogin() throws IOException {
testLoginWithMethod("POST");
}
@Test(description = "GET /login")
public void testGetLogin() throws IOException {
testLoginWithMethod("GET");
}
private void testLoginWithMethod(final String method) throws IOException {
String user = identity.substring(0, identity.lastIndexOf('@'));
String org = identity.substring(identity.lastIndexOf('@') + 1);
String password = credential;
String authHeader = "Basic " + CryptoStreams.base64(String.format("%s@%s:%s", checkNotNull(user), checkNotNull(org), checkNotNull(password)).getBytes("UTF-8"));
HttpResponse response = context.getUtils().getHttpClient().invoke(HttpRequest.builder()
.method(method)
.endpoint(endpoint + "/login")
.addHeader("Authorization", authHeader)
.addHeader("Accept", "*/*").build());
sessionWithToken = SessionWithToken.builder().session(session).token(response.getFirstHeaderOrNull("x-vcloud-authorization")).build();
assertEquals(sessionWithToken.getSession().getUser(), user);
assertEquals(sessionWithToken.getSession().get(), org);
assertTrue(sessionWithToken.getSession().getLinks().size() > 0);
assertNotNull(sessionWithToken.getToken());
OrgList orgList = parser.fromXML(Strings2.toString(response.getPayload()), OrgList.class);
assertTrue(orgList.size() > 0, "must have orgs");
context.getApi().getOrgApi().get(Iterables.getLast(orgList).getHref());
}
@Test(description = "GET /schema/{schemaFileName}", dependsOnMethods = { "testPostLogin", "testGetLogin" })
public void testGetSchema() throws IOException {
String schemafileName = "master.xsd";
HttpResponse response = context.getUtils().getHttpClient().invoke(HttpRequest.builder()
.method("GET")
.endpoint(endpoint + "/v1.5/schema/" + schemafileName)
.addHeader("x-vcloud-authorization", sessionWithToken.getToken())
.addHeader("Accept", "*/*").build());
String schema = Strings2.toString(response.getPayload());
// TODO: asserting something about the schema
}
}

View File

@ -0,0 +1,57 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
*(Link.builder().regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless(Link.builder().required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.vcloud.director.v1_5.binders;
import static org.testng.Assert.assertEquals;
import javax.ws.rs.core.MediaType;
import org.jclouds.http.HttpRequest;
import org.jclouds.xml.XMLParser;
import org.jclouds.xml.internal.JAXBParser;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
/**
* Tests behavior of {@code BindMapAsMetadata}.
*
*/
@Test(groups = "unit", testName = "BindMapAsMetadataTest")
public class BindMapAsMetadataTest {
XMLParser xml = new JAXBParser("true");
@Test
public void testBindMap() {
BindMapAsMetadata binder = new BindMapAsMetadata(xml);
HttpRequest request = HttpRequest.builder().method("GET").endpoint("http://momma").build();
request = binder.bindToRequest(request, ImmutableMap.of("foo", "bar"));
assertEquals(request.getPayload().getRawContent(),
XMLParser.DEFAULT_XML_HEADER + "\n"+
"<Metadata xmlns=\"http://www.vmware.com/vcloud/v1.5\">" + "\n"+
" <MetadataEntry>" + "\n" +
" <Key>foo</Key>" + "\n" +
" <Value>bar</Value>" + "\n" +
" </MetadataEntry>" + "\n" +
"</Metadata>" + "\n");
assertEquals(request.getPayload().getContentMetadata().getContentType(), MediaType.APPLICATION_XML);
}
}

View File

@ -0,0 +1,52 @@
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
*(Link.builder().regarding copyright ownership. jclouds licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless(Link.builder().required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jclouds.vcloud.director.v1_5.binders;
import static org.testng.Assert.assertEquals;
import javax.ws.rs.core.MediaType;
import org.jclouds.http.HttpRequest;
import org.jclouds.xml.XMLParser;
import org.jclouds.xml.internal.JAXBParser;
import org.testng.annotations.Test;
/**
* Tests behavior of {@code BindStringAsMetadataValue}.
*
*/
@Test(groups = "unit", testName = "BindStringAsMetadataValueTest")
public class BindStringAsMetadataValueTest {
XMLParser xml = new JAXBParser("true");
@Test
public void testBindMap() {
BindStringAsMetadataValue binder = new BindStringAsMetadataValue(xml);
HttpRequest request = HttpRequest.builder().method("GET").endpoint("http://momma").build();
request = binder.bindToRequest(request, "foo");
assertEquals(request.getPayload().getRawContent(),
XMLParser.DEFAULT_XML_HEADER + "\n"+
"<MetadataValue xmlns=\"http://www.vmware.com/vcloud/v1.5\">" + "\n"+
" <Value>foo</Value>" + "\n" +
"</MetadataValue>" + "\n");
assertEquals(request.getPayload().getContentMetadata().getContentType(), MediaType.APPLICATION_XML);
}
}

View File

@ -141,7 +141,7 @@ public class Checks {
}
// Check parent type
checkResourceType(entity);
checkResource(entity);
}
/**
@ -173,20 +173,20 @@ public class Checks {
/**
* Assumes the validTypes to be vcloud-specific types.
*
* @see #checkResourceType(ResourceType, Collection)
* @see #checkResource(Resource, Collection)
*/
public static void checkResourceType(Resource resource) {
checkResourceType(resource, VCloudDirectorMediaType.ALL);
public static void checkResource(Resource resource) {
checkResource(resource, VCloudDirectorMediaType.ALL);
}
/**
* @see #checkResourceType(ResourceType, Collection)
* @see #checkResource(Resource, Collection)
*/
public static void checkResourceType(Resource resource, String type) {
checkResourceType(resource, ImmutableSet.of(type));
public static void checkResource(Resource resource, String type) {
checkResource(resource, ImmutableSet.of(type));
}
public static void checkResourceType(Resource resource, Collection<String> validTypes) {
public static void checkResource(Resource resource, Collection<String> validTypes) {
// Check optional fields
URI href = resource.getHref();
if (href != null) checkHref(href);
@ -294,7 +294,7 @@ public class Checks {
}
// Check parent type
checkResourceType(metadata);
checkResource(metadata);
}
public static void checkMetadataEntry(MetadataEntry metadataEntry) {
@ -303,15 +303,7 @@ public class Checks {
assertNotNull(metadataEntry.getValue(), String.format(NOT_NULL_OBJ_FIELD_FMT, "Value", "MetadataEntry"));
// Check parent type
checkResourceType(metadataEntry);
}
public static void checkMetadataValue(MetadataValue metadataValue) {
// Check required elements and attributes
assertNotNull(metadataValue.getValue(), String.format(NOT_NULL_OBJ_FIELD_FMT, "Value", "MetadataValue"));
// Check parent type
checkResourceType(metadataValue);
checkResource(metadataEntry);
}
public static void checkProgress(Integer progress) {
@ -339,7 +331,7 @@ public class Checks {
public static void checkAdminOrg(AdminOrg org) {
// required
assertNotNull(org.getSettings(), String.format(NOT_NULL_OBJ_FIELD_FMT, "settings", "AdminOrg"));
checkResourceType(org, VCloudDirectorMediaType.ADMIN_ORG);
checkResource(org, VCloudDirectorMediaType.ADMIN_ORG);
// optional
for (Reference user : org.getUsers()) {
@ -387,7 +379,7 @@ public class Checks {
}
// Check parent type
checkResourceType(owner);
checkResource(owner);
}
public static void checkCatalogItem(CatalogItem catalogItem) {
@ -573,29 +565,13 @@ public class Checks {
String.format(OBJ_FIELD_ATTRB_REQ, api, "MetadataEntry", entry.getValue(), "value"));
// Check parent type
checkResourceType(entry);
checkResource(entry);
}
// Check parent type
checkResourceType(metadata);
checkResource(metadata);
}
public static void checkMetadataValueFor(String api, MetadataValue metadataValue) {
checkMetadataValueFor(api, metadataValue, "value");
}
public static void checkMetadataValueFor(String api, MetadataValue metadataValue, String expectedValue) {
// Check required fields
String value = metadataValue.getValue();
assertNotNull(value,
String.format(OBJ_FIELD_ATTRB_REQ, api, "MetadataEntry",
metadataValue.toString(), "value"));
assertEquals(value, expectedValue,
String.format(OBJ_FIELD_EQ, api, "metadataEntry.value", expectedValue, value));
// Check parent type
checkResourceType(metadataValue);
}
public static void checkMetadataKeyAbsentFor(String api, Metadata metadata, String key) {
Map<String,String> metadataMap = metadataToMap(metadata);
@ -628,7 +604,7 @@ public class Checks {
}
// Check parent type
checkResourceType(question);
checkResource(question);
}
public static void checkVmQuestionAnswerChoice(VmQuestionAnswerChoice choice) {
@ -848,7 +824,7 @@ public class Checks {
}
// parent type
checkResourceType(settings);
checkResource(settings);
}
public static void checkEmailSettings(OrgEmailSettings settings) {
@ -864,7 +840,7 @@ public class Checks {
// NOTE alertEmailsTo cannot be checked
// parent type
checkResourceType(settings);
checkResource(settings);
}
public static void checkEmailAddress(String email) {
@ -889,7 +865,7 @@ public class Checks {
}
// parent type
checkResourceType(settings);
checkResource(settings);
}
public static void checkLdapSettings(OrgLdapSettings settings) {
@ -905,7 +881,7 @@ public class Checks {
}
// parent type
checkResourceType(settings);
checkResource(settings);
}
public static void checkCustomOrgLdapSettings(CustomOrgLdapSettings settings) {
@ -980,7 +956,7 @@ public class Checks {
String.format(OBJ_FIELD_GTE_0, "OrgPasswordPolicySettings", "accountLockoutIntervalMinutes", settings.getAccountLockoutIntervalMinutes()));
// parent type
checkResourceType(settings);
checkResource(settings);
}
public static void checkVAppLeaseSettings(OrgLeaseSettings settings) {
@ -996,7 +972,7 @@ public class Checks {
}
// parent type
checkResourceType(settings);
checkResource(settings);
}
public static void checkVAppTemplateLeaseSettings(OrgVAppTemplateLeaseSettings settings) {
@ -1008,7 +984,7 @@ public class Checks {
}
// parent type
checkResourceType(settings);
checkResource(settings);
}
public static void checkUser(User user) {
@ -1087,7 +1063,7 @@ public class Checks {
}
// Check parent type
checkResourceType(sections);
checkResource(sections);
}
public static void checkGuestCustomizationSection(GuestCustomizationSection section) {
@ -1220,7 +1196,7 @@ public class Checks {
assertNotNull(val.getNetworkName(), String.format(NOT_NULL_OBJ_FIELD_FMT, "NetworkName", "VAppNetworkConfiguration"));
checkNetworkConfiguration(val.getConfiguration());
checkResourceType(val);
checkResource(val);
}
public static void checkNetworkConnectionSection(NetworkConnectionSection val) {
@ -1517,6 +1493,6 @@ public class Checks {
}
// parent type
checkResourceType(container);
checkResource(container);
}
}

View File

@ -37,12 +37,12 @@ import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
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.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
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.user.VCloudDirectorApi;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.net.HttpHeaders;
@ -182,7 +182,7 @@ public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
@Test
public void testGetCatalogMetadataEntryHref() {
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadataValue, getMetadataValueResponse);
assertEquals(api.getCatalogApi().getMetadataApi(catalogHref).getValue("KEY"), metadataValue());
assertEquals(api.getCatalogApi().getMetadataApi(catalogHref).get("KEY"), "VALUE");
}
static String item = "a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df";
@ -328,9 +328,7 @@ public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
@Test
public void testMergeCatalogItemMetadataHref() {
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, mergeItemMetadata, mergeItemMetadataResponse);
// TODO: horrendous way of representing Map<String,String>
Metadata metadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "VALUE").build()).build();
assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).merge(metadata), mergeMetadataTask());
assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).putAll(ImmutableMap.of("KEY", "VALUE")), mergeMetadataTask());
}
HttpRequest getItemMetadataValue = HttpRequest.builder()
@ -348,7 +346,7 @@ public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
@Test
public void testGetCatalogItemMetadataEntryHref() {
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getItemMetadataValue, getItemMetadataValueResponse);
assertEquals(api.getCatalogApi().getMetadataApi(itemHref).getValue("KEY"), itemMetadataValue());
assertEquals(api.getCatalogApi().getMetadataApi(itemHref).get("KEY"), "VALUE");
}
HttpRequest putItemMetadata = HttpRequest.builder()
@ -368,7 +366,7 @@ public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
@Test
public void testSetCatalogItemMetadataEntryHref() {
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, putItemMetadata, putItemMetadataResponse);
assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).putEntry("KEY", MetadataValue.builder().value("KITTENS").build()), setMetadataValueTask());
assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).put("KEY", "KITTENS"), setMetadataValueTask());
}
HttpRequest removeItemMetadataEntry = HttpRequest.builder()
@ -386,7 +384,7 @@ public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
@Test
public void testRemoveCatalogItemMetadataEntryHref() {
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, removeItemMetadataEntry, removeItemMetadataEntryResponse);
assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).removeEntry("KEY"), removeEntryTask());
assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).remove("KEY"), removeTask());
}
public static final Catalog catalog() {
@ -487,30 +485,6 @@ public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
.build();
}
public static MetadataValue metadataValue() {
return MetadataValue.builder()
.href(URI.create(endpoint + "/catalog/" + catalog + "/metadata/KEY"))
.link(Link.builder()
.rel("up")
.type("application/vnd.vmware.vcloud.metadata+xml")
.href(URI.create(endpoint + "/catalog/" + catalog + "/metadata"))
.build())
.value("VALUE")
.build();
}
public static MetadataValue itemMetadataValue() {
return MetadataValue.builder()
.href(URI.create(endpoint + "/catalogItem/" + item + "/metadata/KEY"))
.link(Link.builder()
.rel("up")
.type("application/vnd.vmware.vcloud.metadata+xml")
.href(URI.create(endpoint + "/catalogItem/" + item + "/metadata"))
.build())
.value("VALUE")
.build();
}
public static CatalogItem catalogItem() {
return CatalogItem.builder()
.name("ubuntu10")
@ -607,7 +581,7 @@ public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
.build();
}
public static Task removeEntryTask() {
public static Task removeTask() {
return Task.builder()
.name("task")
.id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")

View File

@ -24,7 +24,6 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.C
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkCatalogItem;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkTask;
import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals;
import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals;
@ -41,8 +40,6 @@ import org.jclouds.vcloud.director.v1_5.domain.Checks;
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.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.Reference;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.domain.Vdc;
@ -51,8 +48,7 @@ import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorApiLiveTest;
import org.testng.annotations.AfterClass;
import org.testng.annotations.Test;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.ImmutableMap;
/**
* Tests live behavior of {@link CatalogApi}.
@ -184,25 +180,15 @@ public class CatalogApiLiveTest extends BaseVCloudDirectorApiLiveTest {
@Test(description = "GET /catalog/{id}/metadata/{key}")
public void testGetCatalogMetadataValue() {
Metadata newMetadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "MARMALADE").build())
.build();
Task mergeCatalogMetadata = adminCatalogApi.getMetadataApi(catalogUrn).merge(newMetadata);
Task mergeCatalogMetadata = adminCatalogApi.getMetadataApi(catalogUrn)
.putAll(ImmutableMap.of("KEY", "MARMALADE"));
assertTaskSucceedsLong(mergeCatalogMetadata);
Metadata catalogMetadata = catalogApi.getMetadataApi(catalogUrn).get();
MetadataEntry existingMetadataEntry = Iterables.find(catalogMetadata.getMetadataEntries(),
new Predicate<MetadataEntry>() {
@Override
public boolean apply(MetadataEntry input) {
return input.getKey().equals("KEY");
}
});
MetadataValue metadataValue = catalogApi.getMetadataApi(catalogUrn)
.getValue("KEY");
assertEquals(metadataValue.getValue(), existingMetadataEntry.getValue(), String.format(CORRECT_VALUE_OBJECT_FMT,
"Value", "MetadataValue", existingMetadataEntry.getValue(), metadataValue.getValue()));
checkMetadataValue(metadataValue);
String metadataValue = catalogApi.getMetadataApi(catalogUrn).get("KEY");
assertEquals(metadataValue, catalogMetadata.get("KEY"), String.format(CORRECT_VALUE_OBJECT_FMT, "Value",
"MetadataValue", catalogMetadata.get("KEY"), metadataValue));
}
@Test(description = "GET /catalogItem/{id}/metadata", dependsOnMethods = "testAddCatalogItem")
@ -213,12 +199,10 @@ public class CatalogApiLiveTest extends BaseVCloudDirectorApiLiveTest {
@Test(description = "POST /catalogItem/{id}/metadata", dependsOnMethods = "testAddCatalogItem")
public void testMergeCatalogItemMetadata() {
Metadata newMetadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "MARMALADE").build())
.entry(MetadataEntry.builder().entry("VEGIMITE", "VALUE").build()).build();
Metadata before = catalogApi.getItemMetadataApi(catalogItem.getId()).get();
Task mergeCatalogItemMetadata = catalogApi.getItemMetadataApi(catalogItem.getId()).merge(newMetadata);
Task mergeCatalogItemMetadata = catalogApi.getItemMetadataApi(catalogItem.getId()).putAll(
ImmutableMap.of("KEY", "MARMALADE", "VEGIMITE", "VALUE"));
checkTask(mergeCatalogItemMetadata);
assertTrue(retryTaskSuccess.apply(mergeCatalogItemMetadata),
String.format(TASK_COMPLETE_TIMELY, "mergeCatalogItemMetadata"));
@ -227,47 +211,40 @@ public class CatalogApiLiveTest extends BaseVCloudDirectorApiLiveTest {
assertTrue(mergedCatalogItemMetadata.getMetadataEntries().size() > before.getMetadataEntries().size(),
"Should have added at least one other MetadataEntry to the CatalogItem");
MetadataValue keyMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
assertEquals(keyMetadataValue.getValue(), "MARMALADE",
"The Value of the MetadataValue for KEY should have changed");
checkMetadataValue(keyMetadataValue);
String keyMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).get("KEY");
assertEquals(keyMetadataValue, "MARMALADE", "The Value of the MetadataValue for KEY should have changed");
MetadataValue newKeyMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("VEGIMITE");
String newKeyMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).get("VEGIMITE");
assertEquals(newKeyMetadataValue.getValue(), "VALUE",
"The Value of the MetadataValue for NEW_KEY should have been set");
checkMetadataValue(newKeyMetadataValue);
assertEquals(newKeyMetadataValue, "VALUE", "The Value of the MetadataValue for NEW_KEY should have been set");
}
@Test(description = "GET /catalogItem/{id}/metadata/{key}", dependsOnMethods = "testSetCatalogItemMetadataValue")
public void testGetCatalogItemMetadataValue() {
MetadataValue metadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
checkMetadataValue(metadataValue);
String metadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).get("KEY");
assertNotNull(metadataValue);
}
@Test(description = "PUT /catalogItem/{id}/metadata/{key}", dependsOnMethods = "testMergeCatalogItemMetadata")
public void testSetCatalogItemMetadataValue() {
MetadataValue newMetadataValue = MetadataValue.builder().value("NEW").build();
Task setCatalogItemMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).putEntry("KEY",
newMetadataValue);
Task setCatalogItemMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).put("KEY", "NEW");
checkTask(setCatalogItemMetadataValue);
assertTrue(retryTaskSuccess.apply(setCatalogItemMetadataValue),
String.format(TASK_COMPLETE_TIMELY, "setCatalogItemMetadataValue"));
MetadataValue editedMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
assertEquals(editedMetadataValue.getValue(), newMetadataValue.getValue(), String.format(CORRECT_VALUE_OBJECT_FMT,
"Value", "MetadataValue", newMetadataValue.getValue(), editedMetadataValue.getValue()));
checkMetadataValue(editedMetadataValue);
String editedMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).get("KEY");
assertEquals(editedMetadataValue, "NEW",
String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", "NEW", editedMetadataValue));
}
@Test(description = "DELETE /catalogItem/{id}/metadata/{key}", dependsOnMethods = "testGetCatalogItemMetadataValue")
public void testRemoveCatalogItemMetadataValue() {
Task removeCatalogItemMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).removeEntry("KEY");
Task removeCatalogItemMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).remove("KEY");
checkTask(removeCatalogItemMetadataValue);
assertTrue(retryTaskSuccess.apply(removeCatalogItemMetadataValue),
String.format(TASK_COMPLETE_TIMELY, "removeCatalogItemMetadataValue"));
MetadataValue removed = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
String removed = catalogApi.getItemMetadataApi(catalogItem.getId()).get("KEY");
assertNull(removed);
}

View File

@ -33,7 +33,6 @@ import org.jclouds.vcloud.director.v1_5.domain.Media;
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.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
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.Task;
@ -259,7 +258,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
Metadata inputMetadata = metadata();
Task expectedTask = mergeMetadataTask();
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).merge(inputMetadata), expectedTask);
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).putAll(inputMetadata), expectedTask);
}
public void testGetMetadataValue() {
@ -274,10 +273,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
.xmlFilePayload("/media/metadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE)
.httpResponseBuilder().build());
MetadataValue expected = metadataValue();
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).getValue("key"), expected);
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).get("key"), "value");
}
@Test
@ -294,11 +290,9 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
.xmlFilePayload("/media/setMetadataValueTask.xml", VCloudDirectorMediaType.TASK)
.httpResponseBuilder().build());
MetadataValue inputMetadataValue = MetadataValue.builder().value("value").build();
Task expectedTask = setMetadataEntryTask();
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).putEntry("key", inputMetadataValue), expectedTask);
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).put("key", "value"), expectedTask);
}
@Test
@ -314,9 +308,9 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
.xmlFilePayload("/media/removeMetadataEntryTask.xml", VCloudDirectorMediaType.TASK)
.httpResponseBuilder().build());
Task expectedTask = removeEntryTask();
Task expectedTask = removeTask();
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).removeEntry("key"), expectedTask);
assertEquals(api.getMediaApi().getMetadataApi(mediaUri).remove("key"), expectedTask);
}
@Test
@ -635,27 +629,6 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
.build();
}
private static MetadataValue metadataValue() {
return MetadataValue.builder()
.type("application/vnd.vmware.vcloud.metadata.value+xml")
.href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata/key"))
.link(Link.builder()
.rel("up")
.type("application/vnd.vmware.vcloud.metadata+xml")
.href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata"))
.build())
.link(Link.builder()
.rel("edit")
.type("application/vnd.vmware.vcloud.metadata.value+xml")
.href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata/key"))
.build())
.link(Link.builder()
.rel("remove")
.href(URI.create("https://mycloud.greenhousedata.com/api/media/c93e5cdc-f29a-4749-8ed2-093df04cc75e/metadata/key"))
.build())
.value("value").build();
}
private Task mergeMetadataTask() {
return Task.builder()
.status("running")
@ -722,7 +695,7 @@ public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
.build();
}
public static Task removeEntryTask() {
public static Task removeTask() {
return Task.builder()
.name("task")
.id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")

View File

@ -27,7 +27,6 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.G
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_ATTRB_DEL;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_CLONE;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_CONTAINS;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_LIST_SIZE_EQ;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_LIST_SIZE_GE;
@ -55,8 +54,6 @@ import org.jclouds.vcloud.director.v1_5.domain.File;
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.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.Owner;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.Task;
@ -69,7 +66,7 @@ import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
/**
@ -95,7 +92,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest {
private Media media, oldMedia;
private Owner owner;
private Metadata metadata;
private MetadataValue metadataValue;
private String metadataValue;
private String metadataEntryValue = "value";
@Override
@ -179,7 +176,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest {
owner = media.getOwner();
assertNotNull(owner, String.format(OBJ_FIELD_REQ_LIVE, MEDIA, "owner"));
Checks.checkResourceType(media.getOwner());
Checks.checkResource(media.getOwner());
Checks.checkMediaFor(MEDIA, media);
}
@ -193,7 +190,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest {
directOwner.toString()));
// parent type
Checks.checkResourceType(directOwner);
Checks.checkResource(directOwner);
// required
assertNotNull(directOwner.getUser(), String.format(OBJ_FIELD_REQ, "Owner", "user"));
@ -223,7 +220,7 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest {
assertTrue(media.clone(oldMedia),
String.format(OBJ_FIELD_CLONE, MEDIA, "copied media", media.toString(), oldMedia.toString()));
mediaApi.getMetadataApi(media.getId()).putEntry("key", MetadataValue.builder().value("value").build());
mediaApi.getMetadataApi(media.getId()).put("key", "value");
media = vdcApi
.cloneMedia(vdcUrn, CloneMediaParams.builder().source(Reference.builder().fromEntity(media).build())
@ -286,83 +283,59 @@ public class MediaApiLiveTest extends BaseVCloudDirectorApiLiveTest {
@Test(description = "POST /media/{id}/metadata", dependsOnMethods = { "testGetMedia" })
public void testMergeMetadata() {
// test new
Set<MetadataEntry> inputEntries = ImmutableSet.of(MetadataEntry.builder().entry("testKey", "testValue").build());
Metadata inputMetadata = Metadata.builder().entries(inputEntries).build();
Task mergeMetadata = mediaApi.getMetadataApi(media.getId()).merge(inputMetadata);
Task mergeMetadata = mediaApi.getMetadataApi(media.getId()).putAll(ImmutableMap.of("testKey", "testValue"));
Checks.checkTask(mergeMetadata);
assertTrue(retryTaskSuccess.apply(mergeMetadata), String.format(TASK_COMPLETE_TIMELY, "mergeMetadata(new)"));
metadata = mediaApi.getMetadataApi(media.getId()).get();
Checks.checkMetadataFor(MEDIA, metadata);
checkMetadataContainsEntries(metadata, inputEntries);
assertEquals(metadata.get("testKey"), "testValue");
media = mediaApi.get(media.getId());
Checks.checkMediaFor(MEDIA, media);
// test edit
inputEntries = ImmutableSet.of(MetadataEntry.builder().entry("testKey", "new testValue").build());
inputMetadata = Metadata.builder().entries(inputEntries).build();
mergeMetadata = mediaApi.getMetadataApi(media.getId()).merge(inputMetadata);
mergeMetadata = mediaApi.getMetadataApi(media.getId()).put("testKey", "new testValue");
Checks.checkTask(mergeMetadata);
assertTrue(retryTaskSuccess.apply(mergeMetadata), String.format(TASK_COMPLETE_TIMELY, "mergeMetadata(edit)"));
metadata = mediaApi.getMetadataApi(media.getId()).get();
Checks.checkMetadataFor(MEDIA, metadata);
checkMetadataContainsEntries(metadata, inputEntries);
assertEquals(metadata.get("testKey"), "new testValue");
media = mediaApi.get(media.getId());
Checks.checkMediaFor(MEDIA, media);
}
private void checkMetadataContainsEntries(Metadata metadata, Set<MetadataEntry> entries) {
for (MetadataEntry inputEntry : entries) {
boolean found = false;
for (MetadataEntry entry : metadata.getMetadataEntries()) {
if (equal(inputEntry.getKey(), entry.getKey())) {
found = true;
break;
}
}
if (!found) {
String.format(OBJ_FIELD_CONTAINS, MEDIA, "metadata", Iterables.toString(metadata.getMetadataEntries()),
Iterables.toString(entries));
}
}
}
@Test(description = "GET /media/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" })
public void testGetMetadataValue() {
metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("key");
Checks.checkMetadataValueFor(MEDIA, metadataValue);
metadataValue = mediaApi.getMetadataApi(media.getId()).get("key");
assertNotNull(metadataValue);
}
@Test(description = "PUT /media/{id}/metadata/{key}", dependsOnMethods = { "testMergeMetadata" })
public void testSetMetadataValue() {
metadataEntryValue = "value";
MetadataValue newValue = MetadataValue.builder().value(metadataEntryValue).build();
Task setMetadataEntry = mediaApi.getMetadataApi(media.getId()).putEntry("key", newValue);
Task setMetadataEntry = mediaApi.getMetadataApi(media.getId()).put("key", metadataEntryValue);
Checks.checkTask(setMetadataEntry);
assertTrue(retryTaskSuccess.apply(setMetadataEntry), String.format(TASK_COMPLETE_TIMELY, "setMetadataEntry"));
metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("key");
Checks.checkMetadataValueFor(MEDIA, metadataValue);
metadataValue = mediaApi.getMetadataApi(media.getId()).get("key");
assertNotNull(metadataValue);
}
@Test(description = "DELETE /media/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata",
"testGetMetadataValue" })
public void testRemoveMetadata() {
Task removeEntry = mediaApi.getMetadataApi(media.getId()).removeEntry("testKey");
Checks.checkTask(removeEntry);
assertTrue(retryTaskSuccess.apply(removeEntry), String.format(TASK_COMPLETE_TIMELY, "removeEntry"));
Task remove = mediaApi.getMetadataApi(media.getId()).remove("testKey");
Checks.checkTask(remove);
assertTrue(retryTaskSuccess.apply(remove), String.format(TASK_COMPLETE_TIMELY, "remove"));
metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("testKey");
metadataValue = mediaApi.getMetadataApi(media.getId()).get("testKey");
assertNull(metadataValue, String.format(OBJ_FIELD_ATTRB_DEL, MEDIA, "Metadata",
metadataValue != null ? metadataValue.toString() : "", "MetadataEntry",
metadataValue != null ? metadataValue.toString() : ""));
metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("key");
Checks.checkMetadataValueFor(MEDIA, metadataValue);
metadataValue = mediaApi.getMetadataApi(media.getId()).get("key");
assertNotNull(metadataValue);
media = mediaApi.get(media.getId());
Checks.checkMediaFor(MEDIA, media);

View File

@ -38,7 +38,6 @@ 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.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.network.DhcpService;
import org.jclouds.vcloud.director.v1_5.domain.network.IpAddresses;
import org.jclouds.vcloud.director.v1_5.domain.network.IpRange;
@ -216,22 +215,9 @@ public class NetworkApiExpectTest extends VCloudDirectorAdminApiExpectTest {
@Test
public void testGetNetworkMetadataEntryHref() {
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadataValue, getMetadataValueResponse);
assertEquals(api.getNetworkApi().getMetadataApi(networkHref).getValue("KEY"), metadataValue());
assertEquals(api.getNetworkApi().getMetadataApi(networkHref).get("KEY"), "value");
}
private MetadataValue metadataValue() {
return MetadataValue.builder()
.href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata/key"))
.link(Link.builder()
.rel("up")
.type("application/vnd.vmware.vcloud.metadata+xml")
.href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata"))
.build())
.value("value")
.build();
}
public static OrgNetwork network() {
return OrgNetwork.builder()
.name("ilsolation01-Jclouds")

View File

@ -24,7 +24,7 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.O
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REQUIRED_VALUE_OBJECT_FMT;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkResourceType;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkResource;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
@ -33,7 +33,6 @@ import static org.testng.Assert.assertTrue;
import org.jclouds.vcloud.director.v1_5.domain.Checks;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.domain.network.Network;
import org.jclouds.vcloud.director.v1_5.domain.org.OrgNetwork;
@ -71,7 +70,7 @@ public class NetworkApiLiveTest extends BaseVCloudDirectorApiLiveTest {
public void cleanUp() {
if (metadataSet) {
try {
Task remove = adminContext.getApi().getNetworkApi().getMetadataApi(networkUrn).removeEntry("key");
Task remove = adminContext.getApi().getNetworkApi().getMetadataApi(networkUrn).remove("key");
taskDoneEventually(remove);
} catch (Exception e) {
logger.warn(e, "Error when deleting metadata");
@ -95,8 +94,8 @@ public class NetworkApiLiveTest extends BaseVCloudDirectorApiLiveTest {
}
private void setupMetadata() {
adminContext.getApi().getNetworkApi().getMetadataApi(networkUrn)
.putEntry("key", MetadataValue.builder().value("value").build());
//TODO: block until complete
adminContext.getApi().getNetworkApi().getMetadataApi(networkUrn).put("key", "value");
metadataSet = true;
}
@ -112,7 +111,7 @@ public class NetworkApiLiveTest extends BaseVCloudDirectorApiLiveTest {
String.format(OBJ_FIELD_REQ_LIVE, NETWORK, "metadata.entries"));
// parent type
checkResourceType(metadata);
checkResource(metadata);
for (MetadataEntry entry : metadata.getMetadataEntries()) {
// required elements and attributes
@ -122,21 +121,14 @@ public class NetworkApiLiveTest extends BaseVCloudDirectorApiLiveTest {
String.format(OBJ_FIELD_ATTRB_REQ, networkApi, "MetadataEntry", entry.getValue(), "value"));
// parent type
checkResourceType(entry);
checkResource(entry);
}
}
@Test(description = "GET /network/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" })
public void testGetMetadataValue() {
MetadataValue metadataValue = networkApi.getMetadataApi(networkUrn).getValue("key");
String metadataValue = networkApi.getMetadataApi(networkUrn).get("key");
// Check parent type
checkResourceType(metadataValue);
// Check required elements and attributes
String value = metadataValue.getValue();
assertNotNull(value,
String.format(OBJ_FIELD_ATTRB_REQ, NETWORK, "MetadataEntry", metadataValue.toString(), "value"));
assertEquals(value, "value", String.format(OBJ_FIELD_EQ, NETWORK, "metadataEntry.value", "value", value));
assertEquals(metadataValue, "value", String.format(OBJ_FIELD_EQ, NETWORK, "metadataEntry.value", "value", metadataValue));
}
}

View File

@ -33,7 +33,6 @@ import org.jclouds.http.HttpResponse;
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.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.org.Org;
import org.jclouds.vcloud.director.v1_5.domain.org.OrgList;
@ -179,7 +178,7 @@ public class OrgApiExpectTest extends VCloudDirectorAdminApiExpectTest {
@Test
public void testGetOrgMetadataEntryHref() {
VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadataValue, getMetadataValueResponse);
assertEquals(api.getOrgApi().getMetadataApi(orgHref).getValue("KEY"), metadataValue());
assertEquals(api.getOrgApi().getMetadataApi(orgHref).get("KEY"), "VALUE");
}
public static Org org() {
@ -243,16 +242,4 @@ public class OrgApiExpectTest extends VCloudDirectorAdminApiExpectTest {
.entry("KEY", "VALUE")
.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();
}
}

View File

@ -22,7 +22,6 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.C
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_EMPTY_OBJECT_FMT;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOrg;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkReferenceType;
import static org.testng.Assert.assertEquals;
@ -32,7 +31,6 @@ import static org.testng.Assert.assertNotNull;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
import org.jclouds.vcloud.director.v1_5.domain.AdminCatalog;
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.Reference;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.domain.org.OrgList;
@ -67,7 +65,7 @@ public class OrgApiLiveTest extends BaseVCloudDirectorApiLiveTest {
public void cleanUp() throws Exception {
if (adminMembersSet) {
try {
Task remove = adminContext.getApi().getOrgApi().getMetadataApi(orgUrn).removeEntry("KEY");
Task remove = adminContext.getApi().getOrgApi().getMetadataApi(orgUrn).remove("KEY");
taskDoneEventually(remove);
} catch (Exception e) {
logger.warn(e, "Error when deleting metadata entry");
@ -126,8 +124,8 @@ public class OrgApiLiveTest extends BaseVCloudDirectorApiLiveTest {
* the need for configuration
*/
private void setupAdminMembers() {
adminContext.getApi().getOrgApi().getMetadataApi(orgUrn)
.putEntry("KEY", MetadataValue.builder().value("VALUE").build());
//TODO: block until complete
adminContext.getApi().getOrgApi().getMetadataApi(orgUrn).put("KEY", "VALUE");
AdminCatalog newCatalog = AdminCatalog.builder().name("Test Catalog " + getTestDateTimeStamp())
.description("created by testOrg()").build();
@ -156,16 +154,14 @@ public class OrgApiLiveTest extends BaseVCloudDirectorApiLiveTest {
@Test(description = "GET /org/{id}/metadata/{key}", dependsOnMethods = { "testGetOrgMetadata" })
public void testGetOrgMetadataValue() {
// Call the method being tested
MetadataValue value = orgApi.getMetadataApi(orgUrn).getValue("KEY");
String value = orgApi.getMetadataApi(orgUrn).get("KEY");
// NOTE The environment MUST have configured the metadata entry as '{ key="KEY", value="VALUE"
// )'
String expected = "VALUE";
checkMetadataValue(value);
assertEquals(value.getValue(), expected,
String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, value.getValue()));
assertEquals(value, expected, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, value));
}
}

View File

@ -31,8 +31,6 @@ import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkLeaseSettingsS
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataKeyAbsentFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValueFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkNetworkConfigSection;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkNetworkSection;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOwner;
@ -59,8 +57,6 @@ import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest;
import org.jclouds.vcloud.director.v1_5.domain.AccessSetting;
import org.jclouds.vcloud.director.v1_5.domain.Checks;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Owner;
import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
@ -117,7 +113,6 @@ import com.google.common.collect.Sets;
@Test(singleThreaded = true, testName = "VAppApiLiveTest")
public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
private MetadataValue metadataValue;
private String key;
private boolean testUserCreated = false;
private User user;
@ -751,22 +746,20 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
public void testSetMetadataValue() {
key = name("key-");
String value = name("value-");
metadataValue = MetadataValue.builder().value(value).build();
vAppApi.getMetadataApi(vAppUrn).putEntry(key, metadataValue);
vAppApi.getMetadataApi(vAppUrn).put(key, value);
// Retrieve the value, and assert it was set correctly
MetadataValue newMetadataValue = vAppApi.getMetadataApi(vAppUrn).getValue(key);
String newMetadataValue = vAppApi.getMetadataApi(vAppUrn).get(key);
// Check the retrieved object is well formed
checkMetadataValueFor(VAPP, newMetadataValue, value);
assertEquals(newMetadataValue, value);
}
@Test(groups = { "live", "user" }, description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" })
public void testGetMetadata() {
key = name("key-");
String value = name("value-");
metadataValue = MetadataValue.builder().value(value).build();
vAppApi.getMetadataApi(vAppUrn).putEntry(key, metadataValue);
vAppApi.getMetadataApi(vAppUrn).put(key, value);
// Call the method being tested
Metadata metadata = vAppApi.getMetadataApi(vAppUrn).get();
@ -783,23 +776,18 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
key = name("key-");
String value = name("value-");
metadataValue = MetadataValue.builder().value(value).build();
vAppApi.getMetadataApi(vAppUrn).putEntry(key, metadataValue);
vAppApi.getMetadataApi(vAppUrn).put(key, value);
// Call the method being tested
MetadataValue newValue = vAppApi.getMetadataApi(vAppUrn).getValue(key);
String newValue = vAppApi.getMetadataApi(vAppUrn).get(key);
String expected = metadataValue.getValue();
checkMetadataValue(newValue);
assertEquals(newValue.getValue(), expected,
String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, newValue.getValue()));
assertEquals(newValue, value, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", value, newValue));
}
@Test(groups = { "live", "user" }, description = "DELETE /vApp/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" })
public void testRemoveMetadataEntry() {
// Delete the entry
Task task = vAppApi.getMetadataApi(vAppUrn).removeEntry(key);
Task task = vAppApi.getMetadataApi(vAppUrn).remove(key);
retryTaskSuccess.apply(task);
// Confirm the entry has been removed
@ -817,8 +805,7 @@ public class VAppApiLiveTest extends AbstractVAppApiLiveTest {
// Store a value, to be removed
String key = name("key-");
String value = name("value-");
Metadata addedMetadata = Metadata.builder().entry(MetadataEntry.builder().key(key).value(value).build()).build();
Task task = vAppApi.getMetadataApi(vAppUrn).merge(addedMetadata);
Task task = vAppApi.getMetadataApi(vAppUrn).putAll(ImmutableMap.of(key, value));
retryTaskSuccess.apply(task);
// Confirm the entry contains everything that was there, and everything that was being added

View File

@ -78,7 +78,7 @@ public class VAppNetworksLiveTest extends AbstractVAppApiLiveTest {
protected void tidyUp() {
if (key != null) {
try {
Task remove = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).removeEntry(key);
Task remove = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).remove(key);
taskDoneEventually(remove);
} catch (Exception e) {
logger.warn(e, "Error when deleting metadata entry '%s'", key);

View File

@ -42,7 +42,6 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
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.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
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.Task;
@ -251,7 +250,7 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
assertEquals(metadata, exampleMetadata());
Task task = api.getMetadataApi(uri).merge(exampleMetadata());
Task task = api.getMetadataApi(uri).putAll(exampleMetadata());
assertNotNull(task);
}
@ -276,7 +275,7 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
new VcloudHttpRequestPrimer().apiCommand("POST", templateId + "/metadata").xmlFilePayload("/vapptemplate/metadata.xml", METADATA).acceptMedia(TASK).httpRequestBuilder().build(),
new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
api.getMetadataApi(uri).merge(exampleMetadata());
api.getMetadataApi(uri).putAll(exampleMetadata());
}
public void testVappTemplateMetadataValue() {
@ -293,14 +292,14 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
).getVAppTemplateApi();
assertNotNull(api);
MetadataValue metadata = api.getMetadataApi(uri).getValue("12345");
String metadata = api.getMetadataApi(uri).get("12345");
assertEquals(metadata, exampleMetadataValue());
assertEquals(metadata, "some value");
Task task = api.getMetadataApi(uri).putEntry("12345", exampleMetadataValue());
Task task = api.getMetadataApi(uri).put("12345", "some value");
assertNotNull(task);
task = api.getMetadataApi(uri).removeEntry("12345");
task = api.getMetadataApi(uri).remove("12345");
assertNotNull(task);
}
@ -312,7 +311,7 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
new VcloudHttpRequestPrimer().apiCommand("GET", templateId + "/metadata/12345").acceptMedia(METADATA_ENTRY).httpRequestBuilder().build(),
new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi();
assertNull(api.getMetadataApi(uri).getValue("12345"));
assertNull(api.getMetadataApi(uri).get("12345"));
}
@Test(expectedExceptions = VCloudDirectorException.class)
@ -324,7 +323,7 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/metadata/12345").xmlFilePayload("/vapptemplate/metadataValue.xml", METADATA_ENTRY).acceptMedia(TASK).httpRequestBuilder().build(),
new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
api.getMetadataApi(uri).putEntry("12345", exampleMetadataValue());
api.getMetadataApi(uri).put("12345", "some value");
}
@Test(expectedExceptions = ResourceNotFoundException.class)
@ -336,7 +335,7 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
new VcloudHttpRequestPrimer().apiCommand("DELETE", templateId + "/metadata/12345").acceptMedia(TASK).httpRequestBuilder().build(),
new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi();
api.getMetadataApi(uri).removeEntry("12345");
api.getMetadataApi(uri).remove("12345");
}
@Test(expectedExceptions = VCloudDirectorException.class)
@ -437,8 +436,4 @@ public class VAppTemplateApiExpectTest extends VCloudDirectorAdminApiExpectTest
.entry(MetadataEntry.builder().key("key").value("value").build()).build();
}
private MetadataValue exampleMetadataValue() {
return MetadataValue.builder().value("some value").build();
}
}

View File

@ -23,7 +23,6 @@ import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkLeaseSettingsS
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataKeyAbsentFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkNetworkConfigSection;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOvfEnvelope;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOvfNetworkSection;
@ -48,7 +47,6 @@ import org.jclouds.vcloud.director.v1_5.domain.Link;
import org.jclouds.vcloud.director.v1_5.domain.Link.Rel;
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.Owner;
import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
@ -84,7 +82,7 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest {
protected void tidyUp() {
if (key != null) {
try {
Task remove = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).removeEntry(key);
Task remove = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).remove(key);
taskDoneEventually(remove);
} catch (Exception e) {
logger.warn(e, "Error when deleting metadata entry '%s'", key);
@ -157,10 +155,9 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest {
Metadata metadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();
MetadataEntry entry = Iterables.get(metadata.getMetadataEntries(), 0);
MetadataValue val = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).getValue(entry.getKey());
String val = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get(entry.getKey());
checkMetadataValue(val);
assertEquals(val.getValue(), entry.getValue());
assertEquals(val, entry.getValue());
}
@Test(description = "GET /vAppTemplate/{id}/networkConfigSection")
@ -205,10 +202,8 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest {
key = name("key-");
val = name("value-");
MetadataEntry metadataEntry = MetadataEntry.builder().entry(key, val).build();
Metadata metadata = Metadata.builder().fromMetadata(oldMetadata).entry(metadataEntry).build();
final Task task = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).merge(metadata);
final Task task = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).putAll(ImmutableMap.of(key, val));
assertTaskSucceeds(task);
Metadata newMetadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();
@ -220,18 +215,17 @@ public class VAppTemplateApiLiveTest extends AbstractVAppApiLiveTest {
@Test(description = "PUT /vAppTemplate/{id}/metadata/{key}", dependsOnMethods = { "testEditMetadata" })
public void testEditMetadataValue() {
val = "new" + val;
MetadataValue metadataValue = MetadataValue.builder().value(val).build();
final Task task = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).putEntry(key, metadataValue);
final Task task = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).put(key, val);
retryTaskSuccess.apply(task);
MetadataValue newMetadataValue = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).getValue(key);
assertEquals(newMetadataValue.getValue(), metadataValue.getValue());
String newMetadataValue = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get(key);
assertEquals(newMetadataValue, val);
}
@Test(description = "DELETE /vAppTemplate/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadataValue" })
public void testRemoveVAppTemplateMetadataValue() {
final Task deletionTask = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).removeEntry(key);
final Task deletionTask = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).remove(key);
assertTaskSucceeds(deletionTask);
Metadata newMetadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();

View File

@ -35,7 +35,6 @@ 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.ImageType;
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.Owner;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.User;
@ -371,9 +370,7 @@ public class VdcApiExpectTest extends VCloudDirectorAdminApiExpectTest {
.xmlFilePayload("/vdc/metadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE)
.httpResponseBuilder().build());
MetadataValue expected = metadataValue();
assertEquals(api.getVdcApi().getMetadataApi(vdcUri).getValue("key"), expected);
assertEquals(api.getVdcApi().getMetadataApi(vdcUri).get("key"), "");
}
public static Vdc getVdc() {
@ -582,9 +579,4 @@ public class VdcApiExpectTest extends VCloudDirectorAdminApiExpectTest {
return null;
}
private MetadataValue metadataValue() {
// TODO Auto-generated method stub
return null;
}
}

View File

@ -24,8 +24,8 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.O
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import java.util.Map;
@ -33,8 +33,6 @@ import java.util.Set;
import org.jclouds.vcloud.director.v1_5.domain.Checks;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
import org.jclouds.vcloud.director.v1_5.domain.ResourceEntity;
import org.jclouds.vcloud.director.v1_5.domain.Task;
@ -123,7 +121,7 @@ public class VdcApiLiveTest extends BaseVCloudDirectorApiLiveTest {
if (metadataSet) {
try {
Task remove = adminContext.getApi().getVdcApi().getMetadataApi(vdcUrn).removeEntry("key");
Task remove = adminContext.getApi().getVdcApi().getMetadataApi(vdcUrn).remove("key");
taskDoneEventually(remove);
} catch (Exception e) {
logger.warn(e, "Error deleting metadata entry");
@ -323,13 +321,9 @@ public class VdcApiLiveTest extends BaseVCloudDirectorApiLiveTest {
String key = Iterables.getFirst(metadataMap.keySet(), "MadeUpKey!");
String value = metadataMap.get(key);
MetadataValue metadataValue = vdcApi.getMetadataApi(vdcUrn).getValue(key);
String metadataValue = vdcApi.getMetadataApi(vdcUrn).get(key);
Checks.checkMetadataValueFor(VDC, metadataValue, value);
assertEquals(metadataValue, value);
}
private void setupMetadata() {
adminContext.getApi().getVdcApi().getMetadataApi(vdcUrn).putEntry("key", MetadataValue.builder().value("value").build());
metadataSet = true;
}
}

View File

@ -28,8 +28,6 @@ import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkGuestCustomiza
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataKeyAbsentFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValueFor;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkNetworkConnectionSection;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOperatingSystemSection;
import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkProductSectionList;
@ -59,8 +57,6 @@ import org.jclouds.dmtf.ovf.ProductSection;
import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest;
import org.jclouds.vcloud.director.v1_5.domain.Checks;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
import org.jclouds.vcloud.director.v1_5.domain.RasdItemsList;
import org.jclouds.vcloud.director.v1_5.domain.Reference;
@ -104,7 +100,7 @@ import com.google.common.collect.Sets;
@Test(groups = { "live", "user" }, singleThreaded = true, testName = "VmApiLiveTest")
public class VmApiLiveTest extends AbstractVAppApiLiveTest {
private MetadataValue metadataValue;
private String metadataValue;
private String key;
private boolean testUserCreated = false;
@ -872,15 +868,16 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest {
@Test(description = "PUT /vApp/{id}/metadata/{key}", dependsOnMethods = { "testGetVm" })
public void testSetMetadataValue() {
key = name("key-");
String value = name("value-");
metadataValue = MetadataValue.builder().value(value).build();
vmApi.getMetadataApi(vmUrn).putEntry(key, metadataValue);
metadataValue = name("value-");
//TODO: block!!
vmApi.getMetadataApi(vmUrn).put(key, metadataValue);
// Retrieve the value, and assert it was set correctly
MetadataValue newMetadataValue = vmApi.getMetadataApi(vmUrn).getValue(key);
String newMetadataValue = vmApi.getMetadataApi(vmUrn).get(key);
// Check the retrieved object is well formed
checkMetadataValueFor(VM, newMetadataValue, value);
assertEquals(newMetadataValue, metadataValue,
String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", metadataValue, newMetadataValue));
}
@Test(description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" })
@ -898,24 +895,22 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest {
@Test(description = "GET /vApp/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" })
public void testGetOrgMetadataValue() {
key = name("key-");
String value = name("value-");
metadataValue = MetadataValue.builder().value(value).build();
vmApi.getMetadataApi(vmUrn).putEntry(key, metadataValue);
metadataValue = name("value-");
//TODO: block!!
vmApi.getMetadataApi(vmUrn).put(key, metadataValue);
// Call the method being tested
MetadataValue metadataValue = vmApi.getMetadataApi(vmUrn).getValue(key);
String newMetadataValue = vmApi.getMetadataApi(vmUrn).get(key);
String expected = metadataValue.getValue();
checkMetadataValue(metadataValue);
assertEquals(metadataValue.getValue(), expected,
String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, metadataValue.getValue()));
assertEquals(newMetadataValue, metadataValue,
String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", metadataValue, newMetadataValue));
}
@Test(description = "DELETE /vApp/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" })
public void testRemoveMetadataEntry() {
// Delete the entry
Task task = vmApi.getMetadataApi(vmUrn).removeEntry(key);
Task task = vmApi.getMetadataApi(vmUrn).remove(key);
retryTaskSuccess.apply(task);
// Confirm the entry has been removed
@ -933,8 +928,7 @@ public class VmApiLiveTest extends AbstractVAppApiLiveTest {
// Store a value, to be removed
String key = name("key-");
String value = name("value-");
Metadata addedMetadata = Metadata.builder().entry(MetadataEntry.builder().key(key).value(value).build()).build();
Task task = vmApi.getMetadataApi(vmUrn).merge(addedMetadata);
Task task = vmApi.getMetadataApi(vmUrn).putAll(ImmutableMap.of(key, value));
retryTaskSuccess.apply(task);
// Confirm the entry contains everything that was there, and everything that was being added

View File

@ -21,14 +21,12 @@ package org.jclouds.vcloud.director.v1_5.features.admin;
import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.fail;
import static org.testng.Assert.assertNull;
import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
import org.jclouds.vcloud.director.v1_5.domain.AdminVdc;
import org.jclouds.vcloud.director.v1_5.domain.Checks;
import org.jclouds.vcloud.director.v1_5.domain.Metadata;
import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
import org.jclouds.vcloud.director.v1_5.domain.Task;
import org.jclouds.vcloud.director.v1_5.features.MetadataApi;
import org.jclouds.vcloud.director.v1_5.features.VdcApi;
@ -37,6 +35,8 @@ import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
/**
* Tests behavior of {@link VdcApi}
*
@ -67,7 +67,7 @@ public class AdminVdcApiLiveTest extends BaseVCloudDirectorApiLiveTest {
public void cleanUp() throws Exception {
if (metadataKey != null) {
try {
Task task = metadataApi.removeEntry(metadataKey);
Task task = metadataApi.remove(metadataKey);
taskDoneEventually(task);
} catch (VCloudDirectorException e) {
logger.warn(e, "Error deleting metadata-value (perhaps it doesn't exist?); continuing...");
@ -171,36 +171,33 @@ public class AdminVdcApiLiveTest extends BaseVCloudDirectorApiLiveTest {
public void testSetMetadata() throws Exception {
metadataKey = name("key-");
metadataValue = name("value-");
Metadata metadata = Metadata.builder().entry(MetadataEntry.builder().entry(metadataKey, metadataValue).build())
.build();
Task task = metadataApi.merge(metadata);
Task task = metadataApi.putAll(ImmutableMap.of(metadataKey, metadataValue));
assertTaskSucceeds(task);
MetadataValue modified = metadataApi.getValue(metadataKey);
Checks.checkMetadataValueFor("AdminVdc", modified, metadataValue);
Checks.checkMetadata(metadata);
String modified = metadataApi.get(metadataKey);
assertEquals(modified, metadataValue);
}
// TODO insufficient permissions to test
@Test(description = "GET /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadata" }, enabled = false)
public void testGetMetadataValue() throws Exception {
MetadataValue retrievedMetadataValue = metadataApi.getValue(metadataKey);
String retrievedMetadataValue = metadataApi.get(metadataKey);
Checks.checkMetadataValueFor("AdminVdc", retrievedMetadataValue, metadataValue);
assertEquals(retrievedMetadataValue, metadataValue);
}
// TODO insufficient permissions to test
@Test(description = "PUT /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadataValue" }, enabled = false)
public void testSetMetadataValue() throws Exception {
metadataValue = name("value-");
MetadataValue newV = MetadataValue.builder().value(metadataValue).build();
Task task = metadataApi.putEntry(metadataKey, newV);
Task task = metadataApi.put(metadataKey, metadataValue);
assertTaskSucceeds(task);
MetadataValue retrievedMetadataValue = metadataApi.getValue(metadataKey);
Checks.checkMetadataValueFor("AdminVdc", retrievedMetadataValue, metadataValue);
String retrievedMetadataValue = metadataApi.get(metadataKey);
assertEquals(retrievedMetadataValue, metadataValue);
}
// TODO insufficient permissions to test
@ -208,14 +205,9 @@ public class AdminVdcApiLiveTest extends BaseVCloudDirectorApiLiveTest {
public void testRemoveMetadataValue() throws Exception {
// TODO Remove dependency on other tests; make cleanUp remove a list of metadata entries?
Task task = metadataApi.removeEntry(metadataKey);
Task task = metadataApi.remove(metadataKey);
assertTaskSucceeds(task);
try {
metadataApi.getValue(metadataKey);
fail("Retrieval of metadata value " + metadataKey + " should have fail after deletion");
} catch (VCloudDirectorException e) {
// success; should not be accessible
}
assertNull(metadataApi.get(metadataKey));
}
}

View File

@ -234,7 +234,7 @@ public abstract class BaseVCloudDirectorExpectTest<T> extends BaseRestApiExpectT
@Deprecated
protected class VcloudHttpResponsePrimer {
private HttpResponse.Builder<?> builder = HttpResponse.builder();
private HttpResponse.Builder<?> builder = HttpResponse.builder().statusCode(200);
public VcloudHttpResponsePrimer() {
}

View File

@ -1,4 +1,3 @@
<MetadataValue
xmlns="http://www.vmware.com/vcloud/v1.5">
<MetadataValue xmlns="http://www.vmware.com/vcloud/v1.5">
<Value>some value</Value>
</MetadataValue>