diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java index 2eb7627e63..22120e49fc 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java @@ -44,6 +44,7 @@ import org.jclouds.rest.MapBinder; import org.jclouds.rest.binders.BindToStringPayload; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.Vm; import org.jclouds.vcloud.domain.network.FenceMode; @@ -70,7 +71,7 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder protected final String ns; protected final String schema; protected final BindToStringPayload stringBinder; - protected final URI defaultNetwork; + protected final ReferenceType defaultNetwork; protected final FenceMode defaultFenceMode; protected final DefaultNetworkNameInTemplate defaultNetworkNameInTemplate; protected final VCloudClient client; @@ -78,7 +79,7 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder @Inject public BindInstantiateVAppTemplateParamsToXmlPayload(DefaultNetworkNameInTemplate defaultNetworkNameInTemplate, BindToStringPayload stringBinder, @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, - @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Network URI network, + @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Network ReferenceType network, @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode, VCloudClient client) { this.defaultNetworkNameInTemplate = defaultNetworkNameInTemplate; this.ns = ns; @@ -104,8 +105,8 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder Set networkConfig = null; - NetworkConfigDecorator networknetworkConfigDecorator = new NetworkConfigDecorator(template, defaultNetwork, - defaultFenceMode, defaultNetworkNameInTemplate); + NetworkConfigDecorator networknetworkConfigDecorator = new NetworkConfigDecorator(template, + defaultNetwork.getHref(), defaultFenceMode, defaultNetworkNameInTemplate); InstantiateVAppTemplateOptions options = findOptionsInArgsOrNull(gRequest); diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java index 60789123aa..0a8d53f7fa 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java @@ -23,21 +23,21 @@ import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import java.util.Map; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicReference; -import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import org.jclouds.cim.xml.ResourceAllocationSettingDataHandler; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.AsyncClientFactory; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.VCloudLoginAsyncClient; import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; @@ -49,47 +49,31 @@ import com.google.inject.Provides; import com.google.inject.TypeLiteral; /** - * Configures the VCloud authentication service connection, including logging and http transport. + * Configures the VCloud authentication service connection, including logging + * and http transport. * * @author Adrian Cole */ @RequiresHttp @ConfiguresRestClient public abstract class BaseVCloudRestClientModule extends - CommonVCloudRestClientModule { + CommonVCloudRestClientModule { public BaseVCloudRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); } public BaseVCloudRestClientModule(Class syncClientType, Class asyncClientType, - Map, Class> delegateMap) { + Map, Class> delegateMap) { super(syncClientType, asyncClientType, delegateMap); } - @Singleton - public static class VCloudWritableCatalog extends WriteableCatalog { - private final VCloudClient client; - - @Inject - public VCloudWritableCatalog(VCloudClient client) { - super(client); - this.client = client; - } - - @Override - public boolean apply(ReferenceType arg0) { - return !client.getCatalogClient().getCatalog(arg0.getHref()).isReadOnly(); - } - } - @Override protected void configure() { bind(new TypeLiteral, Iterable>>() { }).to(new TypeLiteral() { }); bind(ResourceAllocationSettingDataHandler.class).to(VCloudResourceAllocationSettingDataHandler.class); - bind(WriteableCatalog.class).to(VCloudWritableCatalog.class); super.configure(); } @@ -102,21 +86,21 @@ public abstract class BaseVCloudRestClientModule provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { + AtomicReference authException, final VCloudLoginAsyncClient login) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier(authException, seconds, - new Supplier() { + new Supplier() { - @Override - public VCloudSession get() { - try { - return login.login().get(10, TimeUnit.SECONDS); - } catch (Exception e) { - propagate(e); - assert false : e; - return null; - } + @Override + public VCloudSession get() { + try { + return login.login().get(10, TimeUnit.SECONDS); + } catch (Exception e) { + propagate(e); + assert false : e; + return null; } + } - }); + }); } } diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/BaseVCloudAsyncClientTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/BaseVCloudAsyncClientTest.java index 2de9d696d7..2ccc14f322 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/BaseVCloudAsyncClientTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/BaseVCloudAsyncClientTest.java @@ -18,14 +18,13 @@ */ package org.jclouds.vcloud; -import static org.jclouds.Constants.PROPERTY_API_VERSION; -import static org.jclouds.Constants.PROPERTY_IDENTITY; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.testng.Assert.assertEquals; import java.net.URI; import java.util.Map; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; import javax.inject.Named; @@ -33,6 +32,7 @@ import javax.inject.Singleton; import org.jclouds.http.HttpRequest; import org.jclouds.http.RequiresHttp; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; @@ -43,6 +43,7 @@ import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudSession; +import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.domain.VDCStatus; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; @@ -57,7 +58,7 @@ import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.inject.Injector; +import com.google.inject.AbstractModule; import com.google.inject.Module; /** @@ -88,67 +89,79 @@ public abstract class BaseVCloudAsyncClientTest extends RestClientTest { return new RestContextFactory().createContextSpec("vcloud", "identity", "credential", overrides); } + protected static final ReferenceTypeImpl ORG_REF = new ReferenceTypeImpl("org", VCloudMediaType.ORG_XML, + URI.create("https://vcenterprise.bluelock.com/api/v1.0/org/1")); + + protected static final ReferenceTypeImpl CATALOG_REF = new ReferenceTypeImpl("catalog", VCloudMediaType.CATALOG_XML, + URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1")); + + protected static final ReferenceTypeImpl TASKSLIST_REF = new ReferenceTypeImpl("tasksList", + VCloudMediaType.TASKSLIST_XML, URI.create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")); + + protected static final ReferenceTypeImpl VDC_REF = new ReferenceTypeImpl("vdc", VCloudMediaType.VDC_XML, + URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1")); + + protected static final ReferenceTypeImpl NETWORK_REF = new ReferenceTypeImpl("network", VCloudMediaType.NETWORK_XML, + URI.create("https://vcloud.safesecureweb.com/network/1990")); + + protected static final Org ORG = new OrgImpl(ORG_REF.getName(), ORG_REF.getType(), ORG_REF.getHref(), "org", null, + ImmutableMap. of(CATALOG_REF.getName(), CATALOG_REF), + ImmutableMap. of(VDC_REF.getName(), VDC_REF), ImmutableMap. of( + NETWORK_REF.getName(), NETWORK_REF), TASKSLIST_REF, ImmutableList. of()); + + protected static final VDC VDC = new VDCImpl(VDC_REF.getName(), VDC_REF.getType(), VDC_REF.getHref(), + VDCStatus.READY, null, "description", ImmutableSet. of(), AllocationModel.ALLOCATION_POOL, null, null, + null, ImmutableMap. of( + "vapp", + new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), + "network", + new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), + ImmutableMap. of(NETWORK_REF.getName(), NETWORK_REF), 0, 0, 0, false); + @RequiresHttp @ConfiguresRestClient public static class VCloudRestClientModuleExtension extends VCloudRestClientModule { + @Override - protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { + protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, String version) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/login"); } @Override - protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return URI.create("https://vcenterprise.bluelock.com/api/v1.0/org"); - + protected Org provideOrg(Supplier> orgSupplier, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return ORG; } @Override - protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return "org"; - } + protected void installDefaultVCloudEndpointsModule() { + install(new AbstractModule() { - @Override - protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user, WriteableCatalog writableCatalog) { - return URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog"); + @Override + protected void configure() { + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Org.class).toInstance(ORG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Catalog.class).toInstance( + CATALOG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.TasksList.class).toInstance( + TASKSLIST_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.VDC.class).toInstance(VDC_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Network.class).toInstance( + NETWORK_REF); + } - } - - @Override - protected Org provideOrg(CommonVCloudClient discovery) { - return null; - } - - @Override - protected URI provideDefaultTasksList(Org org) { - return URI.create("https://vcenterprise.bluelock.com/api/v1.0/taskslist"); - } - - @Override - protected URI provideDefaultVDC(Org org, @org.jclouds.vcloud.endpoints.VDC String defaultVDC) { - return URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"); - } - - @Override - protected String provideDefaultVDCName( - @org.jclouds.vcloud.endpoints.VDC Supplier> vDCtoOrgSupplier) { - return "vdc"; - } - - @Override - protected URI provideDefaultNetwork(URI vdc, Injector injector) { - return URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"); + }); } @Override protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { + AtomicReference authException, final VCloudLoginAsyncClient login) { return Suppliers. ofInstance(new VCloudSession() { @Override public Map getOrgs() { - return ImmutableMap. of("org", new ReferenceTypeImpl("org", - VCloudMediaType.ORG_XML, URI.create("https://vcenterprise.bluelock.com/api/v1.0/org/1"))); + return ImmutableMap. of(ORG_REF.getName(), ORG_REF); } @Override @@ -168,51 +181,18 @@ public abstract class BaseVCloudAsyncClientTest extends RestClientTest { bind(OrgCatalogItemSupplier.class).to(TestOrgCatalogItemSupplier.class); } + @Override protected Supplier>> provideOrgVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { - - return Suppliers - .>> ofInstance(ImmutableMap - .> of( - "org", - - ImmutableMap - . of( - "vdc", - new VDCImpl( - "vdc", - null, - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), - VDCStatus.READY, - null, - "description", - ImmutableSet. of(), - AllocationModel.ALLOCATION_POOL, - null, - null, - null, - ImmutableMap - . of( - "vapp", - new ReferenceTypeImpl( - "vapp", - "application/vnd.vmware.vcloud.vApp+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), - "network", - new ReferenceTypeImpl( - "network", - "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), - ImmutableMap. of(), 0, 0, 0, - false)))); - + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + OrgVDCSupplier supplier) { + return Suppliers.>> ofInstance(ImmutableMap + .> of(ORG_REF.getName(), + ImmutableMap. of(VDC.getName(), VDC))); } @Singleton public static class TestOrgMapSupplier extends OrgMapSupplier { + @Inject protected TestOrgMapSupplier() { super(null, null); @@ -220,19 +200,7 @@ public abstract class BaseVCloudAsyncClientTest extends RestClientTest { @Override public Map get() { - return ImmutableMap. of("org", new OrgImpl("org", null, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "org", "description", ImmutableMap - . of("catalog", new ReferenceTypeImpl("catalog", - VCloudMediaType.CATALOG_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap - . of("vdc", new ReferenceTypeImpl("vdc", VCloudMediaType.VDC_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap - . of("network", new ReferenceTypeImpl("network", - VCloudMediaType.NETWORK_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/network/1"))), - new ReferenceTypeImpl("tasksList", VCloudMediaType.TASKSLIST_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")), ImmutableList - . of())); + return ImmutableMap. of(ORG.getName(), ORG); } } @@ -245,17 +213,18 @@ public abstract class BaseVCloudAsyncClientTest extends RestClientTest { @Override public Map> get() { - return ImmutableMap.> of("org", - - ImmutableMap. of("catalog", new CatalogImpl("catalog", "type", - URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), null, "description", - ImmutableMap. of("item", new ReferenceTypeImpl("item", - "application/vnd.vmware.vcloud.catalogItem+xml", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), - "template", new ReferenceTypeImpl("template", - "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"))), - ImmutableList. of(), true, false))); + return ImmutableMap.> of( + ORG_REF.getName(), ImmutableMap. of( + CATALOG_REF.getName(), + new CatalogImpl(CATALOG_REF.getName(), CATALOG_REF.getType(), CATALOG_REF.getHref(), null, + "description", ImmutableMap. of( + "item", + new ReferenceTypeImpl("item", "application/vnd.vmware.vcloud.catalogItem+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), + "template", + new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"))), + ImmutableList. of(), true, false))); } } @@ -267,35 +236,20 @@ public abstract class BaseVCloudAsyncClientTest extends RestClientTest { @Override public Map>> get() { - return ImmutableMap - .>> of( - "org", - ImmutableMap - .> of( - "catalog", - ImmutableMap - . of( - "template", - new CatalogItemImpl( - "template", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"), - "description", - new ReferenceTypeImpl( - "template", - "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")), - ImmutableMap. of())))); + return ImmutableMap.>> of( + ORG_REF.getName(), ImmutableMap + .> of(CATALOG_REF + .getName(), ImmutableMap. of( + "template", + new CatalogItemImpl("template", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"), "description", + new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")), + ImmutableMap. of())))); } } - @Override - protected Iterable provideOrgs(Supplier cache, String user) { - return null; - } - } } diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/DeprecatedVCloudClientLiveTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/DeprecatedVCloudClientLiveTest.java index 7dfa80af75..244142dfed 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/DeprecatedVCloudClientLiveTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/DeprecatedVCloudClientLiveTest.java @@ -31,6 +31,9 @@ import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.domain.Vm; import org.testng.annotations.Test; +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + /** * Tests behavior of deprecated {@code VCloudClient} features * @@ -40,30 +43,43 @@ import org.testng.annotations.Test; @Test(groups = "live", singleThreaded = true) public class DeprecatedVCloudClientLiveTest extends CommonVCloudClientLiveTest { + @Override + protected Iterable listOrgs() { + return Iterables.transform(connection.listOrgs().values(), new Function(){ + + @Override + public Org apply(ReferenceType arg0) { + return connection.getOrg(arg0.getHref()); + } + + }); + } + @Test public void testListOrgs() throws Exception { - for (ReferenceType response : connection.listOrgs().values()) { - assertNotNull(response); - assertNotNull(response.getName()); - assertNotNull(response.getHref()); - assertEquals(connection.getOrg(response.getHref()).getName(), response.getName()); - assertEquals(connection.findOrgNamed(response.getName()).getName(), response.getName()); + for (Org org : orgs) { + assertNotNull(org); + assertNotNull(org.getName()); + assertNotNull(org.getHref()); + assertEquals(connection.getOrg(org.getHref()).getName(), org.getName()); + assertEquals(connection.findOrgNamed(org.getName()).getName(), org.getName()); } } @Test public void testGetVAppTemplate() throws Exception { - Org org = connection.findOrgNamed(null); - for (ReferenceType cat : org.getCatalogs().values()) { - Catalog response = connection.getCatalog(cat.getHref()); - for (ReferenceType resource : response.values()) { - if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { - CatalogItem item = connection.getCatalogItem(resource.getHref()); - if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { - try { - assertNotNull(connection.getVAppTemplate(item.getEntity().getHref())); - } catch (AuthorizationException e) { + for (Org org : orgs) { + for (ReferenceType cat : org.getCatalogs().values()) { + Catalog response = connection.getCatalog(cat.getHref()); + for (ReferenceType resource : response.values()) { + if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.getCatalogItem(resource.getHref()); + if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { + try { + assertNotNull(connection.getVAppTemplate(item.getEntity().getHref())); + } catch (AuthorizationException e) { + } } } } @@ -73,96 +89,16 @@ public class DeprecatedVCloudClientLiveTest extends CommonVCloudClientLiveTest 0; + } catch (RuntimeException e) { + + } + } + } + } + } + } + + @Test + public void testFindVAppTemplate() throws Exception { + for (Org org : orgs) { + for (ReferenceType cat : org.getCatalogs().values()) { + Catalog response = connection.getCatalog(cat.getHref()); + for (ReferenceType resource : response.values()) { + if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.getCatalogItem(resource.getHref()); + if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { + try { + assertNotNull(connection.findVAppTemplateInOrgCatalogNamed(org.getName(), response.getName(), + item.getEntity().getName())); + } catch (AuthorizationException e) { + + } + } + } + } + } + } + } + } diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java index 2439d1e8b0..3ffe80a54e 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java @@ -37,7 +37,9 @@ import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.util.Strings2; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.VCloudPropertiesBuilder; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl; import org.jclouds.vcloud.domain.network.FenceMode; import org.jclouds.vcloud.domain.network.NetworkConfig; import org.jclouds.vcloud.domain.ovf.VCloudNetworkSection; @@ -84,8 +86,8 @@ public class BindInstantiateVAppTemplateParamsToXmlPayloadTest { @Network @Provides @Singleton - URI provideNetwork() { - return URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"); + ReferenceType provideNetwork() { + return new ReferenceTypeImpl(null, null, URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990")); } }); } diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java index bbe3120007..db0c85f0b9 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java @@ -25,6 +25,7 @@ import static org.jclouds.vcloud.VCloudMediaType.VAPPTEMPLATE_XML; import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; import java.net.URI; +import java.util.Map; import javax.annotation.Nullable; import javax.ws.rs.Consumes; @@ -47,10 +48,12 @@ import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.vcloud.binders.BindCloneVCloudExpressVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload; import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.domain.VCloudExpressVAppTemplate; import org.jclouds.vcloud.domain.network.OrgNetwork; +import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; @@ -65,6 +68,7 @@ import org.jclouds.vcloud.xml.VCloudExpressVAppHandler; import org.jclouds.vcloud.xml.VCloudExpressVAppTemplateHandler; import com.google.common.util.concurrent.ListenableFuture; +import com.google.inject.Provides; /** * Provides access to VCloud resources via their REST API. @@ -75,7 +79,14 @@ import com.google.common.util.concurrent.ListenableFuture; */ @RequestFilters(SetVCloudTokenCookie.class) public interface VCloudExpressAsyncClient extends CommonVCloudAsyncClient { - + /** + * + * @return a listing of all orgs that the current user has access to. + */ + @Provides + @Org + Map listOrgs(); + /** * @see CommonVCloudClient#getCatalog */ diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java index 8c4138f5c8..791a8c270a 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java @@ -19,12 +19,14 @@ package org.jclouds.vcloud; import java.net.URI; +import java.util.Map; import java.util.NoSuchElementException; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import org.jclouds.concurrent.Timeout; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.domain.VCloudExpressVAppTemplate; @@ -40,7 +42,12 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) public interface VCloudExpressClient extends CommonVCloudClient { - + /** + * + * @return a listing of all orgs that the current user has access to. + */ + Map listOrgs(); + VCloudExpressVApp instantiateVAppTemplateInVDC(URI vDC, URI template, String appName, InstantiateVAppTemplateOptions... options); diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java index 2d41bcd355..738fa77d91 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload.java @@ -44,6 +44,7 @@ import org.jclouds.http.HttpRequest; import org.jclouds.rest.MapBinder; import org.jclouds.rest.binders.BindToStringPayload; import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.network.NetworkConfig; import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -67,14 +68,14 @@ public class BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload implemen private final BindToStringPayload stringBinder; protected final Map virtualHardwareToInstanceId = ImmutableMap.of(ResourceType.PROCESSOR, "1", ResourceType.MEMORY, "2", ResourceType.DISK_DRIVE, "9"); - private final URI defaultNetwork; + private final ReferenceType defaultNetwork; private final String defaultFenceMode; private final String apiVersion; @Inject public BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload(BindToStringPayload stringBinder, @Named(PROPERTY_API_VERSION) String apiVersion, @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, - @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Network URI network, + @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Network ReferenceType network, @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) { this.ns = ns; this.apiVersion = apiVersion; @@ -96,7 +97,7 @@ public class BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload implemen SortedMap virtualHardwareQuantity = Maps.newTreeMap(); InstantiateVAppTemplateOptions options = findOptionsInArgsOrNull(gRequest); - String network = (defaultNetwork != null) ? defaultNetwork.toASCIIString() : null; + String network = (defaultNetwork != null) ? defaultNetwork.getHref().toASCIIString() : null; String fenceMode = defaultFenceMode; String networkName = name; if (options != null) { diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java index a5fafd2a77..3da4e684cf 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/compute/functions/VCloudExpressVAppToNodeMetadata.java @@ -34,6 +34,8 @@ import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.util.ComputeServiceUtils; import org.jclouds.domain.Credentials; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.domain.Status; @@ -57,9 +59,9 @@ public class VCloudExpressVAppToNodeMetadata implements Function credentialStore, Map vAppStatusToNodeState, - HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, - FindLocationForResource findLocationForResourceInVDC, @Memoized Supplier> images) { + Map credentialStore, Map vAppStatusToNodeState, + HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp, + FindLocationForResource findLocationForResourceInVDC, @Memoized Supplier> images) { this.images = checkNotNull(images, "images"); this.hardwareForVCloudExpressVApp = checkNotNull(hardwareForVCloudExpressVApp, "hardwareForVCloudExpressVApp"); this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); @@ -76,8 +78,19 @@ public class VCloudExpressVAppToNodeMetadata implements Function syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); } - + + /** + * + * @return a listing of all orgs that the current user has access to. + */ + @Provides + @Org + Map listOrgs(Supplier sessionSupplier) { + return sessionSupplier.get().getOrgs(); + } + public BaseVCloudExpressRestClientModule(Class syncClientType, Class asyncClientType, Map, Class> delegateMap) { super(syncClientType, asyncClientType, delegateMap); @@ -81,7 +95,7 @@ public abstract class BaseVCloudExpressRestClientModule provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudExpressLoginAsyncClient login) { + AtomicReference authException, final VCloudExpressLoginAsyncClient login) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier(authException, seconds, new Supplier() { diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppImpl.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppImpl.java index 4e4a7c6b7f..3f8cf7d710 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppImpl.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppImpl.java @@ -51,9 +51,6 @@ public class VCloudExpressVAppImpl implements VCloudExpressVApp { private final Set resourceAllocations; private final Integer osType; - /** The serialVersionUID */ - private static final long serialVersionUID = 8464716396538298809L; - public VCloudExpressVAppImpl(String name, URI href, Status status, Long size, ReferenceType vDC, ListMultimap networkToAddresses, Integer osType, String operatingSystemDescription, VirtualSystemSettingData system, Set resourceAllocations) { diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppTemplateImpl.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppTemplateImpl.java index 6dad775bd8..9722c6d356 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppTemplateImpl.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/internal/VCloudExpressVAppTemplateImpl.java @@ -33,8 +33,6 @@ import org.jclouds.vcloud.domain.VCloudExpressVAppTemplate; */ public class VCloudExpressVAppTemplateImpl extends ReferenceTypeImpl implements VCloudExpressVAppTemplate { - /** The serialVersionUID */ - private static final long serialVersionUID = 8464716396538298809L; private final String description; private final Status status; diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressNetworkImpl.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressNetworkImpl.java index 8f18e6f5c2..9491527e3a 100644 --- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressNetworkImpl.java +++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressNetworkImpl.java @@ -40,8 +40,6 @@ import com.google.common.collect.Sets; */ public class VCloudExpressNetworkImpl extends ReferenceTypeImpl implements VCloudExpressNetwork { - /** The serialVersionUID */ - private static final long serialVersionUID = 8464716396538298809L; protected final String description; protected final Set dnsServers = Sets.newHashSet(); protected final String gateway; diff --git a/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index cbdcff315a..df279cfd56 100644 --- a/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -18,8 +18,6 @@ */ package org.jclouds.vcloud; -import static org.jclouds.Constants.PROPERTY_API_VERSION; -import static org.jclouds.Constants.PROPERTY_IDENTITY; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.processorCount; import static org.testng.Assert.assertEquals; @@ -30,6 +28,7 @@ import java.net.URI; import java.util.Map; import java.util.NoSuchElementException; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; import javax.inject.Named; @@ -39,6 +38,7 @@ import org.jclouds.http.HttpRequest; import org.jclouds.http.RequiresHttp; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; @@ -47,10 +47,13 @@ import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.util.Strings2; import org.jclouds.vcloud.config.VCloudExpressRestClientModule; +import org.jclouds.vcloud.domain.AllocationModel; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudSession; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.domain.VDCStatus; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.OrgImpl; @@ -62,12 +65,12 @@ import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.functions.ParseTaskFromLocationHeader; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; -import org.jclouds.vcloud.xml.VCloudExpressCatalogHandler; import org.jclouds.vcloud.xml.CatalogItemHandler; import org.jclouds.vcloud.xml.OrgHandler; import org.jclouds.vcloud.xml.OrgNetworkFromVCloudExpressNetworkHandler; import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.TasksListHandler; +import org.jclouds.vcloud.xml.VCloudExpressCatalogHandler; import org.jclouds.vcloud.xml.VCloudExpressVAppHandler; import org.jclouds.vcloud.xml.VCloudExpressVAppTemplateHandler; import org.jclouds.vcloud.xml.VDCHandler; @@ -77,7 +80,8 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.inject.Injector; +import com.google.common.collect.ImmutableSet; +import com.google.inject.AbstractModule; import com.google.inject.Module; import com.google.inject.TypeLiteral; @@ -86,10 +90,16 @@ import com.google.inject.TypeLiteral; * * @author Adrian Cole */ -// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +// NOTE:without testName, this will not call @Before* and fail w/NPE during +// surefire @Test(groups = "unit", testName = "VCloudExpressAsyncClientTest") public class VCloudExpressAsyncClientTest extends RestClientTest { + public void testListOrgs() { + assertEquals(injector.getInstance(VCloudExpressAsyncClient.class).listOrgs().toString(), + ImmutableMap.of(ORG_REF.getName(), ORG_REF).toString()); + } + public void testInstantiateVAppTemplateInVDCURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudExpressAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, String.class, InstantiateVAppTemplateOptions[].class); @@ -322,7 +332,22 @@ public class VCloudExpressAsyncClientTest extends RestClientTest of(CATALOG_REF.getName(), CATALOG_REF), + ImmutableMap. of(VDC_REF.getName(), VDC_REF), ImmutableMap. of( + NETWORK_REF.getName(), NETWORK_REF), TASKSLIST_REF, ImmutableList. of()); + + protected static final VDC VDC = new VDCImpl(VDC_REF.getName(), VDC_REF.getType(), VDC_REF.getHref(), + VDCStatus.READY, null, "description", ImmutableSet. of(), AllocationModel.ALLOCATION_POOL, null, null, + null, ImmutableMap. of( + "vapp", + new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), + "network", + new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), + ImmutableMap. of(NETWORK_REF.getName(), NETWORK_REF), 0, 0, 0, false); + @RequiresHttp @ConfiguresRestClient public static class VCloudRestClientModuleExtension extends VCloudExpressRestClientModule { + @Override - protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { + protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, String version) { return URI.create("https://vcloud.safesecureweb.com/api/v0.8/login"); } @Override - protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/org"); - + protected Org provideOrg(Supplier> orgSupplier, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return ORG; } @Override - protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return "org"; - } + protected void installDefaultVCloudEndpointsModule() { + install(new AbstractModule() { - @Override - protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user, WriteableCatalog write) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog"); - } + @Override + protected void configure() { + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Org.class).toInstance(ORG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Catalog.class).toInstance( + CATALOG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.TasksList.class).toInstance( + TASKSLIST_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.VDC.class).toInstance(VDC_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Network.class).toInstance( + NETWORK_REF); + } - @Override - protected Org provideOrg(CommonVCloudClient discovery) { - return null; - } - - @Override - protected Iterable provideOrgs(Supplier cache, @Named(PROPERTY_IDENTITY) String user) { - return null; - } - - @Override - protected URI provideDefaultTasksList(Org org) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/taskslist"); - } - - @Override - protected URI provideDefaultVDC(Org org, @org.jclouds.vcloud.endpoints.VDC String defaultVDC) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"); - } - - @Override - protected String provideDefaultVDCName( - @org.jclouds.vcloud.endpoints.VDC Supplier> vDCtoOrgSupplier) { - return "vdc"; - } - - @Override - protected URI provideDefaultNetwork(URI vdc, Injector injector) { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); + }); } @Override protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudExpressLoginAsyncClient login) { + AtomicReference authException, VCloudExpressLoginAsyncClient login) { return Suppliers. ofInstance(new VCloudSession() { @Override public Map getOrgs() { - return ImmutableMap. of("org", new ReferenceTypeImpl("org", - VCloudExpressMediaType.ORG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"))); + return ImmutableMap. of(ORG_REF.getName(), ORG_REF); } @Override @@ -744,26 +777,14 @@ public class VCloudExpressAsyncClientTest extends RestClientTest>> provideOrgVDCSupplierCache( @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { - return Suppliers.>> ofInstance(ImmutableMap - .> of("org", - - ImmutableMap. of( - "vdc", - new VDCImpl("vdc", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), null, - null, "description", null, null, null, null, null, ImmutableMap. of( - "vapp", - new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), - "network", - new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), null, 0, 0, 0, - false)))); - + .> of(ORG_REF.getName(), + ImmutableMap. of(VDC.getName(), VDC))); } @Singleton public static class TestOrgMapSupplier extends OrgMapSupplier { + @Inject protected TestOrgMapSupplier() { super(null, null); @@ -771,21 +792,7 @@ public class VCloudExpressAsyncClientTest extends RestClientTest get() { - return ImmutableMap. of( - "org", - new OrgImpl("org", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), "org", null, - ImmutableMap. of( - "catalog", - new ReferenceTypeImpl("catalog", VCloudExpressMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap - . of( - "vdc", - new ReferenceTypeImpl("vdc", VCloudExpressMediaType.VDC_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap - . of(), new ReferenceTypeImpl("tasksList", - VCloudExpressMediaType.TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")), ImmutableList - . of())); + return ImmutableMap. of(ORG.getName(), ORG); } } @@ -798,19 +805,18 @@ public class VCloudExpressAsyncClientTest extends RestClientTest> get() { - return ImmutableMap.> of("org", - - ImmutableMap. of( - "catalog", - new CatalogImpl("catalog", "type", URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"), - null, "description", ImmutableMap. of( - "item", - new ReferenceTypeImpl("item", "application/vnd.vmware.vcloud.catalogItem+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1")), - "template", - new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"))), ImmutableList - . of(), true, false))); + return ImmutableMap.> of( + ORG_REF.getName(), ImmutableMap. of( + CATALOG_REF.getName(), + new CatalogImpl(CATALOG_REF.getName(), CATALOG_REF.getType(), CATALOG_REF.getHref(), null, + "description", ImmutableMap. of( + "item", + new ReferenceTypeImpl("item", "application/vnd.vmware.vcloud.catalogItem+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1")), + "template", + new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"))), + ImmutableList. of(), true, false))); } } @@ -823,8 +829,9 @@ public class VCloudExpressAsyncClientTest extends RestClientTest>> get() { return ImmutableMap.>> of( - "org", ImmutableMap.> of( - "catalog", ImmutableMap. of( + ORG_REF.getName(), ImmutableMap + .> of(CATALOG_REF + .getName(), ImmutableMap. of( "template", new CatalogItemImpl("template", URI .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"), "description", diff --git a/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java b/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java index 1b39ffecf3..e60c169c3d 100644 --- a/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java +++ b/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java @@ -28,25 +28,41 @@ import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.domain.VDC; import org.testng.annotations.Test; +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + /** * Tests behavior of {@code VCloudExpressClient} * * @author Adrian Cole */ -@Test(groups = "live", sequential = true) +@Test(groups = "live", singleThreaded = true) public abstract class VCloudExpressClientLiveTest extends - CommonVCloudClientLiveTest { + CommonVCloudClientLiveTest { + @Override + protected Iterable listOrgs() { + return Iterables.transform(connection.listOrgs().values(), new Function(){ + + @Override + public Org apply(ReferenceType arg0) { + return connection.getOrg(arg0.getHref()); + } + + }); + } + @Test public void testGetVAppTemplate() throws Exception { - Org org = connection.findOrgNamed(null); - for (ReferenceType cat : org.getCatalogs().values()) { - Catalog response = connection.getCatalog(cat.getHref()); - for (ReferenceType resource : response.values()) { - if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { - CatalogItem item = connection.getCatalogItem(resource.getHref()); - if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { - assertNotNull(connection.getVAppTemplate(item.getEntity().getHref())); + for (Org org : orgs) { + for (ReferenceType cat : org.getCatalogs().values()) { + Catalog response = connection.getCatalog(cat.getHref()); + for (ReferenceType resource : response.values()) { + if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.getCatalogItem(resource.getHref()); + if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { + assertNotNull(connection.getVAppTemplate(item.getEntity().getHref())); + } } } } @@ -55,16 +71,17 @@ public abstract class VCloudExpressClientLiveTest extends @Test public void testGetVApp() throws Exception { - Org org = connection.findOrgNamed(null); - for (ReferenceType vdc : org.getVDCs().values()) { - VDC response = connection.getVDC(vdc.getHref()); - for (ReferenceType item : response.getResourceEntities().values()) { - if (item.getType().equals(VCloudMediaType.VAPP_XML)) { - try { - VCloudExpressVApp app = connection.getVApp(item.getHref()); - assertNotNull(app); - } catch (RuntimeException e) { + for (Org org : listOrgs()) { + for (ReferenceType vdc : org.getVDCs().values()) { + VDC response = connection.getVDC(vdc.getHref()); + for (ReferenceType item : response.getResourceEntities().values()) { + if (item.getType().equals(VCloudMediaType.VAPP_XML)) { + try { + VCloudExpressVApp app = connection.getVApp(item.getHref()); + assertNotNull(app); + } catch (RuntimeException e) { + } } } } @@ -73,15 +90,16 @@ public abstract class VCloudExpressClientLiveTest extends @Test public void testFindVAppTemplate() throws Exception { - Org org = connection.findOrgNamed(null); - for (ReferenceType cat : org.getCatalogs().values()) { - Catalog response = connection.getCatalog(cat.getHref()); - for (ReferenceType resource : response.values()) { - if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { - CatalogItem item = connection.getCatalogItem(resource.getHref()); - if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { - assertNotNull(connection.findVAppTemplateInOrgCatalogNamed(org.getName(), response.getName(), item + for (Org org : listOrgs()) { + for (ReferenceType cat : org.getCatalogs().values()) { + Catalog response = connection.getCatalog(cat.getHref()); + for (ReferenceType resource : response.values()) { + if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.getCatalogItem(resource.getHref()); + if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { + assertNotNull(connection.findVAppTemplateInOrgCatalogNamed(org.getName(), response.getName(), item .getEntity().getName())); + } } } } diff --git a/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayloadTest.java b/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayloadTest.java index 2c1e200eca..509afab294 100644 --- a/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayloadTest.java +++ b/apis/vcloudexpress/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayloadTest.java @@ -34,6 +34,8 @@ import javax.inject.Singleton; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.util.Strings2; import org.jclouds.vcloud.VCloudExpressPropertiesBuilder; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl; import org.jclouds.vcloud.domain.network.FenceMode; import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -66,8 +68,8 @@ public class BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayloadTest { @Network @Provides @Singleton - URI provideNetwork() { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); + ReferenceType provideNetwork() { + return new ReferenceTypeImpl(null, null, URI.create("https://vcloud.safesecureweb.com/network/1990")); } }); diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java index 56fbf30848..0a49720d7e 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java @@ -57,11 +57,9 @@ import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudExpressVApp; import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; @@ -98,7 +96,6 @@ import org.jclouds.vcloud.xml.VCloudExpressCatalogHandler; import org.jclouds.vcloud.xml.VCloudExpressVAppHandler; import com.google.common.util.concurrent.ListenableFuture; -import com.google.inject.Provides; /** * Provides access to VCloud resources via their REST API. @@ -109,13 +106,6 @@ import com.google.inject.Provides; */ @RequestFilters(SetVCloudTokenCookie.class) public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { - /** - * - * @return a listing of all orgs that the current user has access to. - */ - @Provides - @Org - Iterable listOrgs(); /** * @see VCloudExpressClient#getCatalogItemInOrg diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java index 68d377fc4c..fcdc4b3c37 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java @@ -26,10 +26,8 @@ import javax.annotation.Nullable; import org.jclouds.concurrent.Timeout; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudExpressVApp; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.terremark.domain.CustomizationParameters; import org.jclouds.vcloud.terremark.domain.InternetService; import org.jclouds.vcloud.terremark.domain.KeyPair; @@ -43,8 +41,6 @@ import org.jclouds.vcloud.terremark.domain.VAppConfiguration; import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions; import org.jclouds.vcloud.terremark.options.AddNodeOptions; -import com.google.inject.Provides; - /** * Provides access to VCloud resources via their REST API. *

@@ -54,13 +50,6 @@ import com.google.inject.Provides; */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) public interface TerremarkVCloudClient extends VCloudExpressClient { - /** - * - * @return a listing of all orgs that the current user has access to. - */ - @Provides - @Org - Iterable listOrgs(); /** * {@inheritDoc} diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java index 1acdb43069..bb827da44c 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java @@ -23,10 +23,9 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAU import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_SCHEMA; -import java.net.URI; import java.util.Map; -import java.util.SortedMap; import java.util.Map.Entry; +import java.util.SortedMap; import javax.annotation.Nullable; import javax.inject.Inject; @@ -37,6 +36,7 @@ import org.jclouds.cim.ResourceAllocationSettingData.ResourceType; import org.jclouds.rest.binders.BindToStringPayload; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.vcloud.binders.BindInstantiateVCloudExpressVAppTemplateParamsToXmlPayload; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions; @@ -55,7 +55,7 @@ public class TerremarkBindInstantiateVAppTemplateParamsToXmlPayload extends @Inject public TerremarkBindInstantiateVAppTemplateParamsToXmlPayload(BindToStringPayload stringBinder, @Named(PROPERTY_API_VERSION) String apiVersion, @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, - @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Nullable @Network URI network, + @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Nullable @Network ReferenceType network, @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) { super(stringBinder, apiVersion, ns, schema, network, fenceMode); } diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java index 6cfb44c4f7..23a5726d07 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java @@ -17,10 +17,12 @@ * ==================================================================== */ package org.jclouds.vcloud.terremark.config; + import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import java.io.IOException; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; import javax.inject.Named; @@ -30,6 +32,7 @@ import org.jclouds.http.HttpErrorHandler; import org.jclouds.http.annotation.ClientError; import org.jclouds.http.annotation.Redirection; import org.jclouds.http.annotation.ServerError; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.util.Strings2; import org.jclouds.vcloud.config.BaseVCloudExpressRestClientModule; @@ -46,7 +49,7 @@ import com.google.common.collect.Maps; import com.google.inject.Provides; public abstract class TerremarkRestClientModule - extends BaseVCloudExpressRestClientModule { + extends BaseVCloudExpressRestClientModule { public TerremarkRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); @@ -56,31 +59,26 @@ public abstract class TerremarkRestClientModule, Class> delegateMap) { super(syncClientType, asyncClientType, delegateMap); } - + @Singleton @Provides @Named("CreateInternetService") String provideCreateInternetService() throws IOException { - return Strings2.toStringAndClose(getClass().getResourceAsStream( - "/terremark/CreateInternetService.xml")); + return Strings2.toStringAndClose(getClass().getResourceAsStream("/terremark/CreateInternetService.xml")); } @Singleton @Provides @Named("CreateNodeService") String provideCreateNodeService() throws IOException { - return Strings2.toStringAndClose(getClass().getResourceAsStream( - "/terremark/CreateNodeService.xml")); + return Strings2.toStringAndClose(getClass().getResourceAsStream("/terremark/CreateNodeService.xml")); } @Override protected void bindErrorHandlers() { - bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to( - ParseTerremarkVCloudErrorFromHttpResponse.class); - bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to( - ParseTerremarkVCloudErrorFromHttpResponse.class); - bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to( - ParseTerremarkVCloudErrorFromHttpResponse.class); + bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseTerremarkVCloudErrorFromHttpResponse.class); + bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ParseTerremarkVCloudErrorFromHttpResponse.class); + bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseTerremarkVCloudErrorFromHttpResponse.class); } @Singleton @@ -111,14 +109,10 @@ public abstract class TerremarkRestClientModule> provideOrgToKeysListCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgNameToKeysListSupplier supplier) { - return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + OrgNameToKeysListSupplier supplier) { + return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( + authException, seconds, supplier); } @Singleton diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToEndpoint.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToEndpoint.java index 208b02560e..798f391d0d 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToEndpoint.java @@ -23,6 +23,7 @@ import java.util.Map; import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import com.google.common.base.Function; @@ -36,9 +37,10 @@ import com.google.common.collect.Maps; public abstract class OrgURIToEndpoint implements Function { protected final Supplier> orgMap; - protected final URI defaultOrg; + protected final ReferenceType defaultOrg; - public OrgURIToEndpoint(Supplier> orgMap, @org.jclouds.vcloud.endpoints.Org URI defaultUri) { + public OrgURIToEndpoint(Supplier> orgMap, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultUri) { this.orgMap = orgMap; this.defaultOrg = defaultUri; } @@ -53,7 +55,7 @@ public abstract class OrgURIToEndpoint implements Function { }); try { - TerremarkOrg org = TerremarkOrg.class.cast(uriToOrg.get(from == null ? defaultOrg : from)); + TerremarkOrg org = TerremarkOrg.class.cast(uriToOrg.get(from == null ? defaultOrg.getHref() : from)); return getUriFromOrg(org); } catch (NullPointerException e) { throw new ResourceNotFoundException("org " + from + " not found in: " + uriToOrg, e); diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java index 4f670f6759..be45bb7ae9 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import com.google.common.base.Function; @@ -38,7 +39,7 @@ import com.google.common.base.Supplier; public class OrgURIToKeysListEndpoint extends OrgURIToEndpoint implements Function { @Inject public OrgURIToKeysListEndpoint(Supplier> orgMap, - @org.jclouds.vcloud.endpoints.Org URI defaultUri) { + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultUri) { super(orgMap, defaultUri); } diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToInternetServicesEndpoint.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToInternetServicesEndpoint.java index 4d522c8034..40d1e03461 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToInternetServicesEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToInternetServicesEndpoint.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.VDC; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; @@ -38,19 +39,19 @@ import com.google.common.base.Supplier; @Singleton public class VDCURIToInternetServicesEndpoint implements Function { private final Supplier> orgVDCMap; - private final URI defaultVDC; + private final ReferenceType defaultVDC; @Inject public VDCURIToInternetServicesEndpoint(Supplier> orgVDCMap, - @VDC URI defaultVDC) { + @VDC ReferenceType defaultVDC) { this.orgVDCMap = orgVDCMap; this.defaultVDC = defaultVDC; } public URI apply(Object from) { try { - return TerremarkVDC.class.cast(orgVDCMap.get().get(from == null ? defaultVDC : from)).getInternetServices() - .getHref(); + return TerremarkVDC.class.cast(orgVDCMap.get().get(from == null ? defaultVDC.getHref() : from)) + .getInternetServices().getHref(); } catch (NullPointerException e) { throw new ResourceNotFoundException("vdc " + from + " not found in " + orgVDCMap.get()); } diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToPublicIPsEndpoint.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToPublicIPsEndpoint.java index ff93df6683..3447c26a2a 100644 --- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToPublicIPsEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/VDCURIToPublicIPsEndpoint.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.rest.ResourceNotFoundException; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.VDC; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; @@ -38,18 +39,19 @@ import com.google.common.base.Supplier; @Singleton public class VDCURIToPublicIPsEndpoint implements Function { private final Supplier> orgVDCMap; - private final URI defaultVDC; + private final ReferenceType defaultVDC; @Inject public VDCURIToPublicIPsEndpoint(Supplier> orgVDCMap, - @VDC URI defaultVDC) { + @VDC ReferenceType defaultVDC) { this.orgVDCMap = orgVDCMap; this.defaultVDC = defaultVDC; } public URI apply(Object from) { try { - return TerremarkVDC.class.cast(orgVDCMap.get().get(from == null ? defaultVDC : from)).getPublicIps().getHref(); + return TerremarkVDC.class.cast(orgVDCMap.get().get(from == null ? defaultVDC.getHref() : from)).getPublicIps() + .getHref(); } catch (NullPointerException e) { throw new ResourceNotFoundException("vdc " + from + " not found in " + orgVDCMap.get()); } diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java index 74d6934adf..c4d1071369 100644 --- a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java +++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java @@ -54,6 +54,7 @@ import org.jclouds.ssh.jsch.config.JschSshClientModule; import org.jclouds.vcloud.VCloudExpressClientLiveTest; import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.Task; @@ -64,10 +65,12 @@ import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.predicates.TaskSuccess; import org.jclouds.vcloud.terremark.domain.CustomizationParameters; import org.jclouds.vcloud.terremark.domain.InternetService; +import org.jclouds.vcloud.terremark.domain.KeyPair; import org.jclouds.vcloud.terremark.domain.Node; import org.jclouds.vcloud.terremark.domain.Protocol; import org.jclouds.vcloud.terremark.domain.PublicIpAddress; import org.jclouds.vcloud.terremark.domain.TerremarkCatalogItem; +import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions; import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions; @@ -99,49 +102,65 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes protected VCloudExpressVApp clone; protected VDC vdc; public static final String PREFIX = System.getProperty("user.name") + "-terremark"; - + @Test - public void testListOrgs() throws Exception { - for (ReferenceType org : tmClient.listOrgs()) { - assertNotNull(tmClient.getOrg(org.getHref())); + public void testKeysList() throws Exception { + for (Org oorg : orgs) { + TerremarkVCloudClient vCloudExpressClient = TerremarkVCloudClient.class.cast(tmClient); + TerremarkOrg org = (TerremarkOrg) oorg; + Set response = vCloudExpressClient.listKeyPairsInOrg(org.getHref()); + assertNotNull(response); } } - + @Test public void testGetAllInternetServices() throws Exception { - for (InternetService service : tmClient.getAllInternetServicesInVDC(tmClient.findVDCInOrgNamed(null, null) - .getHref())) { - assertNotNull(tmClient.getNodes(service.getId())); + for (Org org : orgs) { + for (ReferenceType vdc : org.getVDCs().values()) { + for (InternetService service : tmClient.getAllInternetServicesInVDC(vdc.getHref())) { + assertNotNull(tmClient.getNodes(service.getId())); + } + } } } @Test public void testCreateInternetServiceMonitorDisabled() throws Exception { - VDC vdc = tmClient.findVDCInOrgNamed(null, null); - Set publicIpAddresses = tmClient.getPublicIpsAssociatedWithVDC(vdc.getHref()); - PublicIpAddress publicIp = publicIpAddresses.iterator().next(); - - InternetService service = tmClient.addInternetServiceToExistingIp(publicIp.getId(), PREFIX + "-no-monitoring", - Protocol.TCP, 1234, AddInternetServiceOptions.Builder.monitorDisabled()); - tmClient.deleteInternetService(service.getId()); + for (Org org : orgs) { + for (ReferenceType vdc : org.getVDCs().values()) { + Set publicIpAddresses = tmClient.getPublicIpsAssociatedWithVDC(vdc.getHref()); + PublicIpAddress publicIp = publicIpAddresses.iterator().next(); + InternetService service = tmClient.addInternetServiceToExistingIp(publicIp.getId(), PREFIX + + "-no-monitoring", Protocol.TCP, 1234, AddInternetServiceOptions.Builder.monitorDisabled()); + tmClient.deleteInternetService(service.getId()); + } + } } @Test public void testGetPublicIpsAssociatedWithVDC() throws Exception { - for (PublicIpAddress ip : tmClient - .getPublicIpsAssociatedWithVDC(tmClient.findVDCInOrgNamed(null, null).getHref())) { - assertNotNull(tmClient.getInternetServicesOnPublicIp(ip.getId())); - assertNotNull(tmClient.getPublicIp(ip.getId())); + for (Org org : orgs) { + for (ReferenceType vdc : org.getVDCs().values()) { + for (PublicIpAddress ip : tmClient.getPublicIpsAssociatedWithVDC(vdc.getHref())) { + assertNotNull(tmClient.getInternetServicesOnPublicIp(ip.getId())); + assertNotNull(tmClient.getPublicIp(ip.getId())); + } + } } } @Test public void testGetConfigCustomizationOptions() throws Exception { - Catalog response = connection.findCatalogInOrgNamed(null, null); - for (ReferenceType resource : response.values()) { - if (resource.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML)) { - TerremarkCatalogItem item = tmClient.findCatalogItemInOrgCatalogNamed(null, null, resource.getName()); - assert tmClient.getCustomizationOptions(item.getCustomizationOptions().getHref()) != null; + for (Org org : orgs) { + for (ReferenceType catalog : org.getCatalogs().values()) { + Catalog response = connection.getCatalog(catalog.getHref()); + for (ReferenceType resource : response.values()) { + if (resource.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML)) { + TerremarkCatalogItem item = tmClient.findCatalogItemInOrgCatalogNamed(org.getName(), + catalog.getName(), resource.getName()); + assert tmClient.getCustomizationOptions(item.getCustomizationOptions().getHref()) != null; + } + } } } } @@ -149,16 +168,20 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes @Test public void testDefaultVDC() throws Exception { super.testDefaultVDC(); - TerremarkVDC response = (TerremarkVDC) tmClient.findVDCInOrgNamed(null, null); - assertNotNull(response); - assertNotNull(response.getCatalog()); - assertNotNull(response.getInternetServices()); - assertNotNull(response.getPublicIps()); + for (Org org : orgs) { + for (ReferenceType vdc : org.getVDCs().values()) { + TerremarkVDC response = (TerremarkVDC) tmClient.getVDC(vdc.getHref()); + assertNotNull(response); + assertNotNull(response.getCatalog()); + assertNotNull(response.getInternetServices()); + assertNotNull(response.getPublicIps()); + } + } } @Test(enabled = true) public void testInstantiateAndPowerOn() throws InterruptedException, ExecutionException, TimeoutException, - IOException { + IOException { prepare(); StringBuffer name = new StringBuffer(); for (int i = 0; i < 15; i++) @@ -184,7 +207,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes // if this template supports setting the root password, let's add it to // our options CustomizationParameters customizationOptions = tmClient.getCustomizationOptions(item.getCustomizationOptions() - .getHref()); + .getHref()); if (customizationOptions.canCustomizePassword()) instantiateOptions.withPassword("robotsarefun"); @@ -194,7 +217,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes // instantiate, noting vApp returned has minimal details vApp = tmClient.instantiateVAppTemplateInVDC(vdc.getHref(), vAppTemplate.getHref(), serverName, - instantiateOptions); + instantiateOptions); assertEquals(vApp.getStatus(), Status.RESOLVED); @@ -286,7 +309,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes @Test(enabled = true, dependsOnMethods = { "testInstantiateAndPowerOn", "testAddInternetService" }) public void testPublicIp() throws InterruptedException, ExecutionException, TimeoutException, IOException { node = tmClient.addNode(is.getId(), Iterables.getLast(vApp.getNetworkToAddresses().values()), vApp.getName() - + "-SSH", 22); + + "-SSH", 22); loopAndCheckPass(); } @@ -349,18 +372,18 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes vApp = tmClient.getVApp(vApp.getHref()); Task task = tmClient.configureVApp(vApp, changeNameTo("eduardo").changeMemoryTo(1536).changeProcessorCountTo(1) - .addDisk(25 * 1048576).addDisk(25 * 1048576)); + .addDisk(25 * 1048576).addDisk(25 * 1048576)); assert successTester.apply(task.getHref()); vApp = tmClient.getVApp(vApp.getHref()); assertEquals(vApp.getName(), "eduardo"); assertEquals(find(vApp.getResourceAllocations(), CIMPredicates.resourceTypeIn(ResourceType.PROCESSOR)) - .getVirtualQuantity().longValue(), 1); + .getVirtualQuantity().longValue(), 1); assertEquals(find(vApp.getResourceAllocations(), CIMPredicates.resourceTypeIn(ResourceType.MEMORY)) - .getVirtualQuantity().longValue(), 1536); + .getVirtualQuantity().longValue(), 1536); assertEquals(size(filter(vApp.getResourceAllocations(), CIMPredicates.resourceTypeIn(ResourceType.DISK_DRIVE))), - 3); + 3); assert successTester.apply(tmClient.powerOnVApp(vApp.getHref()).getHref()); @@ -370,11 +393,11 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes // extract the disks on the vApp sorted by addressOnParent List disks = Lists.newArrayList(filter(vApp.getResourceAllocations(), - CIMPredicates.resourceTypeIn(ResourceType.DISK_DRIVE))); + CIMPredicates.resourceTypeIn(ResourceType.DISK_DRIVE))); // delete the second disk - task = tmClient.configureVApp(vApp, deleteDiskWithAddressOnParent(Integer.parseInt(disks.get(1) - .getAddressOnParent()))); + task = tmClient.configureVApp(vApp, + deleteDiskWithAddressOnParent(Integer.parseInt(disks.get(1).getAddressOnParent()))); assert successTester.apply(task.getHref()); @@ -383,17 +406,18 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes } protected void verifyConfigurationOfVApp(VCloudExpressVApp vApp, String serverName, String expectedOs, - int processorCount, long memory, long hardDisk) { + int processorCount, long memory, long hardDisk) { assertEquals(vApp.getName(), serverName); assertEquals(vApp.getOperatingSystemDescription(), expectedOs); assertEquals((int) find(vApp.getResourceAllocations(), CIMPredicates.resourceTypeIn(ResourceType.PROCESSOR)) - .getVirtualQuantity().longValue(), processorCount); + .getVirtualQuantity().longValue(), processorCount); assertEquals(find(vApp.getResourceAllocations(), CIMPredicates.resourceTypeIn(ResourceType.MEMORY)) - .getVirtualQuantity().longValue(), memory); + .getVirtualQuantity().longValue(), memory); assertEquals(find(vApp.getResourceAllocations(), CIMPredicates.resourceTypeIn(ResourceType.DISK_DRIVE)) - .getVirtualQuantity().longValue(), hardDisk); - assertEquals(vApp.getSize().longValue(), find(vApp.getResourceAllocations(), - CIMPredicates.resourceTypeIn(ResourceType.DISK_DRIVE)).getVirtualQuantity().longValue()); + .getVirtualQuantity().longValue(), hardDisk); + assertEquals(vApp.getSize().longValue(), + find(vApp.getResourceAllocations(), CIMPredicates.resourceTypeIn(ResourceType.DISK_DRIVE)) + .getVirtualQuantity().longValue()); } protected void doCheckPass(String address) throws IOException { @@ -476,8 +500,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes Properties overrides = setupProperties(); injector = new RestContextFactory().createContextBuilder(provider, - ImmutableSet. of(new Log4JLoggingModule(), new JschSshClientModule()), overrides) - .buildInjector(); + ImmutableSet. of(new Log4JLoggingModule(), new JschSshClientModule()), overrides).buildInjector(); connection = tmClient = injector.getInstance(TerremarkVCloudClient.class); diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayloadTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayloadTest.java index 721c9f6bdc..df11a07c77 100644 --- a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayloadTest.java +++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayloadTest.java @@ -32,6 +32,8 @@ import javax.inject.Singleton; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.util.Strings2; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl; import org.jclouds.vcloud.domain.network.NetworkConfig; import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.terremark.TerremarkVCloudPropertiesBuilder; @@ -68,8 +70,8 @@ public class TerremarkBindInstantiateVAppTemplateParamsToXmlPayloadTest { @Network @Provides @Singleton - URI provideNetwork() { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); + ReferenceType provideNetwork() { + return new ReferenceTypeImpl(null, null, URI.create("https://vcloud.safesecureweb.com/network/1990")); } }); diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.java b/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.java index 15c7153f43..b65746e016 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudBindComputeSuppliersByClass.java @@ -18,16 +18,27 @@ */ package org.jclouds.vcloud.compute.config; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.find; + import java.util.Set; +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.collect.Memoized; import org.jclouds.compute.config.BindComputeSuppliersByClass; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; import org.jclouds.vcloud.compute.suppliers.StaticHardwareSupplier; import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.endpoints.VDC; +import com.google.common.base.Predicate; import com.google.common.base.Supplier; /** @@ -48,4 +59,47 @@ public class CommonVCloudBindComputeSuppliersByClass extends BindComputeSupplier protected Class>> defineLocationSupplier() { return OrgAndVDCToLocationSupplier.class; } + + @Override + protected Class> defineDefaultLocationSupplier() { + return DefaultVDC.class; + } + + @Singleton + public static class DefaultVDC implements Supplier { + @Singleton + public static final class IsDefaultVDC implements Predicate { + private final ReferenceType defaultVDC; + + @Inject + IsDefaultVDC(@VDC ReferenceType defaultVDC) { + this.defaultVDC = checkNotNull(defaultVDC, "defaultVDC"); + } + + @Override + public boolean apply(Location input) { + return input.getScope() == LocationScope.ZONE && input.getId().equals(defaultVDC.getHref().toASCIIString()); + } + + @Override + public String toString() { + return "isDefaultVDC()"; + } + } + + private final Supplier> locationsSupplier; + private final IsDefaultVDC isDefaultVDC; + + @Inject + DefaultVDC(@Memoized Supplier> locationsSupplier, IsDefaultVDC isDefaultVDC) { + this.locationsSupplier = checkNotNull(locationsSupplier, "locationsSupplierSupplier"); + this.isDefaultVDC = checkNotNull(isDefaultVDC, "isDefaultVDC"); + } + + @Override + public Location get() { + return find(locationsSupplier.get(), isDefaultVDC); + } + + } } \ No newline at end of file diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java b/common/vcloud/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java index 58e587eae8..95dcf06a98 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java @@ -21,30 +21,23 @@ package org.jclouds.vcloud.config; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.concat; -import static com.google.common.collect.Iterables.find; -import static com.google.common.collect.Iterables.get; import static com.google.common.collect.Iterables.getLast; import static com.google.common.collect.Iterables.transform; -import static com.google.common.collect.Maps.newLinkedHashMap; import static com.google.common.collect.Maps.transformValues; import static com.google.common.collect.Maps.uniqueIndex; import static org.jclouds.Constants.PROPERTY_API_VERSION; -import static org.jclouds.Constants.PROPERTY_IDENTITY; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; -import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_NETWORK; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; import java.net.URI; import java.util.Map; -import java.util.NoSuchElementException; -import java.util.SortedMap; import java.util.Map.Entry; +import java.util.SortedMap; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicReference; -import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -55,7 +48,6 @@ import org.jclouds.http.RequiresHttp; import org.jclouds.http.annotation.ClientError; import org.jclouds.http.annotation.Redirection; import org.jclouds.http.annotation.ServerError; -import org.jclouds.logging.Logger; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.AsyncClientFactory; import org.jclouds.rest.AuthorizationException; @@ -73,9 +65,7 @@ import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.endpoints.OrgList; -import org.jclouds.vcloud.endpoints.TasksList; import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog; import org.jclouds.vcloud.functions.AllCatalogItemsInOrg; import org.jclouds.vcloud.functions.AllCatalogsInOrg; @@ -87,39 +77,41 @@ import org.jclouds.vcloud.predicates.TaskSuccess; import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.base.Predicates; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; -import com.google.inject.ConfigurationException; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; import com.google.inject.Injector; -import com.google.inject.Key; import com.google.inject.Provides; import com.google.inject.TypeLiteral; -import com.google.inject.name.Names; /** - * Configures the VCloud authentication service connection, including logging and http transport. + * Configures the VCloud authentication service connection, including logging + * and http transport. * * @author Adrian Cole */ @RequiresHttp @ConfiguresRestClient public class CommonVCloudRestClientModule extends - RestClientModule { + RestClientModule { public CommonVCloudRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); } public CommonVCloudRestClientModule(Class syncClientType, Class asyncClientType, - Map, Class> delegateMap) { + Map, Class> delegateMap) { super(syncClientType, asyncClientType, delegateMap); } @Override protected void configure() { - requestInjection(this); super.configure(); + // Ensures we don't retry on authorization failures + bind(new TypeLiteral>() { + }).toInstance(new AtomicReference()); + installDefaultVCloudEndpointsModule(); bind(new TypeLiteral>() { }).to(new TypeLiteral() { }); @@ -158,68 +150,29 @@ public class CommonVCloudRestClientModule> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> orgToVDCSupplier) { - return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - Map returnVal = newLinkedHashMap(); - for (Entry orgr : orgToVDCSupplier.get().entrySet()) { - for (String vdc : orgr.getValue().getVDCs().keySet()) { - returnVal.put(vdc, orgr.getKey()); - } - } - return returnVal; - } - }); + protected Supplier> provideVDCtoORG(Supplier> orgNameToOrgSuppier) { + return Suppliers.compose(new Function, Map>() { - } + @Override + public Map apply(Map arg0) { + Builder returnVal = ImmutableMap. builder(); + for (Entry orgr : arg0.entrySet()) { + for (String vdc : orgr.getValue().getVDCs().keySet()) { + returnVal.put(vdc, orgr.getKey()); + } + } + return returnVal.build(); + } + }, orgNameToOrgSuppier); - @Provides - @org.jclouds.vcloud.endpoints.VDC - @Singleton - protected URI provideDefaultVDC(Org org, @org.jclouds.vcloud.endpoints.VDC String defaultVDC) { - checkState(org.getVDCs().size() > 0, "No vdcs present in org %s", org.getName()); - return checkNotNull(org.getVDCs().get(defaultVDC), "vdc %s not present in org %s", defaultVDC, org.getName()) - .getHref(); - } - - @Provides - @org.jclouds.vcloud.endpoints.VDC - @Singleton - protected String provideDefaultVDCName( - @org.jclouds.vcloud.endpoints.VDC Supplier> vDCtoOrgSupplier) { - Map vDCtoOrg = vDCtoOrgSupplier.get(); - checkState(vDCtoOrg.keySet().size() > 0, "No vdcs present!"); - return get(vDCtoOrg.keySet(), 0); - } - - @Provides - @org.jclouds.vcloud.endpoints.Catalog - @Singleton - protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user, WriteableCatalog writableCatalog) { - checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); - try { - return find(org.getCatalogs().values(), writableCatalog).getHref(); - } catch (NoSuchElementException e) { - throw new NoSuchElementException(String.format("no writable catalogs in org %s; catalogs %s", org, org - .getCatalogs())); - } } @Provides @Singleton protected Supplier> provideOrgMapCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final OrgMapSupplier supplier) { + AtomicReference authException, OrgMapSupplier supplier) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - - }); + authException, seconds, supplier); } @Provides @@ -227,33 +180,17 @@ public class CommonVCloudRestClientModule sessionSupplier) { VCloudSession session = sessionSupplier.get(); - return URI.create(Iterables.getLast(session.getOrgs().values()).getHref().toASCIIString().replaceAll("org/.*", - "org")); - } - - @Singleton - public static class WriteableCatalog implements Predicate { - private final CommonVCloudClient client; - - @Inject - public WriteableCatalog(CommonVCloudClient client) { - this.client = client; - } - - @Override - public boolean apply(ReferenceType arg0) { - return !client.getCatalog(arg0.getHref()).isReadOnly(); - } + return URI.create(getLast(session.getOrgs().values()).getHref().toASCIIString().replaceAll("org/.*", "org")); } @Singleton public static class OrgMapSupplier implements Supplier> { protected final Supplier sessionSupplier; - private final Function, Iterable> organizationsForNames; + protected final Function, Iterable> organizationsForNames; @Inject protected OrgMapSupplier(Supplier sessionSupplier, - Function, Iterable> organizationsForNames) { + Function, Iterable> organizationsForNames) { this.sessionSupplier = sessionSupplier; this.organizationsForNames = organizationsForNames; } @@ -264,15 +201,19 @@ public class CommonVCloudRestClientModule>> { + Supplier>> { protected final Supplier> orgSupplier; - private final Function> allCatalogsInOrg; + protected final Function> allCatalogsInOrg; @Inject protected OrgCatalogSupplier(Supplier> orgSupplier, - Function> allCatalogsInOrg) { + Function> allCatalogsInOrg) { this.orgSupplier = orgSupplier; this.allCatalogsInOrg = allCatalogsInOrg; } @@ -280,67 +221,41 @@ public class CommonVCloudRestClientModule> get() { return transformValues( - transformValues(orgSupplier.get(), allCatalogsInOrg), - new Function, Map>() { + transformValues(orgSupplier.get(), allCatalogsInOrg), + new Function, Map>() { - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } - }); + }); } } - @Resource - protected Logger logger = Logger.NULL; - @VCloudToken @Provides String provideVCloudToken(Supplier cache) { return checkNotNull(cache.get().getVCloudToken(), "No token present in session"); } - @Provides - @org.jclouds.vcloud.endpoints.Org - @Singleton - protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return getLast(orgs).getHref(); - } - - @Provides - @org.jclouds.vcloud.endpoints.Org - @Singleton - protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return getLast(orgs).getName(); - } - @Provides @org.jclouds.vcloud.endpoints.Org @Singleton protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final OrgNameToOrgSupplier supplier) { + AtomicReference authException, OrgNameToOrgSupplier supplier) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + authException, seconds, supplier); } @Provides @Singleton protected Supplier> provideURIToVDC( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final URItoVDC supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + URItoVDC supplier) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + authException, seconds, supplier); } @Singleton @@ -355,39 +270,28 @@ public class CommonVCloudRestClientModule get() { return uniqueIndex( - concat(transform( - orgVDCMap.get().values(), - new Function, Iterable>() { + concat(transform( + orgVDCMap.get().values(), + new Function, Iterable>() { - @Override - public Iterable apply( - Map from) { - return from.values(); - } + @Override + public Iterable apply( + Map from) { + return from.values(); + } - })), new Function() { + })), new Function() { - @Override - public URI apply(org.jclouds.vcloud.domain.VDC from) { - return from.getHref(); - } + @Override + public URI apply(org.jclouds.vcloud.domain.VDC from) { + return from.getHref(); + } - }); + }); } } - @Provides - @org.jclouds.vcloud.endpoints.Org - @Singleton - protected Iterable provideOrgs(Supplier cache, @Named(PROPERTY_IDENTITY) String user) { - VCloudSession discovery = cache.get(); - checkState(discovery.getOrgs().size() > 0, "No orgs present for user: " + user); - return discovery.getOrgs().values(); - } - - protected AtomicReference authException = new AtomicReference(); - final static Function name = new Function() { @Override @@ -401,8 +305,7 @@ public class CommonVCloudRestClientModule versions = versionService.getSupportedVersions().get(180, TimeUnit.SECONDS); checkState(versions.size() > 0, "No versions present"); checkState(versions.containsKey(version), "version " + version + " not present in: " + versions); @@ -433,107 +336,46 @@ public class CommonVCloudRestClientModule>> catalogs) { - return getLast(getLast(catalogs.get().values()).keySet()); - } - - @Provides - @Network - @Singleton - protected URI provideDefaultNetwork(@org.jclouds.vcloud.endpoints.VDC URI defaultVDC, Injector injector) { - if (authException.get() != null) - throw authException.get(); - try { - org.jclouds.vcloud.domain.VDC vDC = injector.getInstance(CommonVCloudClient.class).getVDC(defaultVDC); - Map networks = vDC.getAvailableNetworks(); - checkState(networks.size() > 0, "No networks present in vDC: " + vDC.getName()); - if (networks.size() == 1) - return Iterables.getLast(networks.values()).getHref(); - String networkName = null; - try { - networkName = injector.getInstance(Key.get(String.class, Names.named(PROPERTY_VCLOUD_DEFAULT_NETWORK))); - ReferenceType network = networks.get(Iterables.find(networks.keySet(), Predicates - .containsPattern(networkName))); - return network.getHref(); - } catch (NoSuchElementException e) { - throw new IllegalStateException(String.format("network matching [%s] not in %s", networkName, networks.keySet())); - } catch (ConfigurationException e) { - return findDefaultNetworkForVDC(vDC, networks, injector); - } - } catch (AuthorizationException e) { - authException.set(e); - throw e; - } - } - - protected URI findDefaultNetworkForVDC(org.jclouds.vcloud.domain.VDC vDC, Map networks, - Injector injector) { - logger.warn("default network for vdc %s not set", vDC.getName()); - return Iterables.getLast(networks.values()).getHref(); - } - - @Provides - @Singleton - protected Org provideOrg(CommonVCloudClient discovery) { - if (authException.get() != null) - throw authException.get(); - try { - return discovery.findOrgNamed(null); - } catch (AuthorizationException e) { - authException.set(e); - throw e; - } + protected Org provideOrg(Supplier> orgSupplier, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return orgSupplier.get().get(defaultOrg.getName()); } @Provides @Singleton protected Predicate successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { return new RetryablePredicate(injector.getInstance(TaskSuccess.class), completed); } @Provides @Singleton protected Supplier>> provideOrgCatalogItemMapSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + OrgCatalogSupplier supplier) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); + authException, seconds, supplier); } - + @Provides @Singleton protected Supplier>> provideOrgVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + OrgVDCSupplier supplier) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); + authException, seconds, supplier); } @Singleton public static class OrgVDCSupplier implements - Supplier>> { + Supplier>> { protected final Supplier> orgSupplier; private final Function> allVDCsInOrg; @Inject protected OrgVDCSupplier(Supplier> orgSupplier, - Function> allVDCsInOrg) { + Function> allVDCsInOrg) { this.orgSupplier = orgSupplier; this.allVDCsInOrg = allVDCsInOrg; } @@ -541,29 +383,29 @@ public class CommonVCloudRestClientModule> get() { return transformValues( - transformValues(orgSupplier.get(), allVDCsInOrg), - new Function, Map>() { + transformValues(orgSupplier.get(), allVDCsInOrg), + new Function, Map>() { - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } - }); + }); } } @Singleton public static class OrgCatalogItemSupplier implements - Supplier>>> { + Supplier>>> { protected final Supplier>> catalogSupplier; - private final Function> allCatalogItemsInCatalog; + protected final Function> allCatalogItemsInCatalog; @Inject protected OrgCatalogItemSupplier( - Supplier>> catalogSupplier, - Function> allCatalogItemsInCatalog) { + Supplier>> catalogSupplier, + Function> allCatalogItemsInCatalog) { this.catalogSupplier = catalogSupplier; this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; } @@ -571,47 +413,34 @@ public class CommonVCloudRestClientModule>> get() { return transformValues( - catalogSupplier.get(), - new Function, Map>>() { + catalogSupplier.get(), + new Function, Map>>() { - @Override - public Map> apply( - Map from) { - return transformValues( - from, - new Function>() { + @Override + public Map> apply( + Map from) { + return transformValues( + from, + new Function>() { - @Override - public Map apply( - org.jclouds.vcloud.domain.Catalog from) { - return uniqueIndex(allCatalogItemsInCatalog.apply(from), name); - } - }); + @Override + public Map apply(org.jclouds.vcloud.domain.Catalog from) { + return uniqueIndex(allCatalogItemsInCatalog.apply(from), name); + } + }); - } - }); + } + }); } } @Provides @Singleton protected Supplier>>> provideOrgCatalogItemSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogItemSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + OrgCatalogItemSupplier supplier) { return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( - authException, seconds, - new Supplier>>>() { - @Override - public Map>> get() { - return supplier.get(); - } - }); - } - - @Provides - @TasksList - @Singleton - protected URI provideDefaultTasksList(Org org) { - return org.getTasksList().getHref(); + authException, seconds, supplier); } @Override diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultCatalogForOrg.java b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultCatalogForOrg.java new file mode 100644 index 0000000000..122827071c --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultCatalogForOrg.java @@ -0,0 +1,65 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.config; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_CATALOG; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.config.ValueOfConfigurationKeyOrNull; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.endpoints.Catalog; +import org.jclouds.vcloud.suppliers.OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class DefaultCatalogForOrg implements Function { + private final OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault selector; + private final Supplier> nameToOrg; + + @Inject + public DefaultCatalogForOrg(ValueOfConfigurationKeyOrNull valueOfConfigurationKeyOrNull, + @Catalog Predicate defaultSelector, Supplier> nameToOrg) { + this.selector = new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(checkNotNull( + valueOfConfigurationKeyOrNull, "valueOfConfigurationKeyOrNull"), PROPERTY_VCLOUD_DEFAULT_CATALOG, + checkNotNull(defaultSelector, "defaultSelector")); + this.nameToOrg = checkNotNull(nameToOrg, "nameToOrg"); + } + + @Override + public ReferenceType apply(ReferenceType defaultOrg) { + org.jclouds.vcloud.domain.Org org = nameToOrg.get().get(defaultOrg.getName()); + checkState(org != null, "could not retrieve Org at %s", defaultOrg); + return selector.apply(org.getCatalogs().values()); + } + +} \ No newline at end of file diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultNetworkForVDC.java b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultNetworkForVDC.java new file mode 100644 index 0000000000..2888037c19 --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultNetworkForVDC.java @@ -0,0 +1,68 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.config; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_NETWORK; + +import java.net.URI; +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.config.ValueOfConfigurationKeyOrNull; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.endpoints.Network; +import org.jclouds.vcloud.suppliers.OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class DefaultNetworkForVDC implements Function { + + private final OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault selector; + private final Supplier> uriToVDC; + + @Inject + public DefaultNetworkForVDC(ValueOfConfigurationKeyOrNull valueOfConfigurationKeyOrNull, + @Network Predicate defaultSelector, + Supplier> uriToVDC) { + this.selector = new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(checkNotNull( + valueOfConfigurationKeyOrNull, "valueOfConfigurationKeyOrNull"), PROPERTY_VCLOUD_DEFAULT_NETWORK, + checkNotNull(defaultSelector, "defaultSelector")); + this.uriToVDC = checkNotNull(uriToVDC, "uriToVDC"); + } + + @Override + public ReferenceType apply(ReferenceType defaultVDC) { + org.jclouds.vcloud.domain.VDC vDC = uriToVDC.get().get(defaultVDC.getHref()); + checkState(vDC != null, "could not retrieve VDC at %s", defaultVDC); + return selector.apply(vDC.getAvailableNetworks().values()); + } + +} \ No newline at end of file diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultOrgForUser.java b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultOrgForUser.java new file mode 100644 index 0000000000..6c7cff4db0 --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultOrgForUser.java @@ -0,0 +1,64 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.session/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.config; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_ORG; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.config.ValueOfConfigurationKeyOrNull; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.domain.VCloudSession; +import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.suppliers.OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class DefaultOrgForUser implements Function { + + private final OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault selector; + private final Supplier sessionSupplier; + + @Inject + public DefaultOrgForUser(ValueOfConfigurationKeyOrNull valueOfConfigurationKeyOrNull, + @Org Predicate defaultSelector, Supplier sessionSupplier) { + this.selector = new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(checkNotNull( + valueOfConfigurationKeyOrNull, "valueOfConfigurationKeyOrNull"), PROPERTY_VCLOUD_DEFAULT_ORG, checkNotNull( + defaultSelector, "defaultSelector")); + this.sessionSupplier = checkNotNull(sessionSupplier, "sessionSupplier"); + } + + @Override + public ReferenceType apply(String user) { + VCloudSession session = sessionSupplier.get(); + checkState(session != null, "could not retrieve Session at %s", user); + return selector.apply(session.getOrgs().values()); + } + +} \ No newline at end of file diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultTasksListForOrg.java b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultTasksListForOrg.java new file mode 100644 index 0000000000..85f624f6ab --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultTasksListForOrg.java @@ -0,0 +1,55 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.config; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class DefaultTasksListForOrg implements Function { + private final Supplier> nameToOrg; + + @Inject + public DefaultTasksListForOrg(Supplier> nameToOrg) { + this.nameToOrg = checkNotNull(nameToOrg, "nameToOrg"); + } + + @Override + public ReferenceType apply(ReferenceType defaultOrg) { + org.jclouds.vcloud.domain.Org org = nameToOrg.get().get(defaultOrg.getName()); + checkState(org != null, "could not retrieve Org at %s", defaultOrg); + return org.getTasksList(); + } + +} \ No newline at end of file diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultVCloudReferencesModule.java b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultVCloudReferencesModule.java new file mode 100644 index 0000000000..72a21e3fa5 --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultVCloudReferencesModule.java @@ -0,0 +1,175 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.config; + +import static org.jclouds.Constants.PROPERTY_IDENTITY; + +import java.net.URI; +import java.util.Map; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.ReferenceType; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Predicates; +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableMap.Builder; +import com.google.inject.AbstractModule; +import com.google.inject.Injector; +import com.google.inject.Provides; + +/** + * + * @author Adrian Cole + */ +public class DefaultVCloudReferencesModule extends AbstractModule { + + @Override + protected void configure() { + + } + + @Provides + @org.jclouds.vcloud.endpoints.Org + @Singleton + protected ReferenceType provideDefaultOrg(DefaultOrgForUser defaultOrgURIForUser, + @Named(PROPERTY_IDENTITY) String user) { + return defaultOrgURIForUser.apply(user); + } + + @Provides + @Singleton + @org.jclouds.vcloud.endpoints.Org + protected Predicate provideDefaultOrgSelector(Injector i) { + return Predicates.alwaysTrue(); + } + + @Provides + @org.jclouds.vcloud.endpoints.TasksList + @Singleton + protected ReferenceType provideDefaultTasksList(DefaultTasksListForOrg defaultTasksListURIForOrg, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return defaultTasksListURIForOrg.apply(defaultOrg); + } + + @Provides + @org.jclouds.vcloud.endpoints.Catalog + @Singleton + protected ReferenceType provideDefaultCatalog(DefaultCatalogForOrg defaultCatalogURIForOrg, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return defaultCatalogURIForOrg.apply(defaultOrg); + } + + @Provides + @Singleton + @org.jclouds.vcloud.endpoints.Catalog + protected Predicate provideDefaultCatalogSelector(Injector i) { + return i.getInstance(WriteableCatalog.class); + } + + @Provides + @Singleton + protected Supplier> provideCatalogsById( + Supplier>> supplier) { + return Suppliers + .compose( + new Function>, Map>() { + + @Override + public Map apply(Map> arg0) { + Builder builder = ImmutableMap. builder(); + for (Map v1 : arg0.values()) { + for (Catalog v2 : v1.values()) { + builder.put(v2.getHref(), v2); + } + } + return builder.build(); + } + + }, supplier); + } + + @Singleton + public static class WriteableCatalog implements Predicate { + + @Resource + protected Logger logger = Logger.NULL; + + private final Supplier> catalogsByIdSupplier; + + @Inject + public WriteableCatalog(Supplier> catalogsByIdSupplier) { + this.catalogsByIdSupplier = catalogsByIdSupplier; + } + + @Override + public boolean apply(ReferenceType arg0) { + // TODO: this is inefficient, calculating the index each time, but + // shouldn't be added to constructor as the supplier is an expensive + // call + Map index = catalogsByIdSupplier.get(); + Catalog catalog = index.get(arg0.getHref()); + if (catalog == null) { + if (logger.isTraceEnabled()) + logger.trace("didn't find catalog %s", arg0); + return false; + } else + return !catalog.isReadOnly(); + } + } + + @Provides + @org.jclouds.vcloud.endpoints.VDC + @Singleton + protected ReferenceType provideDefaultVDC(DefaultVDCForOrg defaultVDCURIForOrg, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return defaultVDCURIForOrg.apply(defaultOrg); + } + + @Provides + @Singleton + @org.jclouds.vcloud.endpoints.VDC + protected Predicate provideDefaultVDCSelector(Injector i) { + return Predicates.alwaysTrue(); + } + + @Provides + @org.jclouds.vcloud.endpoints.Network + @Singleton + protected ReferenceType provideDefaultNetwork(DefaultNetworkForVDC defaultNetworkURIForVDC, + @org.jclouds.vcloud.endpoints.VDC ReferenceType defaultVDC) { + return defaultNetworkURIForVDC.apply(defaultVDC); + } + + @Provides + @Singleton + @org.jclouds.vcloud.endpoints.Network + protected Predicate provideDefaultNetworkSelector(Injector i) { + return Predicates.alwaysTrue(); + } +} diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultVDCForOrg.java b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultVDCForOrg.java new file mode 100644 index 0000000000..c1a6de5ffa --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/config/DefaultVDCForOrg.java @@ -0,0 +1,65 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.config; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_VDC; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.config.ValueOfConfigurationKeyOrNull; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.endpoints.VDC; +import org.jclouds.vcloud.suppliers.OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class DefaultVDCForOrg implements Function { + private final OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault selector; + private final Supplier> nameToOrg; + + @Inject + public DefaultVDCForOrg(ValueOfConfigurationKeyOrNull valueOfConfigurationKeyOrNull, + @VDC Predicate defaultSelector, Supplier> nameToOrg) { + this.selector = new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(checkNotNull( + valueOfConfigurationKeyOrNull, "valueOfConfigurationKeyOrNull"), PROPERTY_VCLOUD_DEFAULT_VDC, checkNotNull( + defaultSelector, "defaultSelector")); + this.nameToOrg = checkNotNull(nameToOrg, "nameToOrg"); + } + + @Override + public ReferenceType apply(ReferenceType defaultOrg) { + org.jclouds.vcloud.domain.Org org = nameToOrg.get().get(defaultOrg.getName()); + checkState(org != null, "could not retrieve Org at %s", defaultOrg); + return selector.apply(org.getVDCs().values()); + } + +} \ No newline at end of file diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java b/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java index d9cbd08820..0aec6c6f96 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java @@ -38,8 +38,6 @@ import com.google.common.collect.Maps; */ public class CatalogItemImpl extends ReferenceTypeImpl implements CatalogItem { - /** The serialVersionUID */ - private static final long serialVersionUID = 8464716396538298809L; private final String description; private final ReferenceType entity; private final Map properties = Maps.newLinkedHashMap(); diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/TasksListImpl.java b/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/TasksListImpl.java index 503678fb3b..eb58815f47 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/TasksListImpl.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/domain/internal/TasksListImpl.java @@ -32,10 +32,7 @@ import org.jclouds.vcloud.domain.TasksList; */ public class TasksListImpl implements TasksList { private final SortedSet tasks; - private final URI id; - /** The serialVersionUID */ - private static final long serialVersionUID = 8464716396538298809L; public TasksListImpl(URI id, SortedSet tasks) { this.id = id; diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java index 8972aa4f94..d9dfdb2557 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java @@ -42,15 +42,15 @@ import com.google.common.collect.Iterables; @Singleton public class OrgNameAndCatalogNameToEndpoint implements Function { private final Supplier> orgMap; - private final String defaultOrg; - private final URI defaultUri; + private final ReferenceType defaultOrg; + private final ReferenceType defaultCatalog; @Inject public OrgNameAndCatalogNameToEndpoint(Supplier> orgMap, - @org.jclouds.vcloud.endpoints.Org String defaultOrg, @Catalog URI defaultUri) { + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg, @Catalog ReferenceType defaultCatalog) { this.orgMap = orgMap; this.defaultOrg = defaultOrg; - this.defaultUri = defaultUri; + this.defaultCatalog = defaultCatalog; } @SuppressWarnings("unchecked") @@ -59,9 +59,9 @@ public class OrgNameAndCatalogNameToEndpoint implements Function { Object org = Iterables.get(orgCatalog, 0); Object catalog = Iterables.get(orgCatalog, 1); if (org == null && catalog == null) - return defaultUri; + return defaultCatalog.getHref(); else if (org == null) - org = defaultOrg; + org = defaultOrg.getName(); try { Map catalogs = checkNotNull(orgMap.get().get(org)).getCatalogs(); diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java index ffb1686fae..6bba84dc2d 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java @@ -42,15 +42,15 @@ import com.google.common.collect.Iterables; @Singleton public class OrgNameAndVDCNameToEndpoint implements Function { private final Supplier> orgNameToVDCEndpoint; - private final String defaultOrg; - private final URI defaultUri; + private final ReferenceType defaultOrg; + private final ReferenceType defaultVDC; @Inject public OrgNameAndVDCNameToEndpoint(Supplier> orgNameToVDCEndpoint, - @org.jclouds.vcloud.endpoints.Org String defaultOrg, @VDC URI defaultUri) { + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg, @VDC ReferenceType defaultVDC) { this.orgNameToVDCEndpoint = orgNameToVDCEndpoint; this.defaultOrg = defaultOrg; - this.defaultUri = defaultUri; + this.defaultVDC = defaultVDC; } @SuppressWarnings("unchecked") @@ -59,9 +59,9 @@ public class OrgNameAndVDCNameToEndpoint implements Function { Object org = Iterables.get(orgVdc, 0); Object vdc = Iterables.get(orgVdc, 1); if (org == null && vdc == null) - return defaultUri; + return defaultVDC.getHref(); else if (org == null) - org = defaultOrg; + org = defaultOrg.getName(); try { Map vdcs = checkNotNull(orgNameToVDCEndpoint.get().get(org)).getVDCs(); diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameItemNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameItemNameToEndpoint.java index fd20fea3b9..89d6604e6c 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameItemNameToEndpoint.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameItemNameToEndpoint.java @@ -27,6 +27,7 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.Catalog; import org.jclouds.vcloud.endpoints.Org; @@ -41,13 +42,13 @@ import com.google.common.collect.Iterables; @Singleton public class OrgNameCatalogNameItemNameToEndpoint implements Function { private final Supplier>> orgCatalogMap; - private final String defaultOrg; - private final String defaultCatalog; + private final ReferenceType defaultOrg; + private final ReferenceType defaultCatalog; @Inject public OrgNameCatalogNameItemNameToEndpoint( Supplier>> orgCatalogMap, - @Org String defaultOrg, @Catalog String defaultCatalog) { + @Org ReferenceType defaultOrg, @Catalog ReferenceType defaultCatalog) { this.orgCatalogMap = orgCatalogMap; this.defaultOrg = defaultOrg; this.defaultCatalog = defaultCatalog; @@ -60,9 +61,9 @@ public class OrgNameCatalogNameItemNameToEndpoint implements Function catalogs = checkNotNull(orgCatalogMap.get().get(org)); return catalogs.get(catalog).get(catalogItem).getHref(); diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java index 8f0efac7c9..7c34814734 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java @@ -28,6 +28,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.Catalog; import org.jclouds.vcloud.endpoints.Org; @@ -42,13 +43,13 @@ import com.google.common.collect.Iterables; @Singleton public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function { private final Supplier>>> orgCatalogItemMap; - private final String defaultOrg; - private final String defaultCatalog; + private final ReferenceType defaultOrg; + private final ReferenceType defaultCatalog; @Inject public OrgNameCatalogNameVAppTemplateNameToEndpoint( Supplier>>> orgCatalogItemMap, - @Org String defaultOrg, @Catalog String defaultCatalog) { + @Org ReferenceType defaultOrg, @Catalog ReferenceType defaultCatalog) { this.orgCatalogItemMap = orgCatalogItemMap; this.defaultOrg = defaultOrg; this.defaultCatalog = defaultCatalog; @@ -61,9 +62,9 @@ public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function>> orgCatalogItemMap = this.orgCatalogItemMap.get(); if (!orgCatalogItemMap.containsKey(org)) diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java index 9de5670c67..76f4018ab3 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java @@ -38,18 +38,19 @@ import com.google.common.base.Supplier; @Singleton public class OrgNameToEndpoint implements Function { private final Supplier> orgNameToEndpointSupplier; - private final URI defaultUri; + private final ReferenceType defaultOrg; @Inject - public OrgNameToEndpoint(@Org Supplier> orgNameToEndpointSupplier, @Org URI defaultUri) { + public OrgNameToEndpoint(@Org Supplier> orgNameToEndpointSupplier, + @Org ReferenceType defaultOrg) { this.orgNameToEndpointSupplier = orgNameToEndpointSupplier; - this.defaultUri = defaultUri; + this.defaultOrg = defaultOrg; } public URI apply(Object from) { try { Map orgNameToEndpoint = orgNameToEndpointSupplier.get(); - return from == null ? defaultUri : orgNameToEndpoint.get(from).getHref(); + return from == null ? defaultOrg.getHref() : orgNameToEndpoint.get(from).getHref(); } catch (NullPointerException e) { throw new NoSuchElementException("org " + from + " not found in " + orgNameToEndpointSupplier.get().keySet()); } diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java index 98293c1c2c..f820ef758a 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java @@ -28,6 +28,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.TasksList; import com.google.common.base.Function; @@ -40,18 +41,19 @@ import com.google.common.base.Supplier; @Singleton public class OrgNameToTasksListEndpoint implements Function { private final Supplier> orgMap; - private final URI defaultUri; + private final ReferenceType defaultTasksList; @Inject - public OrgNameToTasksListEndpoint(Supplier> orgMap, @TasksList URI defaultUri) { + public OrgNameToTasksListEndpoint(Supplier> orgMap, + @TasksList ReferenceType defaultTasksList) { this.orgMap = orgMap; - this.defaultUri = defaultUri; + this.defaultTasksList = defaultTasksList; } public URI apply(Object from) { Object org = from; if (org == null) - return defaultUri; + return defaultTasksList.getHref(); try { return checkNotNull(orgMap.get().get(org)).getTasksList().getHref(); } catch (NullPointerException e) { diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java index 0fc028152e..04c76a193d 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java @@ -27,6 +27,7 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.endpoints.VDC; @@ -41,13 +42,13 @@ import com.google.common.collect.Iterables; @Singleton public class OrgNameVDCNameResourceEntityNameToEndpoint implements Function { private final Supplier>> orgVDCMap; - private final String defaultOrg; - private final String defaultVDC; + private final ReferenceType defaultOrg; + private final ReferenceType defaultVDC; @Inject public OrgNameVDCNameResourceEntityNameToEndpoint( - Supplier>> orgVDCMap, @Org String defaultOrg, - @VDC String defaultVDC) { + Supplier>> orgVDCMap, @Org ReferenceType defaultOrg, + @VDC ReferenceType defaultVDC) { this.orgVDCMap = orgVDCMap; this.defaultOrg = defaultOrg; this.defaultVDC = defaultVDC; @@ -60,9 +61,9 @@ public class OrgNameVDCNameResourceEntityNameToEndpoint implements Function vDCs = checkNotNull(orgVDCMap.get().get(org)); return vDCs.get(vDC).getResourceEntities().get(entityName).getHref(); diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java index 6c71e10d4e..442a75e9d4 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java @@ -17,7 +17,7 @@ * ==================================================================== */ package org.jclouds.vcloud.functions; - +import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.http.HttpUtils.releasePayload; import java.util.Map; @@ -69,7 +69,7 @@ public class ParseLoginResponseFromHeaders implements Function org = factory.create(orgHandlerProvider.get()).parse( - from.getPayload().getInput()); + checkNotNull(from.getPayload().getInput(), "no payload in http response to login request %s", from)); return new VCloudSession() { @VCloudToken diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/reference/VCloudConstants.java b/common/vcloud/src/main/java/org/jclouds/vcloud/reference/VCloudConstants.java index da91439fd3..12450d5909 100644 --- a/common/vcloud/src/main/java/org/jclouds/vcloud/reference/VCloudConstants.java +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/reference/VCloudConstants.java @@ -25,7 +25,20 @@ package org.jclouds.vcloud.reference; */ public interface VCloudConstants { public static final String PROPERTY_VCLOUD_VERSION_SCHEMA = "jclouds.vcloud.version.schema"; - + /** + * name of the default org that your vApp will join, if an org isn't + * explicitly specified. + */ + public static final String PROPERTY_VCLOUD_DEFAULT_ORG = "jclouds.vcloud.defaults.org"; + /** + * name of the default catalog to query, if it isn't explicitly specified. + */ + public static final String PROPERTY_VCLOUD_DEFAULT_CATALOG = "jclouds.vcloud.defaults.catalog"; + /** + * name of the VDC that your vApp will join, if a vDC isn't explicitly + * specified. + */ + public static final String PROPERTY_VCLOUD_DEFAULT_VDC = "jclouds.vcloud.defaults.vdc"; /** * name of the default network, in the default VDC that your vApp will join. */ diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/suppliers/OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault.java b/common/vcloud/src/main/java/org/jclouds/vcloud/suppliers/OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault.java new file mode 100644 index 0000000000..a4924e768d --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/suppliers/OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault.java @@ -0,0 +1,101 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.suppliers; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.NoSuchElementException; + +import org.jclouds.config.ValueOfConfigurationKeyOrNull; +import org.jclouds.vcloud.domain.ReferenceType; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +public class OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault implements + Function, ReferenceType> { + + protected final ValueOfConfigurationKeyOrNull valueOfConfigurationKeyOrNull; + protected final String configurationKey; + protected final Predicate defaultSelector; + + public OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault( + ValueOfConfigurationKeyOrNull valueOfConfigurationKeyOrNull, String configurationKey, + Predicate defaultSelector) { + this.configurationKey = checkNotNull(configurationKey, "configurationKey"); + this.valueOfConfigurationKeyOrNull = checkNotNull(valueOfConfigurationKeyOrNull, "valueOfConfigurationKeyOrNull"); + this.defaultSelector = checkNotNull(defaultSelector, "defaultSelector"); + } + + @Override + public ReferenceType apply(Iterable referenceTypes) { + checkNotNull(referenceTypes, "referenceTypes"); + checkArgument(Iterables.size(referenceTypes) > 0, + "No referenceTypes corresponding to configuration key %s present", configurationKey); + if (Iterables.size(referenceTypes) == 1) + return Iterables.getLast(referenceTypes); + String namingPattern = valueOfConfigurationKeyOrNull.apply(configurationKey); + if (namingPattern != null) { + return findReferenceTypeWithNameMatchingPattern(referenceTypes, namingPattern); + } else { + return defaultReferenceType(referenceTypes); + } + } + + public ReferenceType defaultReferenceType(Iterable referenceTypes) { + return Iterables.find(referenceTypes, defaultSelector); + } + + public ReferenceType findReferenceTypeWithNameMatchingPattern(Iterable referenceTypes, + String namingPattern) { + try { + return Iterables.find(referenceTypes, new ReferenceTypeNameMatchesPattern(namingPattern)); + } catch (NoSuchElementException e) { + throw new NoSuchElementException(String.format( + "referenceType matching pattern [%s], corresponding to configuration key %s, not in %s", namingPattern, + configurationKey, referenceTypes)); + } + } + + static class ReferenceTypeNameMatchesPattern implements Predicate { + + private final String namingPattern; + + public ReferenceTypeNameMatchesPattern(String namingPattern) { + this.namingPattern = checkNotNull(namingPattern, "namingPattern"); + } + + @Override + public boolean apply(ReferenceType arg0) { + return arg0.getName().matches(namingPattern); + } + + @Override + public String toString() { + return "nameMatchesPattern(" + namingPattern + ")"; + + } + } +} \ No newline at end of file diff --git a/common/vcloud/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java b/common/vcloud/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java index 685d5e5b2a..39a03c2f92 100644 --- a/common/vcloud/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java +++ b/common/vcloud/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java @@ -22,6 +22,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; +import java.util.Map; import java.util.Properties; import org.jclouds.Constants; @@ -37,9 +38,12 @@ import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.domain.network.OrgNetwork; +import org.jclouds.vcloud.reference.VCloudConstants; +import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.inject.Module; @@ -48,58 +52,127 @@ import com.google.inject.Module; * * @author Adrian Cole */ -@Test(groups = "live", sequential = true) +@Test(groups = "live", singleThreaded = true) public abstract class CommonVCloudClientLiveTest { protected S connection; protected RestContext context; + protected abstract Iterable listOrgs(); + @Test public void testOrg() throws Exception { - Org response = connection.findOrgNamed(null); - assertNotNull(response); - assertNotNull(response.getName()); - assert response.getCatalogs().size() >= 1; - assert response.getTasksList() != null; - assert response.getVDCs().size() >= 1; - assertEquals(connection.findOrgNamed(response.getName()), response); + for (Org org : orgs) { + assertNotNull(org); + assertNotNull(org.getName()); + assert org.getCatalogs().size() >= 1; + assert org.getTasksList() != null; + assert org.getVDCs().size() >= 1; + assertEquals(connection.findOrgNamed(org.getName()), org); + } + } + + @Test + public void testPropertiesCanOverrideDefaultOrg() throws Exception { + for (Org org : orgs) { + RestContext newContext = null; + try { + newContext = createContextWithProperties(overrideDefaults(ImmutableMap.of( + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_ORG, org.getName()))); + assertEquals(newContext.getApi().findOrgNamed(null), org); + } finally { + newContext.close(); + } + } + } + + public Properties overrideDefaults(Map overrides) { + Properties properties = setupProperties(); + properties.putAll(overrides); + return properties; } @Test public void testCatalog() throws Exception { - Org org = connection.findOrgNamed(null); - for (ReferenceType cat : org.getCatalogs().values()) { - Catalog response = connection.getCatalog(cat.getHref()); - assertNotNull(response); - assertNotNull(response.getName()); - assertNotNull(response.getHref()); - assertEquals(connection.findCatalogInOrgNamed(null, response.getName()), response); + for (Org org : orgs) { + for (ReferenceType cat : org.getCatalogs().values()) { + Catalog response = connection.getCatalog(cat.getHref()); + assertNotNull(response); + assertNotNull(response.getName()); + assertNotNull(response.getHref()); + assertEquals(connection.findCatalogInOrgNamed(org.getName(), response.getName()), response); + } + } + } + + @Test + public void testPropertiesCanOverrideDefaultCatalog() throws Exception { + for (Org org : orgs) { + for (ReferenceType cat : org.getCatalogs().values()) { + RestContext newContext = null; + try { + newContext = createContextWithProperties(overrideDefaults(ImmutableMap.of( + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_ORG, org.getName(), + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_CATALOG, cat.getName()))); + assertEquals(newContext.getApi().findCatalogInOrgNamed(null, null), connection.getCatalog(cat.getHref())); + } finally { + newContext.close(); + } + } } } @Test public void testGetOrgNetwork() throws Exception { - Org org = connection.findOrgNamed(null); - for (ReferenceType resource : org.getNetworks().values()) { - if (resource.getType().equals(VCloudMediaType.NETWORK_XML)) { - OrgNetwork item = connection.getNetwork(resource.getHref()); - assertNotNull(item); + for (Org org : orgs) { + for (ReferenceType resource : org.getNetworks().values()) { + if (resource.getType().equals(VCloudMediaType.NETWORK_XML)) { + OrgNetwork item = connection.getNetwork(resource.getHref()); + assertNotNull(item); + } } } } @Test public void testGetVDCNetwork() throws Exception { - Org org = connection.findOrgNamed(null); - for (ReferenceType vdc : org.getVDCs().values()) { - VDC response = connection.getVDC(vdc.getHref()); - for (ReferenceType resource : response.getAvailableNetworks().values()) { - if (resource.getType().equals(VCloudMediaType.NETWORK_XML)) { - try { - OrgNetwork item = connection.getNetwork(resource.getHref()); - assertNotNull(item); - } catch (AuthorizationException e) { + for (Org org : orgs) { + for (ReferenceType vdc : org.getVDCs().values()) { + VDC response = connection.getVDC(vdc.getHref()); + for (ReferenceType resource : response.getAvailableNetworks().values()) { + if (resource.getType().equals(VCloudMediaType.NETWORK_XML)) { + try { + OrgNetwork net = connection.getNetwork(resource.getHref()); + assertNotNull(net); + assertNotNull(net.getName()); + assertNotNull(net.getHref()); + assertEquals( + connection.findNetworkInOrgVDCNamed(org.getName(), response.getName(), net.getName()), net); + } catch (AuthorizationException e) { + } + } + } + } + } + } + + @Test + public void testPropertiesCanOverrideDefaultNetwork() throws Exception { + for (Org org : orgs) { + for (ReferenceType vdc : org.getVDCs().values()) { + VDC response = connection.getVDC(vdc.getHref()); + for (ReferenceType net : response.getAvailableNetworks().values()) { + RestContext newContext = null; + try { + newContext = createContextWithProperties(overrideDefaults(ImmutableMap.of( + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_ORG, org.getName(), + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_VDC, vdc.getName(), + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_NETWORK, net.getName()))); + assertEquals(newContext.getApi().findNetworkInOrgVDCNamed(null, null, null), + connection.getNetwork(net.getHref())); + } finally { + newContext.close(); } } } @@ -108,13 +181,14 @@ public abstract class CommonVCloudClientLiveTest newContext = null; + try { + newContext = createContextWithProperties(overrideDefaults(ImmutableMap.of( + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_ORG, org.getName(), + VCloudConstants.PROPERTY_VCLOUD_DEFAULT_VDC, vdc.getName()))); + assertEquals(newContext.getApi().findVDCInOrgNamed(null, null), connection.getVDC(vdc.getHref())); + } finally { + newContext.close(); + } + } } } @Test public void testDefaultTasksList() throws Exception { - org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null); - assertNotNull(response); - assertNotNull(response.getLocation()); - assertNotNull(response.getTasks()); - assertEquals(connection.getTasksList(response.getLocation()).getLocation(), response.getLocation()); + for (Org org : orgs) { + org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(org.getName()); + assertNotNull(response); + assertNotNull(response.getLocation()); + assertNotNull(response.getTasks()); + assertEquals(connection.getTasksList(response.getLocation()).getLocation(), response.getLocation()); + } } @Test public void testGetTask() throws Exception { - org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null); - assertNotNull(response); - assertNotNull(response.getLocation()); - assertNotNull(response.getTasks()); - if (response.getTasks().size() > 0) { - Task task = response.getTasks().last(); - assertEquals(connection.getTask(task.getHref()).getHref(), task.getHref()); + for (Org org : orgs) { + org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(org.getName()); + assertNotNull(response); + assertNotNull(response.getLocation()); + assertNotNull(response.getTasks()); + if (response.getTasks().size() > 0) { + Task task = response.getTasks().last(); + assertEquals(connection.getTask(task.getHref()).getHref(), task.getHref()); + } } } @@ -184,6 +281,7 @@ public abstract class CommonVCloudClientLiveTest orgs; protected void setupCredentials() { identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity"); @@ -213,10 +311,19 @@ public abstract class CommonVCloudClientLiveTest of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); - + context = createContextWithProperties(setupProperties()); connection = context.getApi(); + orgs = listOrgs(); } + + public RestContext createContextWithProperties(Properties overrides) { + return new ComputeServiceContextFactory(setupRestProperties()).createContext(provider, + ImmutableSet. of(new Log4JLoggingModule()), overrides).getProviderSpecificContext(); + } + + @AfterGroups(groups = { "live" }) + public void teardownClient() { + context.close(); + } + } diff --git a/common/vcloud/src/test/java/org/jclouds/vcloud/suppliers/OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefaultTest.java b/common/vcloud/src/test/java/org/jclouds/vcloud/suppliers/OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefaultTest.java new file mode 100644 index 0000000000..ecb4ae2186 --- /dev/null +++ b/common/vcloud/src/test/java/org/jclouds/vcloud/suppliers/OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefaultTest.java @@ -0,0 +1,124 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.suppliers; + +import static org.easymock.classextension.EasyMock.createMock; +import static org.testng.Assert.assertEquals; + +import java.util.NoSuchElementException; + +import org.jclouds.config.ValueOfConfigurationKeyOrNull; +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl; +import org.testng.annotations.Test; + +import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.name.Names; + +/** + * Tests behavior of + * {@code OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault} + * + * @author Adrian Cole + */ +// NOTE:without testName, this will not call @Before* and fail w/NPE during +// surefire +@Test(groups = "unit", testName = "OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefaultTest") +public class OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefaultTest { + ValueOfConfigurationKeyOrNull valueOfConfigurationKeyOrNull = new ValueOfConfigurationKeyOrNull( + Guice.createInjector()); + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testIllegalArgumentWhenResourcesEmpty() { + new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(valueOfConfigurationKeyOrNull, "foo", + Predicates. alwaysTrue()).apply(ImmutableSet. of()); + } + + @Test + public void testReturnsOnlyResource() { + ReferenceType reference = createMock(ReferenceType.class); + + assertEquals(new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(valueOfConfigurationKeyOrNull, + "foo", Predicates. alwaysTrue()).apply(ImmutableSet. of(reference)), + reference); + + } + + @Test + public void testReturnsFirstResourceWhenConfigurationUnspecified() { + ReferenceType reference1 = createMock(ReferenceType.class); + ReferenceType reference2 = createMock(ReferenceType.class); + + assertEquals(new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(valueOfConfigurationKeyOrNull, + "foo", Predicates. alwaysTrue()).apply(ImmutableList. of(reference1, + reference2)), reference1); + + } + + @Test + public void testReturnsResourceMatchingDefaultPredicateWhenConfigurationUnspecified() { + ReferenceType reference1 = createMock(ReferenceType.class); + ReferenceType reference2 = createMock(ReferenceType.class); + + assertEquals(new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(valueOfConfigurationKeyOrNull, + "foo", Predicates.equalTo(reference2)).apply(ImmutableList. of(reference1, reference2)), + reference2); + + } + + @Test + public void testReturnsResourceWithNameMatchingConfigurationKey() { + ReferenceType reference1 = new ReferenceTypeImpl("travis tritt", null, null); + ReferenceType reference2 = new ReferenceTypeImpl("hail mary", null, null); + + assertEquals(new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault( + new ValueOfConfigurationKeyOrNull(Guice.createInjector(new AbstractModule() { + + @Override + protected void configure() { + bindConstant().annotatedWith(Names.named("foo")).to(".*mary.*"); + } + + })), "foo", Predicates. alwaysTrue()).apply(ImmutableList. of(reference1, + reference2)), reference2); + + } + + @Test(expectedExceptions = NoSuchElementException.class) + public void testThrowsNoSuchElementWhenNoneMatchConfigurationKey() { + ReferenceType reference1 = new ReferenceTypeImpl("travis tritt", null, null); + ReferenceType reference2 = new ReferenceTypeImpl("hail mary", null, null); + + new OnlyReferenceTypeFirstWithNameMatchingConfigurationKeyOrDefault(new ValueOfConfigurationKeyOrNull( + Guice.createInjector(new AbstractModule() { + + @Override + protected void configure() { + bindConstant().annotatedWith(Names.named("foo")).to(".*happy.*"); + } + + })), "foo", Predicates. alwaysTrue()).apply(ImmutableList. of(reference1, + reference2)); + + } +} diff --git a/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BluelockVCloudDirectorPropertiesBuilder.java b/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BluelockVCloudDirectorPropertiesBuilder.java index d16116f559..8294a674a7 100644 --- a/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BluelockVCloudDirectorPropertiesBuilder.java +++ b/providers/bluelock-vcdirector/src/main/java/org/jclouds/vcloud/bluelock/BluelockVCloudDirectorPropertiesBuilder.java @@ -40,7 +40,7 @@ public class BluelockVCloudDirectorPropertiesBuilder extends VCloudPropertiesBui Properties properties = super.defaultProperties(); properties.setProperty(PROPERTY_ISO3166_CODES, "US-IN"); properties.setProperty(PROPERTY_ENDPOINT, "https://vcenterprise.bluelock.com/api"); - properties.setProperty(PROPERTY_VCLOUD_DEFAULT_NETWORK, "internet01"); + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_NETWORK, "internet01-.*"); return properties; } diff --git a/providers/bluelock-vcloud-vcenterprise/src/main/java/org/jclouds/bluelock/vcloud/vcenterprise/BluelockVCloudEnterprisePropertiesBuilder.java b/providers/bluelock-vcloud-vcenterprise/src/main/java/org/jclouds/bluelock/vcloud/vcenterprise/BluelockVCloudEnterprisePropertiesBuilder.java index 5ee26e8d44..79845fae4d 100644 --- a/providers/bluelock-vcloud-vcenterprise/src/main/java/org/jclouds/bluelock/vcloud/vcenterprise/BluelockVCloudEnterprisePropertiesBuilder.java +++ b/providers/bluelock-vcloud-vcenterprise/src/main/java/org/jclouds/bluelock/vcloud/vcenterprise/BluelockVCloudEnterprisePropertiesBuilder.java @@ -37,7 +37,7 @@ public class BluelockVCloudEnterprisePropertiesBuilder extends VCloudPropertiesB Properties properties = super.defaultProperties(); properties.setProperty(PROPERTY_ISO3166_CODES, "US-IN"); properties.setProperty(PROPERTY_ENDPOINT, "https://vcenterprise.bluelock.com/api"); - properties.setProperty(PROPERTY_VCLOUD_DEFAULT_NETWORK, "internet01"); + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_NETWORK, "internet01-.*"); return properties; } diff --git a/providers/bluelock-vcloud-zone01/src/main/java/org/jclouds/bluelock/vcloud/zone01/BluelockVCloudZone01PropertiesBuilder.java b/providers/bluelock-vcloud-zone01/src/main/java/org/jclouds/bluelock/vcloud/zone01/BluelockVCloudZone01PropertiesBuilder.java index 779b1fdf85..493881b105 100644 --- a/providers/bluelock-vcloud-zone01/src/main/java/org/jclouds/bluelock/vcloud/zone01/BluelockVCloudZone01PropertiesBuilder.java +++ b/providers/bluelock-vcloud-zone01/src/main/java/org/jclouds/bluelock/vcloud/zone01/BluelockVCloudZone01PropertiesBuilder.java @@ -37,7 +37,7 @@ public class BluelockVCloudZone01PropertiesBuilder extends VCloudPropertiesBuild Properties properties = super.defaultProperties(); properties.setProperty(PROPERTY_ISO3166_CODES, "US-IN"); properties.setProperty(PROPERTY_ENDPOINT, "https://zone01.bluelock.com/api"); - properties.setProperty(PROPERTY_VCLOUD_DEFAULT_NETWORK, "internet01"); + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_NETWORK, "internet01-.*"); return properties; } diff --git a/providers/trmk-ecloud/pom.xml b/providers/trmk-ecloud/pom.xml index 0d6fbca333..4e5ac83b73 100644 --- a/providers/trmk-ecloud/pom.xml +++ b/providers/trmk-ecloud/pom.xml @@ -36,6 +36,7 @@ https://services.enterprisecloud.terremark.com/api + MIA 0.8b-ext2.8 FIXME FIXME @@ -141,6 +142,10 @@ test.trmk-ecloud.credential ${test.trmk-ecloud.credential} + + test.trmk-ecloud.datacenter + ${test.trmk-ecloud.datacenter} + diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToDataCentersListEndpoint.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToDataCentersListEndpoint.java index 97c9b2281f..38aa6658e8 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToDataCentersListEndpoint.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToDataCentersListEndpoint.java @@ -26,6 +26,7 @@ import javax.inject.Singleton; import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.functions.OrgURIToEndpoint; @@ -40,7 +41,7 @@ import com.google.common.base.Supplier; public class OrgURIToDataCentersListEndpoint extends OrgURIToEndpoint implements Function { @Inject public OrgURIToDataCentersListEndpoint(Supplier> orgMap, - @org.jclouds.vcloud.endpoints.Org URI defaultUri) { + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultUri) { super(orgMap, defaultUri); } diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToTagsListEndpoint.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToTagsListEndpoint.java index aeb35daffe..b8e1b30edf 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToTagsListEndpoint.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToTagsListEndpoint.java @@ -26,6 +26,7 @@ import javax.inject.Singleton; import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.functions.OrgURIToEndpoint; @@ -40,7 +41,7 @@ import com.google.common.base.Supplier; public class OrgURIToTagsListEndpoint extends OrgURIToEndpoint implements Function { @Inject public OrgURIToTagsListEndpoint(Supplier> orgMap, - @org.jclouds.vcloud.endpoints.Org URI defaultUri) { + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultUri) { super(orgMap, defaultUri); } diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java index 6e1c982718..6d0df667e0 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java @@ -76,7 +76,7 @@ import org.jclouds.vcloud.terremark.xml.IpAddressesHandler; import org.jclouds.vcloud.terremark.xml.KeyPairByNameHandler; import org.jclouds.vcloud.terremark.xml.KeyPairHandler; import org.jclouds.vcloud.terremark.xml.KeyPairsHandler; -import org.jclouds.vcloud.terremark.xml.PublicIpAddressesHandler; +import org.jclouds.vcloud.terremark.xml.PublicIpAddressHandler; import org.jclouds.vcloud.terremark.xml.TerremarkNetworkHandler; import org.jclouds.vcloud.terremark.xml.TerremarkOrgNetworkFromTerremarkVCloudExpressNetworkHandler; import org.jclouds.vcloud.terremark.xml.VAppExtendedInfoHandler; @@ -137,8 +137,8 @@ public interface TerremarkECloudAsyncClient extends TerremarkVCloudAsyncClient { */ @POST @Consumes(PUBLICIP_XML) - @XMLResponseParser(PublicIpAddressesHandler.class) - @ExceptionParser(ReturnVoidOnNotFoundOr404.class) + @XMLResponseParser(PublicIpAddressHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture activatePublicIpInVDC( @EndpointParam(parser = VDCURIToPublicIPsEndpoint.class) URI vDCId); diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java index 3244de1357..a79b561462 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java @@ -20,21 +20,20 @@ package org.jclouds.vcloud.terremark.config; import static com.google.common.base.Preconditions.checkNotNull; -import java.net.URI; import java.util.Map; -import java.util.NoSuchElementException; +import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.terremark.ecloud.features.DataCenterOperationsAsyncClient; import org.jclouds.terremark.ecloud.features.DataCenterOperationsClient; import org.jclouds.terremark.ecloud.features.TagOperationsAsyncClient; import org.jclouds.terremark.ecloud.features.TagOperationsClient; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.config.DefaultVCloudReferencesModule; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.terremark.TerremarkECloudAsyncClient; import org.jclouds.vcloud.terremark.TerremarkECloudClient; @@ -45,24 +44,24 @@ import org.jclouds.vcloud.terremark.domain.TerremarkOrgNetwork; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; import com.google.inject.Injector; import com.google.inject.Provides; /** - * Configures the VCloud authentication service connection, including logging and http transport. + * Configures the VCloud authentication service connection, including logging + * and http transport. * * @author Adrian Cole */ @RequiresHttp @ConfiguresRestClient public class TerremarkECloudRestClientModule extends - TerremarkRestClientModule { + TerremarkRestClientModule { public static final Map, Class> DELEGATE_MAP = ImmutableMap., Class> builder()// - .put(DataCenterOperationsClient.class, DataCenterOperationsAsyncClient.class)// - .put(TagOperationsClient.class, TagOperationsAsyncClient.class)// - .build(); + .put(DataCenterOperationsClient.class, DataCenterOperationsAsyncClient.class)// + .put(TagOperationsClient.class, TagOperationsAsyncClient.class)// + .build(); public TerremarkECloudRestClientModule() { super(TerremarkECloudClient.class, TerremarkECloudAsyncClient.class, DELEGATE_MAP); @@ -92,36 +91,51 @@ public class TerremarkECloudRestClientModule extends return in; } - @Override - protected URI findDefaultNetworkForVDC(org.jclouds.vcloud.domain.VDC vDC, Map networks, - final Injector injector) { - // TODO FIXME XXX: In Terremark Enterprise environment with multiple VDC's this does not - // work well. - // Each VDC will have differnt network subnets. So we cannot assume the default VDC's - // networks will - // work with non-default VDC's. So make PROPERTY_VCLOUD_DEFAULT_NETWORK optional. If - // this property - // is not set, they are expected to add NetworkConfig to the options when launching a - // server. - logger.warn("default network for vdc %s not set", vDC.getName()); - try { - return Iterables.find(networks.values(), new Predicate() { + @Singleton + public static class IsDMZNetwork implements Predicate { + private final TerremarkECloudClient client; - @Override - public boolean apply(ReferenceType input) { - TerremarkOrgNetwork network = injector.getInstance(TerremarkECloudClient.class).getNetwork( - input.getHref()); - TerremarkNetwork terremarkNetwork = injector.getInstance(TerremarkECloudClient.class) - .getTerremarkNetwork( - checkNotNull(checkNotNull(network, "network at: " + input).getNetworkExtension(), - "network extension for: " + input).getHref()); - return checkNotNull(terremarkNetwork, "terremark network extension at: " + network.getNetworkExtension()) - .getNetworkType() == TerremarkNetwork.Type.DMZ; - } + @Inject + public IsDMZNetwork(TerremarkECloudClient client) { + this.client = client; + } - }).getHref(); - } catch (NoSuchElementException e) { - throw new ResourceNotFoundException("no dmz networks in vdc " + vDC.getName() + ": " + networks); + @Override + public boolean apply(ReferenceType arg0) { + // TODO FIXME XXX: In Terremark Enterprise environment with multiple + // VDC's + // this does not + // work well. + // Each VDC will have differnt network subnets. So we cannot assume the + // default VDC's + // networks will + // work with non-default VDC's. So make PROPERTY_VCLOUD_DEFAULT_NETWORK + // optional. If + // this property + // is not set, they are expected to add NetworkConfig to the options + // when + // launching a + // server. + TerremarkOrgNetwork orgNetwork = client.getNetwork(arg0.getHref()); + TerremarkNetwork terremarkNetwork = client.getTerremarkNetwork(checkNotNull( + checkNotNull(orgNetwork, "network at: " + arg0).getNetworkExtension(), "network extension for: " + arg0) + .getHref()); + return checkNotNull(terremarkNetwork, "terremark network extension at: " + orgNetwork.getNetworkExtension()) + .getNetworkType() == TerremarkNetwork.Type.DMZ; } } + + @Override + protected void installDefaultVCloudEndpointsModule() { + install(new DefaultVCloudReferencesModule() { + + @Override + protected Predicate provideDefaultNetworkSelector(Injector i) { + return i.getInstance(IsDMZNetwork.class); + } + + }); + + } + } diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java index 4cf89bcfa8..dcc77ce2a5 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/suppliers/TerremarkECloudInternetServiceAndPublicIpAddressSupplier.java @@ -61,7 +61,7 @@ public class TerremarkECloudInternetServiceAndPublicIpAddressSupplier implements @Override public Entry getNewInternetServiceAndIp(VCloudExpressVApp vApp, int port, Protocol protocol) { - logger.debug(">> creating InternetService in vDC %s:%s:%d", vApp.getVDC().getName(), protocol, port); + logger.debug(">> creating InternetService in vDC %s:%s:%d", vApp.getVDC().getHref(), protocol, port); InternetService is = null; PublicIpAddress ip = null; try { diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudAsyncClientTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudAsyncClientTest.java index 097fa449c3..00761a8bd4 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudAsyncClientTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudAsyncClientTest.java @@ -18,13 +18,13 @@ */ package org.jclouds.terremark.ecloud; -import static org.jclouds.Constants.PROPERTY_API_VERSION; -import static org.jclouds.Constants.PROPERTY_IDENTITY; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.testng.Assert.assertEquals; import java.net.URI; import java.util.Map; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; import javax.inject.Named; @@ -32,36 +32,36 @@ import javax.inject.Singleton; import org.jclouds.http.HttpRequest; import org.jclouds.http.RequiresHttp; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; import org.jclouds.rest.RestContextSpec; import org.jclouds.terremark.ecloud.domain.internal.TerremarkECloudOrgImpl; -import org.jclouds.vcloud.CommonVCloudClient; -import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogItemSupplier; -import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogSupplier; +import org.jclouds.vcloud.VCloudExpressLoginAsyncClient; +import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.config.CommonVCloudRestClientModule.OrgVDCSupplier; import org.jclouds.vcloud.domain.AllocationModel; -import org.jclouds.vcloud.domain.Capacity; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudSession; +import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.domain.VDCStatus; +import org.jclouds.vcloud.domain.internal.CatalogImpl; +import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.terremark.TerremarkECloudMediaType; -import org.jclouds.vcloud.terremark.TerremarkVCloudMediaType; import org.jclouds.vcloud.terremark.config.TerremarkECloudRestClientModule; import org.jclouds.vcloud.terremark.domain.internal.TerremarkVDCImpl; -import com.google.common.base.Function; import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.inject.Injector; +import com.google.inject.AbstractModule; import com.google.inject.Module; /** @@ -69,128 +69,6 @@ import com.google.inject.Module; */ public abstract class BaseTerremarkECloudAsyncClientTest extends RestClientTest { - @RequiresHttp - @ConfiguresRestClient - protected static class TerremarkVCloudRestClientModuleExtension extends TerremarkECloudRestClientModule { - @Override - protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { - return URI.create("https://vcloud/login"); - } - - @Override - protected void configure() { - super.configure(); - bind(OrgNameToKeysListSupplier.class).to(TestOrgNameToKeysListSupplier.class); - bind(OrgMapSupplier.class).to(TestTerremarkOrgMapSupplier.class); - bind(OrgCatalogSupplier.class).to(TestOrgCatalogSupplier.class); - bind(OrgCatalogItemSupplier.class).to(TestOrgCatalogItemSupplier.class); - bind(OrgVDCSupplier.class).to(TestTerremarkOrgVDCSupplier.class); - } - - @Singleton - public static class TestOrgNameToKeysListSupplier extends OrgNameToKeysListSupplier { - @Inject - protected TestOrgNameToKeysListSupplier(Supplier sessionSupplier) { - super(sessionSupplier, null); - } - - @Override - public Map get() { - return Maps.transformValues(sessionSupplier.get().getOrgs(), new Function() { - - @Override - public ReferenceType apply(ReferenceType from) { - return new ReferenceTypeImpl(from.getName(), TerremarkECloudMediaType.KEYSLIST_XML, URI.create(from - .getHref().toASCIIString() + "/keysList")); - } - }); - } - } - - @Singleton - public static class TestTerremarkOrgMapSupplier extends OrgMapSupplier { - @Inject - protected TestTerremarkOrgMapSupplier() { - super(null, null); - } - - @Override - public Map get() { - return ImmutableMap. of( - "org", - new TerremarkECloudOrgImpl("org", null, - URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), null, ImmutableMap - . of( - "catalog", - new ReferenceTypeImpl("catalog", TerremarkECloudMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), - ImmutableMap. of( - "vdc", - new ReferenceTypeImpl("vdc", TerremarkECloudMediaType.VDC_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap - . of(), ImmutableMap. of( - "tasksList", - new ReferenceTypeImpl("tasksList", TerremarkECloudMediaType.TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))), - new ReferenceTypeImpl("keysList", TerremarkECloudMediaType.KEYSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")), new ReferenceTypeImpl( - "deviceTags", TerremarkECloudMediaType.TAGSLISTLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/deviceTags/1")), - new ReferenceTypeImpl("vappCatalog", TerremarkECloudMediaType.VAPPCATALOGLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vappCatalog/1")), - new ReferenceTypeImpl("dataCentersList", TerremarkECloudMediaType.DATACENTERSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/datacentersList/1")))); - } - } - - @Override - protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return URI.create("https://org"); - } - - @Override - protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return "org"; - } - - @Override - protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user, WriteableCatalog write) { - return URI.create("https://catalog"); - } - - @Override - protected Org provideOrg(CommonVCloudClient discovery) { - return null; - } - - @Override - protected Iterable provideOrgs(Supplier cache, String user) { - return null; - } - - @Override - protected URI provideDefaultTasksList(Org org) { - return URI.create("https://taskslist"); - } - - @Override - protected URI provideDefaultVDC(Org org, @org.jclouds.vcloud.endpoints.VDC String defaultVDC) { - return URI.create("https://vdc/1"); - } - - @Override - protected String provideDefaultVDCName( - @org.jclouds.vcloud.endpoints.VDC Supplier> vDCtoOrgSupplier) { - return "vdc"; - } - - @Override - protected URI provideDefaultNetwork(URI vdc, Injector injector) { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); - } - } - @Override protected void checkFilters(HttpRequest request) { assertEquals(request.getFilters().size(), 1); @@ -199,7 +77,7 @@ public abstract class BaseTerremarkECloudAsyncClientTest extends RestClientTe @Override protected Module createModule() { - return new TerremarkVCloudRestClientModuleExtension(); + return new TerremarkECloudRestClientModuleExtension(); } @Override @@ -207,37 +85,187 @@ public abstract class BaseTerremarkECloudAsyncClientTest extends RestClientTe return new RestContextFactory().createContextSpec("trmk-ecloud", "identity", "credential", new Properties()); } - @Singleton - public static class TestTerremarkOrgVDCSupplier extends OrgVDCSupplier { - @Inject - protected TestTerremarkOrgVDCSupplier() { - super(null, null); + protected static final ReferenceTypeImpl ORG_REF = new ReferenceTypeImpl("org", VCloudMediaType.ORG_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1")); + + protected static final ReferenceTypeImpl CATALOG_REF = new ReferenceTypeImpl("catalog", VCloudMediaType.CATALOG_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")); + + protected static final ReferenceTypeImpl TASKSLIST_REF = new ReferenceTypeImpl("tasksList", + VCloudMediaType.TASKSLIST_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")); + + protected static final ReferenceTypeImpl VDC_REF = new ReferenceTypeImpl("vdc", VCloudMediaType.VDC_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1")); + + protected static final ReferenceTypeImpl KEYSLIST_REF = new ReferenceTypeImpl("keysList", + TerremarkECloudMediaType.KEYSLIST_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")); + protected static final ReferenceTypeImpl TAGSLIST_REF = new ReferenceTypeImpl("deviceTags", + TerremarkECloudMediaType.TAGSLISTLIST_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/deviceTags/1")); + protected static final ReferenceTypeImpl VAPPCATALOGLIST_REF = new ReferenceTypeImpl("vappCatalog", + TerremarkECloudMediaType.VAPPCATALOGLIST_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vappCatalog/1")); + protected static final ReferenceTypeImpl DATACENTERSLIST_REF = new ReferenceTypeImpl("dataCentersList", + TerremarkECloudMediaType.DATACENTERSLIST_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/datacentersList/1")); + protected static final ReferenceTypeImpl NETWORK_REF = new ReferenceTypeImpl("network", VCloudMediaType.NETWORK_XML, + URI.create("https://vcloud.safesecureweb.com/network/1990")); + + protected static final ReferenceTypeImpl PUBLICIPS_REF = new ReferenceTypeImpl("publicIps", + TerremarkECloudMediaType.PUBLICIPSLIST_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/publicIps/1")); + + protected static final ReferenceTypeImpl INTERNETSERVICES_REF = new ReferenceTypeImpl("internetServices", + TerremarkECloudMediaType.INTERNETSERVICESLIST_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/internetServices/1")); + + protected static final Org ORG = new TerremarkECloudOrgImpl(ORG_REF.getName(), ORG_REF.getType(), ORG_REF.getHref(), + "org", ImmutableMap. of(CATALOG_REF.getName(), CATALOG_REF), + ImmutableMap. of(VDC_REF.getName(), VDC_REF), ImmutableMap. of( + NETWORK_REF.getName(), NETWORK_REF), ImmutableMap. of(TASKSLIST_REF.getName(), + TASKSLIST_REF), KEYSLIST_REF, TAGSLIST_REF, VAPPCATALOGLIST_REF, DATACENTERSLIST_REF); + + protected static final VDC VDC = new TerremarkVDCImpl(VDC_REF.getName(), VDC_REF.getType(), VDC_REF.getHref(), + VDCStatus.READY, null, "description", ImmutableSet. of(), AllocationModel.ALLOCATION_POOL, null, null, + null, ImmutableMap. of( + "vapp", + new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), + "network", + new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), + ImmutableMap. of(NETWORK_REF.getName(), NETWORK_REF), 0, 0, 0, false, CATALOG_REF, + PUBLICIPS_REF, INTERNETSERVICES_REF); + + @RequiresHttp + @ConfiguresRestClient + protected static class TerremarkECloudRestClientModuleExtension extends TerremarkECloudRestClientModule { + + @Override + protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, String version) { + return URI.create("https://vcloud.safesecureweb.com/api/v0.8/login"); } @Override - public Map> get() { - return ImmutableMap.> of("org", - - ImmutableMap. of( - "vdc", - new TerremarkVDCImpl("vdc", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), - VDCStatus.READY, null, "description", ImmutableSet. of(), AllocationModel.UNRECOGNIZED, - new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0), - ImmutableMap. of( - "vapp", - new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), - "network", - new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), ImmutableMap - . of(), 0, 0, 0, false, new ReferenceTypeImpl("catalog", - TerremarkVCloudMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")), - new ReferenceTypeImpl("publicIps", TerremarkVCloudMediaType.PUBLICIPSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/publicIps/1")), new ReferenceTypeImpl( - "internetServices", TerremarkVCloudMediaType.INTERNETSERVICESLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/internetServices/1"))))); + protected Org provideOrg(Supplier> orgSupplier, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return ORG; } - } + @Override + protected void installDefaultVCloudEndpointsModule() { + install(new AbstractModule() { + + @Override + protected void configure() { + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Org.class).toInstance(ORG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Catalog.class).toInstance( + CATALOG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.TasksList.class).toInstance( + TASKSLIST_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.VDC.class).toInstance(VDC_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Network.class).toInstance( + NETWORK_REF); + } + + }); + } + + @Override + protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + AtomicReference authException, VCloudExpressLoginAsyncClient login) { + return Suppliers. ofInstance(new VCloudSession() { + + @Override + public Map getOrgs() { + return ImmutableMap. of(ORG_REF.getName(), ORG_REF); + } + + @Override + public String getVCloudToken() { + return "token"; + } + + }); + + } + + @Override + protected void configure() { + super.configure(); + bind(OrgMapSupplier.class).to(TestOrgMapSupplier.class); + bind(OrgCatalogSupplier.class).to(TestOrgCatalogSupplier.class); + bind(OrgCatalogItemSupplier.class).to(TestOrgCatalogItemSupplier.class); + } + + @Override + protected Supplier>> provideOrgVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + OrgVDCSupplier supplier) { + return Suppliers.>> ofInstance(ImmutableMap + .> of(ORG_REF.getName(), + ImmutableMap. of(VDC.getName(), VDC))); + } + + @Singleton + public static class TestOrgMapSupplier extends OrgMapSupplier { + + @Inject + protected TestOrgMapSupplier() { + super(null, null); + } + + @Override + public Map get() { + return ImmutableMap. of(ORG.getName(), ORG); + } + } + + @Singleton + public static class TestOrgCatalogSupplier extends OrgCatalogSupplier { + @Inject + protected TestOrgCatalogSupplier() { + super(null, null); + } + + @Override + public Map> get() { + return ImmutableMap.> of( + ORG_REF.getName(), ImmutableMap. of( + CATALOG_REF.getName(), + new CatalogImpl(CATALOG_REF.getName(), CATALOG_REF.getType(), CATALOG_REF.getHref(), null, + "description", ImmutableMap. of( + "item", + new ReferenceTypeImpl("item", "application/vnd.vmware.vcloud.catalogItem+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1")), + "template", + new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"))), + ImmutableList. of(), true, false))); + } + } + + @Singleton + public static class TestOrgCatalogItemSupplier extends OrgCatalogItemSupplier { + protected TestOrgCatalogItemSupplier() { + super(null, null); + } + + @Override + public Map>> get() { + return ImmutableMap.>> of( + ORG_REF.getName(), ImmutableMap + .> of(CATALOG_REF + .getName(), ImmutableMap. of( + "template", + new CatalogItemImpl("template", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"), "description", + new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")), + ImmutableMap. of())))); + + } + } + + } } \ No newline at end of file diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudClientLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudClientLiveTest.java index 7da1548044..55d0f1280a 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudClientLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudClientLiveTest.java @@ -18,6 +18,9 @@ */ package org.jclouds.terremark.ecloud; +import java.util.Properties; + +import org.jclouds.vcloud.reference.VCloudConstants; import org.jclouds.vcloud.terremark.BaseTerremarkClientLiveTest; import org.jclouds.vcloud.terremark.TerremarkECloudClient; import org.testng.annotations.Test; @@ -27,5 +30,11 @@ import org.testng.annotations.Test; */ @Test(groups = "live", enabled = true, singleThreaded = true) public class BaseTerremarkECloudClientLiveTest extends BaseTerremarkClientLiveTest { - + @Override + protected Properties setupProperties() { + Properties props = super.setupProperties(); + props.setProperty(VCloudConstants.PROPERTY_VCLOUD_DEFAULT_VDC, + ".* - " + System.getProperty("test.trmk-ecloud.datacenter", "MIA")); + return props; + } } \ No newline at end of file diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClientLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClientLiveTest.java index 68a90e8f5f..c0ceed16d4 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClientLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClientLiveTest.java @@ -33,7 +33,7 @@ import org.testng.annotations.Test; public class DataCenterOperationsClientLiveTest extends BaseTerremarkECloudClientLiveTest { @Test public void testListDataCentersInOrg() throws Exception { - for (ReferenceType response : getApi().listOrgs()) { + for (ReferenceType response : getApi().listOrgs().values()) { TerremarkECloudOrg org = getApi().getOrg(response.getHref()); assertNotNull(response); assertNotNull(response.getName()); diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsClientLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsClientLiveTest.java index b8f537cd49..7560ccb813 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsClientLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsClientLiveTest.java @@ -33,7 +33,7 @@ import org.testng.annotations.Test; public class TagOperationsClientLiveTest extends BaseTerremarkECloudClientLiveTest { @Test public void testListTagsInOrg() throws Exception { - for (ReferenceType response : getApi().listOrgs()) { + for (ReferenceType response : getApi().listOrgs().values()) { TerremarkECloudOrg org = getApi().getOrg(response.getHref()); assertNotNull(response); assertNotNull(response.getName()); diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java index 2bd57577f1..924106ff7d 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java @@ -19,12 +19,12 @@ package org.jclouds.vcloud.terremark; import static org.jclouds.vcloud.terremark.options.AddInternetServiceOptions.Builder.disabled; +import static org.testng.Assert.assertEquals; import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; - import org.jclouds.http.HttpRequest; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; @@ -50,7 +50,7 @@ import org.jclouds.vcloud.terremark.xml.KeyPairHandler; import org.jclouds.vcloud.terremark.xml.KeyPairsHandler; import org.jclouds.vcloud.terremark.xml.NodeHandler; import org.jclouds.vcloud.terremark.xml.NodesHandler; -import org.jclouds.vcloud.terremark.xml.PublicIpAddressesHandler; +import org.jclouds.vcloud.terremark.xml.PublicIpAddressHandler; import org.jclouds.vcloud.terremark.xml.TerremarkOrgNetworkFromTerremarkVCloudExpressNetworkHandler; import org.jclouds.vcloud.terremark.xml.TerremarkVDCHandler; import org.jclouds.vcloud.terremark.xml.VAppExtendedInfoHandler; @@ -58,24 +58,30 @@ import org.jclouds.vcloud.xml.VCloudExpressCatalogHandler; import org.jclouds.vcloud.xml.VCloudExpressVAppHandler; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableMap; import com.google.inject.TypeLiteral; - /** * Tests behavior of {@code TerremarkECloudAsyncClient} * * @author Adrian Cole */ -// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +// NOTE:without testName, this will not call @Before* and fail w/NPE during +// surefire @Test(groups = "unit", singleThreaded = true, testName = "TerremarkECloudAsyncClientTest") public class TerremarkECloudAsyncClientTest extends BaseTerremarkECloudAsyncClientTest { + public void testListOrgs() { + assertEquals(injector.getInstance(TerremarkECloudAsyncClient.class).listOrgs().toString(), + ImmutableMap.of(ORG_REF.getName(), ORG_REF).toString()); + } + @Override protected TypeLiteral> createTypeLiteral() { return new TypeLiteral>() { }; } - + public void testNetwork() throws SecurityException, NoSuchMethodException, IOException { Method method = TerremarkECloudAsyncClient.class.getMethod("getNetwork", URI.class); HttpRequest request = processor.createRequest(method, @@ -219,8 +225,8 @@ public class TerremarkECloudAsyncClientTest extends BaseTerremarkECloudAsyncClie assertPayloadEquals(request, null, null, false); assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, PublicIpAddressesHandler.class); - assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class); + assertSaxResponseParserClassEquals(method, PublicIpAddressHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); checkFilters(request); } diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTest.java index df53e98da6..066f95d4b6 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudClientLiveTest.java @@ -21,11 +21,13 @@ package org.jclouds.vcloud.terremark; import static org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions.Builder.processorCount; import java.util.Map.Entry; +import java.util.Properties; import org.jclouds.domain.Credentials; import org.jclouds.net.IPSocket; import org.jclouds.ssh.SshClient; import org.jclouds.vcloud.domain.VCloudExpressVApp; +import org.jclouds.vcloud.reference.VCloudConstants; import org.jclouds.vcloud.terremark.domain.InternetService; import org.jclouds.vcloud.terremark.domain.Protocol; import org.jclouds.vcloud.terremark.domain.PublicIpAddress; @@ -41,6 +43,14 @@ import org.testng.annotations.Test; */ @Test(groups = "live", enabled = true, singleThreaded = true, testName = "TerremarkECloudClientLiveTest") public class TerremarkECloudClientLiveTest extends TerremarkClientLiveTest { + @Override + protected Properties setupProperties() { + Properties props = super.setupProperties(); + props.setProperty(VCloudConstants.PROPERTY_VCLOUD_DEFAULT_VDC, + ".* - " + System.getProperty("test.trmk-ecloud.datacenter", "MIA")); + return props; + } + @BeforeClass void setProvider() { this.provider = "trmk-ecloud"; @@ -61,7 +71,7 @@ public class TerremarkECloudClientLiveTest extends TerremarkClientLiveTest { @Override protected Entry getNewInternetServiceAndIpForSSH(VCloudExpressVApp vApp) { return new TerremarkECloudInternetServiceAndPublicIpAddressSupplier(TerremarkECloudClient.class.cast(tmClient)) - .getNewInternetServiceAndIp(vApp, 22, Protocol.TCP); + .getNewInternetServiceAndIp(vApp, 22, Protocol.TCP); } } diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java index 951a41815f..f6ed5dc315 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java @@ -20,6 +20,8 @@ package org.jclouds.vcloud.terremark.compute; import static org.testng.Assert.assertEquals; +import java.util.Properties; + import org.jclouds.compute.BaseComputeServiceLiveTest; import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.compute.domain.ComputeMetadata; @@ -32,16 +34,27 @@ import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.rest.RestContext; import org.jclouds.ssh.jsch.config.JschSshClientModule; import org.jclouds.vcloud.domain.VCloudExpressVApp; +import org.jclouds.vcloud.reference.VCloudConstants; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; import org.testng.annotations.Test; /** - * This test is disabled, as it doesn't work while there are too few public ip addresses. + * This test is disabled, as it doesn't work while there are too few public ip + * addresses. * * @author Adrian Cole */ -@Test(groups = "live", enabled = true, sequential = true) +@Test(groups = "live", enabled = true, singleThreaded = true) public class TerremarkECloudComputeServiceLiveTest extends BaseComputeServiceLiveTest { + + @Override + protected Properties setupProperties() { + Properties props = super.setupProperties(); + props.setProperty(VCloudConstants.PROPERTY_VCLOUD_DEFAULT_VDC, + ".* - " + System.getProperty("test.trmk-ecloud.datacenter", "MIA")); + return props; + } + public TerremarkECloudComputeServiceLiveTest() { provider = "trmk-ecloud"; } @@ -60,13 +73,6 @@ public class TerremarkECloudComputeServiceLiveTest extends BaseComputeServiceLiv return template; } - // currently, the wrong CIM OSType data is coming back. - @Override - protected void checkOsMatchesTemplate(NodeMetadata node) { - if (node.getOperatingSystem() != null) - assertEquals(node.getOperatingSystem().getFamily(), null); - } - @Override public void testListImages() throws Exception { for (Image image : client.listImages()) { @@ -74,7 +80,7 @@ public class TerremarkECloudComputeServiceLiveTest extends BaseComputeServiceLiv // image.getLocationId() can be null, if it is a location-free image assertEquals(image.getType(), ComputeType.IMAGE); if (image.getOperatingSystem().getFamily() != OsFamily.WINDOWS - && image.getOperatingSystem().getFamily() != OsFamily.SOLARIS) { + && image.getOperatingSystem().getFamily() != OsFamily.SOLARIS) { assert image.getDefaultCredentials() != null && image.getDefaultCredentials().identity != null : image; assert image.getDefaultCredentials().credential != null : image; } @@ -90,7 +96,7 @@ public class TerremarkECloudComputeServiceLiveTest extends BaseComputeServiceLiv NodeMetadata allData = client.getNodeMetadata(node.getId()); System.out.println(allData.getHardware()); RestContext tmContext = new ComputeServiceContextFactory() - .createContext(provider, identity, credential).getProviderSpecificContext(); + .createContext(provider, identity, credential).getProviderSpecificContext(); VCloudExpressVApp vApp = tmContext.getApi().findVAppInOrgVDCNamed(null, null, allData.getName()); assertEquals(vApp.getName(), allData.getName()); } diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java index 44825979e8..06d95b0de9 100644 --- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java +++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudTemplateBuilderLiveTest.java @@ -22,12 +22,14 @@ import static org.jclouds.compute.util.ComputeServiceUtils.getCores; import static org.testng.Assert.assertEquals; import java.io.IOException; +import java.util.Properties; import java.util.Set; import org.jclouds.compute.BaseTemplateBuilderLiveTest; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.OsFamilyVersion64Bit; import org.jclouds.compute.domain.Template; +import org.jclouds.vcloud.reference.VCloudConstants; import org.testng.annotations.Test; import com.google.common.base.Predicate; @@ -39,6 +41,13 @@ import com.google.common.collect.ImmutableSet; */ @Test(groups = "live") public class TerremarkECloudTemplateBuilderLiveTest extends BaseTemplateBuilderLiveTest { + @Override + protected Properties setupProperties() { + Properties props = super.setupProperties(); + props.setProperty(VCloudConstants.PROPERTY_VCLOUD_DEFAULT_VDC, + ".* - " + System.getProperty("test.trmk-ecloud.datacenter", "MIA")); + return props; + } public TerremarkECloudTemplateBuilderLiveTest() { provider = "trmk-ecloud"; @@ -51,20 +60,20 @@ public class TerremarkECloudTemplateBuilderLiveTest extends BaseTemplateBuilderL @Override public boolean apply(OsFamilyVersion64Bit input) { switch (input.family) { - case RHEL: - return !input.version.equals("") && !input.version.matches("5.[50]"); - case SOLARIS: - return !input.is64Bit; - case CENTOS: - return !input.version.equals("") && !input.version.matches("5.[50]"); - case UBUNTU: - return !input.version.equals("") && !input.version.equals("10.04") && !input.version.equals("8.04"); - case WINDOWS: - return !input.version.equals("") && !input.version.equals("2003 R2") // - && !(input.version.equals("2008") && !input.is64Bit) // - && !(input.version.matches("2008( R2)?") && input.is64Bit); - default: - return true; + case RHEL: + return !input.version.equals("") && !input.version.matches("5.[50]"); + case SOLARIS: + return !input.is64Bit; + case CENTOS: + return !input.version.equals("") && !input.version.matches("5.[50]"); + case UBUNTU: + return !input.version.equals("") && !input.version.equals("10.04") && !input.version.equals("8.04"); + case WINDOWS: + return !input.version.equals("") && !input.version.equals("2003 R2") // + && !(input.version.equals("2008") && !input.is64Bit) // + && !(input.version.matches("2008( R2)?") && input.is64Bit); + default: + return true; } } }; diff --git a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java index 395bdcdb69..279af1dcc8 100644 --- a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java +++ b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java @@ -18,8 +18,7 @@ */ package org.jclouds.vcloud.terremark; -import static org.jclouds.Constants.PROPERTY_API_VERSION; -import static org.jclouds.Constants.PROPERTY_IDENTITY; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.vcloud.terremark.options.AddInternetServiceOptions.Builder.disabled; import static org.testng.Assert.assertEquals; @@ -28,6 +27,7 @@ import java.lang.reflect.Method; import java.net.URI; import java.util.Map; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; import javax.inject.Inject; import javax.inject.Named; @@ -37,6 +37,7 @@ import org.jclouds.http.HttpRequest; import org.jclouds.http.RequiresHttp; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ReleasePayloadAndReturn; +import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.RestClientTest; @@ -47,18 +48,18 @@ import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.util.Strings2; -import org.jclouds.vcloud.CommonVCloudClient; -import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogItemSupplier; -import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogSupplier; +import org.jclouds.vcloud.VCloudExpressLoginAsyncClient; +import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.VCloudVersionsAsyncClient; import org.jclouds.vcloud.domain.AllocationModel; -import org.jclouds.vcloud.domain.Capacity; -import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudSession; +import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.domain.VDCStatus; +import org.jclouds.vcloud.domain.internal.CatalogImpl; +import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl; import org.jclouds.vcloud.domain.network.NetworkConfig; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; @@ -85,12 +86,12 @@ import org.jclouds.vcloud.xml.VCloudExpressCatalogHandler; import org.jclouds.vcloud.xml.VCloudExpressVAppHandler; import org.testng.annotations.Test; -import com.google.common.base.Function; import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.inject.Injector; +import com.google.inject.AbstractModule; import com.google.inject.Module; import com.google.inject.TypeLiteral; @@ -99,10 +100,16 @@ import com.google.inject.TypeLiteral; * * @author Adrian Cole */ -// NOTE:without testName, this will not call @Before* and fail w/NPE during surefire +// NOTE:without testName, this will not call @Before* and fail w/NPE during +// surefire @Test(groups = "unit", singleThreaded = true, testName = "TerremarkVCloudExpressAsyncClientTest") public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest { + public void testListOrgs() { + assertEquals(injector.getInstance(TerremarkVCloudExpressAsyncClient.class).listOrgs().toString(), + ImmutableMap.of(ORG_REF.getName(), ORG_REF).toString()); + } + public void testCatalogItemURI() throws SecurityException, NoSuchMethodException, IOException { Method method = TerremarkVCloudExpressAsyncClient.class.getMethod("getCatalogItem", URI.class); HttpRequest request = processor.createRequest(method, @@ -631,160 +638,181 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest of(CATALOG_REF.getName(), CATALOG_REF), + ImmutableMap. of(VDC_REF.getName(), VDC_REF), ImmutableMap. of( + NETWORK_REF.getName(), NETWORK_REF), ImmutableMap. of(TASKSLIST_REF.getName(), + TASKSLIST_REF), KEYSLIST_REF); + + protected static final VDC VDC = new TerremarkVDCImpl(VDC_REF.getName(), VDC_REF.getType(), VDC_REF.getHref(), + VDCStatus.READY, null, "description", ImmutableSet. of(), AllocationModel.ALLOCATION_POOL, null, null, + null, ImmutableMap. of( + "vapp", + new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), + "network", + new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), + ImmutableMap. of(NETWORK_REF.getName(), NETWORK_REF), 0, 0, 0, false, CATALOG_REF, + PUBLICIPS_REF, INTERNETSERVICES_REF); + @RequiresHttp @ConfiguresRestClient protected static class TerremarkVCloudRestClientModuleExtension extends TerremarkVCloudExpressRestClientModule { + @Override - protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { - return URI.create("https://vcloud/login"); + protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, String version) { + return URI.create("https://vcloud.safesecureweb.com/api/v0.8/login"); + } + + @Override + protected Org provideOrg(Supplier> orgSupplier, + @org.jclouds.vcloud.endpoints.Org ReferenceType defaultOrg) { + return ORG; + } + + @Override + protected void installDefaultVCloudEndpointsModule() { + install(new AbstractModule() { + + @Override + protected void configure() { + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Org.class).toInstance(ORG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Catalog.class).toInstance( + CATALOG_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.TasksList.class).toInstance( + TASKSLIST_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.VDC.class).toInstance(VDC_REF); + bind(ReferenceType.class).annotatedWith(org.jclouds.vcloud.endpoints.Network.class).toInstance( + NETWORK_REF); + } + + }); + } + + @Override + protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + AtomicReference authException, VCloudExpressLoginAsyncClient login) { + return Suppliers. ofInstance(new VCloudSession() { + + @Override + public Map getOrgs() { + return ImmutableMap. of(ORG_REF.getName(), ORG_REF); + } + + @Override + public String getVCloudToken() { + return "token"; + } + + }); + } @Override protected void configure() { super.configure(); - bind(OrgNameToKeysListSupplier.class).to(TestOrgNameToKeysListSupplier.class); - bind(OrgMapSupplier.class).to(TestTerremarkOrgMapSupplier.class); + bind(OrgMapSupplier.class).to(TestOrgMapSupplier.class); bind(OrgCatalogSupplier.class).to(TestOrgCatalogSupplier.class); bind(OrgCatalogItemSupplier.class).to(TestOrgCatalogItemSupplier.class); - bind(OrgVDCSupplier.class).to(TestTerremarkOrgVDCSupplier.class); } @Override - protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"); - } - - @Override - protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { - return "org"; - } - - @Override - protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user, WriteableCatalog write) { - return URI.create("https://catalog"); - } - - @Override - protected Org provideOrg(CommonVCloudClient discovery) { - return null; - } - - @Override - protected Iterable provideOrgs(Supplier cache, @Named(PROPERTY_IDENTITY) String user) { - return null; + protected Supplier>> provideOrgVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference authException, + OrgVDCSupplier supplier) { + return Suppliers.>> ofInstance(ImmutableMap + .> of(ORG_REF.getName(), + ImmutableMap. of(VDC.getName(), VDC))); } @Singleton - public static class TestOrgNameToKeysListSupplier extends OrgNameToKeysListSupplier { + public static class TestOrgMapSupplier extends OrgMapSupplier { + @Inject - protected TestOrgNameToKeysListSupplier(Supplier sessionSupplier) { - super(sessionSupplier, null); - } - - @Override - public Map get() { - return Maps.transformValues(sessionSupplier.get().getOrgs(), new Function() { - - @Override - public ReferenceType apply(ReferenceType from) { - return new ReferenceTypeImpl(from.getName(), TerremarkVCloudExpressMediaType.KEYSLIST_XML, URI - .create(from.getHref().toASCIIString() + "/keysList")); - } - - }); - - } - - } - - @Singleton - public static class TestTerremarkOrgMapSupplier extends OrgMapSupplier { - @Inject - protected TestTerremarkOrgMapSupplier() { + protected TestOrgMapSupplier() { super(null, null); } @Override public Map get() { - return ImmutableMap. of( - "org", - new TerremarkOrgImpl("org", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), - null, ImmutableMap. of( - "catalog", - new ReferenceTypeImpl("catalog", TerremarkVCloudExpressMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap - . of( - "vdc", - new ReferenceTypeImpl("vdc", TerremarkVCloudExpressMediaType.VDC_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap - . of(), ImmutableMap. of( - "tasksList", - new ReferenceTypeImpl("tasksList", TerremarkVCloudExpressMediaType.TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))), - new ReferenceTypeImpl("keysList", TerremarkVCloudExpressMediaType.KEYSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")))); + return ImmutableMap. of(ORG.getName(), ORG); } } @Singleton - public static class TestTerremarkOrgVDCSupplier extends OrgVDCSupplier { + public static class TestOrgCatalogSupplier extends OrgCatalogSupplier { @Inject - protected TestTerremarkOrgVDCSupplier() { + protected TestOrgCatalogSupplier() { super(null, null); } @Override - public Map> get() { - return ImmutableMap.> of("org", - - ImmutableMap. of( - "vdc", - new TerremarkVDCImpl("vdc", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), - VDCStatus.READY, null, "description", ImmutableSet. of(), AllocationModel.UNRECOGNIZED, - new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0), - ImmutableMap. of( - "vapp", - new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), - "network", - new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), ImmutableMap - . of(), 0, 0, 0, false, new ReferenceTypeImpl("catalog", - TerremarkVCloudExpressMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")), - new ReferenceTypeImpl("publicIps", TerremarkVCloudExpressMediaType.PUBLICIPSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/publicIps/1")), new ReferenceTypeImpl( - "internetServices", TerremarkVCloudExpressMediaType.INTERNETSERVICESLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/internetServices/1"))))); + public Map> get() { + return ImmutableMap.> of( + ORG_REF.getName(), ImmutableMap. of( + CATALOG_REF.getName(), + new CatalogImpl(CATALOG_REF.getName(), CATALOG_REF.getType(), CATALOG_REF.getHref(), null, + "description", ImmutableMap. of( + "item", + new ReferenceTypeImpl("item", "application/vnd.vmware.vcloud.catalogItem+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1")), + "template", + new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"))), + ImmutableList. of(), true, false))); } } - @Override - protected URI provideDefaultTasksList(Org org) { - return URI.create("https://taskslist"); + @Singleton + public static class TestOrgCatalogItemSupplier extends OrgCatalogItemSupplier { + protected TestOrgCatalogItemSupplier() { + super(null, null); + } + + @Override + public Map>> get() { + return ImmutableMap.>> of( + ORG_REF.getName(), ImmutableMap + .> of(CATALOG_REF + .getName(), ImmutableMap. of( + "template", + new CatalogItemImpl("template", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"), "description", + new ReferenceTypeImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")), + ImmutableMap. of())))); + + } } - @Override - protected URI provideDefaultVDC(Org org, @org.jclouds.vcloud.endpoints.VDC String defaultVDC) { - return URI.create("https://vdc/1"); - } - - @Override - protected String provideDefaultVDCName( - @org.jclouds.vcloud.endpoints.VDC Supplier> vDCtoOrgSupplier) { - return "vdc"; - } - - @Override - protected String provideCatalogName(Supplier>> catalogs) { - return "catalog"; - } - - @Override - protected URI provideDefaultNetwork(URI vdc, Injector injector) { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); - } } } diff --git a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java index 20c3f3544a..b9a5e082a0 100644 --- a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java +++ b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressClientLiveTest.java @@ -22,7 +22,6 @@ import static org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTempl import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; -import java.util.Set; import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -51,16 +50,6 @@ public class TerremarkVCloudExpressClientLiveTest extends TerremarkClientLiveTes KeyPair key; - @Test - public void testKeysList() throws Exception { - TerremarkVCloudExpressClient vCloudExpressClient = TerremarkVCloudExpressClient.class.cast(tmClient); - TerremarkOrg org = vCloudExpressClient.findOrgNamed(null); - Set response = vCloudExpressClient.listKeyPairsInOrg(null); - assertNotNull(response); - System.err.println(response); - assertEquals(response, vCloudExpressClient.listKeyPairsInOrg(org.getHref())); - } - @Override protected void prepare() { TerremarkVCloudExpressClient vCloudExpressClient = TerremarkVCloudExpressClient.class.cast(tmClient); @@ -74,13 +63,12 @@ public class TerremarkVCloudExpressClientLiveTest extends TerremarkClientLiveTes key = vCloudExpressClient.generateKeyPairInOrg(org.getHref(), "livetest", false); } assertNotNull(key); - System.err.println(key); assertEquals(key.getName(), "livetest"); assertNotNull(key.getPrivateKey()); assertNotNull(key.getFingerPrint()); assertEquals(key.isDefault(), false); assertEquals(key.getFingerPrint(), vCloudExpressClient.findKeyPairInOrg(org.getHref(), key.getName()) - .getFingerPrint()); + .getFingerPrint()); } @AfterTest @@ -103,7 +91,7 @@ public class TerremarkVCloudExpressClientLiveTest extends TerremarkClientLiveTes @Override protected Entry getNewInternetServiceAndIpForSSH(VCloudExpressVApp vApp) { - return new TerremarkVCloudExpressInternetServiceAndPublicIpAddressSupplier(TerremarkVCloudExpressClient.class - .cast(tmClient)).getNewInternetServiceAndIp(vApp, 22, Protocol.TCP); + return new TerremarkVCloudExpressInternetServiceAndPublicIpAddressSupplier( + TerremarkVCloudExpressClient.class.cast(tmClient)).getNewInternetServiceAndIp(vApp, 22, Protocol.TCP); } } diff --git a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java index 4c7158d92c..7978ef0561 100644 --- a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java +++ b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java @@ -60,13 +60,6 @@ public class TerremarkVCloudExpressComputeServiceLiveTest extends BaseComputeSer return template; } - // currently, the wrong CIM OSType data is coming back. - @Override - protected void checkOsMatchesTemplate(NodeMetadata node) { - if (node.getOperatingSystem() != null) - assertEquals(node.getOperatingSystem().getFamily(), null); - } - @Override public void testListImages() throws Exception { for (Image image : client.listImages()) {