example start on a vcloud director client

This commit is contained in:
Adrian Cole 2012-02-05 23:10:15 -08:00
parent 47ade5a429
commit 7d93887789
12 changed files with 701 additions and 2 deletions

View File

@ -18,7 +18,9 @@
*/
package org.jclouds.vcloud.director.v1_5;
import org.jclouds.rest.annotations.Delegate;
import org.jclouds.vcloud.director.v1_5.domain.Session;
import org.jclouds.vcloud.director.v1_5.features.OrgAsyncClient;
import com.google.inject.Provides;
@ -38,4 +40,9 @@ public interface VCloudDirectorAsyncClient {
@Provides
Session getCurrentSession();
/**
* @return synchronous access to Org features
*/
@Delegate
OrgAsyncClient getOrgClient();
}

View File

@ -21,7 +21,9 @@ package org.jclouds.vcloud.director.v1_5;
import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
import org.jclouds.rest.annotations.Delegate;
import org.jclouds.vcloud.director.v1_5.domain.Session;
import org.jclouds.vcloud.director.v1_5.features.OrgClient;
import com.google.inject.Provides;
@ -40,5 +42,10 @@ public interface VCloudDirectorClient {
*/
@Provides
Session getCurrentSession();
/**
* @return synchronous access to Org features
*/
@Delegate
OrgClient getOrgClient();
}

View File

@ -33,5 +33,8 @@ public interface VCloudDirectorMediaType {
public final static String NS = "http://www.vmware.com/vcloud/v1.5";
public final static String SESSION_XML = "application/vnd.vmware.vcloud.session+xml";
public final static String ORGLIST_XML = "application/vnd.vmware.vcloud.orgList+xml";
public final static String ORG_XML = "application/vnd.vmware.vcloud.org+xml";
}

View File

@ -42,6 +42,8 @@ import org.jclouds.vcloud.director.v1_5.VCloudDirectorClient;
import org.jclouds.vcloud.director.v1_5.annotations.Login;
import org.jclouds.vcloud.director.v1_5.domain.Session;
import org.jclouds.vcloud.director.v1_5.domain.SessionWithToken;
import org.jclouds.vcloud.director.v1_5.features.OrgAsyncClient;
import org.jclouds.vcloud.director.v1_5.features.OrgClient;
import org.jclouds.vcloud.director.v1_5.functions.LoginUserInOrgWithPassword;
import org.jclouds.vcloud.director.v1_5.handlers.InvalidateSessionAndRetryOn401AndLogoutOnClose;
import org.jclouds.vcloud.director.v1_5.handlers.VCloudDirectorErrorHandler;
@ -69,7 +71,7 @@ import com.google.inject.name.Named;
public class VCloudDirectorRestClientModule extends RestClientModule<VCloudDirectorClient, VCloudDirectorAsyncClient> {
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
// TODO
.put(OrgClient.class, OrgAsyncClient.class)
.build();
public VCloudDirectorRestClientModule() {

View File

@ -0,0 +1,196 @@
/**
* 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.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;
/**
* Retrieves a list of organizations.
*
* @author Adrian Cole
*/
@XmlRootElement(namespace = NS, name = "Org")
public class Org extends BaseNamedResource<Org> {
@SuppressWarnings("unchecked")
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return new Builder().fromOrg(this);
}
public static class Builder extends BaseNamedResource.Builder<Org> {
private String id;
private String description;
private String fullName;
private Set<Link> links = Sets.newLinkedHashSet();
/**
* @see Org#getId
*/
public Builder id(String id) {
this.id = id;
return this;
}
/**
* @see Org#getDescription
*/
public Builder description(String description) {
this.description = description;
return this;
}
/**
* @see Org#getFullName
*/
public Builder fullName(String fullName) {
this.fullName = fullName;
return this;
}
/**
* @see Org#getOrgs
*/
public Builder links(Set<Link> links) {
this.links = Sets.newLinkedHashSet(checkNotNull(links, "links"));
return this;
}
/**
* @see Org#getOrgs
*/
public Builder addLink(Link org) {
links.add(checkNotNull(org, "org"));
return this;
}
public Org build() {
return new Org(href, type, name, id, description, fullName, links);
}
public Builder fromOrg(Org in) {
return id(in.getId()).description(in.getDescription()).fullName(in.getFullName()).links(in.getLinks());
}
@Override
public Builder name(String name) {
return Builder.class.cast(super.name(name));
}
@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 Org() {
// For JAXB and builder use
}
private Org(URI href, String type, String name, String id, String description, String fullName, Set<Link> links) {
super(href, type, name);
this.id = id;
this.description = description;
this.fullName = fullName;
this.links = ImmutableSet.copyOf(links);
}
@XmlAttribute
private String id;
@XmlElement(namespace = NS, name = "Description")
private String description;
@XmlElement(namespace = NS, name = "FullName")
private String fullName;
@XmlElement(namespace = NS, name = "Link")
private Set<Link> links = Sets.newLinkedHashSet();
/**
*
* @return id of the org
*/
public String getId() {
return id;
}
/**
*
* @return description of the org
*/
public String getDescription() {
return description;
}
/**
*
* @return fullName of the org
*/
public String getFullName() {
return fullName;
}
/**
* TODO
*/
public Set<Link> getLinks() {
return ImmutableSet.copyOf(links);
}
@Override
public boolean equals(Object o) {
if (!super.equals(o))
return false;
Org that = Org.class.cast(o);
return equal(id, that.id) && equal(description, that.description) && equal(fullName, that.fullName)
&& equal(links, that.links);
}
@Override
public int hashCode() {
return super.hashCode() + Objects.hashCode(id, description, fullName, links);
}
@Override
public ToStringHelper string() {
return super.string().add("id", id).add("description", description).add("fullName", fullName).add("links", links);
}
}

View File

@ -0,0 +1,69 @@
/**
* 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.domain;
import java.net.URI;
public class OrgLink extends BaseNamedResource<OrgLink> {
@SuppressWarnings("unchecked")
public static Builder builder() {
return new Builder();
}
/**
* {@inheritDoc}
*/
@Override
public Builder toBuilder() {
return Builder.class.cast(new Builder().fromNamedResource(this));
}
public static class Builder extends BaseNamedResource.Builder<OrgLink> {
@Override
public OrgLink build() {
return new OrgLink(href, type, name);
}
@Override
public Builder name(String name) {
return Builder.class.cast(super.name(name));
}
@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 OrgLink(URI href, String type, String name) {
super(href, type, name);
}
private OrgLink() {
// for JAXB
}
}

View File

@ -0,0 +1,113 @@
/**
* 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.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;
/**
* Retrieves a list of organizations.
*
* @author Adrian Cole
*/
@XmlRootElement(namespace = NS, name = "OrgList")
public class OrgList {
public static Builder builder() {
return new Builder();
}
public Builder toBuilder() {
return new Builder().fromOrgList(this);
}
public static class Builder {
private Set<OrgLink> orgs = Sets.newLinkedHashSet();
/**
* @see OrgList#getOrgs
*/
public Builder orgs(Set<OrgLink> orgs) {
this.orgs = Sets.newLinkedHashSet(checkNotNull(orgs, "orgs"));
return this;
}
/**
* @see OrgList#getOrgs
*/
public Builder addOrg(OrgLink org) {
orgs.add(checkNotNull(org, "org"));
return this;
}
public OrgList build() {
return new OrgList(orgs);
}
public Builder fromOrgList(OrgList in) {
return orgs(in.getOrgs());
}
}
private OrgList() {
// For JAXB and builder use
}
private OrgList(Set<OrgLink> orgs) {
this.orgs = ImmutableSet.copyOf(orgs);
}
@XmlElement(namespace = NS, name = "Org")
private Set<OrgLink> orgs = Sets.newLinkedHashSet();
public Set<OrgLink> getOrgs() {
return ImmutableSet.copyOf(orgs);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
OrgList that = OrgList.class.cast(o);
return equal(orgs, that.orgs);
}
@Override
public int hashCode() {
return Objects.hashCode(orgs);
}
@Override
public String toString() {
return Objects.toStringHelper("").add("orgs", orgs).toString();
}
}

View File

@ -0,0 +1,62 @@
/**
* 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.features;
import java.net.URI;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import org.jclouds.rest.annotations.EndpointParam;
import org.jclouds.rest.annotations.ExceptionParser;
import org.jclouds.rest.annotations.JAXBResponseParser;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationToRequest;
import com.google.common.util.concurrent.ListenableFuture;
/**
* @see OrgClient
* @author Adrian Cole
*/
@RequestFilters(AddVCloudAuthorizationToRequest.class)
public interface OrgAsyncClient {
/**
* @see OrgClient#getOrgList
*/
@GET
@Path("/org/")
@Consumes
@JAXBResponseParser
ListenableFuture<OrgList> getOrgList();
/**
* @see OrgClient#getOrg
*/
@GET
@Consumes
@JAXBResponseParser
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
ListenableFuture<OrgList> getOrg(@EndpointParam URI uri);
}

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
* 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.features;
import java.net.URI;
import java.util.concurrent.TimeUnit;
import org.jclouds.concurrent.Timeout;
import org.jclouds.vcloud.director.v1_5.domain.Org;
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
/**
* Provides synchronous access to Org.
* <p/>
*
* @see OrgAsyncClient
* @see <a href= "http://support.theenterprisecloud.com/kb/default.asp?id=984&Lang=1&SID=" />
* @author Adrian Cole
*/
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
public interface OrgClient {
/**
* Retrieves a list of organizations.
*
* @return a list of organizations
*/
OrgList getOrgList();
/**
* Retrieves an organization.
*
* @return the org or null if not found
*/
Org getOrg(URI orgHref);
}

View File

@ -0,0 +1,172 @@
/**
* 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.features;
import static org.testng.Assert.assertEquals;
import java.net.URI;
import org.jclouds.http.HttpRequest;
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.Org;
import org.jclouds.vcloud.director.v1_5.domain.OrgLink;
import org.jclouds.vcloud.director.v1_5.domain.OrgList;
import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorRestClientExpectTest;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMultimap;
/**
*
* Allows us to test a client via its side effects.
*
* @author Adrian Cole
*/
@Test(groups = "unit", singleThreaded = true, testName = "OrgClientExpectTest")
public class OrgClientExpectTest extends BaseVCloudDirectorRestClientExpectTest {
public void testWhenResponseIs2xxLoginReturnsValidOrgList() {
HttpRequest orgListRequest = HttpRequest.builder().method("GET")
.endpoint(URI.create("http://localhost/api/org/")).headers(
ImmutableMultimap.<String, String> 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();
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgListRequest,
orgListResponse);
assertEquals(client.getOrgClient().getOrgList(), OrgList.builder().addOrg(
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()
);
}
// please help solve javax.xml.bind.UnmarshalException
@Test(enabled = false)
public void testWhenResponseIs2xxLoginReturnsValidOrg() {
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.<String, String> 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();
VCloudDirectorClient client = requestsSendResponses(loginRequest, sessionResponse, orgRequest, orgResponse);
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"))
.addLink(
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())
.addLink(
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())
.addLink(
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())
.addLink(
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())
.addLink(
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())
.addLink(
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())
.addLink(
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()
);
}
}

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<Org xmlns="http://www.vmware.com/vcloud/v1.5" name="JClouds" id="urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0" type="application/vnd.vmware.vcloud.org+xml" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
<Link rel="down" type="application/vnd.vmware.vcloud.vdc+xml" name="Cluster01-JClouds" href="https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07"/>
<Link rel="down" type="application/vnd.vmware.vcloud.tasksList+xml" href="https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0"/>
<Link rel="down" type="application/vnd.vmware.vcloud.catalog+xml" name="Public" href="https://vcloudbeta.bluelock.com/api/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"/>
<Link rel="down" type="application/vnd.vmware.vcloud.controlAccess+xml" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c/controlAccess/"/>
<Link rel="down" type="application/vnd.vmware.vcloud.orgNetwork+xml" name="ilsolation01-Jclouds" href="https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"/>
<Link rel="down" type="application/vnd.vmware.vcloud.orgNetwork+xml" name="internet01-Jclouds" href="https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c"/>
<Link rel="down" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"/>
<Description/>
<FullName>JClouds</FullName>
</Org>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<OrgList xmlns="http://www.vmware.com/vcloud/v1.5" type="application/vnd.vmware.vcloud.orgList+xml" href="https://vcloudbeta.bluelock.com/api/org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
<Org type="application/vnd.vmware.vcloud.org+xml" name="JClouds" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"/>
</OrgList>