diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java new file mode 100644 index 0000000000..cc22cc5dcb --- /dev/null +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java @@ -0,0 +1,91 @@ +package org.jclouds.vcloud.director.v1_5.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NS; + +import java.util.Set; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import com.google.common.base.Objects; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; + +@XmlRootElement(namespace = NS, name = "MetaDataList") +public class Metadata { + + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromMetadataList(this); + } + + public static class Builder { + + private Set metadata = Sets.newLinkedHashSet(); + + /** + * @see OrgList#getOrgs + */ + public Builder metadata(Set orgs) { + this.metadata = Sets.newLinkedHashSet(checkNotNull(orgs, "metadata")); + return this; + } + + /** + * @see OrgList#getOrgs + */ + public Builder addMetadata(MetadataEntry org) { + metadata.add(checkNotNull(org, "metadatum")); + return this; + } + + public Metadata build() { + return new Metadata(metadata); + } + + public Builder fromMetadataList(Metadata in) { + return metadata(in.getMetadata()); + } + } + + private Metadata() { + // For JAXB and builder use + } + + private Metadata(Set orgs) { + this.metadata = ImmutableSet.copyOf(orgs); + } + + @XmlElement(namespace = NS, name = "MetaData") + private Set metadata = Sets.newLinkedHashSet(); + + public Set getMetadata() { + return ImmutableSet.copyOf(metadata); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + Metadata that = Metadata.class.cast(o); + return equal(metadata, that.metadata); + } + + @Override + public int hashCode() { + return Objects.hashCode(metadata); + } + + @Override + public String toString() { + return Objects.toStringHelper("").add("metadata", metadata).toString(); + } + +} diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java new file mode 100644 index 0000000000..d48fb31cad --- /dev/null +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java @@ -0,0 +1,148 @@ +package org.jclouds.vcloud.director.v1_5.domain; + +import static com.google.common.base.Objects.equal; +import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NS; + +import java.net.URI; +import java.util.Set; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +import com.google.common.base.Objects; +import com.google.common.base.Objects.ToStringHelper; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Sets; + +@XmlRootElement(namespace = NS, name = "org/metadata") +public class MetadataEntry extends BaseResource { + + @SuppressWarnings("unchecked") + public static Builder builder() { + return new Builder(); + } + + public Builder toBuilder() { + return new Builder().fromMetadatum(this); + } + + public static class Builder extends BaseResource.Builder { + + private String key; + private String value; + private Set links = Sets.newLinkedHashSet(); + + /** + * @see MetadataEntry#getKey + */ + public Builder key(String key) { + this.key = key; + return this; + } + + /** + * @see MetadataEntry#getValue + */ + public Builder value(String value) { + this.value = value; + return this; + } + + /** + * @see MetadataEntry#? + */ + public Builder links(Set links) { + this.links = Sets.newLinkedHashSet(checkNotNull(links, "links")); + return this; + } + + /** + * @see MetadataEntry#? + */ + public Builder addLink(Link org) { + links.add(checkNotNull(org, "org")); + return this; + } + + public MetadataEntry build() { + return new MetadataEntry(href, type, key, value, links); + } + + public Builder fromMetadatum(MetadataEntry in) { + return key(in.getKey()).value(in.getValue()); + } + + @Override + public Builder href(URI href) { + return Builder.class.cast(super.href(href)); + } + + @Override + public Builder type(String type) { + return Builder.class.cast(super.type(type)); + } + + } + + private MetadataEntry() { + // For JAXB and builder use + } + + private MetadataEntry(URI href, String type, String key, String value, Set links) { + super(href, type); + this.key = key; + this.value = value; + this.links = ImmutableSet.copyOf(links); + } + + @XmlAttribute + private String key; + @XmlElement(namespace = NS, name = "Value") + private String value; + @XmlElement(namespace = NS, name = "Link") + private Set links = Sets.newLinkedHashSet(); + + /** + * + * @return key of the entry + */ + public String getKey() { + return key; + } + + /** + * + * @return value of the entry + */ + public String getValue() { + return value; + } + + /** + * TODO + */ + public Set getLinks() { + return ImmutableSet.copyOf(links); + } + + + @Override + public boolean equals(Object o) { + if (!super.equals(o)) + return false; + MetadataEntry that = MetadataEntry.class.cast(o); + return equal(key, that.key); + } + + @Override + public int hashCode() { + return super.hashCode() + Objects.hashCode(key); + } + + @Override + public ToStringHelper string() { + return super.string().add("key", key).add("value", value); + } +} diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java index 3a6d8d50b3..d5078f52c4 100644 --- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java +++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgClient.java @@ -22,6 +22,8 @@ import java.net.URI; 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.MetadataEntry; import org.jclouds.vcloud.director.v1_5.domain.Org; import org.jclouds.vcloud.director.v1_5.domain.OrgList; @@ -49,4 +51,18 @@ public interface OrgClient { * @return the org or null if not found */ Org getOrg(URI orgHref); + + /** + * Retrieves an list of the organization's metadata + * + * @return a list of metadata + */ + Metadata getMetadata(URI orgRef); + + /** + * Retrieves a metadata + * + * @return the metadata or null if not found + */ + MetadataEntry getMetadataEntry(URI metaDataRef); } diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java index 91298a7eb7..4efd508409 100644 --- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java +++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgClientExpectTest.java @@ -27,6 +27,8 @@ import org.jclouds.http.HttpResponse; import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient; import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType; 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.Org; import org.jclouds.vcloud.director.v1_5.domain.OrgList; import org.jclouds.vcloud.director.v1_5.domain.Reference; @@ -45,29 +47,32 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest @Test public void testWhenResponseIs2xxLoginReturnsValidOrgList() { HttpRequest orgListRequest = HttpRequest.builder() - .method("GET") - .endpoint(URI.create("http://localhost/api/org/")) - .headers(ImmutableMultimap. builder() - .put("Accept", "*/*") - .put("x-vcloud-authorization", token) - .build()) - .build(); + .method("GET") + .endpoint(URI.create("http://localhost/api/org/")) + .headers(ImmutableMultimap. builder() + .put("Accept", "*/*") + .put("x-vcloud-authorization",token) + .build()) + .build(); HttpResponse orgListResponse = HttpResponse.builder() - .statusCode(200) - .payload(payloadFromResourceWithContentType("/orglist.xml", VCloudDirectorMediaType.ORGLIST_XML + ";version=1.5")) - .build(); + .statusCode(200) + .payload(payloadFromResourceWithContentType("/org/orglist.xml", VCloudDirectorMediaType.ORGLIST_XML + +";version=1.5")) + .build(); - VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgListRequest, orgListResponse); + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgListRequest, + orgListResponse); + + OrgList actual = OrgList.builder() + .org(OrgLink.builder() + .type("application/vnd.vmware.vcloud.org+xml") + .name("JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .build(); - assertEquals(client.getOrgClient().getOrgList(), OrgList.builder() - .org(Reference.builder() - .type("application/vnd.vmware.vcloud.org+xml") - .name("JClouds") - .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) - .build()) - .build() - ); + assertEquals(client.getOrgClient().getOrgList(), actual); } @Test @@ -75,67 +80,104 @@ public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"); HttpRequest orgRequest = HttpRequest.builder() - .method("GET") - .endpoint(orgRef) - .headers(ImmutableMultimap. builder() - .put("Accept", "*/*") - .put("x-vcloud-authorization", token) - .build()) - .build(); + .method("GET") + .endpoint(orgRef) + .headers(ImmutableMultimap. builder() + .put("Accept", "*/*") + .put("x-vcloud-authorization", token) + .build()) + .build(); HttpResponse orgResponse = HttpResponse.builder() - .statusCode(200) - .payload(payloadFromResourceWithContentType("/org.xml", VCloudDirectorMediaType.ORG_XML + ";version=1.5")) - .build(); + .statusCode(200) + .payload(payloadFromResourceWithContentType("/org/org.xml", VCloudDirectorMediaType.ORG_XML + ";version=1.5")) + .build(); VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgRequest, orgResponse); + + Org actual = Org + .builder() + .name("JClouds") + .description("") + .fullName("JClouds") + .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0") + .type(VCloudDirectorMediaType.ORG_XML) + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.vdc+xml") + .name("Cluster01-JClouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.tasksList+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.catalog+xml") + .name("Public") + .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.controlAccess+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c/controlAccess/")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.orgNetwork+xml") + .name("ilsolation01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/network/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.orgNetwork+xml") + .name("internet01-Jclouds") + .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c")) + .build()) + .link(Link.builder() + .rel("down") + .type("application/vnd.vmware.vcloud.metadata+xml") + .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata")) + .build()) + .build(); - assertEquals(client.getOrgClient().getOrg(orgRef), Org.builder() - .name("JClouds") - .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0") - .type(VCloudDirectorMediaType.ORG_XML) - .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) - .link(Link.builder() - .rel("down") - .type("application/vnd.vmware.vcloud.vdc+xml") - .name("Cluster01-JClouds") - .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07")) - .build()) - .link(Link.builder() - .type("application/vnd.vmware.vcloud.tasksList+xml") - .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")) - .build()) - .link(Link.builder() - .rel("down") - .type("application/vnd.vmware.vcloud.catalog+xml") - .name("Public") - .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c")) - .build()) - .link(Link.builder() - .rel("down") - .type("application/vnd.vmware.vcloud.controlAccess+xml") - .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c/controlAccess/")) - .build()) - .link(Link.builder() - .rel("down") - .type("application/vnd.vmware.vcloud.orgNetwork+xml") - .name("ilsolation01-Jclouds") - .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38")) - .build()) - .link(Link.builder() - .rel("down") - .type("application/vnd.vmware.vcloud.orgNetwork+xml") - .name("internet01-Jclouds") - .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c")) - .build()) - .link(Link.builder() - .rel("down") - .type("application/vnd.vmware.vcloud.metadata+xml") - .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata")) - .build()) - .description("") - .fullName("JClouds") - .build() - ); + assertEquals(client.getOrgClient().getOrg(orgRef), actual); + } + + @Test + public void testWhenResponseIs2xxLoginReturnsValidMetadataList() { + URI orgRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", orgRef), + getStandardPaylodResponse("/orglist.xml")); + + Metadata actual = Metadata.builder() +// .link(Link.builder() +// .rel("up") +// .type("application/vnd.vmware.vcloud.vdc+xml") +// .name("Cluster01-JClouds") +// .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07")) +// .build()) + .build(); + + assertEquals(client.getOrgClient().getMetadata(orgRef), actual); + } + + @Test(enabled=false) + public void testWhenResponseIs2xxLoginReturnsValidMetadata() { + URI metadataRef = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadataKEY"); + + VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, + getStandardRequest("GET", metadataRef), + getStandardPaylodResponse("/org/metadata.xml")); + + MetadataEntry actual = MetadataEntry.builder() + .build(); + + assertEquals(client.getOrgClient().getMetadataEntry(metadataRef), actual); } } diff --git a/labs/vcloud-director/src/test/resources/org/metadata.xml b/labs/vcloud-director/src/test/resources/org/metadata.xml new file mode 100644 index 0000000000..992459fd0d --- /dev/null +++ b/labs/vcloud-director/src/test/resources/org/metadata.xml @@ -0,0 +1,4 @@ + + + + diff --git a/labs/vcloud-director/src/test/resources/org.xml b/labs/vcloud-director/src/test/resources/org/org.xml similarity index 100% rename from labs/vcloud-director/src/test/resources/org.xml rename to labs/vcloud-director/src/test/resources/org/org.xml diff --git a/labs/vcloud-director/src/test/resources/orglist.xml b/labs/vcloud-director/src/test/resources/org/orglist.xml similarity index 100% rename from labs/vcloud-director/src/test/resources/orglist.xml rename to labs/vcloud-director/src/test/resources/org/orglist.xml