From bb98d3127f8b8e45a4cc28f07cdbbb8a54ca7ac5 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Thu, 19 Aug 2010 10:34:29 -0700 Subject: [PATCH 01/16] Issue 286: tweaks to the ecloud api --- ...TerremarkVCloudComputeServiceContextModule.java | 1 - ...ateDescriptionToGetDefaultLoginCredentials.java | 2 +- .../TerremarkECloudComputeServiceLiveTest.java | 14 ++++++++------ ...DefaultLoginCredentialsForVAppTemplateTest.java | 14 ++++++++++++++ .../test/resources/terremark/lamp_description.txt | 8 ++++++++ 5 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 vcloud/terremark/src/test/resources/terremark/lamp_description.txt diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java index fd29ab55fc..958c3f5ee3 100755 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java @@ -114,7 +114,6 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudComputeSer bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to( ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); bind(SecureRandom.class).toInstance(new SecureRandom()); - } @Provides diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java index 9038da1d8c..0e8e337a39 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.java @@ -39,7 +39,7 @@ public class ParseVAppTemplateDescriptionToGetDefaultLoginCredentials implements PopulateDefaultLoginCredentialsForImageStrategy { public static final Pattern USER_PASSWORD_PATTERN = Pattern - .compile(".*[Uu]sername: ([a-z]+) ?.*\n[Pp]assword: ([^ ]+) ?\n.*"); + .compile(".*[Uu]sername: ([a-z]+) ?.*\n[Pp]assword: ([^ \n\r]+) ?\r?\n.*"); @Override public Credentials execute(Object resourceToAuthenticate) { diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java index 2ec2128ec0..cc877f9476 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkECloudComputeServiceLiveTest.java @@ -46,6 +46,7 @@ public class TerremarkECloudComputeServiceLiveTest extends VCloudComputeServiceL @Override public void setServiceDefaults() { provider = "trmk-ecloud"; + tag = "trmke"; } @Override @@ -57,9 +58,9 @@ public class TerremarkECloudComputeServiceLiveTest extends VCloudComputeServiceL @Test public void testTemplateBuilder() { Template defaultTemplate = client.templateBuilder().build(); - assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), false); assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); - assertEquals(defaultTemplate.getLocation().getDescription(), "Miami Environment 1"); + assert defaultTemplate.getLocation().getDescription() != null;// different per org assertEquals(defaultTemplate.getSize().getCores(), 1.0d); } @@ -73,8 +74,8 @@ public class TerremarkECloudComputeServiceLiveTest extends VCloudComputeServiceL protected Template buildTemplate(TemplateBuilder templateBuilder) { Template template = super.buildTemplate(templateBuilder); Image image = template.getImage(); - assert image.getDefaultCredentials().identity != null : image; - assert image.getDefaultCredentials().credential != null : image; + assert image.getDefaultCredentials() != null && image.getDefaultCredentials().identity != null : image; + assert image.getDefaultCredentials() != null && image.getDefaultCredentials().credential != null : image; return template; } @@ -91,9 +92,10 @@ public class TerremarkECloudComputeServiceLiveTest extends VCloudComputeServiceL assert image.getProviderId() != null : image; // image.getLocationId() can be null, if it is a location-free image assertEquals(image.getType(), ComputeType.IMAGE); - assert image.getDefaultCredentials().identity != null : image; - if (image.getOperatingSystem().getFamily() != OsFamily.WINDOWS) + if (image.getOperatingSystem().getFamily() != OsFamily.WINDOWS) { + assert image.getDefaultCredentials() != null && image.getDefaultCredentials().identity != null : image; assert image.getDefaultCredentials().credential != null : image; + } } } diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java index 93d6f18511..555411d27a 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/strategy/PopulateDefaultLoginCredentialsForVAppTemplateTest.java @@ -54,6 +54,20 @@ public class PopulateDefaultLoginCredentialsForVAppTemplateTest { verify(template); } + @Test + public void testLamp() throws IOException { + InputStream is = getClass().getResourceAsStream("/terremark/lamp_description.txt"); + String description = new String(ByteStreams.toByteArray(is)); + VAppTemplate template = createMock(VAppTemplate.class); + expect(template.getDescription()).andReturn(description).atLeastOnce(); + replay(template); + ParseVAppTemplateDescriptionToGetDefaultLoginCredentials converter = new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(); + Credentials creds = converter.execute(template); + assertEquals(creds.identity, "ecloud"); + assertEquals(creds.credential, "$Ep455l0ud!2"); + verify(template); + } + @Test public void testFt() throws IOException { InputStream is = getClass().getResourceAsStream("/terremark/ft_description.txt"); diff --git a/vcloud/terremark/src/test/resources/terremark/lamp_description.txt b/vcloud/terremark/src/test/resources/terremark/lamp_description.txt new file mode 100644 index 0000000000..91d9283c94 --- /dev/null +++ b/vcloud/terremark/src/test/resources/terremark/lamp_description.txt @@ -0,0 +1,8 @@ +NOTE: This template does not support automated OS configuration. + +Username: ecloud +Password: $Ep455l0ud!2 + +mySQL root password is the same as ecloud. + +This template contains a base install of Ubuntu Server 8.04 + LAMP. \ No newline at end of file From 0d06623dcfa88f46937fcaec56d8dd6bb7ddef1a Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Thu, 19 Aug 2010 13:00:44 -0700 Subject: [PATCH 02/16] Issue 341: bluelock-vcloudexpress, bluelock-vclouddirector --- core/src/main/resources/rest.properties | 7 +- vcloud/bluelock/pom.xml | 76 ++++++++++++++++++- .../BlueLockVCloudDirectorContextBuilder.java | 63 +++++++++++++++ ...ueLockVCloudDirectorPropertiesBuilder.java | 48 ++++++++++++ ... BlueLockVCloudExpressContextBuilder.java} | 12 +-- ...ueLockVCloudExpressPropertiesBuilder.java} | 4 +- ...> BlueLockVCloudExpressComputeClient.java} | 4 +- ...udExpressComputeServiceContextModule.java} | 12 +-- ...ockVCloudExpressImageForVAppTemplate.java} | 4 +- ...lueLockVCloudExpressRestClientModule.java} | 2 +- .../BlueLockVCloudDirectorClientLiveTest.java | 55 ++++++++++++++ ... BlueLockVCloudExpressClientLiveTest.java} | 9 ++- .../bluelock/ProvidersInPropertiesTest.java | 7 +- .../VCloudSessionRefreshLiveTest.java | 9 ++- ...kVCloudDirectorComputeServiceLiveTest.java | 71 +++++++++++++++++ ...kVCloudExpressComputeServiceLiveTest.java} | 17 +++-- 16 files changed, 361 insertions(+), 39 deletions(-) create mode 100644 vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java create mode 100644 vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java rename vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/{BlueLockVCloudContextBuilder.java => BlueLockVCloudExpressContextBuilder.java} (82%) rename vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/{BlueLockVCloudPropertiesBuilder.java => BlueLockVCloudExpressPropertiesBuilder.java} (89%) rename vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/{BlueLockVCloudComputeClient.java => BlueLockVCloudExpressComputeClient.java} (89%) rename vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/{BlueLockVCloudComputeServiceContextModule.java => BlueLockVCloudExpressComputeServiceContextModule.java} (78%) rename vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/{BlueLockImageForVAppTemplate.java => BlueLockVCloudExpressImageForVAppTemplate.java} (89%) rename vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/{BlueLockVCloudRestClientModule.java => BlueLockVCloudExpressRestClientModule.java} (97%) create mode 100644 vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java rename vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/{BlueLockVCloudClientLiveTest.java => BlueLockVCloudExpressClientLiveTest.java} (80%) create mode 100644 vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java rename vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/{BlueLockVCloudComputeServiceLiveTest.java => BlueLockVCloudExpressComputeServiceLiveTest.java} (78%) diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index fe611b190c..d1c008b552 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -80,8 +80,11 @@ eucalyptus.propertiesbuilder=org.jclouds.aws.ec2.EucalyptusPropertiesBuilder cloudservers.contextbuilder=org.jclouds.rackspace.cloudservers.CloudServersContextBuilder cloudservers.propertiesbuilder=org.jclouds.rackspace.RackspacePropertiesBuilder -bluelock.contextbuilder=org.jclouds.vcloud.bluelock.BlueLockVCloudContextBuilder -bluelock.propertiesbuilder=org.jclouds.vcloud.bluelock.BlueLockVCloudPropertiesBuilder +bluelock-vclouddirector.contextbuilder=org.jclouds.vcloud.bluelock.BlueLockVCloudDirectorContextBuilder +bluelock-vclouddirector.propertiesbuilder=org.jclouds.vcloud.bluelock.BlueLockVCloudDirectorPropertiesBuilder + +bluelock-vcloudexpress.contextbuilder=org.jclouds.vcloud.bluelock.BlueLockVCloudExpressContextBuilder +bluelock-vcloudexpress.propertiesbuilder=org.jclouds.vcloud.bluelock.BlueLockVCloudExpressPropertiesBuilder gogrid.propertiesbuilder=org.jclouds.gogrid.GoGridPropertiesBuilder gogrid.contextbuilder=org.jclouds.gogrid.GoGridContextBuilder diff --git a/vcloud/bluelock/pom.xml b/vcloud/bluelock/pom.xml index 83b6a1d20a..4794df66f5 100644 --- a/vcloud/bluelock/pom.xml +++ b/vcloud/bluelock/pom.xml @@ -31,9 +31,18 @@ jclouds-bluelock jclouds bluelock Components Core jclouds core components to access bluelock + - ${jclouds.bluelock.user} - ${jclouds.bluelock.password} + + + https://express.bluelock.com/api + 0.8 + FIXME + FIXME + https://vcenterprise.bluelock.com/api + 1.0 + FIXME + FIXME @@ -56,5 +65,66 @@ test - + + + live + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration + integration-test + + test + + + + + bluelock-vcloudexpress.endpoint + ${bluelock-vcloudexpress.endpoint} + + + bluelock-vcloudexpress.apiversion + ${bluelock-vcloudexpress.apiversion} + + + bluelock-vcloudexpress.identity + ${bluelock-vcloudexpress.identity} + + + bluelock-vcloudexpress.credential + ${bluelock-vcloudexpress.credential} + + + bluelock-vclouddirector.endpoint + ${bluelock-vclouddirector.endpoint} + + + bluelock-vclouddirector.apiversion + ${bluelock-vclouddirector.apiversion} + + + bluelock-vclouddirector.identity + ${bluelock-vclouddirector.identity} + + + bluelock-vclouddirector.credential + ${bluelock-vclouddirector.credential} + + + jclouds.compute.blacklist.nodes + ${jclouds.compute.blacklist.nodes} + + + + + + + + + + diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java new file mode 100644 index 0000000000..22120c1566 --- /dev/null +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java @@ -0,0 +1,63 @@ +/** + * + * Copyright (C) 2010 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.bluelock; + +import java.util.List; +import java.util.Properties; + +import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; +import org.jclouds.logging.jdk.config.JDKLoggingModule; +import org.jclouds.vcloud.VCloudContextBuilder; +import org.jclouds.vcloud.bluelock.compute.config.BlueLockVCloudExpressComputeServiceContextModule; +import org.jclouds.vcloud.bluelock.config.BlueLockVCloudExpressRestClientModule; + +import com.google.inject.Injector; +import com.google.inject.Module; + +/** + * Creates {@link BlueLockVCloudComputeServiceContext} or {@link Injector} instances based on the + * most commonly requested arguments. + *

+ * Note that Threadsafe objects will be bound as singletons to the Injector or Context provided. + *

+ *

+ * If no Modules are specified, the default {@link JDKLoggingModule logging} and + * {@link JavaUrlHttpCommandExecutorServiceModule http transports} will be installed. + * + * @author Adrian Cole + * @see BlueLockVCloudComputeServiceContext + */ +public class BlueLockVCloudDirectorContextBuilder extends VCloudContextBuilder { + + public BlueLockVCloudDirectorContextBuilder(Properties props) { + super(props); + } + + @Override + protected void addContextModule(List modules) { + modules.add(new BlueLockVCloudExpressComputeServiceContextModule()); + } + + @Override + protected void addClientModule(List modules) { + modules.add(new BlueLockVCloudExpressRestClientModule()); + } + +} diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java new file mode 100644 index 0000000000..94816202ed --- /dev/null +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java @@ -0,0 +1,48 @@ +/** + * + * Copyright (C) 2010 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.bluelock; + +import static org.jclouds.Constants.PROPERTY_API_VERSION; +import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_VERSION_SCHEMA; + +import java.util.Properties; + +import org.jclouds.vcloud.VCloudPropertiesBuilder; + +/** + * Builds properties used in bluelock VCloud Clients + * + * @author Adrian Cole + */ +public class BlueLockVCloudDirectorPropertiesBuilder extends VCloudPropertiesBuilder { + @Override + protected Properties defaultProperties() { + Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_API_VERSION, "1.0"); + properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "1.0"); + properties.setProperty(PROPERTY_ENDPOINT, "https://vcenterprise.bluelock.com/api"); + return properties; + } + + public BlueLockVCloudDirectorPropertiesBuilder(Properties properties) { + super(properties); + } +} diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudContextBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressContextBuilder.java similarity index 82% rename from vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudContextBuilder.java rename to vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressContextBuilder.java index 6c65ecd46d..f9187854b5 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudContextBuilder.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressContextBuilder.java @@ -25,8 +25,8 @@ import java.util.Properties; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; import org.jclouds.vcloud.VCloudContextBuilder; -import org.jclouds.vcloud.bluelock.compute.config.BlueLockVCloudComputeServiceContextModule; -import org.jclouds.vcloud.bluelock.config.BlueLockVCloudRestClientModule; +import org.jclouds.vcloud.bluelock.compute.config.BlueLockVCloudExpressComputeServiceContextModule; +import org.jclouds.vcloud.bluelock.config.BlueLockVCloudExpressRestClientModule; import com.google.inject.Injector; import com.google.inject.Module; @@ -44,20 +44,20 @@ import com.google.inject.Module; * @author Adrian Cole * @see BlueLockVCloudComputeServiceContext */ -public class BlueLockVCloudContextBuilder extends VCloudContextBuilder { +public class BlueLockVCloudExpressContextBuilder extends VCloudContextBuilder { - public BlueLockVCloudContextBuilder(Properties props) { + public BlueLockVCloudExpressContextBuilder(Properties props) { super(props); } @Override protected void addContextModule(List modules) { - modules.add(new BlueLockVCloudComputeServiceContextModule()); + modules.add(new BlueLockVCloudExpressComputeServiceContextModule()); } @Override protected void addClientModule(List modules) { - modules.add(new BlueLockVCloudRestClientModule()); + modules.add(new BlueLockVCloudExpressRestClientModule()); } } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudPropertiesBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressPropertiesBuilder.java similarity index 89% rename from vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudPropertiesBuilder.java rename to vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressPropertiesBuilder.java index d86391b17d..22b7455a56 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudPropertiesBuilder.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressPropertiesBuilder.java @@ -30,7 +30,7 @@ import org.jclouds.vcloud.VCloudPropertiesBuilder; * * @author Adrian Cole */ -public class BlueLockVCloudPropertiesBuilder extends VCloudPropertiesBuilder { +public class BlueLockVCloudExpressPropertiesBuilder extends VCloudPropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); @@ -38,7 +38,7 @@ public class BlueLockVCloudPropertiesBuilder extends VCloudPropertiesBuilder { return properties; } - public BlueLockVCloudPropertiesBuilder(Properties properties) { + public BlueLockVCloudExpressPropertiesBuilder(Properties properties) { super(properties); } } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudComputeClient.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java similarity index 89% rename from vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudComputeClient.java rename to vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java index 74e627efe5..9c7e4369fc 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudComputeClient.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java @@ -40,11 +40,11 @@ import com.google.common.base.Predicate; * @author Adrian Cole */ @Singleton -public class BlueLockVCloudComputeClient extends BaseVCloudComputeClient { +public class BlueLockVCloudExpressComputeClient extends BaseVCloudComputeClient { private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; @Inject - protected BlueLockVCloudComputeClient(PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, + protected BlueLockVCloudExpressComputeClient(PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, VCloudClient client, Predicate successTester, Map vAppStatusToNodeState) { super(client, successTester, vAppStatusToNodeState); this.credentialsProvider = credentialsProvider; diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudComputeServiceContextModule.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudExpressComputeServiceContextModule.java similarity index 78% rename from vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudComputeServiceContextModule.java rename to vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudExpressComputeServiceContextModule.java index 1fdea89539..1390275b01 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudComputeServiceContextModule.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudExpressComputeServiceContextModule.java @@ -23,9 +23,9 @@ import java.util.Set; import org.jclouds.compute.domain.Size; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; -import org.jclouds.vcloud.bluelock.compute.BlueLockVCloudComputeClient; +import org.jclouds.vcloud.bluelock.compute.BlueLockVCloudExpressComputeClient; import org.jclouds.vcloud.bluelock.compute.config.suppliers.ParseSizeFromImageSupplier; -import org.jclouds.vcloud.bluelock.compute.functions.BlueLockImageForVAppTemplate; +import org.jclouds.vcloud.bluelock.compute.functions.BlueLockVCloudExpressImageForVAppTemplate; import org.jclouds.vcloud.bluelock.compute.strategy.DefaultLoginCredentialsFromBlueLockFAQ; import org.jclouds.vcloud.compute.VCloudComputeClient; import org.jclouds.vcloud.compute.config.VCloudComputeServiceContextModule; @@ -36,17 +36,17 @@ import com.google.inject.Injector; /** * Configures the {@link BlueLockVCloudComputeServiceContext}; requires - * {@link BlueLockVCloudComputeClient} bound. + * {@link BlueLockVCloudExpressComputeClient} bound. * * @author Adrian Cole */ -public class BlueLockVCloudComputeServiceContextModule extends VCloudComputeServiceContextModule { +public class BlueLockVCloudExpressComputeServiceContextModule extends VCloudComputeServiceContextModule { @Override protected void configure() { super.configure(); - bind(ImageForVAppTemplate.class).to(BlueLockImageForVAppTemplate.class); - bind(VCloudComputeClient.class).to(BlueLockVCloudComputeClient.class); + bind(ImageForVAppTemplate.class).to(BlueLockVCloudExpressImageForVAppTemplate.class); + bind(VCloudComputeClient.class).to(BlueLockVCloudExpressComputeClient.class); bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to(DefaultLoginCredentialsFromBlueLockFAQ.class); } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockImageForVAppTemplate.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudExpressImageForVAppTemplate.java similarity index 89% rename from vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockImageForVAppTemplate.java rename to vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudExpressImageForVAppTemplate.java index cc0d620607..5214728345 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockImageForVAppTemplate.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudExpressImageForVAppTemplate.java @@ -31,10 +31,10 @@ import org.jclouds.vcloud.compute.functions.ImageForVAppTemplate; * @author Adrian Cole */ @Singleton -public class BlueLockImageForVAppTemplate extends ImageForVAppTemplate { +public class BlueLockVCloudExpressImageForVAppTemplate extends ImageForVAppTemplate { @Inject - protected BlueLockImageForVAppTemplate(FindLocationForResource findLocationForResource, + protected BlueLockVCloudExpressImageForVAppTemplate(FindLocationForResource findLocationForResource, PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider) { super(findLocationForResource, credentialsProvider); } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudRestClientModule.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java similarity index 97% rename from vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudRestClientModule.java rename to vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java index 3e56163d16..f8a3ea852d 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudRestClientModule.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java @@ -47,7 +47,7 @@ import com.google.common.collect.Iterables; */ @RequiresHttp @ConfiguresRestClient -public class BlueLockVCloudRestClientModule extends VCloudRestClientModule { +public class BlueLockVCloudExpressRestClientModule extends VCloudRestClientModule { @Override protected URI provideDefaultNetwork(VCloudClient client) throws InterruptedException, ExecutionException, diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java new file mode 100644 index 0000000000..53dbbe5533 --- /dev/null +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java @@ -0,0 +1,55 @@ +/** + * + * Copyright (C) 2010 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 director or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.vcloud.bluelock; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Properties; + +import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.jclouds.rest.RestContextFactory; +import org.jclouds.vcloud.VCloudClientLiveTest; +import org.testng.annotations.BeforeGroups; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +/** + * Tests behavior of {@code BlueLockVCloudClient} + * + * @author Adrian Cole + */ +@Test(groups = "live", sequential = true, testName = "bluelock.BlueLockVCloudDirectorClientLiveTest") +public class BlueLockVCloudDirectorClientLiveTest extends VCloudClientLiveTest { + + @BeforeGroups(groups = { "live" }) + @Override + public void setupClient() { + identity = checkNotNull(System.getProperty("bluelock-vclouddirector.identity"), + "bluelock-vclouddirector.identity"); + String credential = checkNotNull(System.getProperty("bluelock-vclouddirector.credential"), + "bluelock-vclouddirector.credential"); + context = new RestContextFactory().createContext("bluelock-vclouddirector", identity, credential, ImmutableSet + . of(new Log4JLoggingModule()), new Properties()); + connection = context.getApi(); + } + +} diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudClientLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java similarity index 80% rename from vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudClientLiveTest.java rename to vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java index 40cb827765..b4c5bdbb25 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudClientLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java @@ -38,14 +38,15 @@ import com.google.inject.Module; * @author Adrian Cole */ @Test(groups = "live", sequential = true, testName = "vcloud.BlueLockVCloudClientLiveTest") -public class BlueLockVCloudClientLiveTest extends VCloudClientLiveTest { +public class BlueLockVCloudExpressClientLiveTest extends VCloudClientLiveTest { @BeforeGroups(groups = { "live" }) @Override public void setupClient() { - identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); - String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - context = new RestContextFactory().createContext("bluelock", identity, credential, ImmutableSet + identity = checkNotNull(System.getProperty("bluelock-vcloudexpress.identity"), "bluelock-vcloudexpress.identity"); + String credential = checkNotNull(System.getProperty("bluelock-vcloudexpress.credential"), + "bluelock-vcloudexpress.credential"); + context = new RestContextFactory().createContext("bluelock-vcloudexpress", identity, credential, ImmutableSet . of(new Log4JLoggingModule()), new Properties()); connection = context.getApi(); } diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/ProvidersInPropertiesTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/ProvidersInPropertiesTest.java index 58e3efac36..67e6511e09 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/ProvidersInPropertiesTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/ProvidersInPropertiesTest.java @@ -36,13 +36,16 @@ public class ProvidersInPropertiesTest { @Test public void testSupportedProviders() { Iterable providers = Utils.getSupportedProviders(); - assert Iterables.contains(providers, "bluelock") : providers; + assert Iterables.contains(providers, "bluelock-vcloudexpress") : providers; + assert Iterables.contains(providers, "bluelock-vclouddirector") : providers; + } @Test public void testSupportedComputeServiceProviders() { Iterable providers = ComputeServiceUtils.getSupportedProviders(); - assert Iterables.contains(providers, "bluelock") : providers; + assert Iterables.contains(providers, "bluelock-vcloudexpress") : providers; + assert Iterables.contains(providers, "bluelock-vclouddirector") : providers; } } diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java index d3bd466193..c17842e70e 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java @@ -60,14 +60,15 @@ public class VCloudSessionRefreshLiveTest { @BeforeGroups(groups = { "live" }) public void setupClient() throws IOException { - identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); - String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); + identity = checkNotNull(System.getProperty("bluelock-vclouddirector.identity"), "bluelock-vclouddirector.identity"); + String credential = checkNotNull(System.getProperty("bluelock-vclouddirector.credential"), + "bluelock-vclouddirector.credential"); Properties props = new Properties(); props.setProperty(PROPERTY_SESSION_INTERVAL, 40 + ""); - context = new ComputeServiceContextFactory().createContext("bluelock", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), props); + context = new ComputeServiceContextFactory().createContext("bluelock-vclouddirector", identity, credential, + ImmutableSet. of(new Log4JLoggingModule()), props); connection = VCloudClient.class.cast(context.getProviderSpecificContext().getApi()); } diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java new file mode 100644 index 0000000000..ce801b154b --- /dev/null +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java @@ -0,0 +1,71 @@ +/** + * + * Copyright (C) 2010 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 director or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.jclouds.vcloud.bluelock.compute; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.testng.Assert.assertEquals; + +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.domain.TemplateBuilder; +import org.jclouds.vcloud.compute.VCloudComputeServiceLiveTest; +import org.testng.annotations.Test; + +/** + * + * + * @author Adrian Cole + */ +@Test(groups = "live", enabled = true, sequential = true, testName = "bluelock.BlueLockVCloudExpressComputeServiceLiveTest") +public class BlueLockVCloudDirectorComputeServiceLiveTest extends VCloudComputeServiceLiveTest { + @Override + public void setServiceDefaults() { + provider = "bluelock-vclouddirector"; + tag = "director"; + } + + @Override + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("bluelock-vclouddirector.identity"), + "bluelock-vclouddirector.identity"); + credential = checkNotNull(System.getProperty("bluelock-vclouddirector.credential"), + "bluelock-vclouddirector.credential"); + } + + @Test + public void testTemplateBuilder() { + Template defaultTemplate = client.templateBuilder().build(); + assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); + assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU); + assert defaultTemplate.getLocation().getId() != null : defaultTemplate.getLocation(); + assertEquals(defaultTemplate.getSize().getCores(), 1.0d); + } + + @Override + protected Template buildTemplate(TemplateBuilder templateBuilder) { + Template template = super.buildTemplate(templateBuilder); + Image image = template.getImage(); + assert image.getDefaultCredentials().identity != null : image; + assert image.getDefaultCredentials().credential != null : image; + return template; + } + +} diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudComputeServiceLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeServiceLiveTest.java similarity index 78% rename from vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudComputeServiceLiveTest.java rename to vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeServiceLiveTest.java index e46a2cf410..cb66134353 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudComputeServiceLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeServiceLiveTest.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.bluelock.compute; +import static com.google.common.base.Preconditions.checkNotNull; import static org.testng.Assert.assertEquals; import org.jclouds.compute.domain.Image; @@ -26,7 +27,6 @@ import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.vcloud.compute.VCloudComputeServiceLiveTest; -import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** @@ -34,12 +34,19 @@ import org.testng.annotations.Test; * * @author Adrian Cole */ -@Test(groups = "live", enabled = true, sequential = true, testName = "compute.BlueLockVCloudComputeServiceLiveTest") -public class BlueLockVCloudComputeServiceLiveTest extends VCloudComputeServiceLiveTest { - @BeforeClass +@Test(groups = "live", enabled = true, sequential = true, testName = "bluelock.BlueLockVCloudExpressComputeServiceLiveTest") +public class BlueLockVCloudExpressComputeServiceLiveTest extends VCloudComputeServiceLiveTest { @Override public void setServiceDefaults() { - provider = "bluelock"; + provider = "bluelock-vcloudexpress"; + tag = "vcx"; + } + + @Override + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("bluelock-vcloudexpress.identity"), "bluelock-vcloudexpress.identity"); + credential = checkNotNull(System.getProperty("bluelock-vcloudexpress.credential"), + "bluelock-vcloudexpress.credential"); } @Test From 3657e066f41214970e6b8877bdf8a2262734eaa5 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Thu, 19 Aug 2010 16:04:11 -0700 Subject: [PATCH 03/16] Issue 280: separated out VCloudExpress specific classes from the 1.0 stuff --- core/src/main/resources/rest.properties | 3 + .../BlueLockVCloudDirectorContextBuilder.java | 8 +- ...ueLockVCloudDirectorPropertiesBuilder.java | 4 - .../BlueLockVCloudExpressContextBuilder.java | 4 +- ...lueLockVCloudExpressPropertiesBuilder.java | 4 +- .../BlueLockVCloudDirectorComputeClient.java | 62 ++ .../BlueLockVCloudExpressComputeClient.java | 8 +- ...udDirectorComputeServiceContextModule.java | 57 ++ ...oudExpressComputeServiceContextModule.java | 12 +- ...> BlueLockVCloudImageForVAppTemplate.java} | 4 +- ...lueLockVCloudDirectorRestClientModule.java | 35 + ...BlueLockVCloudExpressRestClientModule.java | 14 +- .../BlueLockVCloudExpressClientLiveTest.java | 4 +- ...kVCloudDirectorComputeServiceLiveTest.java | 2 +- ...ckVCloudExpressComputeServiceLiveTest.java | 4 +- .../org/jclouds/vcloud/VCloudAsyncClient.java | 82 +- .../jclouds/vcloud/VCloudContextBuilder.java | 12 +- .../vcloud/VCloudExpressAsyncClient.java | 411 +++++++++ .../jclouds/vcloud/VCloudExpressClient.java | 213 +++++ .../vcloud/VCloudExpressContextBuilder.java | 74 ++ .../vcloud/VCloudExpressMediaType.java | 42 + .../VCloudExpressPropertiesBuilder.java | 90 ++ .../org/jclouds/vcloud/VCloudMediaType.java | 39 +- .../vcloud/VCloudPropertiesBuilder.java | 18 +- .../BindCloneVAppParamsToXmlPayload.java | 4 +- .../compute/BaseVCloudComputeClient.java | 6 +- .../BaseVCloudExpressComputeClient.java | 216 +++++ .../compute/VCloudExpressComputeClient.java | 101 ++ ...mmonVCloudComputeServiceContextModule.java | 92 ++ .../VCloudComputeServiceContextModule.java | 70 +- ...oudExpressComputeServiceContextModule.java | 69 ++ .../vcloud/compute/functions/GetExtra.java | 4 +- .../functions/ImagesInOrganization.java | 5 +- .../VCloudExpressAddNodeWithTagStrategy.java | 89 ++ .../VCloudExpressDestroyNodeStrategy.java | 55 ++ ...VCloudExpressGetNodeMetadataStrategy.java} | 21 +- .../VCloudExpressListNodesStrategy.java | 141 +++ .../VCloudExpressRebootNodeStrategy.java | 60 ++ .../VCloudGetNodeMetadataStrategy.java | 61 +- .../strategy/VCloudListNodesStrategy.java | 11 +- .../BaseVCloudExpressRestClientModule.java | 126 +++ .../config/BaseVCloudRestClientModule.java | 499 +--------- .../config/CommonVCloudRestClientModule.java | 521 +++++++++++ .../config/VCloudExpressRestClientModule.java | 41 + .../vcloud/config/VCloudRestClientModule.java | 3 +- .../jclouds/vcloud/domain/ResourceType.java | 4 +- .../vcloud/domain/internal/CatalogImpl.java | 4 +- .../domain/internal/CatalogItemImpl.java | 6 +- .../vcloud/domain/internal/NetworkImpl.java | 4 +- .../domain/internal/OrganizationImpl.java | 4 +- .../vcloud/domain/internal/VAppImpl.java | 4 +- .../domain/internal/VAppTemplateImpl.java | 4 +- .../vcloud/domain/internal/VDCImpl.java | 4 +- .../functions/AllCatalogItemsInCatalog.java | 3 +- .../AllCatalogItemsInOrganization.java | 8 +- .../functions/AllCatalogsInOrganization.java | 17 +- .../functions/AllVDCsInOrganization.java | 17 +- .../VAppTemplatesForCatalogItems.java | 4 +- .../VAppTemplatesForResourceEntities.java | 10 +- ...VCloudExpressAllCatalogItemsInCatalog.java | 85 ++ ...CloudExpressAllCatalogsInOrganization.java | 73 ++ .../VCloudExpressAllVDCsInOrganization.java | 75 ++ .../VCloudExpressOrganizationsForNames.java | 70 ++ ...VCloudExpressOrganizatonsForLocations.java | 98 ++ ...udExpressVAppTemplatesForCatalogItems.java | 83 ++ .../internal/VCloudLoginAsyncClient.java | 4 +- .../InstantiateVAppTemplateOptions.java | 46 +- ...und.java => VCloudExpressTaskSuccess.java} | 30 +- .../org/jclouds/vcloud/xml/OrgHandler.java | 6 +- .../jclouds/vcloud/xml/OrgListHandler.java | 2 +- .../org/jclouds/vcloud/xml/VAppHandler.java | 4 +- .../vcloud/ProvidersInPropertiesTest.java | 2 + .../jclouds/vcloud/VCloudAsyncClientTest.java | 309 ++++--- .../jclouds/vcloud/VCloudClientLiveTest.java | 14 +- .../vcloud/VCloudExpressAsyncClientTest.java | 870 ++++++++++++++++++ .../vcloud/VCloudExpressClientLiveTest.java | 175 ++++ .../BindCloneVAppParamsToXmlPayloadTest.java | 16 +- ...ateVAppTemplateParamsToXmlPayloadTest.java | 26 +- ...ssBindCloneVAppParamsToXmlPayloadTest.java | 98 ++ ...ateVAppTemplateParamsToXmlPayloadTest.java | 132 +++ .../compute/VCloudComputeClientLiveTest.java | 38 +- .../compute/VCloudComputeServiceLiveTest.java | 10 +- .../VCloudExpressComputeClientLiveTest.java | 164 ++++ .../VCloudExpressComputeServiceLiveTest.java | 80 ++ ...xpressComputeServiceContextModuleTest.java | 38 + .../ParseLoginResponseFromHeadersTest.java | 6 +- .../vcloud/xml/CatalogItemHandlerTest.java | 2 +- .../jclouds/vcloud/xml/OrgHandlerTest.java | 10 +- .../vcloud/xml/OrgListHandlerTest.java | 4 +- .../jclouds/vcloud/xml/TaskHandlerTest.java | 12 +- .../vcloud/xml/TasksListHandlerTest.java | 10 +- .../src/test/resources/cloneVApp-default.xml | 2 +- vcloud/core/src/test/resources/cloneVApp.xml | 2 +- .../resources/express/cloneVApp-default.xml | 1 + .../src/test/resources/express/cloneVApp.xml | 1 + .../{ => express}/newvapp-hosting.xml | 0 .../newvapp-hostingcpumemdisk.xml | 0 ...ewvapp-hostingnetworknamedhcpfencemode.xml | 0 .../src/test/resources/newvapp-cpumemdisk.xml | 1 + .../newvapp-networknamedhcpfencemode.xml | 1 + vcloud/core/src/test/resources/newvapp.xml | 1 + .../HostingDotComVCloudAsyncClient.java | 8 +- .../HostingDotComVCloudClient.java | 4 +- .../HostingDotComVCloudContextBuilder.java | 4 +- .../HostingDotComVCloudPropertiesBuilder.java | 4 +- .../HostingDotComVCloudComputeClient.java | 8 +- ...tComVCloudComputeServiceContextModule.java | 8 +- .../HostingDotComVCloudRestClientModule.java | 14 +- .../HostingDotComVCloudAsyncClientTest.java | 6 +- .../HostingDotComVCloudClientLiveTest.java | 4 +- ...tingDotComVCloudComputeClientLiveTest.java | 4 +- ...ingDotComVCloudComputeServiceLiveTest.java | 4 +- .../TerremarkECloudContextBuilder.java | 8 +- .../terremark/TerremarkVCloudAsyncClient.java | 26 +- .../terremark/TerremarkVCloudClient.java | 4 +- .../TerremarkVCloudExpressContextBuilder.java | 4 +- .../terremark/TerremarkVCloudMediaType.java | 4 +- .../TerremarkVCloudPropertiesBuilder.java | 4 +- .../compute/TerremarkVCloudComputeClient.java | 4 +- ...markVCloudComputeServiceContextModule.java | 26 +- .../functions/NodeMetadataToOrgAndName.java | 6 +- ...erremarkVCloudGetNodeMetadataStrategy.java | 26 +- .../suppliers/VAppTemplatesInOrgs.java | 8 +- .../TerremarkECloudRestClientModule.java | 8 +- .../config/TerremarkRestClientModule.java | 4 +- ...erremarkVCloudExpressRestClientModule.java | 8 +- .../terremark/xml/TerremarkVDCHandler.java | 4 +- .../terremark/TerremarkClientLiveTest.java | 12 +- .../TerremarkECloudAsyncClientTest.java | 10 +- ...TerremarkVCloudExpressAsyncClientTest.java | 10 +- ...BindVAppConfigurationToXmlPayloadTest.java | 4 +- ...TerremarkECloudComputeServiceLiveTest.java | 4 +- ...rkVCloudExpressComputeServiceLiveTest.java | 6 +- .../xml/TerremarkOrgHandlerTest.java | 8 +- .../xml/TerremarkVDCHandlerTest.java | 8 +- .../vcloud/terremark/xml/VAppHandlerTest.java | 6 +- 136 files changed, 5255 insertions(+), 1120 deletions(-) create mode 100644 vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java create mode 100644 vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudDirectorComputeServiceContextModule.java rename vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/{BlueLockVCloudExpressImageForVAppTemplate.java => BlueLockVCloudImageForVAppTemplate.java} (89%) create mode 100644 vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudDirectorRestClientModule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressContextBuilder.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressMediaType.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java mode change 100755 => 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java create mode 100755 vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java rename vcloud/core/src/main/java/org/jclouds/vcloud/compute/{functions/VCloudGetNodeMetadata.java => strategy/VCloudExpressGetNodeMetadataStrategy.java} (84%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudExpressRestClientModule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogItemsInCatalog.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogsInOrganization.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressVAppTemplatesForCatalogItems.java rename vcloud/core/src/main/java/org/jclouds/vcloud/predicates/{VAppNotFound.java => VCloudExpressTaskSuccess.java} (59%) create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindCloneVAppParamsToXmlPayloadTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindInstantiateVAppTemplateParamsToXmlPayloadTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeClientLiveTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeServiceLiveTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModuleTest.java create mode 100644 vcloud/core/src/test/resources/express/cloneVApp-default.xml create mode 100644 vcloud/core/src/test/resources/express/cloneVApp.xml rename vcloud/core/src/test/resources/{ => express}/newvapp-hosting.xml (100%) rename vcloud/core/src/test/resources/{ => express}/newvapp-hostingcpumemdisk.xml (100%) rename vcloud/core/src/test/resources/{ => express}/newvapp-hostingnetworknamedhcpfencemode.xml (100%) create mode 100644 vcloud/core/src/test/resources/newvapp-cpumemdisk.xml create mode 100644 vcloud/core/src/test/resources/newvapp-networknamedhcpfencemode.xml create mode 100644 vcloud/core/src/test/resources/newvapp.xml diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index d1c008b552..a3d20f6e5f 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -74,6 +74,9 @@ opscodeplatform.propertiesbuilder=org.jclouds.opscodeplatform.OpscodePlatformPro vcloud.contextbuilder=org.jclouds.vcloud.VCloudContextBuilder vcloud.propertiesbuilder=org.jclouds.vcloud.VCloudPropertiesBuilder +vcloudexpress.contextbuilder=org.jclouds.vcloud.VCloudExpressContextBuilder +vcloudexpress.propertiesbuilder=org.jclouds.vcloud.VCloudExpressPropertiesBuilder + eucalyptus.contextbuilder=org.jclouds.aws.ec2.EC2ContextBuilder eucalyptus.propertiesbuilder=org.jclouds.aws.ec2.EucalyptusPropertiesBuilder diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java index 22120c1566..7f9c2e80e8 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorContextBuilder.java @@ -25,8 +25,8 @@ import java.util.Properties; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; import org.jclouds.vcloud.VCloudContextBuilder; -import org.jclouds.vcloud.bluelock.compute.config.BlueLockVCloudExpressComputeServiceContextModule; -import org.jclouds.vcloud.bluelock.config.BlueLockVCloudExpressRestClientModule; +import org.jclouds.vcloud.bluelock.compute.config.BlueLockVCloudDirectorComputeServiceContextModule; +import org.jclouds.vcloud.bluelock.config.BlueLockVCloudDirectorRestClientModule; import com.google.inject.Injector; import com.google.inject.Module; @@ -52,12 +52,12 @@ public class BlueLockVCloudDirectorContextBuilder extends VCloudContextBuilder { @Override protected void addContextModule(List modules) { - modules.add(new BlueLockVCloudExpressComputeServiceContextModule()); + modules.add(new BlueLockVCloudDirectorComputeServiceContextModule()); } @Override protected void addClientModule(List modules) { - modules.add(new BlueLockVCloudExpressRestClientModule()); + modules.add(new BlueLockVCloudDirectorRestClientModule()); } } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java index 94816202ed..dd171d19c6 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorPropertiesBuilder.java @@ -19,9 +19,7 @@ package org.jclouds.vcloud.bluelock; -import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_ENDPOINT; -import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_VERSION_SCHEMA; import java.util.Properties; @@ -36,8 +34,6 @@ public class BlueLockVCloudDirectorPropertiesBuilder extends VCloudPropertiesBui @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_API_VERSION, "1.0"); - properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "1.0"); properties.setProperty(PROPERTY_ENDPOINT, "https://vcenterprise.bluelock.com/api"); return properties; } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressContextBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressContextBuilder.java index f9187854b5..7dd776267c 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressContextBuilder.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressContextBuilder.java @@ -24,7 +24,7 @@ import java.util.Properties; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; -import org.jclouds.vcloud.VCloudContextBuilder; +import org.jclouds.vcloud.VCloudExpressContextBuilder; import org.jclouds.vcloud.bluelock.compute.config.BlueLockVCloudExpressComputeServiceContextModule; import org.jclouds.vcloud.bluelock.config.BlueLockVCloudExpressRestClientModule; @@ -44,7 +44,7 @@ import com.google.inject.Module; * @author Adrian Cole * @see BlueLockVCloudComputeServiceContext */ -public class BlueLockVCloudExpressContextBuilder extends VCloudContextBuilder { +public class BlueLockVCloudExpressContextBuilder extends VCloudExpressContextBuilder { public BlueLockVCloudExpressContextBuilder(Properties props) { super(props); diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressPropertiesBuilder.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressPropertiesBuilder.java index 22b7455a56..1d1ee131e6 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressPropertiesBuilder.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressPropertiesBuilder.java @@ -23,14 +23,14 @@ import static org.jclouds.Constants.PROPERTY_ENDPOINT; import java.util.Properties; -import org.jclouds.vcloud.VCloudPropertiesBuilder; +import org.jclouds.vcloud.VCloudExpressPropertiesBuilder; /** * Builds properties used in bluelock VCloud Clients * * @author Adrian Cole */ -public class BlueLockVCloudExpressPropertiesBuilder extends VCloudPropertiesBuilder { +public class BlueLockVCloudExpressPropertiesBuilder extends VCloudExpressPropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java new file mode 100644 index 0000000000..7ab82f6be6 --- /dev/null +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java @@ -0,0 +1,62 @@ +/** + * + * Copyright (C) 2010 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.bluelock.compute; + +import java.net.URI; +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.domain.Credentials; +import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.VAppTemplate; + +import com.google.common.base.Predicate; + +/** + * @author Adrian Cole + */ +@Singleton +public class BlueLockVCloudDirectorComputeClient extends BaseVCloudComputeClient { + private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; + + @Inject + protected BlueLockVCloudDirectorComputeClient(PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, + VCloudClient client, Predicate successTester, Map vAppStatusToNodeState) { + super(client, successTester, vAppStatusToNodeState); + this.credentialsProvider = credentialsProvider; + } + + @Override + protected Map parseAndValidateResponse(VAppTemplate template, VApp vAppResponse) { + Credentials credentials = credentialsProvider.execute(template); + Map toReturn = super.parseResponse(template, vAppResponse); + toReturn.put("username", credentials.identity); + toReturn.put("password", credentials.credential); + return toReturn; + } + +} \ No newline at end of file diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java index 9c7e4369fc..dd685c19df 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java @@ -28,8 +28,8 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.domain.Credentials; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; @@ -40,12 +40,12 @@ import com.google.common.base.Predicate; * @author Adrian Cole */ @Singleton -public class BlueLockVCloudExpressComputeClient extends BaseVCloudComputeClient { +public class BlueLockVCloudExpressComputeClient extends BaseVCloudExpressComputeClient { private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; @Inject protected BlueLockVCloudExpressComputeClient(PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, - VCloudClient client, Predicate successTester, Map vAppStatusToNodeState) { + VCloudExpressClient client, Predicate successTester, Map vAppStatusToNodeState) { super(client, successTester, vAppStatusToNodeState); this.credentialsProvider = credentialsProvider; } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudDirectorComputeServiceContextModule.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudDirectorComputeServiceContextModule.java new file mode 100644 index 0000000000..acbf6d57e1 --- /dev/null +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudDirectorComputeServiceContextModule.java @@ -0,0 +1,57 @@ +/** + * + * Copyright (C) 2010 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.bluelock.compute.config; + +import java.util.Set; + +import org.jclouds.compute.domain.Size; +import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; +import org.jclouds.vcloud.bluelock.compute.BlueLockVCloudDirectorComputeClient; +import org.jclouds.vcloud.bluelock.compute.config.suppliers.ParseSizeFromImageSupplier; +import org.jclouds.vcloud.bluelock.compute.functions.BlueLockVCloudImageForVAppTemplate; +import org.jclouds.vcloud.bluelock.compute.strategy.DefaultLoginCredentialsFromBlueLockFAQ; +import org.jclouds.vcloud.compute.VCloudComputeClient; +import org.jclouds.vcloud.compute.config.VCloudComputeServiceContextModule; +import org.jclouds.vcloud.compute.functions.ImageForVAppTemplate; + +import com.google.common.base.Supplier; +import com.google.inject.Injector; + +/** + * Configures the {@link BlueLockVCloudComputeServiceContext}; requires + * {@link BlueLockVCloudComputeClient} bound. + * + * @author Adrian Cole + */ +public class BlueLockVCloudDirectorComputeServiceContextModule extends VCloudComputeServiceContextModule { + + @Override + protected void configure() { + super.configure(); + bind(ImageForVAppTemplate.class).to(BlueLockVCloudImageForVAppTemplate.class); + bind(VCloudComputeClient.class).to(BlueLockVCloudDirectorComputeClient.class); + bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to(DefaultLoginCredentialsFromBlueLockFAQ.class); + } + + @Override + protected Supplier> getSourceSizeSupplier(Injector injector) { + return injector.getInstance(ParseSizeFromImageSupplier.class); + } +} diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudExpressComputeServiceContextModule.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudExpressComputeServiceContextModule.java index 1390275b01..ff3659e864 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudExpressComputeServiceContextModule.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/config/BlueLockVCloudExpressComputeServiceContextModule.java @@ -25,10 +25,10 @@ import org.jclouds.compute.domain.Size; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.vcloud.bluelock.compute.BlueLockVCloudExpressComputeClient; import org.jclouds.vcloud.bluelock.compute.config.suppliers.ParseSizeFromImageSupplier; -import org.jclouds.vcloud.bluelock.compute.functions.BlueLockVCloudExpressImageForVAppTemplate; +import org.jclouds.vcloud.bluelock.compute.functions.BlueLockVCloudImageForVAppTemplate; import org.jclouds.vcloud.bluelock.compute.strategy.DefaultLoginCredentialsFromBlueLockFAQ; -import org.jclouds.vcloud.compute.VCloudComputeClient; -import org.jclouds.vcloud.compute.config.VCloudComputeServiceContextModule; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; import org.jclouds.vcloud.compute.functions.ImageForVAppTemplate; import com.google.common.base.Supplier; @@ -40,13 +40,13 @@ import com.google.inject.Injector; * * @author Adrian Cole */ -public class BlueLockVCloudExpressComputeServiceContextModule extends VCloudComputeServiceContextModule { +public class BlueLockVCloudExpressComputeServiceContextModule extends VCloudExpressComputeServiceContextModule { @Override protected void configure() { super.configure(); - bind(ImageForVAppTemplate.class).to(BlueLockVCloudExpressImageForVAppTemplate.class); - bind(VCloudComputeClient.class).to(BlueLockVCloudExpressComputeClient.class); + bind(ImageForVAppTemplate.class).to(BlueLockVCloudImageForVAppTemplate.class); + bind(VCloudExpressComputeClient.class).to(BlueLockVCloudExpressComputeClient.class); bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to(DefaultLoginCredentialsFromBlueLockFAQ.class); } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudExpressImageForVAppTemplate.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudImageForVAppTemplate.java similarity index 89% rename from vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudExpressImageForVAppTemplate.java rename to vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudImageForVAppTemplate.java index 5214728345..1e1e12c70a 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudExpressImageForVAppTemplate.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/functions/BlueLockVCloudImageForVAppTemplate.java @@ -31,10 +31,10 @@ import org.jclouds.vcloud.compute.functions.ImageForVAppTemplate; * @author Adrian Cole */ @Singleton -public class BlueLockVCloudExpressImageForVAppTemplate extends ImageForVAppTemplate { +public class BlueLockVCloudImageForVAppTemplate extends ImageForVAppTemplate { @Inject - protected BlueLockVCloudExpressImageForVAppTemplate(FindLocationForResource findLocationForResource, + protected BlueLockVCloudImageForVAppTemplate(FindLocationForResource findLocationForResource, PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider) { super(findLocationForResource, credentialsProvider); } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudDirectorRestClientModule.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudDirectorRestClientModule.java new file mode 100644 index 0000000000..2d552cbd0b --- /dev/null +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudDirectorRestClientModule.java @@ -0,0 +1,35 @@ +/** + * + * Copyright (C) 2010 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.bluelock.config; + +import org.jclouds.http.RequiresHttp; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.vcloud.config.VCloudRestClientModule; + +/** + * Configures the VCloud authentication service connection, including logging and http transport. + * + * @author Adrian Cole + */ +@RequiresHttp +@ConfiguresRestClient +public class BlueLockVCloudDirectorRestClientModule extends VCloudRestClientModule { + +} diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java index f8a3ea852d..cd77f6d93a 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java @@ -24,15 +24,13 @@ import static org.jclouds.Constants.PROPERTY_IDENTITY; import java.net.URI; import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeoutException; import javax.inject.Named; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.config.VCloudRestClientModule; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.config.VCloudExpressRestClientModule; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; @@ -40,18 +38,16 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; /** - * 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 BlueLockVCloudExpressRestClientModule extends VCloudRestClientModule { +public class BlueLockVCloudExpressRestClientModule extends VCloudExpressRestClientModule { @Override - protected URI provideDefaultNetwork(VCloudClient client) throws InterruptedException, ExecutionException, - TimeoutException { + protected URI provideDefaultNetwork(VCloudExpressClient client) { org.jclouds.vcloud.domain.VDC vDC = client.findVDCInOrgNamed(null, null); Map networks = vDC.getAvailableNetworks(); checkState(networks.size() > 0, "No networks present in vDC: " + vDC.getName()); diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java index b4c5bdbb25..c8185718e7 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java @@ -25,7 +25,7 @@ import java.util.Properties; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContextFactory; -import org.jclouds.vcloud.VCloudClientLiveTest; +import org.jclouds.vcloud.VCloudExpressClientLiveTest; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -38,7 +38,7 @@ import com.google.inject.Module; * @author Adrian Cole */ @Test(groups = "live", sequential = true, testName = "vcloud.BlueLockVCloudClientLiveTest") -public class BlueLockVCloudExpressClientLiveTest extends VCloudClientLiveTest { +public class BlueLockVCloudExpressClientLiveTest extends VCloudExpressClientLiveTest { @BeforeGroups(groups = { "live" }) @Override diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java index ce801b154b..aba4db23fd 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeServiceLiveTest.java @@ -34,7 +34,7 @@ import org.testng.annotations.Test; * * @author Adrian Cole */ -@Test(groups = "live", enabled = true, sequential = true, testName = "bluelock.BlueLockVCloudExpressComputeServiceLiveTest") +@Test(groups = "live", enabled = true, sequential = true, testName = "bluelock.BlueLockVCloudComputeServiceLiveTest") public class BlueLockVCloudDirectorComputeServiceLiveTest extends VCloudComputeServiceLiveTest { @Override public void setServiceDefaults() { diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeServiceLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeServiceLiveTest.java index cb66134353..4b0d1ef294 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeServiceLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeServiceLiveTest.java @@ -26,7 +26,7 @@ import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.Template; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.vcloud.compute.VCloudComputeServiceLiveTest; +import org.jclouds.vcloud.compute.VCloudExpressComputeServiceLiveTest; import org.testng.annotations.Test; /** @@ -35,7 +35,7 @@ import org.testng.annotations.Test; * @author Adrian Cole */ @Test(groups = "live", enabled = true, sequential = true, testName = "bluelock.BlueLockVCloudExpressComputeServiceLiveTest") -public class BlueLockVCloudExpressComputeServiceLiveTest extends VCloudComputeServiceLiveTest { +public class BlueLockVCloudExpressComputeServiceLiveTest extends VCloudExpressComputeServiceLiveTest { @Override public void setServiceDefaults() { provider = "bluelock-vcloudexpress"; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java index ae80a69b64..03e158fa0f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java @@ -19,15 +19,15 @@ package org.jclouds.vcloud; -import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; -import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML; -import static org.jclouds.vcloud.VCloudMediaType.ORG_XML; -import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; -import static org.jclouds.vcloud.VCloudMediaType.TASK_XML; -import static org.jclouds.vcloud.VCloudMediaType.VAPPTEMPLATE_XML; -import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; -import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.NETWORK_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.ORG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASK_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VAPPTEMPLATE_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; import java.net.URI; @@ -95,7 +95,7 @@ import com.google.common.util.concurrent.ListenableFuture; @RequestFilters(SetVCloudTokenCookie.class) public interface VCloudAsyncClient { /** - * @see VCloudClient#getDefaultOrganization + * @see VCloudExpressClient#getDefaultOrganization */ @Deprecated @GET @@ -105,7 +105,7 @@ public interface VCloudAsyncClient { ListenableFuture getDefaultOrganization(); /** - * @see VCloudClient#getOrganization + * @see VCloudExpressClient#getOrganization */ @GET @XMLResponseParser(OrgHandler.class) @@ -114,7 +114,7 @@ public interface VCloudAsyncClient { ListenableFuture getOrganization(@EndpointParam URI orgId); /** - * @see VCloudClient#getOrganizationNamed + * @see VCloudExpressClient#getOrganizationNamed */ @GET @XMLResponseParser(OrgHandler.class) @@ -124,7 +124,7 @@ public interface VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); /** - * @see VCloudClient#getDefaultCatalog + * @see VCloudExpressClient#getDefaultCatalog */ @Deprecated @GET @@ -134,7 +134,7 @@ public interface VCloudAsyncClient { ListenableFuture getDefaultCatalog(); /** - * @see VCloudClient#getCatalog + * @see VCloudExpressClient#getCatalog */ @GET @XMLResponseParser(CatalogHandler.class) @@ -143,7 +143,7 @@ public interface VCloudAsyncClient { ListenableFuture getCatalog(@EndpointParam URI catalogId); /** - * @see VCloudClient#findCatalogInOrgNamed + * @see VCloudExpressClient#findCatalogInOrgNamed */ @GET @XMLResponseParser(CatalogHandler.class) @@ -154,7 +154,7 @@ public interface VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); /** - * @see VCloudClient#getVAppTemplate + * @see VCloudExpressClient#getVAppTemplate */ @GET @Consumes(VAPPTEMPLATE_XML) @@ -163,7 +163,7 @@ public interface VCloudAsyncClient { ListenableFuture getVAppTemplate(@EndpointParam URI vAppTemplate); /** - * @see VCloudClient#findVAppTemplateInOrgCatalogNameds + * @see VCloudExpressClient#findVAppTemplateInOrgCatalogNameds */ @GET @Consumes(VAPPTEMPLATE_XML) @@ -175,7 +175,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); /** - * @see VCloudClient#getCatalogItem + * @see VCloudExpressClient#getCatalogItem */ @GET @Consumes(CATALOGITEM_XML) @@ -184,7 +184,7 @@ public interface VCloudAsyncClient { ListenableFuture getCatalogItem(@EndpointParam URI catalogItem); /** - * @see VCloudClient#getCatalogItemInOrg + * @see VCloudExpressClient#getCatalogItemInOrg */ @GET @Consumes(CATALOGITEM_XML) @@ -196,7 +196,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); /** - * @see VCloudClient#findNetworkInOrgVDCNamed + * @see VCloudExpressClient#findNetworkInOrgVDCNamed */ @GET @Consumes(NETWORK_XML) @@ -208,7 +208,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); /** - * @see VCloudClient#getNetwork + * @see VCloudExpressClient#getNetwork */ @GET @Consumes(NETWORK_XML) @@ -217,7 +217,7 @@ public interface VCloudAsyncClient { ListenableFuture getNetwork(@EndpointParam URI network); /** - * @see VCloudClient#getDefaultVDC + * @see VCloudExpressClient#getDefaultVDC */ @Deprecated @GET @@ -227,7 +227,7 @@ public interface VCloudAsyncClient { ListenableFuture getDefaultVDC(); /** - * @see VCloudClient#getVDC(URI) + * @see VCloudExpressClient#getVDC(URI) */ @GET @XMLResponseParser(VDCHandler.class) @@ -236,7 +236,7 @@ public interface VCloudAsyncClient { ListenableFuture getVDC(@EndpointParam URI vdc); /** - * @see VCloudClient#findVDCInOrgNamed(String, String) + * @see VCloudExpressClient#findVDCInOrgNamed(String, String) */ @GET @XMLResponseParser(VDCHandler.class) @@ -247,7 +247,7 @@ public interface VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); /** - * @see VCloudClient#getTasksList + * @see VCloudExpressClient#getTasksList */ @GET @Consumes(TASKSLIST_XML) @@ -256,7 +256,7 @@ public interface VCloudAsyncClient { ListenableFuture getTasksList(@EndpointParam URI tasksListId); /** - * @see VCloudClient#getTasksListInOrg + * @see VCloudExpressClient#getTasksListInOrg */ @GET @Consumes(TASKSLIST_XML) @@ -267,7 +267,7 @@ public interface VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameAndTasksListNameToEndpoint.class) String tasksListName); /** - * @see VCloudClient#getDefaultTasksList + * @see VCloudExpressClient#getDefaultTasksList */ @Deprecated @GET @@ -277,7 +277,7 @@ public interface VCloudAsyncClient { ListenableFuture getDefaultTasksList(); /** - * @see VCloudClient#deployVApp + * @see VCloudExpressClient#deployVApp */ @POST @Consumes(TASK_XML) @@ -286,14 +286,14 @@ public interface VCloudAsyncClient { ListenableFuture deployVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#deleteVApp + * @see VCloudExpressClient#deleteVApp */ @DELETE @ExceptionParser(ReturnVoidOnNotFoundOr404.class) ListenableFuture deleteVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#undeployVApp + * @see VCloudExpressClient#undeployVApp */ @POST @Consumes(TASK_XML) @@ -302,7 +302,7 @@ public interface VCloudAsyncClient { ListenableFuture undeployVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#powerOnVApp + * @see VCloudExpressClient#powerOnVApp */ @POST @Consumes(TASK_XML) @@ -311,7 +311,7 @@ public interface VCloudAsyncClient { ListenableFuture powerOnVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#powerOffVApp + * @see VCloudExpressClient#powerOffVApp */ @POST @Consumes(TASK_XML) @@ -320,14 +320,14 @@ public interface VCloudAsyncClient { ListenableFuture powerOffVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#shutdownVApp + * @see VCloudExpressClient#shutdownVApp */ @POST @Path("/power/action/shutdown") ListenableFuture shutdownVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#resetVApp + * @see VCloudExpressClient#resetVApp */ @POST @Consumes(TASK_XML) @@ -336,7 +336,7 @@ public interface VCloudAsyncClient { ListenableFuture resetVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#suspendVApp + * @see VCloudExpressClient#suspendVApp */ @POST @Consumes(TASK_XML) @@ -345,7 +345,7 @@ public interface VCloudAsyncClient { ListenableFuture suspendVApp(@EndpointParam URI vAppId); /** - * @see VCloudClient#getTask + * @see VCloudExpressClient#getTask */ @GET @Consumes(TASK_XML) @@ -354,14 +354,14 @@ public interface VCloudAsyncClient { ListenableFuture getTask(@EndpointParam URI taskId); /** - * @see VCloudClient#cancelTask + * @see VCloudExpressClient#cancelTask */ @POST @Path("/action/cancel") ListenableFuture cancelTask(@EndpointParam URI taskId); /** - * @see VCloudClient#findVAppInOrgVDCNamed + * @see VCloudExpressClient#findVAppInOrgVDCNamed */ @GET @Consumes(VAPP_XML) @@ -373,7 +373,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); /** - * @see VCloudClient#getVApp + * @see VCloudExpressClient#getVApp */ @GET @Consumes(VAPP_XML) @@ -382,7 +382,7 @@ public interface VCloudAsyncClient { ListenableFuture getVApp(@EndpointParam URI vApp); /** - * @see VCloudClient#instantiateVAppTemplateInVDC + * @see VCloudExpressClient#instantiateVAppTemplateInVDC */ @POST @Path("action/instantiateVAppTemplate") @@ -396,7 +396,7 @@ public interface VCloudAsyncClient { InstantiateVAppTemplateOptions... options); /** - * @see VCloudClient#cloneVAppInVDC + * @see VCloudExpressClient#cloneVAppInVDC */ @POST @Path("/action/cloneVApp") diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudContextBuilder.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudContextBuilder.java index fd6d54c329..1ce37d6e7d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudContextBuilder.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudContextBuilder.java @@ -48,8 +48,7 @@ import com.google.inject.TypeLiteral; * @author Adrian Cole * @see VCloudComputeServiceContext */ -public class VCloudContextBuilder extends - ComputeServiceContextBuilder { +public class VCloudContextBuilder extends ComputeServiceContextBuilder { public VCloudContextBuilder(Properties props) { super(VCloudClient.class, VCloudAsyncClient.class, props); @@ -68,11 +67,8 @@ public class VCloudContextBuilder extends @Override public ComputeServiceContext buildComputeServiceContext() { // need the generic type information - return (ComputeServiceContext) this - .buildInjector() - .getInstance( - Key - .get(new TypeLiteral>() { - })); + return (ComputeServiceContext) this.buildInjector().getInstance( + Key.get(new TypeLiteral>() { + })); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java new file mode 100644 index 0000000000..da8341ba11 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java @@ -0,0 +1,411 @@ +/** + * + * Copyright (C) 2010 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; + +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.NETWORK_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.ORG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASK_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VAPPTEMPLATE_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; + +import java.net.URI; + +import javax.annotation.Nullable; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import org.jclouds.predicates.validators.DnsNameValidator; +import org.jclouds.rest.annotations.Endpoint; +import org.jclouds.rest.annotations.EndpointParam; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.MapBinder; +import org.jclouds.rest.annotations.MapPayloadParam; +import org.jclouds.rest.annotations.ParamValidators; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.XMLResponseParser; +import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; +import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; +import org.jclouds.vcloud.binders.BindCloneVAppParamsToXmlPayload; +import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.Network; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.TasksList; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.filters.SetVCloudTokenCookie; +import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameAndTasksListNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; +import org.jclouds.vcloud.options.CloneVAppOptions; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; +import org.jclouds.vcloud.xml.CatalogHandler; +import org.jclouds.vcloud.xml.CatalogItemHandler; +import org.jclouds.vcloud.xml.NetworkHandler; +import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.TaskHandler; +import org.jclouds.vcloud.xml.TasksListHandler; +import org.jclouds.vcloud.xml.VAppHandler; +import org.jclouds.vcloud.xml.VAppTemplateHandler; +import org.jclouds.vcloud.xml.VDCHandler; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides access to VCloud resources via their REST API. + *

+ * + * @see + * @author Adrian Cole + */ +@RequestFilters(SetVCloudTokenCookie.class) +public interface VCloudExpressAsyncClient { + /** + * @see VCloudExpressClient#getDefaultOrganization + */ + @Deprecated + @GET + @Endpoint(Org.class) + @Consumes(ORG_XML) + @XMLResponseParser(OrgHandler.class) + ListenableFuture getDefaultOrganization(); + + /** + * @see VCloudExpressClient#getOrganization + */ + @GET + @XMLResponseParser(OrgHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(ORG_XML) + ListenableFuture getOrganization(@EndpointParam URI orgId); + + /** + * @see VCloudExpressClient#getOrganizationNamed + */ + @GET + @XMLResponseParser(OrgHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(ORG_XML) + ListenableFuture findOrganizationNamed( + @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); + + /** + * @see VCloudExpressClient#getDefaultCatalog + */ + @Deprecated + @GET + @Endpoint(org.jclouds.vcloud.endpoints.Catalog.class) + @Consumes(CATALOG_XML) + @XMLResponseParser(CatalogHandler.class) + ListenableFuture getDefaultCatalog(); + + /** + * @see VCloudExpressClient#getCatalog + */ + @GET + @XMLResponseParser(CatalogHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(CATALOG_XML) + ListenableFuture getCatalog(@EndpointParam URI catalogId); + + /** + * @see VCloudExpressClient#findCatalogInOrgNamed + */ + @GET + @XMLResponseParser(CatalogHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(CATALOG_XML) + ListenableFuture findCatalogInOrgNamed( + @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); + + /** + * @see VCloudExpressClient#getVAppTemplate + */ + @GET + @Consumes(VAPPTEMPLATE_XML) + @XMLResponseParser(VAppTemplateHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getVAppTemplate(@EndpointParam URI vAppTemplate); + + /** + * @see VCloudExpressClient#findVAppTemplateInOrgCatalogNameds + */ + @GET + @Consumes(VAPPTEMPLATE_XML) + @XMLResponseParser(VAppTemplateHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findVAppTemplateInOrgCatalogNamed( + @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); + + /** + * @see VCloudExpressClient#getCatalogItem + */ + @GET + @Consumes(CATALOGITEM_XML) + @XMLResponseParser(CatalogItemHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getCatalogItem(@EndpointParam URI catalogItem); + + /** + * @see VCloudExpressClient#getCatalogItemInOrg + */ + @GET + @Consumes(CATALOGITEM_XML) + @XMLResponseParser(CatalogItemHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findCatalogItemInOrgCatalogNamed( + @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); + + /** + * @see VCloudExpressClient#findNetworkInOrgVDCNamed + */ + @GET + @Consumes(NETWORK_XML) + @XMLResponseParser(NetworkHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findNetworkInOrgVDCNamed( + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); + + /** + * @see VCloudExpressClient#getNetwork + */ + @GET + @Consumes(NETWORK_XML) + @XMLResponseParser(NetworkHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getNetwork(@EndpointParam URI network); + + /** + * @see VCloudExpressClient#getDefaultVDC + */ + @Deprecated + @GET + @Endpoint(org.jclouds.vcloud.endpoints.VDC.class) + @XMLResponseParser(VDCHandler.class) + @Consumes(VDC_XML) + ListenableFuture getDefaultVDC(); + + /** + * @see VCloudExpressClient#getVDC(URI) + */ + @GET + @XMLResponseParser(VDCHandler.class) + @Consumes(VDC_XML) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getVDC(@EndpointParam URI vdc); + + /** + * @see VCloudExpressClient#findVDCInOrgNamed(String, String) + */ + @GET + @XMLResponseParser(VDCHandler.class) + @Consumes(VDC_XML) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findVDCInOrgNamed( + @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); + + /** + * @see VCloudExpressClient#getTasksList + */ + @GET + @Consumes(TASKSLIST_XML) + @XMLResponseParser(TasksListHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getTasksList(@EndpointParam URI tasksListId); + + /** + * @see VCloudExpressClient#getTasksListInOrg + */ + @GET + @Consumes(TASKSLIST_XML) + @XMLResponseParser(TasksListHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findTasksListInOrgNamed( + @Nullable @EndpointParam(parser = OrgNameAndTasksListNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameAndTasksListNameToEndpoint.class) String tasksListName); + + /** + * @see VCloudExpressClient#getDefaultTasksList + */ + @Deprecated + @GET + @Endpoint(org.jclouds.vcloud.endpoints.TasksList.class) + @Consumes(TASKSLIST_XML) + @XMLResponseParser(TasksListHandler.class) + ListenableFuture getDefaultTasksList(); + + /** + * @see VCloudExpressClient#deployVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/action/deploy") + @XMLResponseParser(TaskHandler.class) + ListenableFuture deployVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#deleteVApp + */ + @DELETE + @ExceptionParser(ReturnVoidOnNotFoundOr404.class) + ListenableFuture deleteVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#undeployVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/action/undeploy") + @XMLResponseParser(TaskHandler.class) + ListenableFuture undeployVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#powerOnVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/powerOn") + @XMLResponseParser(TaskHandler.class) + ListenableFuture powerOnVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#powerOffVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/powerOff") + @XMLResponseParser(TaskHandler.class) + ListenableFuture powerOffVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#shutdownVApp + */ + @POST + @Path("/power/action/shutdown") + ListenableFuture shutdownVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#resetVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/reset") + @XMLResponseParser(TaskHandler.class) + ListenableFuture resetVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#suspendVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/suspend") + @XMLResponseParser(TaskHandler.class) + ListenableFuture suspendVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudExpressClient#getTask + */ + @GET + @Consumes(TASK_XML) + @XMLResponseParser(TaskHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getTask(@EndpointParam URI taskId); + + /** + * @see VCloudExpressClient#cancelTask + */ + @POST + @Path("/action/cancel") + ListenableFuture cancelTask(@EndpointParam URI taskId); + + /** + * @see VCloudExpressClient#findVAppInOrgVDCNamed + */ + @GET + @Consumes(VAPP_XML) + @XMLResponseParser(VAppHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findVAppInOrgVDCNamed( + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); + + /** + * @see VCloudExpressClient#getVApp + */ + @GET + @Consumes(VAPP_XML) + @XMLResponseParser(VAppHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getVApp(@EndpointParam URI vApp); + + /** + * @see VCloudExpressClient#instantiateVAppTemplateInVDC + */ + @POST + @Path("action/instantiateVAppTemplate") + @Produces("application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml") + @Consumes(VAPP_XML) + @XMLResponseParser(VAppHandler.class) + @MapBinder(BindInstantiateVAppTemplateParamsToXmlPayload.class) + ListenableFuture instantiateVAppTemplateInVDC(@EndpointParam URI vdc, + @MapPayloadParam("template") URI template, + @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, + InstantiateVAppTemplateOptions... options); + + /** + * @see VCloudExpressClient#cloneVAppInVDC + */ + @POST + @Path("/action/cloneVApp") + @Produces("application/vnd.vmware.vcloud.cloneVAppParams+xml") + @Consumes(TASK_XML) + @XMLResponseParser(TaskHandler.class) + @MapBinder(BindCloneVAppParamsToXmlPayload.class) + ListenableFuture cloneVAppInVDC(@EndpointParam URI vdc, @MapPayloadParam("vApp") URI toClone, + @MapPayloadParam("newName") @ParamValidators(DnsNameValidator.class) String newName, + CloneVAppOptions... options); + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java new file mode 100644 index 0000000000..ad99254809 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java @@ -0,0 +1,213 @@ +/** + * + * Copyright (C) 2010 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; + +import java.net.URI; +import java.util.NoSuchElementException; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nullable; + +import org.jclouds.concurrent.Timeout; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.Network; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.TasksList; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.options.CloneVAppOptions; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; + +/** + * Provides access to VCloud resources via their REST API. + *

+ * + * @see + * @author Adrian Cole + */ +@Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) +public interface VCloudExpressClient { + + /** + * Please use {@link #findOrganizationNamed(String)} passing null + */ + @Deprecated + Organization getDefaultOrganization(); + + Organization getOrganization(URI orgId); + + /** + * This call returns a list of all vCloud Data Centers (vdcs), catalogs, and + * task lists within the organization. + * + * @param name + * organization name, or null for the default + * @throws NoSuchElementException + * if you specified an org name that isn't present + */ + Organization findOrganizationNamed(@Nullable String name); + + /** + * Please use #findCatalogInOrgNamed(null, null) + */ + @Deprecated + Catalog getDefaultCatalog(); + + Catalog getCatalog(URI catalogId); + + /** + * returns the catalog in the organization associated with the specified + * name. Note that both parameters can be null to choose default. + * + * @param orgName + * organization name, or null for the default + * @param catalogName + * catalog name, or null for the default + * @throws NoSuchElementException + * if you specified an org or catalog name that isn't present + */ + Catalog findCatalogInOrgNamed(@Nullable String orgName, @Nullable String catalogName); + + CatalogItem getCatalogItem(URI catalogItem); + + /** + * returns the catalog item in the catalog associated with the specified + * name. Note that the org and catalog parameters can be null to choose + * default. + * + * @param orgName + * organization name, or null for the default + * @param catalogName + * catalog name, or null for the default + * @param itemName + * item you wish to lookup + * + * @throws NoSuchElementException + * if you specified an org, catalog, or catalog item name that + * isn't present + */ + CatalogItem findCatalogItemInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, String itemName); + + VAppTemplate getVAppTemplate(URI vAppTemplate); + + /** + * returns the vapp template corresponding to a catalog item in the catalog + * associated with the specified name. Note that the org and catalog + * parameters can be null to choose default. + * + * @param orgName + * organization name, or null for the default + * @param catalogName + * catalog name, or null for the default + * @param itemName + * item you wish to lookup + * + * @throws NoSuchElementException + * if you specified an org, catalog, or catalog item name that + * isn't present + */ + VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, + String itemName); + + Network findNetworkInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String networkName); + + Network getNetwork(URI network); + + VDC getVDC(URI vdc); + + /** + * returns the VDC in the organization associated with the specified name. + * Note that both parameters can be null to choose default. + * + * @param orgName + * organization name, or null for the default + * @param vdcName + * catalog name, or null for the default + * @throws NoSuchElementException + * if you specified an org or vdc name that isn't present + */ + VDC findVDCInOrgNamed(String orgName, String vdcName); + + /** + * Please use #findVDCInOrgNamed + */ + @Deprecated + VDC getDefaultVDC(); + + TasksList getTasksList(URI tasksListId); + + TasksList findTasksListInOrgNamed(String orgName, String tasksListName); + + /** + * Please use #getTasksListInOrg(null, null) + */ + @Deprecated + TasksList getDefaultTasksList(); + + Task deployVApp(URI vAppId); + + void deleteVApp(URI vAppId); + + Task undeployVApp(URI vAppId); + + /** + * This call powers on the vApp, as specified in the vApp's ovf:Startup + * element. + */ + Task powerOnVApp(URI vAppId); + + /** + * This call powers off the vApp, as specified in the vApp's ovf:Startup + * element. + */ + Task powerOffVApp(URI vAppId); + + /** + * This call shuts down the vApp. + */ + void shutdownVApp(URI vAppId); + + /** + * This call resets the vApp. + */ + Task resetVApp(URI vAppId); + + /** + * This call suspends the vApp. + */ + Task suspendVApp(URI vAppId); + + Task getTask(URI taskId); + + void cancelTask(URI taskId); + + VApp findVAppInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String vAppName); + + VApp getVApp(URI vApp); + + VApp instantiateVAppTemplateInVDC(URI vDC, URI template, String appName, InstantiateVAppTemplateOptions... options); + + Task cloneVAppInVDC(URI vDC, URI toClone, String newName, CloneVAppOptions... options); + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressContextBuilder.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressContextBuilder.java new file mode 100644 index 0000000000..ec99f5db0d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressContextBuilder.java @@ -0,0 +1,74 @@ +/** + * + * Copyright (C) 2010 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; + +import java.util.List; +import java.util.Properties; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.ComputeServiceContextBuilder; +import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; +import org.jclouds.logging.jdk.config.JDKLoggingModule; +import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; +import org.jclouds.vcloud.config.VCloudExpressRestClientModule; + +import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.Module; +import com.google.inject.TypeLiteral; + +/** + * Creates {@link VCloudComputeServiceContext} or {@link Injector} instances based on the most + * commonly requested arguments. + *

+ * Note that Threadsafe objects will be bound as singletons to the Injector or Context provided. + *

+ *

+ * If no Modules are specified, the default {@link JDKLoggingModule logging} and + * {@link JavaUrlHttpCommandExecutorServiceModule http transports} will be installed. + * + * @author Adrian Cole + * @see VCloudComputeServiceContext + */ +public class VCloudExpressContextBuilder extends ComputeServiceContextBuilder { + + public VCloudExpressContextBuilder(Properties props) { + super(VCloudExpressClient.class, VCloudExpressAsyncClient.class, props); + } + + @Override + protected void addContextModule(List modules) { + modules.add(new VCloudExpressComputeServiceContextModule()); + } + + @Override + protected void addClientModule(List modules) { + modules.add(new VCloudExpressRestClientModule()); + } + + @Override + public ComputeServiceContext buildComputeServiceContext() { + // need the generic type information + return (ComputeServiceContext) this.buildInjector().getInstance( + Key.get(new TypeLiteral>() { + })); + } +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressMediaType.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressMediaType.java new file mode 100644 index 0000000000..115de8d915 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressMediaType.java @@ -0,0 +1,42 @@ +/** + * + * Copyright (C) 2010 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; + +import javax.ws.rs.core.MediaType; + +/** + * Resource Types used in VCloud express + * + * @see MediaType + */ +public interface VCloudExpressMediaType extends VCloudMediaType { + + /** + * "application/vnd.vmware.vcloud.organizationList+xml" + */ + public final static String ORGLIST_XML = "application/vnd.vmware.vcloud.organizationList+xml"; + + /** + * "application/vnd.vmware.vcloud.organizationList+xml" + */ + public final static MediaType ORGLIST_XML_TYPE = new MediaType("application", + "vnd.vmware.vcloud.organizationList+xml"); + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java new file mode 100644 index 0000000000..d964e99bb8 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java @@ -0,0 +1,90 @@ +/** + * + * Copyright (C) 2010 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; + +import static org.jclouds.Constants.PROPERTY_API_VERSION; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_FENCEMODE; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_VERSION_SCHEMA; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_SCHEMA; + +import java.util.Properties; + +import org.jclouds.PropertiesBuilder; +import org.jclouds.vcloud.domain.FenceMode; + +/** + * Builds properties used in VCloud Clients + * + * @author Adrian Cole + */ +public class VCloudExpressPropertiesBuilder extends PropertiesBuilder { + @Override + protected Properties defaultProperties() { + Properties properties = super.defaultProperties(); + properties.setProperty(PROPERTY_API_VERSION, "0.8"); + properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "0.8"); + properties.setProperty(PROPERTY_SESSION_INTERVAL, 8 * 60 + ""); + properties.setProperty(PROPERTY_VCLOUD_XML_SCHEMA, + "http://vcloud.safesecureweb.com/ns/vcloud.xsd"); + properties.setProperty("jclouds.dns_name_length_min", "1"); + properties.setProperty("jclouds.dns_name_length_max", "80"); + properties.setProperty(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED, 180l * 1000l + ""); + return properties; + } + + public VCloudExpressPropertiesBuilder(Properties properties) { + super(properties); + } + + protected void setNs() { + if (properties.getProperty(PROPERTY_VCLOUD_XML_NAMESPACE) == null) + properties.setProperty(PROPERTY_VCLOUD_XML_NAMESPACE, "http://www.vmware.com/vcloud/v" + + properties.getProperty(PROPERTY_VCLOUD_VERSION_SCHEMA)); + } + + protected void setFenceMode() { + if (properties.getProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) == null) { + if (properties.getProperty(PROPERTY_VCLOUD_VERSION_SCHEMA).startsWith("0.8")) + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, "allowInOut"); + else + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, FenceMode.BRIDGED); + } + } + + public VCloudExpressPropertiesBuilder withApiVersion(String version) { + properties.setProperty(PROPERTY_API_VERSION, "0.8"); + return this; + } + + public VCloudExpressPropertiesBuilder withSchemaVersion(String version) { + properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "0.8"); + return this; + } + + @Override + public Properties build() { + setNs(); + setFenceMode(); + return super.build(); + } +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudMediaType.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudMediaType.java index 6747db515c..1d7f54be2a 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudMediaType.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudMediaType.java @@ -22,31 +22,29 @@ package org.jclouds.vcloud; import javax.ws.rs.core.MediaType; /** - * Resource Types used in VCloud express + * Resource Types used in VCloud * * @see MediaType */ public interface VCloudMediaType { /** - * "application/vnd.vmware.vcloud.organizationList+xml" + * "application/vnd.vmware.vcloud.vcloud+xml" */ public final static String VCLOUD_XML = "application/vnd.vmware.vcloud.vcloud+xml"; /** - * "application/vnd.vmware.vcloud.organizationList+xml" + * "application/vnd.vmware.vcloud.vcloud+xml" */ - public final static MediaType VCLOUD_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.vcloud+xml"); + public final static MediaType VCLOUD_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.vcloud+xml"); /** - * "application/vnd.vmware.vcloud.organizationList+xml" + * "application/vnd.vmware.vcloud.orgList+xml" */ - public final static String ORGLIST_XML = "application/vnd.vmware.vcloud.organizationList+xml"; + public final static String ORGLIST_XML = "application/vnd.vmware.vcloud.orgList+xml"; /** - * "application/vnd.vmware.vcloud.organizationList+xml" + * "application/vnd.vmware.vcloud.orgList+xml" */ - public final static MediaType ORGLIST_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.organizationList+xml"); + public final static MediaType ORGLIST_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.orgList+xml"); /** * "application/vnd.vmware.vcloud.org+xml" */ @@ -54,8 +52,7 @@ public interface VCloudMediaType { /** * "application/vnd.vmware.vcloud.org+xml" */ - public final static MediaType ORG_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.org+xml"); + public final static MediaType ORG_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.org+xml"); /** * "application/vnd.vmware.vcloud.vdc+xml" @@ -64,8 +61,7 @@ public interface VCloudMediaType { /** * "application/vnd.vmware.vcloud.vdc+xml" */ - public final static MediaType VDC_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.vdc+xml"); + public final static MediaType VDC_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.vdc+xml"); /** * "application/vnd.vmware.vcloud.catalog+xml" @@ -74,8 +70,7 @@ public interface VCloudMediaType { /** * "application/vnd.vmware.vcloud.catalog+xml" */ - public final static MediaType CATALOG_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.catalog+xml"); + public final static MediaType CATALOG_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.catalog+xml"); /** * "application/vnd.vmware.vcloud.tasksList+xml" @@ -84,8 +79,7 @@ public interface VCloudMediaType { /** * "application/vnd.vmware.vcloud.tasksList+xml" */ - public final static MediaType TASKSLIST_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.tasksList+xml"); + public final static MediaType TASKSLIST_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.tasksList+xml"); /** * "application/vnd.vmware.vcloud.catalogItem+xml" @@ -104,8 +98,7 @@ public interface VCloudMediaType { /** * "application/vnd.vmware.vcloud.task+xml" */ - public final static MediaType TASK_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.task+xml"); + public final static MediaType TASK_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.task+xml"); /** * "application/vnd.vmware.vcloud.vApp+xml" @@ -114,8 +107,7 @@ public interface VCloudMediaType { /** * "application/vnd.vmware.vcloud.vApp+xml" */ - public final static MediaType VAPP_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.vApp+xml"); + public final static MediaType VAPP_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.vApp+xml"); /** * "application/vnd.vmware.vcloud.vAppTemplate+xml" @@ -134,7 +126,6 @@ public interface VCloudMediaType { /** * "application/vnd.vmware.vcloud.network+xml" */ - public final static MediaType NETWORK_XML_TYPE = new MediaType("application", - "vnd.vmware.vcloud.network+xml"); + public final static MediaType NETWORK_XML_TYPE = new MediaType("application", "vnd.vmware.vcloud.network+xml"); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java index 2831f23b07..a357ab9bc8 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java @@ -41,13 +41,14 @@ public class VCloudPropertiesBuilder extends PropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_API_VERSION, "0.8"); - properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "0.8"); + properties.setProperty(PROPERTY_API_VERSION, "1.0"); + properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "1.0"); properties.setProperty(PROPERTY_SESSION_INTERVAL, 8 * 60 + ""); properties.setProperty(PROPERTY_VCLOUD_XML_SCHEMA, "http://vcloud.safesecureweb.com/ns/vcloud.xsd"); properties.setProperty("jclouds.dns_name_length_min", "1"); properties.setProperty("jclouds.dns_name_length_max", "80"); + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, FenceMode.BRIDGED); properties.setProperty(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED, 180l * 1000l + ""); return properties; } @@ -62,29 +63,20 @@ public class VCloudPropertiesBuilder extends PropertiesBuilder { + properties.getProperty(PROPERTY_VCLOUD_VERSION_SCHEMA)); } - protected void setFenceMode() { - if (properties.getProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) == null) { - if (properties.getProperty(PROPERTY_VCLOUD_VERSION_SCHEMA).startsWith("0.8")) - properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, "allowInOut"); - else - properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, FenceMode.BRIDGED); - } - } public VCloudPropertiesBuilder withApiVersion(String version) { - properties.setProperty(PROPERTY_API_VERSION, "0.8"); + properties.setProperty(PROPERTY_API_VERSION, "1.0"); return this; } public VCloudPropertiesBuilder withSchemaVersion(String version) { - properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "0.8"); + properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "1.0"); return this; } @Override public Properties build() { setNs(); - setFenceMode(); return super.build(); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayload.java b/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayload.java index 22542ab9d3..fb5d8ecf09 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayload.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayload.java @@ -38,7 +38,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.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.options.CloneVAppOptions; import com.google.inject.Inject; @@ -95,7 +95,7 @@ public class BindCloneVAppParamsToXmlPayload implements MapBinder { XMLBuilder rootBuilder = buildRoot(newName, options.isDeploy(), options.isPowerOn()); if (options.getDescription() != null) rootBuilder.e("Description").text(options.getDescription()); - rootBuilder.e("VApp").a("href", vApp).a("type", VCloudMediaType.VAPP_XML); + rootBuilder.e("VApp").a("href", vApp).a("type", VCloudExpressMediaType.VAPP_XML); Properties outputProperties = new Properties(); outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes"); return rootBuilder.asString(outputProperties); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java index 61e5ad1c89..3970622875 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java @@ -63,7 +63,7 @@ public class BaseVCloudComputeClient implements VCloudComputeClient { @Inject public BaseVCloudComputeClient(VCloudClient client, Predicate successTester, - Map vAppStatusToNodeState) { + Map vAppStatusToNodeState) { this.client = client; this.taskTester = successTester; this.vAppStatusToNodeState = vAppStatusToNodeState; @@ -71,7 +71,7 @@ public class BaseVCloudComputeClient implements VCloudComputeClient { @Override public Map start(@Nullable URI VDC, URI templateId, String name, - InstantiateVAppTemplateOptions options, int... portsToOpen) { + InstantiateVAppTemplateOptions options, int... portsToOpen) { checkNotNull(options, "options"); logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); @@ -175,7 +175,7 @@ public class BaseVCloudComputeClient implements VCloudComputeClient { public TaskException(String type, VApp vApp, Task task) { super(String.format("failed to %s vApp %s status %s;task %s status %s", type, vApp.getName(), - vApp.getStatus(), task.getLocation(), task.getStatus()), vApp); + vApp.getStatus(), task.getLocation(), task.getStatus()), vApp); this.task = task; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java new file mode 100644 index 0000000000..38cbca0732 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java @@ -0,0 +1,216 @@ +/** + * + * Copyright (C) 2010 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.compute; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.net.URI; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Nullable; +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; + +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.google.inject.Inject; + +/** + * @author Adrian Cole + */ +@Singleton +public class BaseVCloudExpressComputeClient implements VCloudExpressComputeClient { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + protected Logger logger = Logger.NULL; + + protected final VCloudExpressClient client; + protected final Predicate taskTester; + protected final Map vAppStatusToNodeState; + + @Inject + public BaseVCloudExpressComputeClient(VCloudExpressClient client, Predicate successTester, + Map vAppStatusToNodeState) { + this.client = client; + this.taskTester = successTester; + this.vAppStatusToNodeState = vAppStatusToNodeState; + } + + @Override + public Map start(@Nullable URI VDC, URI templateId, String name, + InstantiateVAppTemplateOptions options, int... portsToOpen) { + checkNotNull(options, "options"); + logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); + + VDC vdc = client.getVDC(VDC); + VAppTemplate template = client.getVAppTemplate(templateId); + + VApp vAppResponse = client.instantiateVAppTemplateInVDC(vdc.getId(), template.getId(), name, options); + logger.debug("<< instantiated VApp(%s)", vAppResponse.getName()); + + logger.debug(">> deploying vApp(%s)", vAppResponse.getName()); + + Task task = client.deployVApp(vAppResponse.getId()); + if (options.shouldBlockOnDeploy()) { + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("deploy", vAppResponse, task); + } + logger.debug("<< deployed vApp(%s)", vAppResponse.getName()); + + logger.debug(">> powering vApp(%s)", vAppResponse.getName()); + task = client.powerOnVApp(vAppResponse.getId()); + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("powerOn", vAppResponse, task); + } + logger.debug("<< on vApp(%s)", vAppResponse.getName()); + } + return parseAndValidateResponse(template, vAppResponse); + } + + protected Map parseAndValidateResponse(VAppTemplate template, VApp vAppResponse) { + Map response = parseResponse(template, vAppResponse); + checkState(response.containsKey("id"), "bad configuration: [id] should be in response"); + checkState(response.containsKey("username"), "bad configuration: [username] should be in response"); + checkState(response.containsKey("password"), "bad configuration: [password] should be in response"); + return response; + } + + protected Map parseResponse(VAppTemplate template, VApp vAppResponse) { + Map config = Maps.newLinkedHashMap();// Allows nulls + config.put("id", vAppResponse.getId().toASCIIString()); + config.put("username", null); + config.put("password", null); + return config; + } + + @Override + public void reboot(URI id) { + VApp vApp = client.getVApp(id); + logger.debug(">> resetting vApp(%s)", vApp.getName()); + Task task = client.resetVApp(vApp.getId()); + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("resetVApp", vApp, task); + } + logger.debug("<< on vApp(%s)", vApp.getName()); + } + + @Override + public void stop(URI id) { + VApp vApp = client.getVApp(id); + vApp = powerOffVAppIfDeployed(vApp); + vApp = undeployVAppIfDeployed(vApp); + deleteVApp(vApp); + logger.debug("<< deleted vApp(%s)", vApp.getName()); + } + + private void deleteVApp(VApp vApp) { + logger.debug(">> deleting vApp(%s)", vApp.getName()); + client.deleteVApp(vApp.getId()); + } + + private VApp undeployVAppIfDeployed(VApp vApp) { + if (vApp.getStatus().compareTo(VAppStatus.RESOLVED) > 0) { + logger.debug(">> undeploying vApp(%s), current status: %s", vApp.getName(), vApp.getStatus()); + Task task = client.undeployVApp(vApp.getId()); + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("undeploy", vApp, task); + } + vApp = client.getVApp(vApp.getId()); + logger.debug("<< %s vApp(%s)", vApp.getStatus(), vApp.getName()); + } + return vApp; + } + + private VApp powerOffVAppIfDeployed(VApp vApp) { + if (vApp.getStatus().compareTo(VAppStatus.OFF) > 0) { + logger.debug(">> powering off vApp(%s), current status: %s", vApp.getName(), vApp.getStatus()); + Task task = client.powerOffVApp(vApp.getId()); + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("powerOff", vApp, task); + } + vApp = client.getVApp(vApp.getId()); + logger.debug("<< %s vApp(%s)", vApp.getStatus(), vApp.getName()); + } + return vApp; + } + + public static class TaskException extends VAppException { + + private final Task task; + /** The serialVersionUID */ + private static final long serialVersionUID = 251801929573211256L; + + public TaskException(String type, VApp vApp, Task task) { + super(String.format("failed to %s vApp %s status %s;task %s status %s", type, vApp.getName(), + vApp.getStatus(), task.getLocation(), task.getStatus()), vApp); + this.task = task; + } + + public Task getTask() { + return task; + } + + } + + public static class VAppException extends RuntimeException { + + private final VApp vApp; + /** The serialVersionUID */ + private static final long serialVersionUID = 251801929573211256L; + + public VAppException(String message, VApp vApp) { + super(message); + this.vApp = vApp; + } + + public VApp getvApp() { + return vApp; + } + + } + + @Override + public Set getPrivateAddresses(URI id) { + return ImmutableSet.of(); + } + + @Override + public Set getPublicAddresses(URI id) { + VApp vApp = client.getVApp(id); + return Sets.newHashSet(vApp.getNetworkToAddresses().values()); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java new file mode 100644 index 0000000000..516a8d7a81 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java @@ -0,0 +1,101 @@ +/** + * + * Copyright (C) 2010 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.compute; + +import java.net.URI; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; + +import com.google.inject.ImplementedBy; + +/** + * + * @author Adrian Cole + */ +@ImplementedBy(BaseVCloudExpressComputeClient.class) +public interface VCloudExpressComputeClient { + /** + * Runs through all commands necessary to startup a vApp, opening at least + * one ip address to the public network. These are the steps: + *

+ * instantiate -> deploy -> powerOn + *

+ * This command blocks until the vApp is in state {@code VAppStatus#ON} + * + * @param VDC + * id of the virtual datacenter {@code VCloudClient#getDefaultVDC} + * @param templateId + * id of the vAppTemplate you wish to instantiate + * @param name + * name of the vApp + * @param cores + * amount of virtual cpu cores + * @param megs + * amount of ram in megabytes + * @param options + * options for instantiating the vApp; null is ok + * @param portsToOpen + * opens the following ports on the public ip address + * @return map contains at least the following properties + *

    + *
  1. id - vApp id
  2. username - console login user
  3. + * password - console login password
  4. + *
+ */ + Map start(@Nullable URI VDC, URI templateId, String name, InstantiateVAppTemplateOptions options, + int... portsToOpen); + + /** + * returns a set of addresses that are only visible to the private network. + */ + Set getPrivateAddresses(URI vAppId); + + /** + * returns a set of addresses that are publically visible + */ + Set getPublicAddresses(URI vAppId); + + /** + * reboots the vApp, blocking until the following state transition is + * complete: + *

+ * current -> {@code VAppStatus#OFF} -> {@code VAppStatus#ON} + * + * @param vAppId + * vApp to reboot + */ + void reboot(URI vAppId); + + /** + * Destroys dependent resources, powers off and deletes the vApp, blocking + * until the following state transition is complete: + *

+ * current -> {@code VAppStatus#OFF} -> deleted + * + * @param vAppId + * vApp to stop + */ + void stop(URI vAppId); + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java new file mode 100644 index 0000000000..6410bfdc89 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java @@ -0,0 +1,92 @@ +/** + * + * Copyright (C) 2010 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.compute.config; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Singleton; + +import org.jclouds.compute.LoadBalancerService; +import org.jclouds.compute.config.BaseComputeServiceContextModule; +import org.jclouds.compute.config.ComputeServiceTimeoutsModule; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.Size; +import org.jclouds.domain.Location; +import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; +import org.jclouds.vcloud.compute.suppliers.StaticSizeSupplier; +import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; +import org.jclouds.vcloud.domain.VAppStatus; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.inject.Injector; +import com.google.inject.Provides; +import com.google.inject.util.Providers; + +/** + * Configures the {@link VCloudComputeServiceContext}; requires {@link BaseVCloudComputeClient} + * bound. + * + * @author Adrian Cole + */ +public class CommonVCloudComputeServiceContextModule extends BaseComputeServiceContextModule { + + @VisibleForTesting + static final Map vAppStatusToNodeState = ImmutableMap. builder().put( + VAppStatus.OFF, NodeState.SUSPENDED).put(VAppStatus.ON, NodeState.RUNNING).put(VAppStatus.RESOLVED, + NodeState.PENDING).put(VAppStatus.SUSPENDED, NodeState.SUSPENDED).put(VAppStatus.UNRESOLVED, + NodeState.PENDING).build(); + + @Singleton + @Provides + Map provideVAppStatusToNodeState() { + return vAppStatusToNodeState; + } + + @Override + protected void configure() { + install(new ComputeServiceTimeoutsModule()); + bindLoadBalancer(); + } + + protected void bindLoadBalancer() { + bind(LoadBalancerService.class).toProvider(Providers. of(null)); + } + + @Override + protected Supplier> getSourceImageSupplier(Injector injector) { + return injector.getInstance(VCloudImageSupplier.class); + } + + @Override + protected Supplier> getSourceLocationSupplier(Injector injector) { + return injector.getInstance(OrgAndVDCToLocationSupplier.class); + } + + @Override + protected Supplier> getSourceSizeSupplier(Injector injector) { + return injector.getInstance(StaticSizeSupplier.class); + } + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java old mode 100755 new mode 100644 index 8f800bcf91..623ff2cf1a --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java @@ -19,18 +19,7 @@ package org.jclouds.vcloud.compute.config; -import java.util.Map; -import java.util.Set; - -import javax.inject.Singleton; - import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.LoadBalancerService; -import org.jclouds.compute.config.BaseComputeServiceContextModule; -import org.jclouds.compute.config.ComputeServiceTimeoutsModule; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.Size; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.compute.strategy.DestroyNodeStrategy; @@ -39,10 +28,8 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; -import org.jclouds.domain.Location; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; -import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.compute.BaseVCloudComputeClient; import org.jclouds.vcloud.compute.strategy.VCloudAddNodeWithTagStrategy; @@ -50,19 +37,9 @@ import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; -import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; -import org.jclouds.vcloud.compute.suppliers.StaticSizeSupplier; -import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; -import org.jclouds.vcloud.domain.VAppStatus; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; -import com.google.inject.Injector; -import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; -import com.google.inject.util.Providers; /** * Configures the {@link VCloudComputeServiceContext}; requires {@link BaseVCloudComputeClient} @@ -70,55 +47,22 @@ import com.google.inject.util.Providers; * * @author Adrian Cole */ -public class VCloudComputeServiceContextModule extends BaseComputeServiceContextModule { - - @VisibleForTesting - static final Map vAppStatusToNodeState = ImmutableMap. builder().put( - VAppStatus.OFF, NodeState.SUSPENDED).put(VAppStatus.ON, NodeState.RUNNING).put(VAppStatus.RESOLVED, - NodeState.PENDING).put(VAppStatus.SUSPENDED, NodeState.SUSPENDED).put(VAppStatus.UNRESOLVED, - NodeState.PENDING).build(); - - @Singleton - @Provides - Map provideVAppStatusToNodeState() { - return vAppStatusToNodeState; - } +public class VCloudComputeServiceContextModule extends CommonVCloudComputeServiceContextModule { @Override protected void configure() { - install(new ComputeServiceTimeoutsModule()); - bind(AddNodeWithTagStrategy.class).to(VCloudAddNodeWithTagStrategy.class); + super.configure(); bind(new TypeLiteral() { - }).to(new TypeLiteral>() { + }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); - bind(new TypeLiteral>() { - }).to(new TypeLiteral>() { + bind(new TypeLiteral>() { + }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); + bind(AddNodeWithTagStrategy.class).to(VCloudAddNodeWithTagStrategy.class); + bind(DestroyNodeStrategy.class).to(VCloudDestroyNodeStrategy.class); bind(RunNodesAndAddToSetStrategy.class).to(EncodeTagIntoNameRunNodesAndAddToSetStrategy.class); bind(ListNodesStrategy.class).to(VCloudListNodesStrategy.class); bind(GetNodeMetadataStrategy.class).to(VCloudGetNodeMetadataStrategy.class); bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(VCloudDestroyNodeStrategy.class); - bindLoadBalancer(); } - - protected void bindLoadBalancer() { - bind(LoadBalancerService.class).toProvider(Providers. of(null)); - } - - @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(VCloudImageSupplier.class); - } - - @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(OrgAndVDCToLocationSupplier.class); - } - - @Override - protected Supplier> getSourceSizeSupplier(Injector injector) { - return injector.getInstance(StaticSizeSupplier.class); - } - } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java new file mode 100755 index 0000000000..688050440d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java @@ -0,0 +1,69 @@ +/** + * + * Copyright (C) 2010 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.compute.config; + +import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.internal.ComputeServiceContextImpl; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.compute.strategy.DestroyNodeStrategy; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.rest.RestContext; +import org.jclouds.rest.internal.RestContextImpl; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; +import org.jclouds.vcloud.compute.strategy.VCloudExpressAddNodeWithTagStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; + +import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; + +/** + * Configures the {@link VCloudComputeServiceContext}; requires + * {@link BaseVCloudExpressComputeClient} bound. + * + * @author Adrian Cole + */ +public class VCloudExpressComputeServiceContextModule extends CommonVCloudComputeServiceContextModule { + + @Override + protected void configure() { + super.configure(); + bind(new TypeLiteral() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(new TypeLiteral>() { + }).to(new TypeLiteral>() { + }).in(Scopes.SINGLETON); + bind(AddNodeWithTagStrategy.class).to(VCloudExpressAddNodeWithTagStrategy.class); + bind(DestroyNodeStrategy.class).to(VCloudExpressDestroyNodeStrategy.class); + bind(RunNodesAndAddToSetStrategy.class).to(EncodeTagIntoNameRunNodesAndAddToSetStrategy.class); + bind(ListNodesStrategy.class).to(VCloudExpressListNodesStrategy.class); + bind(GetNodeMetadataStrategy.class).to(VCloudExpressGetNodeMetadataStrategy.class); + bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); + } + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java index 3661c0ae9d..21648b4832 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java @@ -31,7 +31,7 @@ import javax.annotation.Resource; import javax.inject.Singleton; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; import org.jclouds.vcloud.domain.VApp; @@ -40,7 +40,7 @@ import com.google.common.base.Function; /** * Configures the {@link VCloudComputeServiceContext}; requires - * {@link BaseVCloudComputeClient} bound. + * {@link BaseVCloudExpressComputeClient} bound. * * @author Adrian Cole */ diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java index fa865f7d6c..6724eb69d2 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java @@ -28,7 +28,6 @@ import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.functions.AllCatalogItemsInOrganization; -import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; import com.google.common.base.Function; import com.google.common.collect.Iterables; @@ -40,13 +39,13 @@ import com.google.common.collect.Iterables; public class ImagesInOrganization implements Function> { private final AllCatalogItemsInOrganization allCatalogItemsInOrganization; - private final VAppTemplatesForCatalogItems vAppTemplatesForCatalogItems; + private final Function, Iterable> vAppTemplatesForCatalogItems; private final Provider imageForVAppTemplateProvider; @Inject ImagesInOrganization(AllCatalogItemsInOrganization allCatalogItemsInOrganization, Provider imageForVAppTemplateProvider, - VAppTemplatesForCatalogItems vAppTemplatesForCatalogItems) { + Function, Iterable> vAppTemplatesForCatalogItems) { this.imageForVAppTemplateProvider = imageForVAppTemplateProvider; this.allCatalogItemsInOrganization = allCatalogItemsInOrganization; this.vAppTemplatesForCatalogItems = vAppTemplatesForCatalogItems; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java new file mode 100644 index 0000000000..b62872f063 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java @@ -0,0 +1,89 @@ +/** + * + * Copyright (C) 2010 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.compute.strategy; + +import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.processorCount; + +import java.net.URI; +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.OperatingSystem; +import org.jclouds.compute.domain.Template; +import org.jclouds.compute.domain.internal.NodeMetadataImpl; +import org.jclouds.compute.domain.os.CIMOperatingSystem; +import org.jclouds.compute.strategy.AddNodeWithTagStrategy; +import org.jclouds.domain.Credentials; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; + +import com.google.common.collect.ImmutableMap; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressAddNodeWithTagStrategy implements AddNodeWithTagStrategy { + protected final VCloudExpressClient client; + protected final VCloudExpressComputeClient computeClient; + protected final Map vAppStatusToNodeState; + + @Inject + protected VCloudExpressAddNodeWithTagStrategy(VCloudExpressClient client, VCloudExpressComputeClient computeClient, + Map vAppStatusToNodeState) { + this.client = client; + this.computeClient = computeClient; + this.vAppStatusToNodeState = vAppStatusToNodeState; + } + + @Override + public NodeMetadata execute(String tag, String name, Template template) { + InstantiateVAppTemplateOptions options = processorCount(Double.valueOf(template.getSize().getCores()).intValue()) + .memory(template.getSize().getRam()).disk(template.getSize().getDisk() * 1024 * 1024l); + if (!template.getOptions().shouldBlockUntilRunning()) + options.blockOnDeploy(false); + Map metaMap = computeClient.start(URI.create(template.getLocation().getId()), URI.create(template + .getImage().getId()), name, options, template.getOptions().getInboundPorts()); + VApp vApp = client.getVApp(URI.create(metaMap.get("id"))); + return newCreateNodeResponse(tag, template, metaMap, vApp); + } + + protected NodeMetadata newCreateNodeResponse(String tag, Template template, Map metaMap, VApp vApp) { + return new NodeMetadataImpl(vApp.getId().toASCIIString(), vApp.getName(), vApp.getId().toASCIIString(), template + .getLocation(), vApp.getId(), ImmutableMap. of(), tag, template.getImage().getId(), + getOperatingSystemForVAppOrDefaultTo(vApp, template.getImage().getOperatingSystem()), + vAppStatusToNodeState.get(vApp.getStatus()), computeClient.getPublicAddresses(vApp.getId()), + computeClient.getPrivateAddresses(vApp.getId()), ImmutableMap. of(), new Credentials( + metaMap.get("username"), metaMap.get("password"))); + } + + private OperatingSystem getOperatingSystemForVAppOrDefaultTo(VApp vApp, OperatingSystem operatingSystem) { + return vApp.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType.fromValue(vApp.getOsType()), + null, null, vApp.getOperatingSystemDescription()) : operatingSystem; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java new file mode 100644 index 0000000000..43ebb452a8 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java @@ -0,0 +1,55 @@ +/** + * + * Copyright (C) 2010 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.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.strategy.DestroyNodeStrategy; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressDestroyNodeStrategy implements DestroyNodeStrategy { + protected final VCloudExpressComputeClient computeClient; + protected final GetNodeMetadataStrategy getNode; + + @Inject + protected VCloudExpressDestroyNodeStrategy(VCloudExpressComputeClient computeClient, GetNodeMetadataStrategy getNode) { + this.computeClient = computeClient; + this.getNode = getNode; + + } + + @Override + public NodeMetadata execute(String id) { + computeClient.stop(URI.create(checkNotNull(id, "node.id"))); + return getNode.execute(id); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudGetNodeMetadata.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java similarity index 84% rename from vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudGetNodeMetadata.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java index 131698ec59..cae361c8a8 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/VCloudGetNodeMetadata.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.vcloud.compute.functions; +package org.jclouds.vcloud.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; @@ -37,11 +37,13 @@ import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.internal.NodeMetadataImpl; import org.jclouds.compute.domain.os.CIMOperatingSystem; import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; -import org.jclouds.vcloud.compute.VCloudComputeClient; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.compute.functions.FindLocationForResource; +import org.jclouds.vcloud.compute.functions.GetExtra; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; @@ -49,26 +51,23 @@ import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; /** - * Configures the {@link VCloudComputeServiceContext}; requires {@link BaseVCloudComputeClient} - * bound. - * * @author Adrian Cole */ @Singleton -public class VCloudGetNodeMetadata { +public class VCloudExpressGetNodeMetadataStrategy implements GetNodeMetadataStrategy { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; - protected final VCloudClient client; - protected final VCloudComputeClient computeClient; + protected final VCloudExpressClient client; + protected final VCloudExpressComputeClient computeClient; protected final Supplier> images; protected final FindLocationForResource findLocationForResourceInVDC; protected final GetExtra getExtra; protected final Map vAppStatusToNodeState; @Inject - VCloudGetNodeMetadata(VCloudClient client, VCloudComputeClient computeClient, + protected VCloudExpressGetNodeMetadataStrategy(VCloudExpressClient client, VCloudExpressComputeClient computeClient, Map vAppStatusToNodeState, GetExtra getExtra, FindLocationForResource findLocationForResourceInVDC, Supplier> images) { this.client = checkNotNull(client, "client"); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java new file mode 100644 index 0000000000..12bb9ae52d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java @@ -0,0 +1,141 @@ +/** + * + * Copyright (C) 2010 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.compute.strategy; + +import static org.jclouds.compute.reference.ComputeServiceConstants.COMPUTE_LOGGER; +import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_BLACKLIST_NODES; + +import java.util.Map; +import java.util.Set; + +import javax.annotation.Resource; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.ComputeType; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.internal.ComputeMetadataImpl; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.domain.Location; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.VCloudExpressMediaType; +import org.jclouds.vcloud.compute.functions.FindLocationForResource; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.endpoints.Org; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Predicate; +import com.google.common.base.Splitter; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Sets; +import com.google.inject.Inject; +import com.google.inject.internal.util.ImmutableSet; + +/** + * @author Adrian Cole + */ +// TODO REFACTOR!!! needs to be parallel +@Singleton +public class VCloudExpressListNodesStrategy implements ListNodesStrategy { + @Resource + @Named(COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + protected final VCloudExpressGetNodeMetadataStrategy getNodeMetadata; + protected final VCloudExpressClient client; + protected final FindLocationForResource findLocationForResourceInVDC; + Set blackListVAppNames = ImmutableSet. of(); + + @Inject(optional = true) + void setBlackList(@Named(PROPERTY_BLACKLIST_NODES) String blackListNodes) { + if (blackListNodes != null && !"".equals(blackListNodes)) + this.blackListVAppNames = ImmutableSet.copyOf(Splitter.on(',').split(blackListNodes)); + } + + private final Supplier> orgNameToEndpoint; + + @Inject + protected VCloudExpressListNodesStrategy(VCloudExpressClient client, + @Org Supplier> orgNameToEndpoint, + VCloudExpressGetNodeMetadataStrategy getNodeMetadata, FindLocationForResource findLocationForResourceInVDC) { + this.client = client; + this.orgNameToEndpoint = orgNameToEndpoint; + this.getNodeMetadata = getNodeMetadata; + this.findLocationForResourceInVDC = findLocationForResourceInVDC; + } + + @Override + public Iterable list() { + Set nodes = Sets.newHashSet(); + for (String org : orgNameToEndpoint.get().keySet()) { + for (NamedResource vdc : client.findOrganizationNamed(org).getVDCs().values()) { + for (NamedResource resource : client.getVDC(vdc.getId()).getResourceEntities().values()) { + if (validVApp(resource)) { + nodes.add(convertVAppToComputeMetadata(vdc, resource)); + } + } + } + } + return nodes; + } + + private boolean validVApp(NamedResource resource) { + return resource.getType().equals(VCloudExpressMediaType.VAPP_XML) + && !blackListVAppNames.contains(resource.getName()); + } + + private ComputeMetadata convertVAppToComputeMetadata(NamedResource vdc, NamedResource resource) { + Location location = findLocationForResourceInVDC.apply(vdc); + return new ComputeMetadataImpl(ComputeType.NODE, resource.getId().toASCIIString(), resource.getName(), resource + .getId().toASCIIString(), location, null, ImmutableMap. of()); + } + + @Override + public Iterable listDetailsOnNodesMatching(Predicate filter) { + Set nodes = Sets.newHashSet(); + for (String org : orgNameToEndpoint.get().keySet()) { + for (NamedResource vdc : client.findOrganizationNamed(org).getVDCs().values()) { + for (NamedResource resource : client.getVDC(vdc.getId()).getResourceEntities().values()) { + if (validVApp(resource) && filter.apply(convertVAppToComputeMetadata(vdc, resource))) { + addVAppToSetRetryingIfNotYetPresent(nodes, vdc, resource); + } + } + } + } + return nodes; + } + + @VisibleForTesting + void addVAppToSetRetryingIfNotYetPresent(Set nodes, NamedResource vdc, NamedResource resource) { + NodeMetadata node = null; + int i = 0; + while (node == null && i++ < 3) { + try { + node = getNodeMetadata.execute(resource.getId().toASCIIString()); + nodes.add(node); + } catch (NullPointerException e) { + logger.warn("vApp %s not yet present in vdc %s", resource.getName(), vdc.getName()); + } + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java new file mode 100644 index 0000000000..ee09736728 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java @@ -0,0 +1,60 @@ +/** + * + * Copyright (C) 2010 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.compute.strategy; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.domain.Task; + +import com.google.common.base.Predicate; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressRebootNodeStrategy implements RebootNodeStrategy { + private final VCloudExpressClient client; + protected final Predicate taskTester; + protected final GetNodeMetadataStrategy getNode; + + @Inject + protected VCloudExpressRebootNodeStrategy(VCloudExpressClient client, Predicate taskTester, GetNodeMetadataStrategy getNode) { + this.client = client; + this.taskTester = taskTester; + this.getNode = getNode; + } + + @Override + public NodeMetadata execute(String in) { + URI id = URI.create(checkNotNull(in, "node.id")); + Task task = client.resetVApp(id); + taskTester.apply(task.getLocation()); + return getNode.execute(in); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java index 8bfa0b70eb..18b5ee6271 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java @@ -20,30 +20,75 @@ package org.jclouds.vcloud.compute.strategy; import static com.google.common.base.Preconditions.checkNotNull; +import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; +import java.net.URI; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Resource; import javax.inject.Inject; +import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; +import org.jclouds.compute.domain.internal.NodeMetadataImpl; +import org.jclouds.compute.domain.os.CIMOperatingSystem; +import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.functions.VCloudGetNodeMetadata; +import org.jclouds.domain.Location; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.compute.VCloudComputeClient; +import org.jclouds.vcloud.compute.functions.FindLocationForResource; +import org.jclouds.vcloud.compute.functions.GetExtra; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppStatus; + +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableMap; /** * @author Adrian Cole */ @Singleton public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy { - - protected final VCloudGetNodeMetadata getNodeMetadata; + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + protected final VCloudClient client; + protected final VCloudComputeClient computeClient; + protected final Supplier> images; + protected final FindLocationForResource findLocationForResourceInVDC; + protected final GetExtra getExtra; + protected final Map vAppStatusToNodeState; @Inject - protected VCloudGetNodeMetadataStrategy(VCloudGetNodeMetadata getNodeMetadata) { - this.getNodeMetadata = getNodeMetadata; + VCloudGetNodeMetadataStrategy(VCloudClient client, VCloudComputeClient computeClient, + Map vAppStatusToNodeState, GetExtra getExtra, + FindLocationForResource findLocationForResourceInVDC, Supplier> images) { + this.client = checkNotNull(client, "client"); + this.images = checkNotNull(images, "images"); + this.getExtra = checkNotNull(getExtra, "getExtra"); + this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); + this.computeClient = checkNotNull(computeClient, "computeClient"); + this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState"); } - @Override - public NodeMetadata execute(String id) { - return getNodeMetadata.execute(checkNotNull(id, "node.id")); + public NodeMetadata execute(String in) { + URI id = URI.create(in); + VApp from = client.getVApp(id); + if (from == null) + return null; + String tag = parseTagFromName(from.getName()); + Location location = findLocationForResourceInVDC.apply(from.getVDC()); + return new NodeMetadataImpl(in, from.getName(), in, location, from.getId(), ImmutableMap. of(), + tag, null, from.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType.fromValue(from + .getOsType()), null, null, from.getOperatingSystemDescription()) : null, vAppStatusToNodeState + .get(from.getStatus()), computeClient.getPublicAddresses(id), computeClient + .getPrivateAddresses(id), getExtra.apply(from), null); } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java index 661d965f2e..00abf0da97 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java @@ -39,7 +39,6 @@ import org.jclouds.logging.Logger; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.compute.functions.FindLocationForResource; -import org.jclouds.vcloud.compute.functions.VCloudGetNodeMetadata; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.endpoints.Org; @@ -55,13 +54,13 @@ import com.google.inject.internal.util.ImmutableSet; /** * @author Adrian Cole */ -//TODO REFACTOR!!! needs to be parallel +// TODO REFACTOR!!! needs to be parallel @Singleton public class VCloudListNodesStrategy implements ListNodesStrategy { @Resource @Named(COMPUTE_LOGGER) public Logger logger = Logger.NULL; - protected final VCloudGetNodeMetadata getNodeMetadata; + protected final VCloudGetNodeMetadataStrategy getNodeMetadata; protected final VCloudClient client; protected final FindLocationForResource findLocationForResourceInVDC; Set blackListVAppNames = ImmutableSet. of(); @@ -76,7 +75,7 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { @Inject protected VCloudListNodesStrategy(VCloudClient client, @Org Supplier> orgNameToEndpoint, - VCloudGetNodeMetadata getNodeMetadata, FindLocationForResource findLocationForResourceInVDC) { + VCloudGetNodeMetadataStrategy getNodeMetadata, FindLocationForResource findLocationForResourceInVDC) { this.client = client; this.orgNameToEndpoint = orgNameToEndpoint; this.getNodeMetadata = getNodeMetadata; @@ -104,8 +103,8 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { private ComputeMetadata convertVAppToComputeMetadata(NamedResource vdc, NamedResource resource) { Location location = findLocationForResourceInVDC.apply(vdc); - return new ComputeMetadataImpl(ComputeType.NODE, resource.getId().toASCIIString(), resource.getName(), - resource.getId().toASCIIString(), location, null, ImmutableMap. of()); + return new ComputeMetadataImpl(ComputeType.NODE, resource.getId().toASCIIString(), resource.getName(), resource + .getId().toASCIIString(), location, null, ImmutableMap. of()); } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java new file mode 100644 index 0000000000..772f41f35f --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java @@ -0,0 +1,126 @@ +/** + * + * Copyright (C) 2010 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.checkState; +import static com.google.common.collect.Iterables.get; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; + +import java.net.URI; +import java.util.Map; + +import javax.inject.Named; + +import org.jclouds.domain.Location; +import org.jclouds.http.RequiresHttp; +import org.jclouds.predicates.RetryablePredicate; +import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.functions.VCloudExpressAllCatalogItemsInCatalog; +import org.jclouds.vcloud.functions.VCloudExpressAllCatalogsInOrganization; +import org.jclouds.vcloud.functions.VCloudExpressAllVDCsInOrganization; +import org.jclouds.vcloud.functions.VCloudExpressOrganizationsForNames; +import org.jclouds.vcloud.functions.VCloudExpressOrganizatonsForLocations; +import org.jclouds.vcloud.functions.VCloudExpressVAppTemplatesForCatalogItems; +import org.jclouds.vcloud.predicates.VCloudExpressTaskSuccess; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.inject.Injector; +import com.google.inject.TypeLiteral; + +/** + * Configures the VCloud authentication service connection, including logging and http transport. + * + * @author Adrian Cole + */ +@RequiresHttp +@ConfiguresRestClient +public abstract class BaseVCloudExpressRestClientModule + extends CommonVCloudRestClientModule { + + public BaseVCloudExpressRestClientModule(Class syncClientType, Class asyncClientType) { + super(syncClientType, asyncClientType); + } + + @Override + protected void configure() { + super.configure(); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + } + + @Override + protected Organization provideOrganization(VCloudExpressClient discovery) { + if (authException.get() != null) + throw authException.get(); + try { + return discovery.findOrganizationNamed(null); + } catch (AuthorizationException e) { + authException.set(e); + throw e; + } + } + + @Override + protected URI provideDefaultNetwork(VCloudExpressClient client) { + if (authException.get() != null) + throw authException.get(); + try { + org.jclouds.vcloud.domain.VDC vDC = client.findVDCInOrgNamed(null, null); + Map networks = vDC.getAvailableNetworks(); + checkState(networks.size() > 0, "No networks present in vDC: " + vDC.getName()); + return get(networks.values(), 0).getId(); + } catch (AuthorizationException e) { + authException.set(e); + throw e; + } + } + + @Override + protected Predicate successTester(Injector injector, + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { + return new RetryablePredicate(injector.getInstance(VCloudExpressTaskSuccess.class), completed); + } +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java index c45ba9b192..eca147a9dd 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java @@ -19,84 +19,50 @@ 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.base.Throwables.propagate; -import static com.google.common.collect.Iterables.concat; 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.SortedMap; -import java.util.Map.Entry; -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; -import org.jclouds.http.HttpErrorHandler; +import org.jclouds.domain.Location; 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; import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.rest.config.RestClientModule; -import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.VCloudToken; +import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Catalog; -import org.jclouds.vcloud.endpoints.Network; -import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.endpoints.TasksList; -import org.jclouds.vcloud.endpoints.VDC; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog; import org.jclouds.vcloud.functions.AllCatalogsInOrganization; import org.jclouds.vcloud.functions.AllVDCsInOrganization; +import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; +import org.jclouds.vcloud.functions.OrganizatonsForLocations; import org.jclouds.vcloud.functions.OrganizationsForNames; -import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.predicates.TaskSuccess; import com.google.common.base.Function; import com.google.common.base.Predicate; -import com.google.common.base.Supplier; -import com.google.inject.Provides; +import com.google.inject.Injector; +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 - RestClientModule { + CommonVCloudRestClientModule { public BaseVCloudRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); @@ -104,378 +70,29 @@ public abstract class BaseVCloudRestClientModule>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); } - @Resource - protected Logger logger = Logger.NULL; - - @Provides - @Singleton - protected Predicate successTester(TaskSuccess success, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { - return new RetryablePredicate(success, completed); - } - - @VCloudToken - @Provides - String provideVCloudToken(Supplier cache) { - return checkNotNull(cache.get().getVCloudToken(), "No token present in session"); - } - - @Provides - @Org - @Singleton - protected URI provideOrg(@Org Iterable orgs) { - return getLast(orgs).getId(); - } - - @Provides - @Org - @Singleton - protected String provideOrgName(@Org Iterable orgs) { - return getLast(orgs).getName(); - } - - @Provides - @Org - @Singleton - protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final OrgNameToOrgSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); - } - - @Provides - @Singleton - protected Supplier> provideURIToVDC( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final URItoVDC supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); - } - - @Provides - @Singleton - @VDC - protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> orgToVDCSupplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; - } - }); - - } - - @Singleton - public static class URItoVDC implements Supplier> { - private final Supplier>> orgVDCMap; - - @Inject - URItoVDC(Supplier>> orgVDCMap) { - this.orgVDCMap = orgVDCMap; - } - - @Override - public Map get() { - return uniqueIndex( - concat(transform( - orgVDCMap.get().values(), - new Function, Iterable>() { - - @Override - public Iterable apply( - Map from) { - return from.values(); - } - - })), new Function() { - - @Override - public URI apply(org.jclouds.vcloud.domain.VDC from) { - return from.getId(); - } - - }); - } - - } - - @Provides - @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(); - - @Provides - @Singleton - protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier(authException, seconds, - new Supplier() { - - @Override - public VCloudSession get() { - try { - return login.login().get(10, TimeUnit.SECONDS); - } catch (Exception e) { - propagate(e); - assert false : e; - return null; - } - } - - }); - } - - @Provides - @Singleton - protected Supplier> provideOrgMapCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationMapSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - - }); - } - - private final static Function name = new Function() { - - @Override - public String apply(NamedResource from) { - return from.getName(); - } - - }; - - @Singleton - public static class OrganizationMapSupplier implements Supplier> { - protected final Supplier sessionSupplier; - private final OrganizationsForNames organizationsForNames; - - @Inject - protected OrganizationMapSupplier(Supplier sessionSupplier, - OrganizationsForNames organizationsForNames) { - this.sessionSupplier = sessionSupplier; - this.organizationsForNames = organizationsForNames; - } - - @Override - public Map get() { - return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); - } - } - - @Singleton - public static class OrganizationCatalogSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final AllCatalogsInOrganization allCatalogsInOrganization; - - @Inject - protected OrganizationCatalogSupplier(Supplier> orgSupplier, - AllCatalogsInOrganization allCatalogsInOrganization) { - this.orgSupplier = orgSupplier; - this.allCatalogsInOrganization = allCatalogsInOrganization; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allCatalogsInOrganization), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Provides - @Singleton - protected Supplier>> provideOrganizationCatalogItemMapSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Provides - @Singleton - protected Supplier>> provideOrganizationVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Singleton - public static class OrganizationVDCSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final AllVDCsInOrganization allVDCsInOrganization; - - @Inject - protected OrganizationVDCSupplier(Supplier> orgSupplier, - AllVDCsInOrganization allVDCsInOrganization) { - this.orgSupplier = orgSupplier; - this.allVDCsInOrganization = allVDCsInOrganization; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allVDCsInOrganization), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Singleton - public static class OrganizationCatalogItemSupplier implements - Supplier>>> { - protected final Supplier>> catalogSupplier; - private final AllCatalogItemsInCatalog allCatalogItemsInCatalog; - - @Inject - protected OrganizationCatalogItemSupplier( - Supplier>> catalogSupplier, - AllCatalogItemsInCatalog allCatalogItemsInCatalog) { - this.catalogSupplier = catalogSupplier; - this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; - } - - @Override - public Map>> get() { - return transformValues( - catalogSupplier.get(), - new Function, Map>>() { - - @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); - } - }); - - } - }); - } - } - - @Provides - @Singleton - protected Supplier>>> provideOrganizationCatalogItemSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogItemSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( - authException, seconds, - new Supplier>>>() { - @Override - public Map>> get() { - return supplier.get(); - } - }); - } - - @Provides - @Singleton - @org.jclouds.vcloud.endpoints.VCloudLogin - protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, TimeoutException { - SortedMap versions = versionService.getSupportedVersions().get(180, TimeUnit.SECONDS); - checkState(versions.size() > 0, "No versions present"); - checkState(versions.containsKey(version), "version " + version + " not present in: " + versions); - return versions.get(version); - } - - @Singleton - private static class OrgNameToOrgSupplier implements Supplier> { - private final Supplier sessionSupplier; - - @SuppressWarnings("unused") - @Inject - OrgNameToOrgSupplier(Supplier sessionSupplier) { - this.sessionSupplier = sessionSupplier; - } - - @Override - public Map get() { - return sessionSupplier.get().getOrgs(); - } - - } - - @Provides - @Singleton - protected VCloudLoginAsyncClient provideVCloudLogin(AsyncClientFactory factory) { - return factory.create(VCloudLoginAsyncClient.class); - } - - @Provides - @Singleton - protected VCloudVersionsAsyncClient provideVCloudVersions(AsyncClientFactory factory) { - return factory.create(VCloudVersionsAsyncClient.class); - } - - @Provides - @Singleton - protected Organization provideOrganization(VCloudClient discovery) throws ExecutionException, TimeoutException, - InterruptedException { + @Override + protected Organization provideOrganization(VCloudClient discovery) { if (authException.get() != null) throw authException.get(); try { @@ -486,35 +103,8 @@ public abstract class BaseVCloudRestClientModule 0, "No vdcs present in org: " + org.getName()); - return get(org.getVDCs().values(), 0).getId(); - } - - @Provides - @Catalog - @Singleton - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { - checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); - return get(org.getCatalogs().values(), 0).getId(); - } - - @Provides - @Catalog - @Singleton - protected String provideCatalogName( - Supplier>> catalogs) { - return getLast(getLast(catalogs.get().values()).keySet()); - } - - @Provides - @Network - @Singleton - protected URI provideDefaultNetwork(VCloudClient client) throws InterruptedException, ExecutionException, - TimeoutException { + @Override + protected URI provideDefaultNetwork(VCloudClient client) { if (authException.get() != null) throw authException.get(); try { @@ -526,27 +116,10 @@ public abstract class BaseVCloudRestClientModule 0, "No tasks lists present in org: " + org.getName()); - return get(org.getTasksLists().values(), 0).getId(); + protected Predicate successTester(Injector injector, + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { + return new RetryablePredicate(injector.getInstance(TaskSuccess.class), completed); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java new file mode 100644 index 0000000000..98c402b25e --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java @@ -0,0 +1,521 @@ +/** + * + * Copyright (C) 2010 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 com.google.common.base.Throwables.propagate; +import static com.google.common.collect.Iterables.concat; +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.SortedMap; +import java.util.Map.Entry; +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; + +import org.jclouds.http.HttpErrorHandler; +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.rest.AsyncClientFactory; +import org.jclouds.rest.AuthorizationException; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.config.RestClientModule; +import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; +import org.jclouds.vcloud.VCloudToken; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.endpoints.Catalog; +import org.jclouds.vcloud.endpoints.Network; +import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.endpoints.TasksList; +import org.jclouds.vcloud.endpoints.VDC; +import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse; +import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; +import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; +import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.base.Supplier; +import com.google.inject.Injector; +import com.google.inject.Provides; + +/** + * Configures the VCloud authentication service connection, including logging and http transport. + * + * @author Adrian Cole + */ +@RequiresHttp +@ConfiguresRestClient +public abstract class CommonVCloudRestClientModule extends RestClientModule { + + public CommonVCloudRestClientModule(Class syncClientType, Class asyncClientType) { + super(syncClientType, asyncClientType); + } + + @Override + protected void configure() { + requestInjection(this); + super.configure(); + } + + @Resource + protected Logger logger = Logger.NULL; + + @Provides + @Singleton + protected abstract Predicate successTester(Injector injector, + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed); + + @VCloudToken + @Provides + String provideVCloudToken(Supplier cache) { + return checkNotNull(cache.get().getVCloudToken(), "No token present in session"); + } + + @Provides + @Org + @Singleton + protected URI provideOrg(@Org Iterable orgs) { + return getLast(orgs).getId(); + } + + @Provides + @Org + @Singleton + protected String provideOrgName(@Org Iterable orgs) { + return getLast(orgs).getName(); + } + + @Provides + @Org + @Singleton + protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final OrgNameToOrgSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, + seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); + } + + @Provides + @Singleton + protected Supplier> provideURIToVDC( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final URItoVDC supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); + } + + @Provides + @Singleton + @VDC + protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final Supplier> orgToVDCSupplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; + } + }); + + } + + @Singleton + public static class URItoVDC implements Supplier> { + private final Supplier>> orgVDCMap; + + @Inject + URItoVDC(Supplier>> orgVDCMap) { + this.orgVDCMap = orgVDCMap; + } + + @Override + public Map get() { + return uniqueIndex( + concat(transform( + orgVDCMap.get().values(), + new Function, Iterable>() { + + @Override + public Iterable apply( + Map from) { + return from.values(); + } + + })), new Function() { + + @Override + public URI apply(org.jclouds.vcloud.domain.VDC from) { + return from.getId(); + } + + }); + } + + } + + @Provides + @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(); + + @Provides + @Singleton + protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final VCloudLoginAsyncClient login) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier(authException, seconds, + new Supplier() { + + @Override + public VCloudSession get() { + try { + return login.login().get(10, TimeUnit.SECONDS); + } catch (Exception e) { + propagate(e); + assert false : e; + return null; + } + } + + }); + } + + @Provides + @Singleton + protected Supplier> provideOrgMapCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationMapSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + + }); + } + + private final static Function name = new Function() { + + @Override + public String apply(NamedResource from) { + return from.getName(); + } + + }; + + @Singleton + public static class OrganizationMapSupplier implements Supplier> { + protected final Supplier sessionSupplier; + private final Function, Iterable> organizationsForNames; + + @Inject + protected OrganizationMapSupplier(Supplier sessionSupplier, + Function, Iterable> organizationsForNames) { + this.sessionSupplier = sessionSupplier; + this.organizationsForNames = organizationsForNames; + } + + @Override + public Map get() { + return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); + } + } + + @Singleton + public static class OrganizationCatalogSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allCatalogsInOrganization; + + @Inject + protected OrganizationCatalogSupplier(Supplier> orgSupplier, + Function> allCatalogsInOrganization) { + this.orgSupplier = orgSupplier; + this.allCatalogsInOrganization = allCatalogsInOrganization; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allCatalogsInOrganization), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } + } + + @Provides + @Singleton + protected Supplier>> provideOrganizationCatalogItemMapSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Provides + @Singleton + protected Supplier>> provideOrganizationVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Singleton + public static class OrganizationVDCSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allVDCsInOrganization; + + @Inject + protected OrganizationVDCSupplier(Supplier> orgSupplier, + Function> allVDCsInOrganization) { + this.orgSupplier = orgSupplier; + this.allVDCsInOrganization = allVDCsInOrganization; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allVDCsInOrganization), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } + } + + @Singleton + public static class OrganizationCatalogItemSupplier implements + Supplier>>> { + protected final Supplier>> catalogSupplier; + private final Function> allCatalogItemsInCatalog; + + @Inject + protected OrganizationCatalogItemSupplier( + Supplier>> catalogSupplier, + Function> allCatalogItemsInCatalog) { + this.catalogSupplier = catalogSupplier; + this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; + } + + @Override + public Map>> get() { + return transformValues( + catalogSupplier.get(), + new Function, Map>>() { + + @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); + } + }); + + } + }); + } + } + + @Provides + @Singleton + protected Supplier>>> provideOrganizationCatalogItemSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogItemSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( + authException, seconds, + new Supplier>>>() { + @Override + public Map>> get() { + return supplier.get(); + } + }); + } + + @Provides + @Singleton + @org.jclouds.vcloud.endpoints.VCloudLogin + protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, + @Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, + TimeoutException { + SortedMap versions = versionService.getSupportedVersions().get(180, TimeUnit.SECONDS); + checkState(versions.size() > 0, "No versions present"); + checkState(versions.containsKey(version), "version " + version + " not present in: " + versions); + return versions.get(version); + } + + @Singleton + private static class OrgNameToOrgSupplier implements Supplier> { + private final Supplier sessionSupplier; + + @SuppressWarnings("unused") + @Inject + OrgNameToOrgSupplier(Supplier sessionSupplier) { + this.sessionSupplier = sessionSupplier; + } + + @Override + public Map get() { + return sessionSupplier.get().getOrgs(); + } + + } + + @Provides + @Singleton + protected VCloudLoginAsyncClient provideVCloudLogin(AsyncClientFactory factory) { + return factory.create(VCloudLoginAsyncClient.class); + } + + @Provides + @Singleton + protected VCloudVersionsAsyncClient provideVCloudVersions(AsyncClientFactory factory) { + return factory.create(VCloudVersionsAsyncClient.class); + } + + @Provides + @Singleton + protected abstract Organization provideOrganization(S client); + + @Provides + @VDC + @Singleton + protected URI provideDefaultVDC(Organization org) { + checkState(org.getVDCs().size() > 0, "No vdcs present in org: " + org.getName()); + return get(org.getVDCs().values(), 0).getId(); + } + + @Provides + @Catalog + @Singleton + protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { + checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); + return get(org.getCatalogs().values(), 0).getId(); + } + + @Provides + @Catalog + @Singleton + protected String provideCatalogName( + Supplier>> catalogs) { + return getLast(getLast(catalogs.get().values()).keySet()); + } + + @Provides + @Network + @Singleton + protected abstract URI provideDefaultNetwork(S client); + + @Provides + @Named(PROPERTY_VCLOUD_DEFAULT_NETWORK) + @Singleton + String provideDefaultNetworkString(@Network URI network) { + return network.toASCIIString(); + } + + @Override + protected void bindErrorHandlers() { + bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseVCloudErrorFromHttpResponse.class); + bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ParseVCloudErrorFromHttpResponse.class); + bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseVCloudErrorFromHttpResponse.class); + } + + @Provides + @TasksList + @Singleton + protected URI provideDefaultTasksList(Organization org) { + checkState(org.getTasksLists().size() > 0, "No tasks lists present in org: " + org.getName()); + return get(org.getTasksLists().values(), 0).getId(); + } +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudExpressRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudExpressRestClientModule.java new file mode 100644 index 0000000000..3b402f0dd1 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudExpressRestClientModule.java @@ -0,0 +1,41 @@ +/** + * + * Copyright (C) 2010 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 org.jclouds.http.RequiresHttp; +import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; + +/** + * Configures the VCloud authentication service connection, including logging and http transport. + * + * @author Adrian Cole + */ +@RequiresHttp +@ConfiguresRestClient +public class VCloudExpressRestClientModule extends + BaseVCloudExpressRestClientModule { + + public VCloudExpressRestClientModule() { + super(VCloudExpressClient.class, VCloudExpressAsyncClient.class); + } + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java index f178373306..435483ec4e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java @@ -25,8 +25,7 @@ import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudClient; /** - * 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 */ diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/ResourceType.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/ResourceType.java index 8e624b55a1..06071d796f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/ResourceType.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/ResourceType.java @@ -21,14 +21,14 @@ package org.jclouds.vcloud.domain; import static com.google.common.base.Preconditions.checkNotNull; -import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.VCloudExpressAsyncClient; /** * * VirtualResource such as disks or CPU * * @author Adrian Cole - * @see VCloudAsyncClient#getVApp + * @see VCloudExpressAsyncClient#getVApp * @see * */ diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java index 305128c46d..44f4a97696 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java @@ -25,7 +25,7 @@ import java.net.URI; import java.util.LinkedHashMap; import java.util.Map; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.NamedResource; @@ -105,7 +105,7 @@ public class CatalogImpl extends LinkedHashMap implements @Override public String getType() { - return VCloudMediaType.CATALOG_XML; + return VCloudExpressMediaType.CATALOG_XML; } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java index f9fa88455b..e1e7e8cc02 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogItemImpl.java @@ -26,7 +26,7 @@ import java.util.Map; import javax.annotation.Nullable; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; @@ -47,7 +47,7 @@ public class CatalogItemImpl extends NamedResourceImpl implements CatalogItem { public CatalogItemImpl(String name, URI id, @Nullable String description, NamedResource entity, Map properties) { - super(name, VCloudMediaType.CATALOGITEM_XML, id); + super(name, VCloudExpressMediaType.CATALOGITEM_XML, id); this.description = description; this.entity = checkNotNull(entity, "entity"); this.properties.putAll(checkNotNull(properties, "properties")); @@ -55,7 +55,7 @@ public class CatalogItemImpl extends NamedResourceImpl implements CatalogItem { @Override public String getType() { - return VCloudMediaType.CATALOGITEM_XML; + return VCloudExpressMediaType.CATALOGITEM_XML; } public NamedResource getEntity() { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/NetworkImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/NetworkImpl.java index 1db1bb2557..dd98c835f6 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/NetworkImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/NetworkImpl.java @@ -22,7 +22,7 @@ package org.jclouds.vcloud.domain.internal; import java.net.URI; import java.util.Set; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.FirewallRule; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.NatRule; @@ -53,7 +53,7 @@ public class NetworkImpl extends NamedResourceImpl implements Network { public NetworkImpl(String name, URI id, String description, Set dnsServers, String gateway, String netmask, Set fenceModes, Boolean dhcp, Set natRules, Set firewallRules) { - super(name, VCloudMediaType.NETWORK_XML, id); + super(name, VCloudExpressMediaType.NETWORK_XML, id); this.description = description; this.dnsServers.addAll(dnsServers); this.gateway = gateway; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java index 041f24efef..1abe2bbf0f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java @@ -22,7 +22,7 @@ package org.jclouds.vcloud.domain.internal; import java.net.URI; import java.util.Map; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.endpoints.Catalog; @@ -130,7 +130,7 @@ public class OrganizationImpl implements Organization { @Override public String getType() { - return VCloudMediaType.ORG_XML; + return VCloudExpressMediaType.ORG_XML; } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java index eecebcc461..6f642ff1b8 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java @@ -24,7 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Set; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.VApp; @@ -207,7 +207,7 @@ public class VAppImpl implements VApp { @Override public String getType() { - return VCloudMediaType.VAPP_XML; + return VCloudExpressMediaType.VAPP_XML; } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java index 90f5c63246..b79e252111 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java @@ -23,7 +23,7 @@ import java.net.URI; import javax.annotation.Nullable; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; @@ -40,7 +40,7 @@ public class VAppTemplateImpl extends NamedResourceImpl implements VAppTemplate private final VAppStatus status; public VAppTemplateImpl(String name, URI id, @Nullable String description, @Nullable VAppStatus status) { - super(name, VCloudMediaType.VAPPTEMPLATE_XML, id); + super(name, VCloudExpressMediaType.VAPPTEMPLATE_XML, id); this.description = description; this.status = status; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java index d718ba4e18..8da53d08de 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java @@ -24,7 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Map; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Capacity; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Quota; @@ -198,7 +198,7 @@ public class VDCImpl implements VDC { @Override public String getType() { - return VCloudMediaType.VDC_XML; + return VCloudExpressMediaType.VDC_XML; } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java index 71baa347dc..3e269f5594 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java @@ -55,7 +55,8 @@ public class AllCatalogItemsInCatalog implements Function> allCatalogsInOrganization; - private final AllCatalogItemsInCatalog allCatalogItemsInCatalog; + private final Function> allCatalogItemsInCatalog; @Inject - AllCatalogItemsInOrganization(AllCatalogsInOrganization allCatalogsInOrganization, - AllCatalogItemsInCatalog allCatalogItemsInCatalog) { + AllCatalogItemsInOrganization(Function> allCatalogsInOrganization, + Function> allCatalogItemsInCatalog) { this.allCatalogsInOrganization = allCatalogsInOrganization; this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrganization.java index eec53aeaaf..c344c15408 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrganization.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrganization.java @@ -52,7 +52,8 @@ public class AllCatalogsInOrganization implements Function apply(final Organization org) { Iterable catalogs = transformParallel(org.getCatalogs().values(), - new Function>() { - @SuppressWarnings("unchecked") - @Override - public Future apply(NamedResource from) { - return (Future) aclient.getCatalog(from.getId()); - } + new Function>() { + @SuppressWarnings("unchecked") + @Override + public Future apply(NamedResource from) { + return (Future) aclient.getCatalog(from.getId()); + } - }, executor, null, logger, "catalogs in " + org.getName()); + }, executor, null, logger, "catalogs in " + org.getName()); return catalogs; } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java index 7045872267..bc61a34be3 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java @@ -52,7 +52,8 @@ public class AllVDCsInOrganization implements Function apply(final Organization org) { Iterable catalogItems = transformParallel(org.getVDCs().values(), - new Function>() { - @SuppressWarnings("unchecked") - @Override - public Future apply(NamedResource from) { - return (Future) aclient.getVDC(from.getId()); - } + new Function>() { + @SuppressWarnings("unchecked") + @Override + public Future apply(NamedResource from) { + return (Future) aclient.getVDC(from.getId()); + } - }, executor, null, logger, "vdcs in org " + org.getName()); + }, executor, null, logger, "vdcs in org " + org.getName()); return catalogItems; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java index ad06b1b09f..15577bf4ba 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForCatalogItems.java @@ -46,7 +46,7 @@ import com.google.common.base.Predicate; */ @Singleton public class VAppTemplatesForCatalogItems implements - Function, Iterable> { + Function, Iterable> { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; @@ -55,7 +55,7 @@ public class VAppTemplatesForCatalogItems implements @Inject VAppTemplatesForCatalogItems(VCloudAsyncClient aclient, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.aclient = aclient; this.executor = executor; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForResourceEntities.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForResourceEntities.java index 02484150d0..4f2c2b5dbd 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForResourceEntities.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VAppTemplatesForResourceEntities.java @@ -34,8 +34,8 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.VAppTemplate; @@ -51,11 +51,11 @@ public class VAppTemplatesForResourceEntities implements @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; - private final VCloudAsyncClient aclient; + private final VCloudExpressAsyncClient aclient; private final ExecutorService executor; @Inject - VAppTemplatesForResourceEntities(VCloudAsyncClient aclient, + VAppTemplatesForResourceEntities(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.aclient = aclient; this.executor = executor; @@ -67,7 +67,7 @@ public class VAppTemplatesForResourceEntities implements @Override public boolean apply(NamedResource input) { - return input.getType().equals(VCloudMediaType.VAPPTEMPLATE_XML); + return input.getType().equals(VCloudExpressMediaType.VAPPTEMPLATE_XML); } }), new Function>() { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogItemsInCatalog.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogItemsInCatalog.java new file mode 100644 index 0000000000..e94c7b3115 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogItemsInCatalog.java @@ -0,0 +1,85 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static com.google.common.collect.Iterables.filter; +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressMediaType; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.NamedResource; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressAllCatalogItemsInCatalog implements Function> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + + private final VCloudExpressAsyncClient aclient; + private final ExecutorService executor; + + @Inject + VCloudExpressAllCatalogItemsInCatalog(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + @Override + public Iterable apply(Catalog from) { + + Iterable catalogItems = transformParallel(filter(from.values(), new Predicate() { + + @Override + public boolean apply(NamedResource input) { + return input.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML); + } + + }), new Function>() { + + @SuppressWarnings("unchecked") + @Override + public Future apply(NamedResource from) { + return (Future) aclient.getCatalogItem(from.getId()); + } + + }, executor, null, logger, "catalogItems in " + from.getId()); + return catalogItems; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogsInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogsInOrganization.java new file mode 100644 index 0000000000..7880a55c76 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogsInOrganization.java @@ -0,0 +1,73 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressAllCatalogsInOrganization implements Function> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + + private final VCloudExpressAsyncClient aclient; + private final ExecutorService executor; + + @Inject + VCloudExpressAllCatalogsInOrganization(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + @Override + public Iterable apply(final Organization org) { + Iterable catalogs = transformParallel(org.getCatalogs().values(), + new Function>() { + @SuppressWarnings("unchecked") + @Override + public Future apply(NamedResource from) { + return (Future) aclient.getCatalog(from.getId()); + } + + }, executor, null, logger, "catalogs in " + org.getName()); + return catalogs; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java new file mode 100644 index 0000000000..1bada11e0d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java @@ -0,0 +1,75 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.VDC; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressAllVDCsInOrganization implements Function> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + + private final VCloudExpressAsyncClient aclient; + private final ExecutorService executor; + + @Inject + VCloudExpressAllVDCsInOrganization(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + @Override + public Iterable apply(final Organization org) { + + Iterable catalogItems = transformParallel(org.getVDCs().values(), + new Function>() { + @SuppressWarnings("unchecked") + @Override + public Future apply(NamedResource from) { + return (Future) aclient.getVDC(from.getId()); + } + + }, executor, null, logger, "vdcs in org " + org.getName()); + return catalogItems; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java new file mode 100644 index 0000000000..4b4d1a14ae --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java @@ -0,0 +1,70 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.domain.Organization; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressOrganizationsForNames implements Function, Iterable> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + private final VCloudExpressAsyncClient aclient; + private final ExecutorService executor; + + @Inject + VCloudExpressOrganizationsForNames(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + @Override + public Iterable apply(Iterable from) { + return transformParallel(from, new Function>() { + + @SuppressWarnings("unchecked") + @Override + public Future apply(String from) { + return (Future) aclient.findOrganizationNamed(from); + } + + }, executor, null, logger, "organizations for names"); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java new file mode 100644 index 0000000000..5b15bde489 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java @@ -0,0 +1,98 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static com.google.common.collect.Iterables.filter; +import static com.google.common.collect.Iterables.transform; +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.net.URI; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.compute.domain.VCloudLocation; +import org.jclouds.vcloud.domain.Organization; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; +import com.google.common.collect.Sets; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressOrganizatonsForLocations implements + Function, Iterable> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + private final VCloudExpressAsyncClient aclient; + private final ExecutorService executor; + + @Inject + VCloudExpressOrganizatonsForLocations(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + /** + * Zones are assignable, but we want regions. so we look for zones, whose + * parent is region. then, we use a set to extract the unique set. + */ + @Override + public Iterable apply(Iterable from) { + + return transformParallel(Sets.newLinkedHashSet(transform(filter(from, new Predicate() { + + @Override + public boolean apply(Location input) { + return input.getScope() == LocationScope.ZONE; + } + + }), new Function() { + + @Override + public URI apply(Location from) { + return VCloudLocation.class.cast(from.getParent()).getResource().getId(); + } + + })), new Function>() { + + @SuppressWarnings("unchecked") + @Override + public Future apply(URI from) { + return (Future) aclient.getOrganization(from); + } + + }, executor, null, logger, "organizations for uris"); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressVAppTemplatesForCatalogItems.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressVAppTemplatesForCatalogItems.java new file mode 100644 index 0000000000..fa664717de --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressVAppTemplatesForCatalogItems.java @@ -0,0 +1,83 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static com.google.common.collect.Iterables.filter; +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressMediaType; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.VAppTemplate; + +import com.google.common.base.Function; +import com.google.common.base.Predicate; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressVAppTemplatesForCatalogItems implements + Function, Iterable> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + private final VCloudExpressAsyncClient aclient; + private final ExecutorService executor; + + @Inject + VCloudExpressVAppTemplatesForCatalogItems(VCloudExpressAsyncClient aclient, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + @Override + public Iterable apply(Iterable from) { + return transformParallel(filter(from, new Predicate() { + + @Override + public boolean apply(CatalogItem input) { + return input.getEntity().getType().equals(VCloudExpressMediaType.VAPPTEMPLATE_XML); + } + + }), new Function>() { + + @SuppressWarnings("unchecked") + @Override + public Future apply(CatalogItem from) { + return (Future) aclient.getVAppTemplate(from.getEntity().getId()); + } + + }, executor, null, logger, "vappTemplates in"); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudLoginAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudLoginAsyncClient.java index f5658b9b82..2d2d21ec94 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudLoginAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudLoginAsyncClient.java @@ -28,7 +28,7 @@ import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.ResponseParser; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.VCloudToken; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.endpoints.Org; @@ -61,6 +61,6 @@ public interface VCloudLoginAsyncClient { */ @POST @ResponseParser(ParseLoginResponseFromHeaders.class) - @Consumes(VCloudMediaType.ORGLIST_XML) + @Consumes(VCloudExpressMediaType.ORGLIST_XML) ListenableFuture login(); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java b/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java index e0121b1d20..88797e5f0f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java @@ -54,14 +54,12 @@ public class InstantiateVAppTemplateOptions { return this; } - public InstantiateVAppTemplateOptions productProperty(String key, - String value) { + public InstantiateVAppTemplateOptions productProperty(String key, String value) { properties.put(checkNotNull(key, "key"), checkNotNull(value, "value")); return this; } - public InstantiateVAppTemplateOptions productProperties( - Map properties) { + public InstantiateVAppTemplateOptions productProperties(Map properties) { this.properties.putAll(checkNotNull(properties, "properties")); return this; } @@ -95,8 +93,7 @@ public class InstantiateVAppTemplateOptions { } public InstantiateVAppTemplateOptions inNetwork(URI networkLocation) { - this.network = checkNotNull(networkLocation, "networkLocation") - .toASCIIString(); + this.network = checkNotNull(networkLocation, "networkLocation").toASCIIString(); return this; } @@ -133,8 +130,7 @@ public class InstantiateVAppTemplateOptions { /** * @see InstantiateVAppTemplateOptions#blockOnDeploy */ - public static InstantiateVAppTemplateOptions blockOnDeploy( - boolean blockOnDeploy) { + public static InstantiateVAppTemplateOptions blockOnDeploy(boolean blockOnDeploy) { InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); return options.blockOnDeploy(blockOnDeploy); } @@ -182,8 +178,7 @@ public class InstantiateVAppTemplateOptions { /** * @see InstantiateVAppTemplateOptions#networkName(String) */ - public static InstantiateVAppTemplateOptions networkName( - String networkName) { + public static InstantiateVAppTemplateOptions networkName(String networkName) { InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); return options.networkName(networkName); } @@ -191,8 +186,7 @@ public class InstantiateVAppTemplateOptions { /** * @see InstantiateVAppTemplateOptions#productProperty(String,String) */ - public static InstantiateVAppTemplateOptions productProperty(String key, - String value) { + public static InstantiateVAppTemplateOptions productProperty(String key, String value) { InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); return options.productProperty(key, value); } @@ -200,8 +194,7 @@ public class InstantiateVAppTemplateOptions { /** * @see InstantiateVAppTemplateOptions#setProperties(Map) */ - public static InstantiateVAppTemplateOptions productProperties( - Map properties) { + public static InstantiateVAppTemplateOptions productProperties(Map properties) { InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); return options.productProperties(properties); } @@ -209,11 +202,9 @@ public class InstantiateVAppTemplateOptions { @Override public String toString() { - return "InstantiateVAppTemplateOptions [cpuCount=" + cpuCount - + ", memorySizeMegabytes=" + memorySizeMegabytes - + ", diskSizeKilobytes=" + diskSizeKilobytes + ", network=" - + network + ", networkName=" + networkName + ", fenceMode=" - + fenceMode + ", properties=" + properties + "]"; + return "InstantiateVAppTemplateOptions [cpuCount=" + cpuCount + ", memorySizeMegabytes=" + memorySizeMegabytes + + ", diskSizeKilobytes=" + diskSizeKilobytes + ", network=" + network + ", networkName=" + networkName + + ", fenceMode=" + fenceMode + ", properties=" + properties + "]"; } @Override @@ -221,19 +212,12 @@ public class InstantiateVAppTemplateOptions { final int prime = 31; int result = 1; result = prime * result + ((cpuCount == null) ? 0 : cpuCount.hashCode()); - result = prime * result - + ((diskSizeKilobytes == null) ? 0 : diskSizeKilobytes.hashCode()); - result = prime * result - + ((fenceMode == null) ? 0 : fenceMode.hashCode()); - result = prime - * result - + ((memorySizeMegabytes == null) ? 0 : memorySizeMegabytes - .hashCode()); + result = prime * result + ((diskSizeKilobytes == null) ? 0 : diskSizeKilobytes.hashCode()); + result = prime * result + ((fenceMode == null) ? 0 : fenceMode.hashCode()); + result = prime * result + ((memorySizeMegabytes == null) ? 0 : memorySizeMegabytes.hashCode()); result = prime * result + ((network == null) ? 0 : network.hashCode()); - result = prime * result - + ((networkName == null) ? 0 : networkName.hashCode()); - result = prime * result - + ((properties == null) ? 0 : properties.hashCode()); + result = prime * result + ((networkName == null) ? 0 : networkName.hashCode()); + result = prime * result + ((properties == null) ? 0 : properties.hashCode()); return result; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VAppNotFound.java b/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VCloudExpressTaskSuccess.java similarity index 59% rename from vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VAppNotFound.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VCloudExpressTaskSuccess.java index ccd7d874fc..4234c08f62 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VAppNotFound.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VCloudExpressTaskSuccess.java @@ -19,13 +19,15 @@ package org.jclouds.vcloud.predicates; +import java.net.URI; + import javax.annotation.Resource; import javax.inject.Singleton; import org.jclouds.logging.Logger; -import org.jclouds.rest.ResourceNotFoundException; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.TaskStatus; import com.google.common.base.Predicate; import com.google.inject.Inject; @@ -37,23 +39,27 @@ import com.google.inject.Inject; * @author Adrian Cole */ @Singleton -public class VAppNotFound implements Predicate { +public class VCloudExpressTaskSuccess implements Predicate { - private final VCloudClient client; + private final VCloudExpressClient client; @Resource protected Logger logger = Logger.NULL; @Inject - public VAppNotFound(VCloudClient client) { + public VCloudExpressTaskSuccess(VCloudExpressClient client) { this.client = client; } - public boolean apply(VApp vApp) { - try { - return client.getVApp(vApp.getId()) == null; - } catch (ResourceNotFoundException e) { - return true; - } + public boolean apply(URI taskId) { + logger.trace("looking for status on task %s", taskId); + + Task task = client.getTask(taskId); + logger.trace("%s: looking for status %s: currently: %s", task, TaskStatus.SUCCESS, task + .getStatus()); + if (task.getStatus() == TaskStatus.ERROR) + throw new RuntimeException("error on task: " + task.getLocation() + " error: " + task.getError()); + return task.getStatus() == TaskStatus.SUCCESS; } + } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java index 6595ccb06e..3be3c036b8 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java @@ -19,9 +19,9 @@ package org.jclouds.vcloud.xml; -import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; -import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; import static org.jclouds.vcloud.util.Utils.newNamedResource; import static org.jclouds.vcloud.util.Utils.putNamedResource; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgListHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgListHandler.java index 10f398041e..f54698853e 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgListHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgListHandler.java @@ -19,7 +19,7 @@ package org.jclouds.vcloud.xml; -import static org.jclouds.vcloud.VCloudMediaType.ORG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.ORG_XML; import static org.jclouds.vcloud.util.Utils.putNamedResource; import java.util.Map; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java index efa50e6162..7c1e5aad0e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java @@ -27,7 +27,7 @@ import javax.inject.Inject; import org.jclouds.http.functions.ParseSax; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.VApp; @@ -87,7 +87,7 @@ public class VAppHandler extends ParseSax.HandlerWithResult { size = new Long(attributes.getValue(attributes.getIndex("size"))); } else if (qName.equals("Link")) { // type should never be missing if (attributes.getIndex("type") != -1 - && attributes.getValue(attributes.getIndex("type")).equals(VCloudMediaType.VDC_XML)) { + && attributes.getValue(attributes.getIndex("type")).equals(VCloudExpressMediaType.VDC_XML)) { vDC = Utils.newNamedResource(attributes); } } else if (qName.equals("OperatingSystemSection")) { diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/ProvidersInPropertiesTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/ProvidersInPropertiesTest.java index f901baf125..5fc189bc9f 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/ProvidersInPropertiesTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/ProvidersInPropertiesTest.java @@ -37,12 +37,14 @@ public class ProvidersInPropertiesTest { public void testSupportedProviders() { Iterable providers = Utils.getSupportedProviders(); assert Iterables.contains(providers, "vcloud") : providers; + assert Iterables.contains(providers, "vcloudexpress") : providers; } @Test public void testSupportedComputeServiceProviders() { Iterable providers = ComputeServiceUtils.getSupportedProviders(); assert Iterables.contains(providers, "vcloud") : providers; + assert Iterables.contains(providers, "vcloudexpress") : providers; } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java index c34a72c8b3..bf8d273754 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java @@ -90,16 +90,16 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testInstantiateVAppTemplateInVDCURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); + String.class, InstantiateVAppTemplateOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"), "my-vapp"); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp"); assertRequestLineEquals(request, - "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); - assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp-hosting.xml")), - "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); + assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp.xml")), + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, VAppHandler.class); @@ -109,21 +109,20 @@ public class VCloudAsyncClientTest extends RestClientTest { } public void testInstantiateVAppTemplateInVDCURIOptions() throws SecurityException, NoSuchMethodException, - IOException { + IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); - HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"), "my-vapp", processorCount(1).memory( - 512).disk(1024).fenceMode("allowInOut").inNetwork( - URI.create("https://vcloud.safesecureweb.com/network/1990"))); + String.class, InstantiateVAppTemplateOptions[].class); + HttpRequest request = processor + .createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp", + processorCount(1).memory(512).disk(1024).inNetwork( + URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"))); assertRequestLineEquals(request, - "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); - assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream( - "/newvapp-hostingcpumemdisk.xml")), "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", - false); + assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp-cpumemdisk.xml")), + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, VAppHandler.class); @@ -134,25 +133,26 @@ public class VCloudAsyncClientTest extends RestClientTest { @Test(expectedExceptions = IllegalArgumentException.class) public void testInstantiateVAppTemplateInOrgOptionsIllegalName() throws SecurityException, NoSuchMethodException, - IOException { + IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); - processor.createRequest(method, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), "CentOS 01", processorCount(1).memory(512) - .disk(1024).inNetwork(URI.create("https://vcloud.safesecureweb.com/network/1990"))); + String.class, InstantiateVAppTemplateOptions[].class); + processor.createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "CentOS 01", processorCount(1).memory(512) + .disk(1024).inNetwork(URI.create("https://vcenterprise.bluelock.com/network/1990"))); } public void testCloneVAppInVDC() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, - CloneVAppOptions[].class); + CloneVAppOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/4181"), "my-vapp"); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/4181"), "my-vapp"); - assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/cloneVApp HTTP/1.1"); + assertRequestLineEquals(request, + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/cloneVApp-default.xml")), - "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, TaskHandler.class); @@ -163,16 +163,17 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCloneVAppInVDCOptions() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, - CloneVAppOptions[].class); + CloneVAppOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/201"), "new-linux-server", new CloneVAppOptions() - .deploy().powerOn().withDescription("The description of the new vApp")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/201"), "new-linux-server", + new CloneVAppOptions().deploy().powerOn().withDescription("The description of the new vApp")); - assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/cloneVApp HTTP/1.1"); + assertRequestLineEquals(request, + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/cloneVApp.xml")), - "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, TaskHandler.class); @@ -185,7 +186,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("getDefaultOrganization"); HttpRequest request = processor.createRequest(method); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/org HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); assertPayloadEquals(request, null, null, false); @@ -199,9 +200,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testOrganization() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getOrganization", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/org/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/org/1")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/org/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); assertPayloadEquals(request, null, null, false); @@ -216,7 +217,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("findOrganizationNamed", String.class); HttpRequest request = processor.createRequest(method, "org"); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/org/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); assertPayloadEquals(request, null, null, false); @@ -231,7 +232,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("getDefaultCatalog"); HttpRequest request = processor.createRequest(method); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalog HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalog HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); assertPayloadEquals(request, null, null, false); @@ -245,9 +246,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCatalog() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getCatalog", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalog/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalog/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); assertPayloadEquals(request, null, null, false); @@ -262,7 +263,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("findCatalogInOrgNamed", String.class, String.class); HttpRequest request = processor.createRequest(method, "org", "catalog"); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalog/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalog/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); assertPayloadEquals(request, null, null, false); @@ -276,9 +277,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testNetwork() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getNetwork", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/network/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/network/2")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/network/2 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/network/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.network+xml\n"); assertPayloadEquals(request, null, null, false); @@ -292,9 +293,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCatalogItemURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getCatalogItem", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalogItem+xml\n"); assertPayloadEquals(request, null, null, false); @@ -307,10 +308,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testFindCatalogItemInOrgCatalogNamed() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("findCatalogItemInOrgCatalogNamed", String.class, String.class, - String.class); + String.class); HttpRequest request = processor.createRequest(method, "org", "catalog", "item"); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalogItem+xml\n"); assertPayloadEquals(request, null, null, false); @@ -323,10 +324,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testFindVAppTemplate() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("findVAppTemplateInOrgCatalogNamed", String.class, - String.class, String.class); + String.class, String.class); HttpRequest request = processor.createRequest(method, "org", "catalog", "template"); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vAppTemplate+xml\n"); assertPayloadEquals(request, null, null, false); @@ -340,9 +341,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testVAppTemplateURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVAppTemplate", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vAppTemplate+xml\n"); assertPayloadEquals(request, null, null, false); @@ -357,7 +358,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("getDefaultVDC"); HttpRequest request = processor.createRequest(method); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); assertPayloadEquals(request, null, null, false); @@ -372,7 +373,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); HttpRequest request = processor.createRequest(method, "org", "vdc"); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); assertPayloadEquals(request, null, null, false); @@ -399,7 +400,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); HttpRequest request = processor.createRequest(method, null, "vdc"); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); assertPayloadEquals(request, null, null, false); @@ -414,7 +415,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); HttpRequest request = processor.createRequest(method, null, null); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); assertPayloadEquals(request, null, null, false); @@ -428,9 +429,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetVDC() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVDC", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); assertPayloadEquals(request, null, null, false); @@ -445,7 +446,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("getDefaultTasksList"); HttpRequest request = processor.createRequest(method); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/taskslist HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/taskslist HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); assertPayloadEquals(request, null, null, false); @@ -459,9 +460,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetTasksList() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getTasksList", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/tasksList/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/tasksList/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); assertPayloadEquals(request, null, null, false); @@ -476,7 +477,7 @@ public class VCloudAsyncClientTest extends RestClientTest { Method method = VCloudAsyncClient.class.getMethod("findTasksListInOrgNamed", String.class, String.class); HttpRequest request = processor.createRequest(method, "org", "tasksList"); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/tasksList/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/tasksList/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); assertPayloadEquals(request, null, null, false); @@ -490,9 +491,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testDeployVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("deployVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); - assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/action/deploy HTTP/1.1"); + assertRequestLineEquals(request, "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/deploy HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -506,9 +507,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vApp/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vApp/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); assertPayloadEquals(request, null, null, false); @@ -522,9 +523,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testUndeployVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("undeployVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); - assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/action/undeploy HTTP/1.1"); + assertRequestLineEquals(request, + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/undeploy HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -538,9 +540,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testDeleteVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("deleteVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); - assertRequestLineEquals(request, "DELETE https://vcloud.safesecureweb.com/api/v0.8/vApp/1 HTTP/1.1"); + assertRequestLineEquals(request, "DELETE https://vcenterprise.bluelock.com/api/v1.0/vApp/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); assertPayloadEquals(request, null, null, false); @@ -554,10 +556,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testPowerOn() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("powerOnVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/powerOn HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOn HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -571,10 +573,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testPowerOff() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("powerOffVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/powerOff HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOff HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -588,10 +590,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testReset() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("resetVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/reset HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/reset HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -605,10 +607,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testSuspend() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("suspendVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/suspend HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/suspend HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -622,10 +624,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testShutdown() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("shutdownVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/shutdown HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/shutdown HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); assertPayloadEquals(request, null, null, false); @@ -639,9 +641,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetTask() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getTask", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/task/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); - assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/task/1 HTTP/1.1"); + assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/task/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -655,9 +657,9 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCancelTask() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cancelTask", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/task/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); - assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/task/1/action/cancel HTTP/1.1"); + assertRequestLineEquals(request, "POST https://vcenterprise.bluelock.com/api/v1.0/task/1/action/cancel HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); assertPayloadEquals(request, null, null, false); @@ -688,7 +690,7 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public ContextSpec createContextSpec() { Properties overrides = new Properties(); - overrides.setProperty("vcloud.endpoint", "https://vcloud.safesecureweb.com/api/v0.8"); + overrides.setProperty("vcloud.endpoint", "https://vcenterprise.bluelock.com/api/v1.0"); return new RestContextFactory().createContextSpec("vcloud", "identity", "credential", overrides); } @@ -697,13 +699,13 @@ public class VCloudAsyncClientTest extends RestClientTest { public static class VCloudRestClientModuleExtension extends VCloudRestClientModule { @Override protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/login"); + @Named(PROPERTY_API_VERSION) String version) { + return URI.create("https://vcenterprise.bluelock.com/api/v1.0/login"); } @Override protected URI provideOrg(@Org Iterable orgs) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/org"); + return URI.create("https://vcenterprise.bluelock.com/api/v1.0/org"); } @@ -714,7 +716,7 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog"); + return URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog"); } @@ -730,28 +732,28 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override protected URI provideDefaultTasksList(Organization org) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/taskslist"); + return URI.create("https://vcenterprise.bluelock.com/api/v1.0/taskslist"); } @Override protected URI provideDefaultVDC(Organization org) { - return URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"); + return URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"); } @Override protected URI provideDefaultNetwork(VCloudClient client) { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); + 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) { + final VCloudLoginAsyncClient login) { return Suppliers. ofInstance(new VCloudSession() { @Override public Map getOrgs() { return ImmutableMap. of("org", new NamedResourceImpl("org", - VCloudMediaType.ORG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"))); + VCloudMediaType.ORG_XML, URI.create("https://vcenterprise.bluelock.com/api/v1.0/org/1"))); } @Override @@ -772,18 +774,41 @@ public class VCloudAsyncClientTest extends RestClientTest { } protected Supplier>> provideOrganizationVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { - return Suppliers.>> ofInstance(ImmutableMap - .> of("org", + return Suppliers + .>> ofInstance(ImmutableMap + .> of( + "org", - ImmutableMap. of("vdc", new VDCImpl("vdc", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), "description", null, null, null, null, - null, ImmutableMap. of("vapp", new NamedResourceImpl("vapp", - "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), "network", - new NamedResourceImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), null)))); + ImmutableMap + . of( + "vdc", + new VDCImpl( + "vdc", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), + "description", + null, + null, + null, + null, + null, + ImmutableMap + . of( + "vapp", + new NamedResourceImpl( + "vapp", + "application/vnd.vmware.vcloud.vApp+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), + "network", + new NamedResourceImpl( + "network", + "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), + null)))); } @@ -797,14 +822,15 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public Map get() { return ImmutableMap. of("org", new OrganizationImpl("org", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), ImmutableMap. of( - "catalog", new NamedResourceImpl("catalog", VCloudMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap - . of("vdc", new NamedResourceImpl("vdc", VCloudMediaType.VDC_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap - . of("tasksList", new NamedResourceImpl("tasksList", - VCloudMediaType.TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))))); + .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), ImmutableMap + . of("catalog", new NamedResourceImpl("catalog", + VCloudMediaType.CATALOG_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap + . of("vdc", new NamedResourceImpl("vdc", VCloudMediaType.VDC_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap + . of("tasksList", new NamedResourceImpl("tasksList", + VCloudMediaType.TASKSLIST_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1"))))); } } @@ -817,15 +843,32 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public Map> get() { - return ImmutableMap.> of("org", + return ImmutableMap + .> of( + "org", - ImmutableMap. of("catalog", new CatalogImpl("catalog", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"), "description", ImmutableMap - . of("item", new NamedResourceImpl("item", - "application/vnd.vmware.vcloud.catalogItem+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1")), "template", - new NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2")))))); + ImmutableMap + . of( + "catalog", + new CatalogImpl( + "catalog", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), + "description", + ImmutableMap + . of( + "item", + new NamedResourceImpl( + "item", + "application/vnd.vmware.vcloud.catalogItem+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), + "template", + new NamedResourceImpl( + "template", + "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")))))); } } @@ -837,14 +880,26 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public Map>> get() { - return ImmutableMap.>> of( - "org", ImmutableMap.> of( - "catalog", ImmutableMap. of("template", - new CatalogItemImpl("template", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"), "description", - new NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI.create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")), - ImmutableMap. of())))); + 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 NamedResourceImpl( + "template", + "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")), + ImmutableMap. of())))); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java index c25943fe9f..600fda0805 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java @@ -53,6 +53,7 @@ public class VCloudClientLiveTest { protected VCloudClient connection; protected String identity; protected RestContext context; + private String credential; @Test public void testOrganization() throws Exception { @@ -156,16 +157,17 @@ public class VCloudClientLiveTest { } } + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("vcloud.identity"), "vcloud.identity"); + credential = checkNotNull(System.getProperty("vcloud.credential"), "vcloud.credential"); + } + @BeforeGroups(groups = { "live" }) public void setupClient() { - String endpoint = checkNotNull(System.getProperty("jclouds.test.endpoint"), "jclouds.test.endpoint"); - identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); - String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - + setupCredentials(); Properties props = new Properties(); - props.setProperty("vcloud.endpoint", endpoint); context = new RestContextFactory().createContext("vcloud", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), props); + . of(new Log4JLoggingModule()), props); connection = context.getApi(); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java new file mode 100644 index 0000000000..a809bb99c6 --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -0,0 +1,870 @@ +/** + * + * Copyright (C) 2010 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; + +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; + +import java.io.IOException; +import java.lang.reflect.Method; +import java.net.URI; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Properties; + +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +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.ConfiguresRestClient; +import org.jclouds.rest.RestClientTest; +import org.jclouds.rest.RestContextFactory; +import org.jclouds.rest.RestContextFactory.ContextSpec; +import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; +import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; +import org.jclouds.rest.internal.RestAnnotationProcessor; +import org.jclouds.util.Utils; +import org.jclouds.vcloud.config.VCloudExpressRestClientModule; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.internal.CatalogImpl; +import org.jclouds.vcloud.domain.internal.CatalogItemImpl; +import org.jclouds.vcloud.domain.internal.NamedResourceImpl; +import org.jclouds.vcloud.domain.internal.OrganizationImpl; +import org.jclouds.vcloud.domain.internal.VDCImpl; +import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.filters.SetVCloudTokenCookie; +import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; +import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; +import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; +import org.jclouds.vcloud.options.CloneVAppOptions; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; +import org.jclouds.vcloud.xml.CatalogHandler; +import org.jclouds.vcloud.xml.CatalogItemHandler; +import org.jclouds.vcloud.xml.NetworkHandler; +import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.TaskHandler; +import org.jclouds.vcloud.xml.TasksListHandler; +import org.jclouds.vcloud.xml.VAppHandler; +import org.jclouds.vcloud.xml.VAppTemplateHandler; +import org.jclouds.vcloud.xml.VDCHandler; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableMap; +import com.google.inject.Module; +import com.google.inject.TypeLiteral; + +/** + * Tests behavior of {@code VCloudExpressAsyncClient} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.VCloudExpressAsyncClientTest") +public class VCloudExpressAsyncClientTest extends RestClientTest { + + public void testInstantiateVAppTemplateInVDCURI() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, + String.class, InstantiateVAppTemplateOptions[].class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"), "my-vapp"); + + assertRequestLineEquals(request, + "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); + assertPayloadEquals(request, Utils.toStringAndClose(getClass() + .getResourceAsStream("/express/newvapp-hosting.xml")), + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VAppHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testInstantiateVAppTemplateInVDCURIOptions() throws SecurityException, NoSuchMethodException, + IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, + String.class, InstantiateVAppTemplateOptions[].class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"), "my-vapp", processorCount(1) + .memory(512).disk(1024).fenceMode("allowInOut").inNetwork( + URI.create("https://vcloud.safesecureweb.com/network/1990"))); + + assertRequestLineEquals(request, + "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); + assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream( + "/express/newvapp-hostingcpumemdisk.xml")), + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VAppHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testInstantiateVAppTemplateInOrgOptionsIllegalName() throws SecurityException, NoSuchMethodException, + IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, + String.class, InstantiateVAppTemplateOptions[].class); + processor.createRequest(method, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), "CentOS 01", processorCount(1).memory(512) + .disk(1024).inNetwork(URI.create("https://vcloud.safesecureweb.com/network/1990"))); + } + + public void testCloneVAppInVDC() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, + CloneVAppOptions[].class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/4181"), "my-vapp"); + + assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/cloneVApp HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream( + "/express/cloneVApp-default.xml")), "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testCloneVAppInVDCOptions() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, + CloneVAppOptions[].class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/201"), "new-linux-server", + new CloneVAppOptions().deploy().powerOn().withDescription("The description of the new vApp")); + + assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vdc/1/action/cloneVApp HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/express/cloneVApp.xml")), + "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testDefaultOrganization() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getDefaultOrganization"); + HttpRequest request = processor.createRequest(method); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/org HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, OrgHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testOrganization() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getOrganization", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/org/1")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/org/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, OrgHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testFindOrganizationNamed() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findOrganizationNamed", String.class); + HttpRequest request = processor.createRequest(method, "org"); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/org/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, OrgHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testDefaultCatalog() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getDefaultCatalog"); + HttpRequest request = processor.createRequest(method); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalog HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, CatalogHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testCatalog() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getCatalog", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalog/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, CatalogHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testCatalogInOrg() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findCatalogInOrgNamed", String.class, String.class); + HttpRequest request = processor.createRequest(method, "org", "catalog"); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalog/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, CatalogHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testNetwork() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getNetwork", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/network/2")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/network/2 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.network+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, NetworkHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testCatalogItemURI() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getCatalogItem", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalogItem+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, CatalogItemHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testFindCatalogItemInOrgCatalogNamed() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findCatalogItemInOrgCatalogNamed", String.class, + String.class, String.class); + HttpRequest request = processor.createRequest(method, "org", "catalog", "item"); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalogItem+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, CatalogItemHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testFindVAppTemplate() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findVAppTemplateInOrgCatalogNamed", String.class, + String.class, String.class); + HttpRequest request = processor.createRequest(method, "org", "catalog", "template"); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vAppTemplate+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VAppTemplateHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testVAppTemplateURI() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getVAppTemplate", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vAppTemplate+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VAppTemplateHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testGetDefaultVDC() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getDefaultVDC"); + HttpRequest request = processor.createRequest(method); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VDCHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testFindVDCInOrgNamed() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); + HttpRequest request = processor.createRequest(method, "org", "vdc"); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VDCHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + @Test(expectedExceptions = NoSuchElementException.class) + public void testFindVDCInOrgNamedBadVDC() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); + processor.createRequest(method, "org", "vdc1"); + } + + @Test(expectedExceptions = NoSuchElementException.class) + public void testFindVDCInOrgNamedBadOrg() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); + processor.createRequest(method, "org1", "vdc"); + } + + public void testFindVDCInOrgNamedNullOrg() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); + HttpRequest request = processor.createRequest(method, null, "vdc"); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VDCHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testFindVDCInOrgNamedNullOrgAndVDC() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); + HttpRequest request = processor.createRequest(method, null, null); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VDCHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testGetVDC() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getVDC", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vdc/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VDCHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testGetDefaultTasksList() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getDefaultTasksList"); + HttpRequest request = processor.createRequest(method); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/taskslist HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TasksListHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetTasksList() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getTasksList", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/tasksList/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TasksListHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testFindTasksListInOrgNamed() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("findTasksListInOrgNamed", String.class, String.class); + HttpRequest request = processor.createRequest(method, "org", "tasksList"); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/tasksList/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TasksListHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testDeployVApp() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("deployVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/action/deploy HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetVApp() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/vApp/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, VAppHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testUndeployVApp() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("undeployVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/action/undeploy HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testDeleteVApp() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("deleteVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, "DELETE https://vcloud.safesecureweb.com/api/v0.8/vApp/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, ""); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, ReturnVoidOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testPowerOn() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("powerOnVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, + "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/powerOn HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testPowerOff() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("powerOffVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, + "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/powerOff HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testReset() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("resetVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, + "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/reset HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testSuspend() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("suspendVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, + "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/suspend HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testShutdown() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("shutdownVApp", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/1")); + + assertRequestLineEquals(request, + "POST https://vcloud.safesecureweb.com/api/v0.8/vApp/1/power/action/shutdown HTTP/1.1"); + assertNonPayloadHeadersEqual(request, ""); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + public void testGetTask() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("getTask", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/task/1")); + + assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/task/1 HTTP/1.1"); + assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ParseSax.class); + assertSaxResponseParserClassEquals(method, TaskHandler.class); + assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); + + checkFilters(request); + } + + public void testCancelTask() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudExpressAsyncClient.class.getMethod("cancelTask", URI.class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/task/1")); + + assertRequestLineEquals(request, "POST https://vcloud.safesecureweb.com/api/v0.8/task/1/action/cancel HTTP/1.1"); + assertNonPayloadHeadersEqual(request, ""); + assertPayloadEquals(request, null, null, false); + + assertResponseParserClassEquals(method, request, ReleasePayloadAndReturn.class); + assertSaxResponseParserClassEquals(method, null); + assertExceptionParserClassEquals(method, null); + + checkFilters(request); + } + + @Override + protected void checkFilters(HttpRequest request) { + assertEquals(request.getFilters().size(), 1); + assertEquals(request.getFilters().get(0).getClass(), SetVCloudTokenCookie.class); + } + + @Override + protected TypeLiteral> createTypeLiteral() { + return new TypeLiteral>() { + }; + } + + @Override + protected Module createModule() { + return new VCloudRestClientModuleExtension(); + } + + @Override + public ContextSpec createContextSpec() { + Properties overrides = new Properties(); + overrides.setProperty("vcloudexpress.endpoint", "https://vcloud.safesecureweb.com/api/v0.8"); + return new RestContextFactory().createContextSpec("vcloudexpress", "identity", "credential", overrides); + } + + @RequiresHttp + @ConfiguresRestClient + public static class VCloudRestClientModuleExtension extends VCloudExpressRestClientModule { + @Override + protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, + @Named(PROPERTY_API_VERSION) String version) { + return URI.create("https://vcloud.safesecureweb.com/api/v0.8/login"); + } + + @Override + protected URI provideOrg(@Org Iterable orgs) { + return URI.create("https://vcloud.safesecureweb.com/api/v0.8/org"); + + } + + @Override + protected String provideOrgName(@Org Iterable orgs) { + return "org"; + } + + @Override + protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { + return URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog"); + + } + + @Override + protected Organization provideOrganization(VCloudExpressClient discovery) { + return null; + } + + @Override + protected Iterable provideOrgs(Supplier cache, @Named(PROPERTY_IDENTITY) String user) { + return null; + } + + @Override + protected URI provideDefaultTasksList(Organization org) { + return URI.create("https://vcloud.safesecureweb.com/api/v0.8/taskslist"); + } + + @Override + protected URI provideDefaultVDC(Organization org) { + return URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"); + } + + @Override + protected URI provideDefaultNetwork(VCloudExpressClient client) { + return URI.create("https://vcloud.safesecureweb.com/network/1990"); + } + + @Override + protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final VCloudLoginAsyncClient login) { + return Suppliers. ofInstance(new VCloudSession() { + + @Override + public Map getOrgs() { + return ImmutableMap. of("org", new NamedResourceImpl("org", + VCloudExpressMediaType.ORG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"))); + } + + @Override + public String getVCloudToken() { + return "token"; + } + + }); + + } + + @Override + protected void configure() { + super.configure(); + bind(OrganizationMapSupplier.class).to(TestOrganizationMapSupplier.class); + bind(OrganizationCatalogSupplier.class).to(TestOrganizationCatalogSupplier.class); + bind(OrganizationCatalogItemSupplier.class).to(TestOrganizationCatalogItemSupplier.class); + } + + protected Supplier>> provideOrganizationVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { + + return Suppliers.>> ofInstance(ImmutableMap + .> of("org", + + ImmutableMap. of("vdc", new VDCImpl("vdc", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), "description", null, null, null, + null, null, ImmutableMap. of("vapp", new NamedResourceImpl("vapp", + "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), + "network", new NamedResourceImpl("network", + "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), + null)))); + + } + + @Singleton + public static class TestOrganizationMapSupplier extends OrganizationMapSupplier { + @Inject + protected TestOrganizationMapSupplier() { + super(null, null); + } + + @Override + public Map get() { + return ImmutableMap. of("org", new OrganizationImpl("org", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), ImmutableMap + . of("catalog", new NamedResourceImpl("catalog", + VCloudExpressMediaType.CATALOG_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap + . of("vdc", new NamedResourceImpl("vdc", VCloudExpressMediaType.VDC_XML, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap + . of("tasksList", new NamedResourceImpl("tasksList", + VCloudExpressMediaType.TASKSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))))); + } + } + + @Singleton + public static class TestOrganizationCatalogSupplier extends OrganizationCatalogSupplier { + @Inject + protected TestOrganizationCatalogSupplier() { + super(null, null); + } + + @Override + public Map> get() { + return ImmutableMap.> of("org", + + ImmutableMap. of("catalog", new CatalogImpl("catalog", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"), "description", ImmutableMap + . of("item", new NamedResourceImpl("item", + "application/vnd.vmware.vcloud.catalogItem+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1")), "template", + new NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2")))))); + } + } + + @Singleton + public static class TestOrganizationCatalogItemSupplier extends OrganizationCatalogItemSupplier { + protected TestOrganizationCatalogItemSupplier() { + super(null, null); + } + + @Override + public Map>> get() { + return ImmutableMap + .>> of( + "org", + ImmutableMap + .> of( + "catalog", + ImmutableMap + . of( + "template", + new CatalogItemImpl( + "template", + URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"), + "description", + new NamedResourceImpl( + "template", + "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")), + ImmutableMap. of())))); + + } + } + + } + +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java new file mode 100644 index 0000000000..b14e0d6a8d --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java @@ -0,0 +1,175 @@ +/** + * + * Copyright (C) 2010 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; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.Properties; + +import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.jclouds.rest.RestContext; +import org.jclouds.rest.RestContextFactory; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Network; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VDC; +import org.testng.annotations.BeforeGroups; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +/** + * Tests behavior of {@code VCloudClient} + * + * @author Adrian Cole + */ +@Test(groups = "live", sequential = true, testName = "vcloud.VCloudClientLiveTest") +public class VCloudExpressClientLiveTest { + + protected VCloudExpressClient connection; + protected String identity; + protected RestContext context; + private String credential; + + @Test + public void testOrganization() throws Exception { + Organization response = connection.findOrganizationNamed(null); + assertNotNull(response); + assertNotNull(response.getName()); + assert response.getCatalogs().size() >= 1; + assert response.getTasksLists().size() >= 1; + assert response.getVDCs().size() >= 1; + assertEquals(connection.findOrganizationNamed(response.getName()), response); + } + + @Test + public void testCatalog() throws Exception { + Catalog response = connection.findCatalogInOrgNamed(null, null); + assertNotNull(response); + assertNotNull(response.getName()); + assertNotNull(response.getId()); + assertEquals(connection.findCatalogInOrgNamed(null, response.getName()), response); + } + + @Test + public void testGetNetwork() throws Exception { + VDC response = connection.findVDCInOrgNamed(null, null); + for (NamedResource resource : response.getAvailableNetworks().values()) { + if (resource.getType().equals(VCloudExpressMediaType.NETWORK_XML)) { + Network item = connection.getNetwork(resource.getId()); + assertNotNull(item); + } + } + } + + @Test + public void testGetCatalogItem() throws Exception { + Catalog response = connection.findCatalogInOrgNamed(null, null); + for (NamedResource resource : response.values()) { + if (resource.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.findCatalogItemInOrgCatalogNamed(null, null, resource.getName()); + assertNotNull(item); + assertNotNull(item.getEntity()); + assertNotNull(item.getId()); + assertNotNull(item.getProperties()); + assertNotNull(item.getType()); + } + } + } + + @Test + public void testGetVAppTemplate() throws Exception { + Catalog response = connection.findCatalogInOrgNamed(null, null); + for (NamedResource resource : response.values()) { + if (resource.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.getCatalogItem(resource.getId()); + if (item.getEntity().getType().equals(VCloudExpressMediaType.VAPPTEMPLATE_XML)) { + assertNotNull(connection.findVAppTemplateInOrgCatalogNamed(null, null, item.getEntity().getName())); + } + } + } + } + + @Test + public void testDefaultVDC() throws Exception { + VDC response = connection.findVDCInOrgNamed(null, null); + assertNotNull(response); + assertNotNull(response.getName()); + assertNotNull(response.getId()); + assertNotNull(response.getResourceEntities()); + assertNotNull(response.getAvailableNetworks()); + assertEquals(connection.getVDC(response.getId()), response); + } + + @Test + public void testDefaultTasksList() throws Exception { + org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null, null); + 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, null); + assertNotNull(response); + assertNotNull(response.getLocation()); + assertNotNull(response.getTasks()); + if (response.getTasks().size() > 0) { + Task task = response.getTasks().last(); + assertEquals(connection.getTask(task.getLocation()).getLocation(), task.getLocation()); + } + } + + @Test + public void testGetVApp() throws Exception { + VDC response = connection.findVDCInOrgNamed(null, null); + for (NamedResource item : response.getResourceEntities().values()) { + if (item.getType().equals(VCloudExpressMediaType.VAPP_XML)) { + VApp app = connection.getVApp(item.getId()); + assertNotNull(app); + } + } + } + + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("vcloudexpress.identity"), "vcloudexpress.identity"); + credential = checkNotNull(System.getProperty("vcloudexpress.credential"), "vcloudexpress.credential"); + } + + @BeforeGroups(groups = { "live" }) + public void setupClient() { + setupCredentials(); + Properties props = new Properties(); + context = new RestContextFactory().createContext("vcloudexpress", identity, credential, ImmutableSet + . of(new Log4JLoggingModule()), props); + + connection = context.getApi(); + } + +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayloadTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayloadTest.java index ccb79b2764..d15325e409 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayloadTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindCloneVAppParamsToXmlPayloadTest.java @@ -54,8 +54,7 @@ public class BindCloneVAppParamsToXmlPayloadTest { @Override protected void configure() { Properties props = new Properties(); - Names.bindProperties(binder(), checkNotNull(new VCloudPropertiesBuilder(props).build(), - "properties")); + Names.bindProperties(binder(), checkNotNull(new VCloudPropertiesBuilder(props).build(), "properties")); } }); @@ -70,19 +69,17 @@ public class BindCloneVAppParamsToXmlPayloadTest { request.setPayload(expected); replay(request); - BindCloneVAppParamsToXmlPayload binder = injector - .getInstance(BindCloneVAppParamsToXmlPayload.class); + BindCloneVAppParamsToXmlPayload binder = injector.getInstance(BindCloneVAppParamsToXmlPayload.class); Map map = Maps.newHashMap(); map.put("newName", "new-linux-server"); - map.put("vApp", "https://vcloud.safesecureweb.com/api/v0.8/vapp/201"); + map.put("vApp", "https://vcenterprise.bluelock.com/api/v1.0/vapp/201"); binder.bindToRequest(request, map); verify(request); } public void testDefault() throws IOException { - String expected = Utils.toStringAndClose(getClass().getResourceAsStream( - "/cloneVApp-default.xml")); + String expected = Utils.toStringAndClose(getClass().getResourceAsStream("/cloneVApp-default.xml")); GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); @@ -90,12 +87,11 @@ public class BindCloneVAppParamsToXmlPayloadTest { request.setPayload(expected); replay(request); - BindCloneVAppParamsToXmlPayload binder = injector - .getInstance(BindCloneVAppParamsToXmlPayload.class); + BindCloneVAppParamsToXmlPayload binder = injector.getInstance(BindCloneVAppParamsToXmlPayload.class); Map map = Maps.newHashMap(); map.put("newName", "my-vapp"); - map.put("vApp", "https://vcloud.safesecureweb.com/api/v0.8/vapp/4181"); + map.put("vApp", "https://vcenterprise.bluelock.com/api/v1.0/vapp/4181"); binder.bindToRequest(request, map); verify(request); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java index b46046ee40..cbc6d7ef85 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayloadTest.java @@ -56,17 +56,13 @@ public class BindInstantiateVAppTemplateParamsToXmlPayloadTest { @Override protected void configure() { Properties props = new Properties(); - props - .put(PROPERTY_VCLOUD_DEFAULT_NETWORK, - "https://vcloud.safesecureweb.com/network/1990"); - Names.bindProperties(binder(), checkNotNull(new VCloudPropertiesBuilder(props).build(), - "properties")); + props.put(PROPERTY_VCLOUD_DEFAULT_NETWORK, "https://vcenterprise.bluelock.com/api/v1.0/network/1990"); + Names.bindProperties(binder(), checkNotNull(new VCloudPropertiesBuilder(props).build(), "properties")); } }); public void testDefault() throws IOException { - String expected = Utils.toStringAndClose(getClass().getResourceAsStream( - "/newvapp-hosting.xml")); + String expected = Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp.xml")); GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); expect(request.getArgs()).andReturn(new Object[] {}).atLeastOnce(); @@ -78,7 +74,7 @@ public class BindInstantiateVAppTemplateParamsToXmlPayloadTest { Map map = Maps.newHashMap(); map.put("name", "my-vapp"); - map.put("template", "https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"); + map.put("template", "https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"); binder.bindToRequest(request, map); verify(request); @@ -88,8 +84,7 @@ public class BindInstantiateVAppTemplateParamsToXmlPayloadTest { InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); options.processorCount(1).memory(512).disk(1024); - String expected = Utils.toStringAndClose(getClass().getResourceAsStream( - "/newvapp-hostingcpumemdisk.xml")); + String expected = Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp-cpumemdisk.xml")); GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); expect(request.getArgs()).andReturn(new Object[] { options }).atLeastOnce(); @@ -101,8 +96,8 @@ public class BindInstantiateVAppTemplateParamsToXmlPayloadTest { Map map = Maps.newHashMap(); map.put("name", "my-vapp"); - map.put("template", "https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"); - map.put("network", "https://vcloud.safesecureweb.com/network/1990"); + map.put("template", "https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"); + map.put("network", "https://vcenterprise.bluelock.com/api/v1.0/network/1990"); binder.bindToRequest(request, map); verify(request); @@ -110,8 +105,7 @@ public class BindInstantiateVAppTemplateParamsToXmlPayloadTest { } public void testWithNetworkNameDhcpFenceMode() throws IOException { - String expected = Utils.toStringAndClose(getClass().getResourceAsStream( - "/newvapp-hostingnetworknamedhcpfencemode.xml")); + String expected = Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp-networknamedhcpfencemode.xml")); GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); @@ -124,8 +118,8 @@ public class BindInstantiateVAppTemplateParamsToXmlPayloadTest { Map map = Maps.newHashMap(); map.put("name", "my-vapp"); - map.put("template", "https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"); - map.put("network", "https://vcloud.safesecureweb.com/network/1990"); + map.put("template", "https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"); + map.put("network", "https://vcenterprise.bluelock.com/api/v1.0/network/1990"); map.put("networkName", "aloha"); map.put("fenceMode", FenceMode.BRIDGED); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindCloneVAppParamsToXmlPayloadTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindCloneVAppParamsToXmlPayloadTest.java new file mode 100644 index 0000000000..a9176fba3a --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindCloneVAppParamsToXmlPayloadTest.java @@ -0,0 +1,98 @@ +/** + * + * Copyright (C) 2010 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.binders; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.easymock.EasyMock.expect; +import static org.easymock.classextension.EasyMock.createMock; +import static org.easymock.classextension.EasyMock.replay; +import static org.easymock.classextension.EasyMock.verify; + +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.Properties; + +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.jclouds.util.Utils; +import org.jclouds.vcloud.VCloudExpressPropertiesBuilder; +import org.jclouds.vcloud.options.CloneVAppOptions; +import org.testng.annotations.Test; + +import com.google.common.collect.Maps; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.name.Names; + +/** + * Tests behavior of {@code BindCloneVAppParamsToXmlPayload} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.BindCloneVAppParamsToXmlPayloadTest") +public class VCloudExpressBindCloneVAppParamsToXmlPayloadTest { + Injector injector = Guice.createInjector(new AbstractModule() { + + @Override + protected void configure() { + Properties props = new Properties(); + Names.bindProperties(binder(), checkNotNull(new VCloudExpressPropertiesBuilder(props).build(), "properties")); + } + }); + + public void testWithDescriptionDeployOn() throws IOException { + String expected = Utils.toStringAndClose(getClass().getResourceAsStream("/express/cloneVApp.xml")); + + CloneVAppOptions options = new CloneVAppOptions().deploy().powerOn().withDescription( + "The description of the new vApp"); + GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); + expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); + expect(request.getArgs()).andReturn(new Object[] { options }).atLeastOnce(); + request.setPayload(expected); + replay(request); + + BindCloneVAppParamsToXmlPayload binder = injector.getInstance(BindCloneVAppParamsToXmlPayload.class); + + Map map = Maps.newHashMap(); + map.put("newName", "new-linux-server"); + map.put("vApp", "https://vcloud.safesecureweb.com/api/v0.8/vapp/201"); + binder.bindToRequest(request, map); + verify(request); + } + + public void testDefault() throws IOException { + String expected = Utils.toStringAndClose(getClass().getResourceAsStream("/express/cloneVApp-default.xml")); + + GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); + expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); + expect(request.getArgs()).andReturn(new Object[] {}).atLeastOnce(); + request.setPayload(expected); + replay(request); + + BindCloneVAppParamsToXmlPayload binder = injector.getInstance(BindCloneVAppParamsToXmlPayload.class); + + Map map = Maps.newHashMap(); + map.put("newName", "my-vapp"); + map.put("vApp", "https://vcloud.safesecureweb.com/api/v0.8/vapp/4181"); + binder.bindToRequest(request, map); + verify(request); + } +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindInstantiateVAppTemplateParamsToXmlPayloadTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindInstantiateVAppTemplateParamsToXmlPayloadTest.java new file mode 100644 index 0000000000..8f14f070fe --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/binders/VCloudExpressBindInstantiateVAppTemplateParamsToXmlPayloadTest.java @@ -0,0 +1,132 @@ +/** + * + * Copyright (C) 2010 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.binders; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.easymock.EasyMock.expect; +import static org.easymock.classextension.EasyMock.createMock; +import static org.easymock.classextension.EasyMock.replay; +import static org.easymock.classextension.EasyMock.verify; +import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_NETWORK; + +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.Properties; + +import org.jclouds.rest.internal.GeneratedHttpRequest; +import org.jclouds.util.Utils; +import org.jclouds.vcloud.VCloudExpressPropertiesBuilder; +import org.jclouds.vcloud.domain.FenceMode; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; +import org.testng.annotations.Test; + +import com.google.common.collect.Maps; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; +import com.google.inject.name.Names; + +/** + * Tests behavior of {@code BindInstantiateVAppTemplateParamsToXmlPayload} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.BindInstantiateVAppTemplateParamsToXmlPayloadTest") +public class VCloudExpressBindInstantiateVAppTemplateParamsToXmlPayloadTest { + Injector injector = Guice.createInjector(new AbstractModule() { + + @Override + protected void configure() { + Properties props = new Properties(); + props.put(PROPERTY_VCLOUD_DEFAULT_NETWORK, "https://vcloud.safesecureweb.com/network/1990"); + Names.bindProperties(binder(), checkNotNull(new VCloudExpressPropertiesBuilder(props).build(), "properties")); + } + }); + + public void testDefault() throws IOException { + String expected = Utils.toStringAndClose(getClass().getResourceAsStream("/express/newvapp-hosting.xml")); + GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); + expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); + expect(request.getArgs()).andReturn(new Object[] {}).atLeastOnce(); + request.setPayload(expected); + replay(request); + + BindInstantiateVAppTemplateParamsToXmlPayload binder = injector + .getInstance(BindInstantiateVAppTemplateParamsToXmlPayload.class); + + Map map = Maps.newHashMap(); + map.put("name", "my-vapp"); + map.put("template", "https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"); + binder.bindToRequest(request, map); + verify(request); + + } + + public void testWithProcessorMemoryDisk() throws IOException { + InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); + options.processorCount(1).memory(512).disk(1024); + + String expected = Utils + .toStringAndClose(getClass().getResourceAsStream("/express/newvapp-hostingcpumemdisk.xml")); + GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); + expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); + expect(request.getArgs()).andReturn(new Object[] { options }).atLeastOnce(); + request.setPayload(expected); + replay(request); + + BindInstantiateVAppTemplateParamsToXmlPayload binder = injector + .getInstance(BindInstantiateVAppTemplateParamsToXmlPayload.class); + + Map map = Maps.newHashMap(); + map.put("name", "my-vapp"); + map.put("template", "https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"); + map.put("network", "https://vcloud.safesecureweb.com/network/1990"); + + binder.bindToRequest(request, map); + verify(request); + + } + + public void testWithNetworkNameDhcpFenceMode() throws IOException { + String expected = Utils.toStringAndClose(getClass().getResourceAsStream( + "/express/newvapp-hostingnetworknamedhcpfencemode.xml")); + + GeneratedHttpRequest request = createMock(GeneratedHttpRequest.class); + expect(request.getEndpoint()).andReturn(URI.create("http://localhost/key")).anyTimes(); + expect(request.getArgs()).andReturn(new Object[] {}).atLeastOnce(); + request.setPayload(expected); + replay(request); + + BindInstantiateVAppTemplateParamsToXmlPayload binder = injector + .getInstance(BindInstantiateVAppTemplateParamsToXmlPayload.class); + + Map map = Maps.newHashMap(); + map.put("name", "my-vapp"); + map.put("template", "https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"); + map.put("network", "https://vcloud.safesecureweb.com/network/1990"); + map.put("networkName", "aloha"); + map.put("fenceMode", FenceMode.BRIDGED); + + binder.bindToRequest(request, map); + verify(request); + + } +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java index 446c8db74a..8b01de97a2 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java @@ -28,7 +28,6 @@ import static org.testng.Assert.assertEquals; import java.io.IOException; import java.net.URI; import java.util.Map; -import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; @@ -83,6 +82,8 @@ public class VCloudComputeClientLiveTest { protected Map expectationMap; protected Predicate addressTester; + private String identity; + private String credential; @Test(enabled = true) public void testPowerOn() throws InterruptedException, ExecutionException, TimeoutException, IOException { @@ -94,7 +95,7 @@ public class VCloudComputeClientLiveTest { VAppTemplate template = client.findVAppTemplateInOrgCatalogNamed(null, null, templateName); InstantiateVAppTemplateOptions options = processorCount(1).memory(512).disk(10 * 1025 * 1024).productProperties( - ImmutableMap.of("foo", "bar")); + ImmutableMap.of("foo", "bar")); id = URI.create(computeClient.start(null, template.getId(), templateName, options).get("id")); Expectation expectation = expectationMap.get(toTest); @@ -106,7 +107,7 @@ public class VCloudComputeClientLiveTest { private String getCompatibleServerName(OsFamily toTest) { String serverName = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, toTest.toString()).substring(0, - toTest.toString().length() <= 15 ? toTest.toString().length() : 14); + toTest.toString().length() <= 15 ? toTest.toString().length() : 14); return serverName; } @@ -117,19 +118,20 @@ public class VCloudComputeClientLiveTest { } private void verifyConfigurationOfVApp(VApp vApp, String serverName, String expectedOs, int processorCount, - int memory, long hardDisk) { + int memory, long hardDisk) { // assertEquals(vApp.getName(), serverName); // assertEquals(vApp.getOperatingSystemDescription(), expectedOs); assertEquals(Iterables - .getOnlyElement(filter(vApp.getResourceAllocations(), resourceType(ResourceType.PROCESSOR))) - .getVirtualQuantity(), processorCount); + .getOnlyElement(filter(vApp.getResourceAllocations(), resourceType(ResourceType.PROCESSOR))) + .getVirtualQuantity(), processorCount); assertEquals(Iterables.getOnlyElement( - filter(vApp.getResourceAllocations(), resourceType(ResourceType.SCSI_CONTROLLER))).getVirtualQuantity(), 1); + filter(vApp.getResourceAllocations(), resourceType(ResourceType.SCSI_CONTROLLER))).getVirtualQuantity(), + 1); assertEquals(Iterables.getOnlyElement(filter(vApp.getResourceAllocations(), resourceType(ResourceType.MEMORY))) - .getVirtualQuantity(), memory); + .getVirtualQuantity(), memory); assertEquals(Iterables.getOnlyElement( - filter(vApp.getResourceAllocations(), resourceType(ResourceType.DISK_DRIVE))).getVirtualQuantity(), - hardDisk); + filter(vApp.getResourceAllocations(), resourceType(ResourceType.DISK_DRIVE))).getVirtualQuantity(), + hardDisk); } @AfterTest @@ -138,23 +140,23 @@ public class VCloudComputeClientLiveTest { computeClient.stop(id); } + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("vcloud.identity"), "vcloud.identity"); + credential = checkNotNull(System.getProperty("vcloud.credential"), "vcloud.credential"); + } + @BeforeGroups(groups = { "live" }) public void setupClient() { - String identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); - String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - String endpoint = checkNotNull(System.getProperty("jclouds.test.endpoint"), "jclouds.test.endpoint"); - - Properties props = new Properties(); - props.setProperty("vcloud.endpoint", endpoint); + setupCredentials(); Injector injector = new RestContextFactory().createContextBuilder("vcloud", identity, credential, - ImmutableSet. of(new Log4JLoggingModule()), props).buildInjector(); + ImmutableSet. of(new Log4JLoggingModule())).buildInjector(); computeClient = injector.getInstance(VCloudComputeClient.class); client = injector.getInstance(VCloudClient.class); addressTester = injector.getInstance(Key.get(new TypeLiteral>() { })); expectationMap = ImmutableMap. builder().put(OsFamily.CENTOS, - new Expectation(4194304 / 2 * 10, "Red Hat Enterprise Linux 5 (64-bit)")).build(); + new Expectation(4194304 / 2 * 10, "Red Hat Enterprise Linux 5 (64-bit)")).build(); provider = "vcloudtest"; templateName = "Ubuntu JeOS 9.10 (32-bit)"; } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java index 3aaa7c0482..77d34de59c 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeServiceLiveTest.java @@ -43,11 +43,15 @@ public class VCloudComputeServiceLiveTest extends BaseComputeServiceLiveTest { @Override public void setServiceDefaults() { - System.setProperty("vcloud.endpoint", checkNotNull(System.getProperty("jclouds.test.endpoint"), - "jclouds.test.endpoint")); provider = "vcloud"; } + @Override + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("vcloud.identity"), "vcloud.identity"); + credential = checkNotNull(System.getProperty("vcloud.credential"), "vcloud.credential"); + } + @Override protected JschSshClientModule getSshModule() { return new JschSshClientModule(); @@ -56,7 +60,7 @@ public class VCloudComputeServiceLiveTest extends BaseComputeServiceLiveTest { public void testAssignability() throws Exception { @SuppressWarnings("unused") RestContext tmContext = new ComputeServiceContextFactory().createContext( - provider, identity, credential).getProviderSpecificContext(); + provider, identity, credential).getProviderSpecificContext(); } @Override diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeClientLiveTest.java new file mode 100644 index 0000000000..ec49f08ad1 --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeClientLiveTest.java @@ -0,0 +1,164 @@ +/** + * + * Copyright (C) 2010 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.compute; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.filter; +import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.processorCount; +import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType; +import static org.testng.Assert.assertEquals; + +import java.io.IOException; +import java.net.URI; +import java.util.Map; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; + +import org.jclouds.compute.domain.OsFamily; +import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.jclouds.rest.RestContextFactory; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.domain.ResourceType; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeGroups; +import org.testng.annotations.Test; + +import com.google.common.base.CaseFormat; +import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.Module; +import com.google.inject.TypeLiteral; + +/** + * Tests behavior of {@code VCloudClient} + * + * @author Adrian Cole + */ +@Test(groups = "live", enabled = true, sequential = true, testName = "vcloud.VCloudClientLiveTest") +public class VCloudExpressComputeClientLiveTest { + protected String provider; + protected VCloudExpressComputeClient computeClient; + protected VCloudExpressClient client; + + protected URI id; + protected String publicAddress; + protected String templateName; + + public static class Expectation { + final long hardDisk; + final String os; + + public Expectation(long hardDisk, String os) { + this.hardDisk = hardDisk; + this.os = os; + } + } + + protected Map expectationMap; + + protected Predicate addressTester; + private String identity; + private String credential; + + @Test(enabled = true) + public void testPowerOn() throws InterruptedException, ExecutionException, TimeoutException, IOException { + OsFamily toTest = OsFamily.CENTOS; + + String serverName = getCompatibleServerName(toTest); + int processorCount = 1; + int memory = 512; + + VAppTemplate template = client.findVAppTemplateInOrgCatalogNamed(null, null, templateName); + InstantiateVAppTemplateOptions options = processorCount(1).memory(512).disk(10 * 1025 * 1024).productProperties( + ImmutableMap.of("foo", "bar")); + + id = URI.create(computeClient.start(null, template.getId(), templateName, options).get("id")); + Expectation expectation = expectationMap.get(toTest); + + VApp vApp = client.getVApp(id); + verifyConfigurationOfVApp(vApp, serverName, expectation.os, processorCount, memory, expectation.hardDisk); + assertEquals(vApp.getStatus(), VAppStatus.ON); + } + + private String getCompatibleServerName(OsFamily toTest) { + String serverName = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_HYPHEN, toTest.toString()).substring(0, + toTest.toString().length() <= 15 ? toTest.toString().length() : 14); + return serverName; + } + + @Test(dependsOnMethods = "testPowerOn", enabled = true) + public void testGetPublicAddresses() { + publicAddress = Iterables.getLast(computeClient.getPublicAddresses(id)); + assert !addressTester.apply(publicAddress); + } + + private void verifyConfigurationOfVApp(VApp vApp, String serverName, String expectedOs, int processorCount, + int memory, long hardDisk) { + // assertEquals(vApp.getName(), serverName); + // assertEquals(vApp.getOperatingSystemDescription(), expectedOs); + assertEquals(Iterables + .getOnlyElement(filter(vApp.getResourceAllocations(), resourceType(ResourceType.PROCESSOR))) + .getVirtualQuantity(), processorCount); + assertEquals(Iterables.getOnlyElement( + filter(vApp.getResourceAllocations(), resourceType(ResourceType.SCSI_CONTROLLER))).getVirtualQuantity(), + 1); + assertEquals(Iterables.getOnlyElement(filter(vApp.getResourceAllocations(), resourceType(ResourceType.MEMORY))) + .getVirtualQuantity(), memory); + assertEquals(Iterables.getOnlyElement( + filter(vApp.getResourceAllocations(), resourceType(ResourceType.DISK_DRIVE))).getVirtualQuantity(), + hardDisk); + } + + @AfterTest + void cleanup() throws InterruptedException, ExecutionException, TimeoutException { + if (id != null) + computeClient.stop(id); + } + + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("vcloudexpress.identity"), "vcloudexpress.identity"); + credential = checkNotNull(System.getProperty("vcloudexpress.credential"), "vcloudexpress.credential"); + } + + @BeforeGroups(groups = { "live" }) + public void setupClient() { + setupCredentials(); + Injector injector = new RestContextFactory().createContextBuilder("vcloudexpress", identity, credential, + ImmutableSet. of(new Log4JLoggingModule())).buildInjector(); + + computeClient = injector.getInstance(VCloudExpressComputeClient.class); + client = injector.getInstance(VCloudExpressClient.class); + addressTester = injector.getInstance(Key.get(new TypeLiteral>() { + })); + expectationMap = ImmutableMap. builder().put(OsFamily.CENTOS, + new Expectation(4194304 / 2 * 10, "Red Hat Enterprise Linux 5 (64-bit)")).build(); + provider = "vcloudtest"; + templateName = "Ubuntu JeOS 9.10 (32-bit)"; + } + +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeServiceLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeServiceLiveTest.java new file mode 100644 index 0000000000..832b90459a --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudExpressComputeServiceLiveTest.java @@ -0,0 +1,80 @@ +/** + * + * Copyright (C) 2010 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.compute; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.testng.Assert.assertEquals; + +import org.jclouds.compute.BaseComputeServiceLiveTest; +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.domain.ComputeMetadata; +import org.jclouds.compute.domain.ComputeType; +import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.rest.RestContext; +import org.jclouds.ssh.jsch.config.JschSshClientModule; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; +import org.testng.annotations.Test; + +/** + * + * + * @author Adrian Cole + */ +@Test(groups = "live", enabled = true, sequential = true, testName = "vcloud.VCloudExpressComputeServiceLiveTest") +public class VCloudExpressComputeServiceLiveTest extends BaseComputeServiceLiveTest { + + @Override + public void setServiceDefaults() { + provider = "vcloudexpress"; + } + + @Override + protected void setupCredentials() { + identity = checkNotNull(System.getProperty("vcloudexpress.identity"), "vcloudexpress.identity"); + credential = checkNotNull(System.getProperty("vcloudexpress.credential"), "vcloudexpress.credential"); + } + + @Override + protected JschSshClientModule getSshModule() { + return new JschSshClientModule(); + } + + public void testAssignability() throws Exception { + @SuppressWarnings("unused") + RestContext tmContext = new ComputeServiceContextFactory() + .createContext(provider, identity, credential).getProviderSpecificContext(); + } + + @Override + public void testListNodes() throws Exception { + for (ComputeMetadata node : client.listNodes()) { + assert node.getProviderId() != null; + assert node.getLocation() != null; + assertEquals(node.getType(), ComputeType.NODE); + NodeMetadata allData = client.getNodeMetadata(node.getId()); + assert allData.getExtra().get("processor/count") != null : allData.getExtra(); + assert allData.getExtra().get("disk_drive/0/kb") != null : allData.getExtra(); + assert allData.getExtra().get("memory/mb") != null : allData.getExtra(); + System.out.println(allData.getExtra()); + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModuleTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModuleTest.java new file mode 100644 index 0000000000..32836b6598 --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModuleTest.java @@ -0,0 +1,38 @@ +/** + * + * Copyright (C) 2010 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.compute.config; + +import org.jclouds.vcloud.domain.VAppStatus; +import org.testng.annotations.Test; + +/** + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.VCloudExpressComputeServiceContextModuleTest") +public class VCloudExpressComputeServiceContextModuleTest { + + public void testAllStatusCovered() { + + for (VAppStatus state : VAppStatus.values()) { + assert VCloudExpressComputeServiceContextModule.vAppStatusToNodeState.containsKey(state) : state; + } + + } +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java index cf4f31ea74..49842e393b 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java @@ -28,7 +28,7 @@ import javax.ws.rs.core.HttpHeaders; import org.jclouds.http.HttpResponse; import org.jclouds.http.functions.BaseHandlerTest; import org.jclouds.io.Payloads; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.testng.annotations.BeforeTest; @@ -59,7 +59,7 @@ public class ParseLoginResponseFromHeadersTest extends BaseHandlerTest { VCloudSession reply = parser.apply(response); assertEquals(reply.getVCloudToken(), "9er4d061-4bff-48fa-84b1-5da7166764d2"); assertEquals(reply.getOrgs(), ImmutableMap.of("adrian@jclouds.org", new NamedResourceImpl("adrian@jclouds.org", - VCloudMediaType.ORG_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")))); + VCloudExpressMediaType.ORG_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")))); } @@ -75,7 +75,7 @@ public class ParseLoginResponseFromHeadersTest extends BaseHandlerTest { VCloudSession reply = parser.apply(response); assertEquals(reply.getVCloudToken(), "c9f232506df9b65d7b7d97b7499eddd7"); assertEquals(reply.getOrgs(), ImmutableMap.of("adrian@jclouds.org", new NamedResourceImpl("adrian@jclouds.org", - VCloudMediaType.ORG_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")))); + VCloudExpressMediaType.ORG_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")))); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java index 8ab0cc7b5a..6704615c75 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java @@ -19,7 +19,7 @@ package org.jclouds.vcloud.xml; -import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; import static org.testng.Assert.assertEquals; import java.io.InputStream; diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java index fb6928d218..ce4ea7338f 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java @@ -19,8 +19,8 @@ package org.jclouds.vcloud.xml; -import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; import static org.testng.Assert.assertEquals; import java.io.InputStream; @@ -29,7 +29,7 @@ import java.net.URI; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.Factory; import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.testng.annotations.Test; @@ -59,7 +59,7 @@ public class OrgHandlerTest { "Miami Environment 1 Catalog", CATALOG_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32/catalog")))); assertEquals(result.getVDCs(), ImmutableMap.of("Miami Environment 1", new NamedResourceImpl( - "Miami Environment 1", VCloudMediaType.VDC_XML, URI + "Miami Environment 1", VCloudExpressMediaType.VDC_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32")))); assertEquals(result.getTasksLists(), ImmutableMap.of("Miami Environment 1 Tasks List", new NamedResourceImpl( "Miami Environment 1 Tasks List", TASKSLIST_XML, URI @@ -76,7 +76,7 @@ public class OrgHandlerTest { assertEquals(result.getCatalogs(), ImmutableMap.of("HMS Shared Catalog", new NamedResourceImpl( "HMS Shared Catalog", CATALOG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")))); assertEquals(result.getVDCs(), ImmutableMap.of("188849 Virtual DataCenter", new NamedResourceImpl( - "188849 Virtual DataCenter", VCloudMediaType.VDC_XML, URI + "188849 Virtual DataCenter", VCloudExpressMediaType.VDC_XML, URI .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/188849")))); assertEquals(result.getTasksLists(), ImmutableMap.of("188849 Task List", new NamedResourceImpl("188849 Task List", TASKSLIST_XML, URI diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgListHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgListHandlerTest.java index 01a0371e7f..fa51ff5798 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgListHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgListHandlerTest.java @@ -26,7 +26,7 @@ import java.net.URI; import java.util.Map; import org.jclouds.http.functions.BaseHandlerTest; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.testng.annotations.Test; @@ -46,6 +46,6 @@ public class OrgListHandlerTest extends BaseHandlerTest { Map result = factory.create(injector.getInstance(OrgListHandler.class)).parse(is); assertEquals(result, ImmutableMap.of("adrian@jclouds.org", new NamedResourceImpl("adrian@jclouds.org", - VCloudMediaType.ORG_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")))); + VCloudExpressMediaType.ORG_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")))); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TaskHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TaskHandlerTest.java index 2c59cef295..dc22c24af0 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TaskHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TaskHandlerTest.java @@ -26,7 +26,7 @@ import java.net.URI; import org.jclouds.date.DateService; import org.jclouds.http.functions.BaseHandlerTest; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TaskStatus; import org.jclouds.vcloud.domain.VAppStatus; @@ -60,8 +60,8 @@ public class TaskHandlerTest extends BaseHandlerTest { Task expects = new TaskImpl(URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/task/3299"), TaskStatus.SUCCESS, dateService.iso8601DateParse("2009-08-24T21:29:32.983Z"), dateService .iso8601DateParse("2009-08-24T21:29:44.65Z"), null, new NamedResourceImpl("VDC Name", - VCloudMediaType.VDC_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/1")), - new NamedResourceImpl("Server1", VCloudMediaType.VAPP_XML, URI + VCloudExpressMediaType.VDC_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/1")), + new NamedResourceImpl("Server1", VCloudExpressMediaType.VAPP_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/4012") ), null @@ -98,7 +98,7 @@ public class TaskHandlerTest extends BaseHandlerTest { .iso8601SecondsDateParse("2010-01-14T20:05:02Z"), dateService .iso8601SecondsDateParse("2010-01-15T20:05:02Z"), - new NamedResourceImpl("188849-96", VCloudMediaType.VAPP_XML, URI + new NamedResourceImpl("188849-96", VCloudExpressMediaType.VAPP_XML, URI .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/188849-96")), null, null); assertEquals(result, expects); } @@ -111,8 +111,8 @@ public class TaskHandlerTest extends BaseHandlerTest { Task expects = new TaskImpl(URI.create("http://10.150.4.49/api/v0.8/task/23"), TaskStatus.ERROR, dateService .iso8601SecondsDateParse("2009-12-07T19:05:02Z"), dateService .iso8601SecondsDateParse("2009-12-10T14:40:32Z"), null, new NamedResourceImpl("APIOrg", - VCloudMediaType.ORG_XML, URI.create("http://10.150.4.49/api/v0.8/org/1")), new NamedResourceImpl( - "testapp1", VCloudMediaType.VAPP_XML, URI.create("http://10.150.4.49/api/v0.8/vapp/1")), + VCloudExpressMediaType.ORG_XML, URI.create("http://10.150.4.49/api/v0.8/org/1")), new NamedResourceImpl( + "testapp1", VCloudExpressMediaType.VAPP_XML, URI.create("http://10.150.4.49/api/v0.8/vapp/1")), new TaskImpl.ErrorImpl("Error processing job", "500", " Error in runDailySummaries date used:2009-12-09 19:40:30.577326+00:00")); assertEquals(result, expects); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TasksListHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TasksListHandlerTest.java index 699616722c..846d1e1068 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TasksListHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/TasksListHandlerTest.java @@ -26,7 +26,7 @@ import java.net.URI; import org.jclouds.date.DateService; import org.jclouds.http.functions.BaseHandlerTest; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TaskStatus; import org.jclouds.vcloud.domain.TasksList; @@ -64,15 +64,15 @@ public class TasksListHandlerTest extends BaseHandlerTest { URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/task/3300"), TaskStatus.SUCCESS, dateService .iso8601DateParse("2009-08-24T21:30:19.587Z"), dateService.iso8601DateParse("2009-08-24T21:30:32.63Z"), - null, new NamedResourceImpl("VDC Name", VCloudMediaType.VDC_XML, URI + null, new NamedResourceImpl("VDC Name", VCloudExpressMediaType.VDC_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/1")), new NamedResourceImpl( - "Server1", VCloudMediaType.VAPP_XML, URI + "Server1", VCloudExpressMediaType.VAPP_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/4012")), null); Task task2 = new TaskImpl(URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/task/3299"), TaskStatus.SUCCESS, dateService.iso8601DateParse("2009-08-24T21:29:32.983Z"), dateService .iso8601DateParse("2009-08-24T21:29:44.65Z"), null, new NamedResourceImpl("VDC Name", - VCloudMediaType.VDC_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/1")), - new NamedResourceImpl("Server1", VCloudMediaType.VAPP_XML, URI + VCloudExpressMediaType.VDC_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/1")), + new NamedResourceImpl("Server1", VCloudExpressMediaType.VAPP_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/4012")), null); assertEquals(result.getTasks(), ImmutableSortedSet.of(task1, task2)); } diff --git a/vcloud/core/src/test/resources/cloneVApp-default.xml b/vcloud/core/src/test/resources/cloneVApp-default.xml index 48e0681e92..fdddd98fb4 100644 --- a/vcloud/core/src/test/resources/cloneVApp-default.xml +++ b/vcloud/core/src/test/resources/cloneVApp-default.xml @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/vcloud/core/src/test/resources/cloneVApp.xml b/vcloud/core/src/test/resources/cloneVApp.xml index bdc3aaeb3a..35690f61fc 100644 --- a/vcloud/core/src/test/resources/cloneVApp.xml +++ b/vcloud/core/src/test/resources/cloneVApp.xml @@ -1 +1 @@ -The description of the new vApp \ No newline at end of file +The description of the new vApp \ No newline at end of file diff --git a/vcloud/core/src/test/resources/express/cloneVApp-default.xml b/vcloud/core/src/test/resources/express/cloneVApp-default.xml new file mode 100644 index 0000000000..48e0681e92 --- /dev/null +++ b/vcloud/core/src/test/resources/express/cloneVApp-default.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vcloud/core/src/test/resources/express/cloneVApp.xml b/vcloud/core/src/test/resources/express/cloneVApp.xml new file mode 100644 index 0000000000..bdc3aaeb3a --- /dev/null +++ b/vcloud/core/src/test/resources/express/cloneVApp.xml @@ -0,0 +1 @@ +The description of the new vApp \ No newline at end of file diff --git a/vcloud/core/src/test/resources/newvapp-hosting.xml b/vcloud/core/src/test/resources/express/newvapp-hosting.xml similarity index 100% rename from vcloud/core/src/test/resources/newvapp-hosting.xml rename to vcloud/core/src/test/resources/express/newvapp-hosting.xml diff --git a/vcloud/core/src/test/resources/newvapp-hostingcpumemdisk.xml b/vcloud/core/src/test/resources/express/newvapp-hostingcpumemdisk.xml similarity index 100% rename from vcloud/core/src/test/resources/newvapp-hostingcpumemdisk.xml rename to vcloud/core/src/test/resources/express/newvapp-hostingcpumemdisk.xml diff --git a/vcloud/core/src/test/resources/newvapp-hostingnetworknamedhcpfencemode.xml b/vcloud/core/src/test/resources/express/newvapp-hostingnetworknamedhcpfencemode.xml similarity index 100% rename from vcloud/core/src/test/resources/newvapp-hostingnetworknamedhcpfencemode.xml rename to vcloud/core/src/test/resources/express/newvapp-hostingnetworknamedhcpfencemode.xml diff --git a/vcloud/core/src/test/resources/newvapp-cpumemdisk.xml b/vcloud/core/src/test/resources/newvapp-cpumemdisk.xml new file mode 100644 index 0000000000..20426183fe --- /dev/null +++ b/vcloud/core/src/test/resources/newvapp-cpumemdisk.xml @@ -0,0 +1 @@ +131245129171024bridged \ No newline at end of file diff --git a/vcloud/core/src/test/resources/newvapp-networknamedhcpfencemode.xml b/vcloud/core/src/test/resources/newvapp-networknamedhcpfencemode.xml new file mode 100644 index 0000000000..60c097b45a --- /dev/null +++ b/vcloud/core/src/test/resources/newvapp-networknamedhcpfencemode.xml @@ -0,0 +1 @@ +bridged \ No newline at end of file diff --git a/vcloud/core/src/test/resources/newvapp.xml b/vcloud/core/src/test/resources/newvapp.xml new file mode 100644 index 0000000000..60c097b45a --- /dev/null +++ b/vcloud/core/src/test/resources/newvapp.xml @@ -0,0 +1 @@ +bridged \ No newline at end of file diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java index fbd10b2f81..47b0bf8b06 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java @@ -19,8 +19,8 @@ package org.jclouds.vcloud.hostingdotcom; -import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; import java.net.URI; @@ -40,7 +40,7 @@ import org.jclouds.rest.annotations.ParamValidators; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.XMLResponseParser; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; -import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; @@ -60,7 +60,7 @@ import com.google.common.util.concurrent.ListenableFuture; * @author Adrian Cole */ @RequestFilters(SetVCloudTokenCookie.class) -public interface HostingDotComVCloudAsyncClient extends VCloudAsyncClient { +public interface HostingDotComVCloudAsyncClient extends VCloudExpressAsyncClient { @GET @Endpoint(org.jclouds.vcloud.endpoints.Catalog.class) diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java index f0cb42288a..91cab53760 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java @@ -23,7 +23,7 @@ import java.net.URI; import java.util.concurrent.TimeUnit; import org.jclouds.concurrent.Timeout; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -36,7 +36,7 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; * @author Adrian Cole */ @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) -public interface HostingDotComVCloudClient extends VCloudClient { +public interface HostingDotComVCloudClient extends VCloudExpressClient { @Override @Timeout(duration = 600, timeUnit = TimeUnit.SECONDS) diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java index a760e292c7..24300385eb 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java @@ -24,7 +24,7 @@ import java.util.Properties; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; -import org.jclouds.vcloud.VCloudContextBuilder; +import org.jclouds.vcloud.VCloudExpressContextBuilder; import org.jclouds.vcloud.hostingdotcom.compute.config.HostingDotComVCloudComputeServiceContextModule; import org.jclouds.vcloud.hostingdotcom.config.HostingDotComVCloudRestClientModule; @@ -44,7 +44,7 @@ import com.google.inject.Module; * @author Adrian Cole * @see HostingDotComVCloudComputeServiceContext */ -public class HostingDotComVCloudContextBuilder extends VCloudContextBuilder { +public class HostingDotComVCloudContextBuilder extends VCloudExpressContextBuilder { public HostingDotComVCloudContextBuilder(Properties props) { super(props); diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java index e9a6a1b1b4..79ea4dec00 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java @@ -24,14 +24,14 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEO import java.util.Properties; -import org.jclouds.vcloud.VCloudPropertiesBuilder; +import org.jclouds.vcloud.VCloudExpressPropertiesBuilder; /** * Builds properties used in hosting.com VCloud Clients * * @author Adrian Cole */ -public class HostingDotComVCloudPropertiesBuilder extends VCloudPropertiesBuilder { +public class HostingDotComVCloudPropertiesBuilder extends VCloudExpressPropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java index bb89b0b253..6fd82e187b 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java @@ -26,8 +26,8 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.compute.domain.NodeState; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; @@ -40,10 +40,10 @@ import com.google.common.collect.ImmutableMap; * @author Adrian Cole */ @Singleton -public class HostingDotComVCloudComputeClient extends BaseVCloudComputeClient { +public class HostingDotComVCloudComputeClient extends BaseVCloudExpressComputeClient { @Inject - protected HostingDotComVCloudComputeClient(VCloudClient client, Predicate successTester, + protected HostingDotComVCloudComputeClient(VCloudExpressClient client, Predicate successTester, Map vAppStatusToNodeState) { super(client, successTester, vAppStatusToNodeState); } diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java index 7e930272c3..68cab3a3da 100755 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java @@ -22,8 +22,8 @@ package org.jclouds.vcloud.hostingdotcom.compute.config; import static org.jclouds.compute.domain.OsFamily.CENTOS; import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.vcloud.compute.VCloudComputeClient; -import org.jclouds.vcloud.compute.config.VCloudComputeServiceContextModule; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; import org.jclouds.vcloud.hostingdotcom.compute.HostingDotComVCloudComputeClient; import com.google.inject.Injector; @@ -34,12 +34,12 @@ import com.google.inject.Injector; * * @author Adrian Cole */ -public class HostingDotComVCloudComputeServiceContextModule extends VCloudComputeServiceContextModule { +public class HostingDotComVCloudComputeServiceContextModule extends VCloudExpressComputeServiceContextModule { @Override protected void configure() { super.configure(); - bind(VCloudComputeClient.class).to(HostingDotComVCloudComputeClient.class); + bind(VCloudExpressComputeClient.class).to(HostingDotComVCloudComputeClient.class); } @Override diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java index 86cd186403..1034d4dfaf 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java @@ -25,9 +25,9 @@ import javax.inject.Singleton; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.config.BaseVCloudRestClientModule; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.config.BaseVCloudExpressRestClientModule; import org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudAsyncClient; import org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudClient; @@ -43,7 +43,7 @@ import com.google.inject.Provides; @ConfiguresRestClient public class HostingDotComVCloudRestClientModule extends - BaseVCloudRestClientModule { + BaseVCloudExpressRestClientModule { public HostingDotComVCloudRestClientModule() { super(HostingDotComVCloudClient.class, @@ -52,19 +52,19 @@ public class HostingDotComVCloudRestClientModule @Provides @Singleton - protected VCloudAsyncClient provideVCloudAsyncClient( + protected VCloudExpressAsyncClient provideVCloudAsyncClient( HostingDotComVCloudAsyncClient in) { return in; } @Provides @Singleton - protected VCloudClient provideVCloudClient(HostingDotComVCloudClient in) { + protected VCloudExpressClient provideVCloudClient(HostingDotComVCloudClient in) { return in; } @Override - protected URI provideDefaultNetwork(VCloudClient client) { + protected URI provideDefaultNetwork(VCloudExpressClient client) { return URI.create("https://vcloud.safesecureweb.com/network/1990"); } diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java index 6c1759ea63..ecbada0a2b 100644 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java +++ b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java @@ -38,7 +38,7 @@ import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory; import org.jclouds.rest.RestContextFactory.ContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.endpoints.Org; @@ -119,7 +119,7 @@ public class HostingDotComVCloudAsyncClientTest extends RestClientTest modules) { // TODO make ecloud version which retrieves passwords from the vapptemplate description - modules.add(new VCloudComputeServiceContextModule()); + modules.add(new VCloudExpressComputeServiceContextModule()); } @Override diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java index a755c6f133..c7a051bb0c 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java @@ -19,11 +19,11 @@ package org.jclouds.vcloud.terremark; -import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; -import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudMediaType.ORG_XML; -import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; -import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.ORG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.CATALOGITEMCUSTOMIZATIONPARAMETERS_XML; import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.INTERNETSERVICESLIST_XML; import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.INTERNETSERVICE_XML; @@ -56,8 +56,8 @@ import org.jclouds.rest.annotations.XMLResponseParser; import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; @@ -109,9 +109,9 @@ import com.google.common.util.concurrent.ListenableFuture; * @author Adrian Cole */ @RequestFilters(SetVCloudTokenCookie.class) -public interface TerremarkVCloudAsyncClient extends VCloudAsyncClient { +public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { /** - * @see VCloudClient#getCatalogItemInOrg + * @see VCloudExpressClient#getCatalogItemInOrg */ @Override @GET @@ -124,7 +124,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); /** - * @see VCloudClient#getCatalogItem + * @see VCloudExpressClient#getCatalogItem */ @Override @GET @@ -149,7 +149,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudAsyncClient { ListenableFuture getOrganization(@EndpointParam URI orgId); /** - * @see VCloudClient#findOrganizationNamed + * @see VCloudExpressClient#findOrganizationNamed */ @Override @GET @@ -190,7 +190,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudAsyncClient { ListenableFuture getVDC(@EndpointParam URI vdc); /** - * @see VCloudClient#findVDCInOrgNamed + * @see VCloudExpressClient#findVDCInOrgNamed */ @GET @Override @@ -202,7 +202,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); /** - * @see VCloudClient#instantiateVAppTemplateInVDC + * @see VCloudExpressClient#instantiateVAppTemplateInVDC */ @Override @POST diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java index 1646a8491e..dbc638197a 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java @@ -26,7 +26,7 @@ import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import org.jclouds.concurrent.Timeout; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.terremark.domain.CustomizationParameters; @@ -50,7 +50,7 @@ import org.jclouds.vcloud.terremark.options.AddNodeOptions; * @author Adrian Cole */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) -public interface TerremarkVCloudClient extends VCloudClient { +public interface TerremarkVCloudClient extends VCloudExpressClient { @Override TerremarkCatalogItem getCatalogItem(URI catalogItem); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressContextBuilder.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressContextBuilder.java index 69d065fdb2..3ce7713c9f 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressContextBuilder.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressContextBuilder.java @@ -24,7 +24,7 @@ import java.util.Properties; import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; import org.jclouds.logging.jdk.config.JDKLoggingModule; -import org.jclouds.vcloud.VCloudContextBuilder; +import org.jclouds.vcloud.VCloudExpressContextBuilder; import org.jclouds.vcloud.terremark.compute.config.TerremarkVCloudComputeServiceContextModule; import org.jclouds.vcloud.terremark.config.TerremarkVCloudExpressRestClientModule; @@ -44,7 +44,7 @@ import com.google.inject.Module; * @author Adrian Cole * @see TerremarkVCloudComputeServiceContext */ -public class TerremarkVCloudExpressContextBuilder extends VCloudContextBuilder { +public class TerremarkVCloudExpressContextBuilder extends VCloudExpressContextBuilder { public TerremarkVCloudExpressContextBuilder(Properties props) { super(props); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudMediaType.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudMediaType.java index 951460c484..0da3343c3a 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudMediaType.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudMediaType.java @@ -21,14 +21,14 @@ package org.jclouds.vcloud.terremark; import javax.ws.rs.core.MediaType; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; /** * Resource Types used in Terremark VCloud * * @see MediaType */ -public interface TerremarkVCloudMediaType extends VCloudMediaType { +public interface TerremarkVCloudMediaType extends VCloudExpressMediaType { /** * "application/vnd.tmrk.vCloud.publicIp+xml" diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudPropertiesBuilder.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudPropertiesBuilder.java index 73c6f3ba99..e9389b8b38 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudPropertiesBuilder.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudPropertiesBuilder.java @@ -26,14 +26,14 @@ import static org.jclouds.vcloud.terremark.reference.TerremarkConstants.PROPERTY import java.util.Properties; -import org.jclouds.vcloud.VCloudPropertiesBuilder; +import org.jclouds.vcloud.VCloudExpressPropertiesBuilder; /** * Builds properties used in Terremark VCloud Clients * * @author Adrian Cole */ -public class TerremarkVCloudPropertiesBuilder extends VCloudPropertiesBuilder { +public class TerremarkVCloudPropertiesBuilder extends VCloudExpressPropertiesBuilder { @Override protected Properties defaultProperties() { Properties properties = super.defaultProperties(); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java index 657b093ab3..2cf0f2859e 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java @@ -38,7 +38,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.domain.Credentials; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TaskStatus; import org.jclouds.vcloud.domain.TasksList; @@ -61,7 +61,7 @@ import com.google.common.collect.Sets; * @author Adrian Cole */ @Singleton -public class TerremarkVCloudComputeClient extends BaseVCloudComputeClient { +public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient { private final TerremarkVCloudExpressClient client; private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java index 958c3f5ee3..0262264685 100755 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java @@ -42,13 +42,13 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.VCloudComputeClient; -import org.jclouds.vcloud.compute.config.VCloudComputeServiceContextModule; -import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; +import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeClient; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeService; import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials; @@ -74,7 +74,7 @@ import com.google.inject.TypeLiteral; * * @author Adrian Cole */ -public class TerremarkVCloudComputeServiceContextModule extends VCloudComputeServiceContextModule { +public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressComputeServiceContextModule { @Provides @Singleton @@ -94,15 +94,15 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudComputeSer // NOTE bind(AddNodeWithTagStrategy.class).to(TerremarkVCloudAddNodeWithTagStrategy.class); bind(new TypeLiteral() { - }).to(new TypeLiteral>() { + }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); // NOTE bind(RunNodesAndAddToSetStrategy.class).to(TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.class); - bind(ListNodesStrategy.class).to(VCloudListNodesStrategy.class); + bind(ListNodesStrategy.class).to(VCloudExpressListNodesStrategy.class); // NOTE bind(GetNodeMetadataStrategy.class).to(TerremarkVCloudGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(VCloudDestroyNodeStrategy.class); + bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); + bind(DestroyNodeStrategy.class).to(VCloudExpressDestroyNodeStrategy.class); bindLoadBalancer(); // MORE specifics... bind(new TypeLiteral>() { @@ -110,7 +110,7 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudComputeSer }); bind(TemplateOptions.class).to(TerremarkVCloudTemplateOptions.class); bind(ComputeService.class).to(TerremarkVCloudComputeService.class); - bind(VCloudComputeClient.class).to(TerremarkVCloudComputeClient.class); + bind(VCloudExpressComputeClient.class).to(TerremarkVCloudComputeClient.class); bind(PopulateDefaultLoginCredentialsForImageStrategy.class).to( ParseVAppTemplateDescriptionToGetDefaultLoginCredentials.class); bind(SecureRandom.class).toInstance(new SecureRandom()); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java index ae248953e8..0e8be44799 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java @@ -29,7 +29,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.endpoints.VDC; import org.jclouds.vcloud.terremark.compute.domain.OrgAndName; @@ -51,10 +51,10 @@ public class NodeMetadataToOrgAndName implements Function> vdcToOrg; - private final VCloudClient client; + private final VCloudExpressClient client; @Inject - NodeMetadataToOrgAndName(VCloudClient client, @VDC Supplier> vdcToOrg) { + NodeMetadataToOrgAndName(VCloudExpressClient client, @VDC Supplier> vdcToOrg) { this.vdcToOrg = vdcToOrg; this.client = client; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java index b916e6bdeb..bf7632bca0 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java @@ -23,6 +23,8 @@ import static com.google.common.base.Preconditions.checkNotNull; import static org.jclouds.compute.util.ComputeServiceUtils.installNewCredentials; import java.net.URI; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentMap; import javax.annotation.Resource; @@ -30,21 +32,29 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; +import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Credentials; import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.domain.VCloudLocation; -import org.jclouds.vcloud.compute.functions.VCloudGetNodeMetadata; -import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; +import org.jclouds.vcloud.compute.functions.FindLocationForResource; +import org.jclouds.vcloud.compute.functions.GetExtra; +import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; +import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials; import org.jclouds.vcloud.terremark.compute.domain.OrgAndName; +import com.google.common.base.Supplier; + /** * @author Adrian Cole */ @Singleton -public class TerremarkVCloudGetNodeMetadataStrategy extends VCloudGetNodeMetadataStrategy { +public class TerremarkVCloudGetNodeMetadataStrategy extends VCloudExpressGetNodeMetadataStrategy { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; @@ -52,15 +62,17 @@ public class TerremarkVCloudGetNodeMetadataStrategy extends VCloudGetNodeMetadat private final ConcurrentMap credentialsMap; @Inject - protected TerremarkVCloudGetNodeMetadataStrategy(VCloudGetNodeMetadata getNodeMetadata, - ConcurrentMap credentialsMap) { - super(getNodeMetadata); + protected TerremarkVCloudGetNodeMetadataStrategy(VCloudExpressClient client, + VCloudExpressComputeClient computeClient, Map vAppStatusToNodeState, + GetExtra getExtra, FindLocationForResource findLocationForResourceInVDC, + Supplier> images, ConcurrentMap credentialsMap) { + super(client, computeClient, vAppStatusToNodeState, getExtra, findLocationForResourceInVDC, images); this.credentialsMap = credentialsMap; } @Override public NodeMetadata execute(String id) { - NodeMetadata node = getNodeMetadata.execute(checkNotNull(id, "node.id")); + NodeMetadata node = super.execute(checkNotNull(id, "node.id")); if (node == null) return null; if (node.getTag() != null) { diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java index 8bc6c7a3aa..5aa536fecc 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java @@ -33,8 +33,9 @@ import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; import org.jclouds.vcloud.compute.functions.ImagesInOrganization; -import org.jclouds.vcloud.functions.OrganizatonsForLocations; +import org.jclouds.vcloud.domain.Organization; +import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.Iterables; @@ -49,11 +50,12 @@ public class VAppTemplatesInOrgs implements Supplier> { public Logger logger = Logger.NULL; private final Supplier> locations; - private final OrganizatonsForLocations organizatonsForLocations; + private final Function, Iterable> organizatonsForLocations; private final ImagesInOrganization imagesInOrganization; @Inject - VAppTemplatesInOrgs(Supplier> locations, OrganizatonsForLocations organizatonsForLocations, + VAppTemplatesInOrgs(Supplier> locations, + Function, Iterable> organizatonsForLocations, ImagesInOrganization imagesInOrganization) { this.locations = locations; this.organizatonsForLocations = organizatonsForLocations; diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java index fe64668cf8..fbb096657e 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java @@ -23,8 +23,8 @@ import javax.inject.Singleton; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; import org.jclouds.vcloud.terremark.TerremarkECloudAsyncClient; @@ -48,13 +48,13 @@ public class TerremarkECloudRestClientModule extends @Provides @Singleton - protected VCloudAsyncClient provideVCloudAsyncClient(TerremarkECloudAsyncClient in) { + protected VCloudExpressAsyncClient provideVCloudAsyncClient(TerremarkECloudAsyncClient in) { return in; } @Provides @Singleton - protected VCloudClient provideVCloudClient(TerremarkECloudClient in) { + protected VCloudExpressClient provideVCloudClient(TerremarkECloudClient in) { return in; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java index 2b9bdadd84..1016e7b63c 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java @@ -29,7 +29,7 @@ import org.jclouds.http.annotation.ClientError; import org.jclouds.http.annotation.Redirection; import org.jclouds.http.annotation.ServerError; import org.jclouds.util.Utils; -import org.jclouds.vcloud.config.BaseVCloudRestClientModule; +import org.jclouds.vcloud.config.BaseVCloudExpressRestClientModule; import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; import org.jclouds.vcloud.terremark.handlers.ParseTerremarkVCloudErrorFromHttpResponse; @@ -37,7 +37,7 @@ import org.jclouds.vcloud.terremark.handlers.ParseTerremarkVCloudErrorFromHttpRe import com.google.inject.Provides; public abstract class TerremarkRestClientModule - extends BaseVCloudRestClientModule { + extends BaseVCloudExpressRestClientModule { public TerremarkRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java index a115e2815d..e15a3f971a 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java @@ -32,8 +32,8 @@ import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.util.Utils; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.VCloudExpressAsyncClient; +import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient; @@ -63,13 +63,13 @@ public class TerremarkVCloudExpressRestClientModule extends @Provides @Singleton - protected VCloudAsyncClient provideVCloudAsyncClient(TerremarkVCloudExpressAsyncClient in) { + protected VCloudExpressAsyncClient provideVCloudAsyncClient(TerremarkVCloudExpressAsyncClient in) { return in; } @Provides @Singleton - protected VCloudClient provideVCloudClient(TerremarkVCloudExpressClient in) { + protected VCloudExpressClient provideVCloudClient(TerremarkVCloudExpressClient in) { return in; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java index fe9c131c91..cd9871e836 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java @@ -19,7 +19,7 @@ package org.jclouds.vcloud.terremark.xml; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; @@ -56,7 +56,7 @@ public class TerremarkVDCHandler extends VDCHandler { publicIps = Utils.newNamedResource(attributes); } else { String type = attributes.getValue(attributes.getIndex("type")); - if (type.equals(VCloudMediaType.CATALOG_XML)) { + if (type.equals(VCloudExpressMediaType.CATALOG_XML)) { catalog = Utils.newNamedResource(attributes); } } diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java index 55d49e2e46..14f1ae0d90 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java @@ -47,8 +47,8 @@ import org.jclouds.ssh.SshClient; import org.jclouds.ssh.SshException; import org.jclouds.ssh.SshClient.Factory; import org.jclouds.ssh.jsch.config.JschSshClientModule; -import org.jclouds.vcloud.VCloudClientLiveTest; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressClientLiveTest; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.ResourceAllocation; @@ -59,7 +59,7 @@ import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.options.CloneVAppOptions; -import org.jclouds.vcloud.predicates.TaskSuccess; +import org.jclouds.vcloud.predicates.VCloudExpressTaskSuccess; import org.jclouds.vcloud.terremark.domain.CustomizationParameters; import org.jclouds.vcloud.terremark.domain.InternetService; import org.jclouds.vcloud.terremark.domain.Node; @@ -78,7 +78,7 @@ import com.google.common.collect.Lists; import com.google.inject.Injector; import com.google.inject.Module; -public abstract class TerremarkClientLiveTest extends VCloudClientLiveTest { +public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTest { // Terremark service call 695,490 @Override @@ -124,7 +124,7 @@ public abstract class TerremarkClientLiveTest extends VCloudClientLiveTest { public void testGetConfigCustomizationOptions() throws Exception { Catalog response = connection.findCatalogInOrgNamed(null, null); for (NamedResource resource : response.values()) { - if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { + if (resource.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML)) { TerremarkCatalogItem item = tmClient.findCatalogItemInOrgCatalogNamed(null, null, resource.getName()); assert tmClient.getCustomizationOptions(item.getCustomizationOptions().getId()) != null; } @@ -444,7 +444,7 @@ public abstract class TerremarkClientLiveTest extends VCloudClientLiveTest { // then // default internet // service timeout - successTester = new RetryablePredicate(injector.getInstance(TaskSuccess.class), 650, 10, TimeUnit.SECONDS); + successTester = new RetryablePredicate(injector.getInstance(VCloudExpressTaskSuccess.class), 650, 10, TimeUnit.SECONDS); } protected abstract void setupCredentials(); diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java index 4d5bc4212f..2bb7eb1543 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java @@ -44,9 +44,9 @@ import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.util.Utils; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.VCloudAsyncClientTest.VCloudRestClientModuleExtension.TestOrganizationCatalogItemSupplier; -import org.jclouds.vcloud.VCloudAsyncClientTest.VCloudRestClientModuleExtension.TestOrganizationCatalogSupplier; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrganizationCatalogItemSupplier; +import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrganizationCatalogSupplier; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.endpoints.Org; @@ -467,7 +467,7 @@ public class TerremarkECloudAsyncClientTest extends RestClientTest of("adriantest", - new NamedResourceImpl("adriantest", VCloudMediaType.VAPP_XML, URI + new NamedResourceImpl("adriantest", VCloudExpressMediaType.VAPP_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/15124")), "centos-53", - new NamedResourceImpl("centos-53", VCloudMediaType.VAPP_XML, URI + new NamedResourceImpl("centos-53", VCloudExpressMediaType.VAPP_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/15120")))); assertEquals(result.getAvailableNetworks(), ImmutableMap.of("10.114.34.128/26", new NamedResourceImpl( diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java index b5bc94113e..93b814603c 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java @@ -32,7 +32,7 @@ import java.util.List; import org.jclouds.http.functions.BaseHandlerTest; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; import org.jclouds.vcloud.domain.VApp; @@ -91,7 +91,7 @@ public class VAppHandlerTest extends BaseHandlerTest { assertEquals(result.getOperatingSystemDescription(), "Red Hat Enterprise Linux 5 (64-bit)"); assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/16238")); - assertEquals(result.getVDC(), new NamedResourceImpl(null, VCloudMediaType.VDC_XML, URI + assertEquals(result.getVDC(), new NamedResourceImpl(null, VCloudExpressMediaType.VDC_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); assertEquals(result.getSystem(), new VirtualSystem(0, "Virtual Hardware Family", "centos-53", "vmx-07")); @@ -129,7 +129,7 @@ public class VAppHandlerTest extends BaseHandlerTest { assertEquals(vApp.getOperatingSystemDescription(), "Ubuntu Linux (32-bit)"); assertEquals(vApp.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/15639")); - assertEquals(vApp.getVDC(), new NamedResourceImpl(null, VCloudMediaType.VDC_XML, URI + assertEquals(vApp.getVDC(), new NamedResourceImpl(null, VCloudExpressMediaType.VDC_XML, URI .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); assertEquals(vApp.getSystem(), new VirtualSystem(0, "Virtual Hardware Family", "eduardo", "vmx-07")); From 80da64b65c7ddc3201d738d22eb2f10f8e945fac Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Thu, 19 Aug 2010 22:25:04 -0700 Subject: [PATCH 04/16] Issue 280: added Org to 1.0 impl as it is incompatible with the 0.8 version --- .../VCloudSessionRefreshLiveTest.java | 4 +- .../org/jclouds/vcloud/VCloudAsyncClient.java | 126 +++---- .../java/org/jclouds/vcloud/VCloudClient.java | 35 +- .../vcloud/VCloudExpressAsyncClient.java | 26 +- .../strategy/VCloudListNodesStrategy.java | 4 +- .../BaseVCloudExpressRestClientModule.java | 239 +++++++++++- .../config/BaseVCloudRestClientModule.java | 289 +++++++++++++-- .../config/CommonVCloudRestClientModule.java | 322 +++------------- .../java/org/jclouds/vcloud/domain/Org.java | 56 +++ .../jclouds/vcloud/domain/Organization.java | 8 - .../vcloud/domain/internal/OrgImpl.java | 167 +++++++++ .../domain/internal/OrganizationImpl.java | 10 +- .../functions/AllCatalogItemsInOrg.java | 68 ++++ .../vcloud/functions/AllCatalogsInOrg.java | 73 ++++ .../vcloud/functions/AllVDCsInOrg.java | 75 ++++ .../OrgNameAndCatalogNameToEndpoint.java | 9 +- .../OrgNameAndVDCNameToEndpoint.java | 9 +- .../functions/OrgNameToTasksListEndpoint.java | 64 ++++ ...anizationNameAndCatalogNameToEndpoint.java | 76 ++++ ...zationNameAndTasksListNameToEndpoint.java} | 4 +- .../OrganizationNameAndVDCNameToEndpoint.java | 76 ++++ ...orLocations.java => OrgsForLocations.java} | 15 +- ...zationsForNames.java => OrgsForNames.java} | 14 +- .../org/jclouds/vcloud/xml/OrgHandler.java | 44 ++- .../vcloud/xml/OrganizationHandler.java | 69 ++++ .../jclouds/vcloud/VCloudAsyncClientTest.java | 350 ++++++------------ .../jclouds/vcloud/VCloudClientLiveTest.java | 16 +- .../vcloud/VCloudExpressAsyncClientTest.java | 8 +- .../jclouds/vcloud/xml/OrgHandlerTest.java | 52 +-- .../vcloud/xml/OrganizationHandlerTest.java | 85 +++++ .../resources/{ => express}/org-hosting.xml | 0 .../core/src/test/resources/express/org.xml | 5 + vcloud/core/src/test/resources/org.xml | 27 +- .../terremark/TerremarkVCloudAsyncClient.java | 6 +- .../terremark/xml/TerremarkOrgHandler.java | 4 +- 35 files changed, 1658 insertions(+), 777 deletions(-) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInOrg.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java rename vcloud/core/src/main/java/org/jclouds/vcloud/functions/{OrgNameAndTasksListNameToEndpoint.java => OrganizationNameAndTasksListNameToEndpoint.java} (92%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java rename vcloud/core/src/main/java/org/jclouds/vcloud/functions/{OrganizatonsForLocations.java => OrgsForLocations.java} (82%) rename vcloud/core/src/main/java/org/jclouds/vcloud/functions/{OrganizationsForNames.java => OrgsForNames.java} (78%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrganizationHandlerTest.java rename vcloud/core/src/test/resources/{ => express}/org-hosting.xml (100%) create mode 100644 vcloud/core/src/test/resources/express/org.xml diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java index c17842e70e..5000bcdc40 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/VCloudSessionRefreshLiveTest.java @@ -53,9 +53,9 @@ public class VCloudSessionRefreshLiveTest { @Test public void testSessionRefresh() throws Exception { - connection.findOrganizationNamed(null); + connection.findOrgNamed(null); Thread.sleep(timeOut * 1000); - connection.findOrganizationNamed(null); + connection.findOrgNamed(null); } @BeforeGroups(groups = { "live" }) diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java index 03e158fa0f..9501164770 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java @@ -19,15 +19,15 @@ package org.jclouds.vcloud; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.NETWORK_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.ORG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASK_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VAPPTEMPLATE_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; +import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; +import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML; +import static org.jclouds.vcloud.VCloudMediaType.ORG_XML; +import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudMediaType.TASK_XML; +import static org.jclouds.vcloud.VCloudMediaType.VAPPTEMPLATE_XML; +import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; import java.net.URI; @@ -40,7 +40,6 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.jclouds.predicates.validators.DnsNameValidator; -import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.EndpointParam; import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.MapBinder; @@ -55,20 +54,19 @@ import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameAndTasksListNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameToTasksListEndpoint; import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -94,47 +92,28 @@ import com.google.common.util.concurrent.ListenableFuture; */ @RequestFilters(SetVCloudTokenCookie.class) public interface VCloudAsyncClient { - /** - * @see VCloudExpressClient#getDefaultOrganization - */ - @Deprecated - @GET - @Endpoint(Org.class) - @Consumes(ORG_XML) - @XMLResponseParser(OrgHandler.class) - ListenableFuture getDefaultOrganization(); /** - * @see VCloudExpressClient#getOrganization + * @see VCloudClient#getOrg */ @GET @XMLResponseParser(OrgHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Consumes(ORG_XML) - ListenableFuture getOrganization(@EndpointParam URI orgId); + ListenableFuture getOrg(@EndpointParam URI orgId); /** - * @see VCloudExpressClient#getOrganizationNamed + * @see VCloudClient#getOrgNamed */ @GET @XMLResponseParser(OrgHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Consumes(ORG_XML) - ListenableFuture findOrganizationNamed( + ListenableFuture findOrgNamed( @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); /** - * @see VCloudExpressClient#getDefaultCatalog - */ - @Deprecated - @GET - @Endpoint(org.jclouds.vcloud.endpoints.Catalog.class) - @Consumes(CATALOG_XML) - @XMLResponseParser(CatalogHandler.class) - ListenableFuture getDefaultCatalog(); - - /** - * @see VCloudExpressClient#getCatalog + * @see VCloudClient#getCatalog */ @GET @XMLResponseParser(CatalogHandler.class) @@ -143,7 +122,7 @@ public interface VCloudAsyncClient { ListenableFuture getCatalog(@EndpointParam URI catalogId); /** - * @see VCloudExpressClient#findCatalogInOrgNamed + * @see VCloudClient#findCatalogInOrgNamed */ @GET @XMLResponseParser(CatalogHandler.class) @@ -154,7 +133,7 @@ public interface VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); /** - * @see VCloudExpressClient#getVAppTemplate + * @see VCloudClient#getVAppTemplate */ @GET @Consumes(VAPPTEMPLATE_XML) @@ -163,7 +142,7 @@ public interface VCloudAsyncClient { ListenableFuture getVAppTemplate(@EndpointParam URI vAppTemplate); /** - * @see VCloudExpressClient#findVAppTemplateInOrgCatalogNameds + * @see VCloudClient#findVAppTemplateInOrgCatalogNameds */ @GET @Consumes(VAPPTEMPLATE_XML) @@ -175,7 +154,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); /** - * @see VCloudExpressClient#getCatalogItem + * @see VCloudClient#getCatalogItem */ @GET @Consumes(CATALOGITEM_XML) @@ -184,7 +163,7 @@ public interface VCloudAsyncClient { ListenableFuture getCatalogItem(@EndpointParam URI catalogItem); /** - * @see VCloudExpressClient#getCatalogItemInOrg + * @see VCloudClient#getCatalogItemInOrg */ @GET @Consumes(CATALOGITEM_XML) @@ -196,7 +175,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); /** - * @see VCloudExpressClient#findNetworkInOrgVDCNamed + * @see VCloudClient#findNetworkInOrgVDCNamed */ @GET @Consumes(NETWORK_XML) @@ -208,7 +187,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); /** - * @see VCloudExpressClient#getNetwork + * @see VCloudClient#getNetwork */ @GET @Consumes(NETWORK_XML) @@ -217,17 +196,7 @@ public interface VCloudAsyncClient { ListenableFuture getNetwork(@EndpointParam URI network); /** - * @see VCloudExpressClient#getDefaultVDC - */ - @Deprecated - @GET - @Endpoint(org.jclouds.vcloud.endpoints.VDC.class) - @XMLResponseParser(VDCHandler.class) - @Consumes(VDC_XML) - ListenableFuture getDefaultVDC(); - - /** - * @see VCloudExpressClient#getVDC(URI) + * @see VCloudClient#getVDC(URI) */ @GET @XMLResponseParser(VDCHandler.class) @@ -236,7 +205,7 @@ public interface VCloudAsyncClient { ListenableFuture getVDC(@EndpointParam URI vdc); /** - * @see VCloudExpressClient#findVDCInOrgNamed(String, String) + * @see VCloudClient#findVDCInOrgNamed(String, String) */ @GET @XMLResponseParser(VDCHandler.class) @@ -247,7 +216,7 @@ public interface VCloudAsyncClient { @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); /** - * @see VCloudExpressClient#getTasksList + * @see VCloudClient#getTasksList */ @GET @Consumes(TASKSLIST_XML) @@ -256,28 +225,17 @@ public interface VCloudAsyncClient { ListenableFuture getTasksList(@EndpointParam URI tasksListId); /** - * @see VCloudExpressClient#getTasksListInOrg + * @see VCloudClient#findTasksListInOrgNamed */ @GET @Consumes(TASKSLIST_XML) @XMLResponseParser(TasksListHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture findTasksListInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndTasksListNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndTasksListNameToEndpoint.class) String tasksListName); + @Nullable @EndpointParam(parser = OrgNameToTasksListEndpoint.class) String orgName); /** - * @see VCloudExpressClient#getDefaultTasksList - */ - @Deprecated - @GET - @Endpoint(org.jclouds.vcloud.endpoints.TasksList.class) - @Consumes(TASKSLIST_XML) - @XMLResponseParser(TasksListHandler.class) - ListenableFuture getDefaultTasksList(); - - /** - * @see VCloudExpressClient#deployVApp + * @see VCloudClient#deployVApp */ @POST @Consumes(TASK_XML) @@ -286,14 +244,14 @@ public interface VCloudAsyncClient { ListenableFuture deployVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#deleteVApp + * @see VCloudClient#deleteVApp */ @DELETE @ExceptionParser(ReturnVoidOnNotFoundOr404.class) ListenableFuture deleteVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#undeployVApp + * @see VCloudClient#undeployVApp */ @POST @Consumes(TASK_XML) @@ -302,7 +260,7 @@ public interface VCloudAsyncClient { ListenableFuture undeployVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#powerOnVApp + * @see VCloudClient#powerOnVApp */ @POST @Consumes(TASK_XML) @@ -311,7 +269,7 @@ public interface VCloudAsyncClient { ListenableFuture powerOnVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#powerOffVApp + * @see VCloudClient#powerOffVApp */ @POST @Consumes(TASK_XML) @@ -320,14 +278,14 @@ public interface VCloudAsyncClient { ListenableFuture powerOffVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#shutdownVApp + * @see VCloudClient#shutdownVApp */ @POST @Path("/power/action/shutdown") ListenableFuture shutdownVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#resetVApp + * @see VCloudClient#resetVApp */ @POST @Consumes(TASK_XML) @@ -336,7 +294,7 @@ public interface VCloudAsyncClient { ListenableFuture resetVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#suspendVApp + * @see VCloudClient#suspendVApp */ @POST @Consumes(TASK_XML) @@ -345,7 +303,7 @@ public interface VCloudAsyncClient { ListenableFuture suspendVApp(@EndpointParam URI vAppId); /** - * @see VCloudExpressClient#getTask + * @see VCloudClient#getTask */ @GET @Consumes(TASK_XML) @@ -354,14 +312,14 @@ public interface VCloudAsyncClient { ListenableFuture getTask(@EndpointParam URI taskId); /** - * @see VCloudExpressClient#cancelTask + * @see VCloudClient#cancelTask */ @POST @Path("/action/cancel") ListenableFuture cancelTask(@EndpointParam URI taskId); /** - * @see VCloudExpressClient#findVAppInOrgVDCNamed + * @see VCloudClient#findVAppInOrgVDCNamed */ @GET @Consumes(VAPP_XML) @@ -373,7 +331,7 @@ public interface VCloudAsyncClient { @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); /** - * @see VCloudExpressClient#getVApp + * @see VCloudClient#getVApp */ @GET @Consumes(VAPP_XML) @@ -382,7 +340,7 @@ public interface VCloudAsyncClient { ListenableFuture getVApp(@EndpointParam URI vApp); /** - * @see VCloudExpressClient#instantiateVAppTemplateInVDC + * @see VCloudClient#instantiateVAppTemplateInVDC */ @POST @Path("action/instantiateVAppTemplate") @@ -396,7 +354,7 @@ public interface VCloudAsyncClient { InstantiateVAppTemplateOptions... options); /** - * @see VCloudExpressClient#cloneVAppInVDC + * @see VCloudClient#cloneVAppInVDC */ @POST @Path("/action/cloneVApp") diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java index 1636be1b5d..25dfe79fa3 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java @@ -29,7 +29,7 @@ import org.jclouds.concurrent.Timeout; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; @@ -42,20 +42,15 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; * Provides access to VCloud resources via their REST API. *

* - * @see * @author Adrian Cole */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) public interface VCloudClient { - /** - * Please use {@link #findOrganizationNamed(String)} passing null - */ - @Deprecated - Organization getDefaultOrganization(); - - Organization getOrganization(URI orgId); + Org getOrg(URI orgId); /** * This call returns a list of all vCloud Data Centers (vdcs), catalogs, and @@ -66,13 +61,7 @@ public interface VCloudClient { * @throws NoSuchElementException * if you specified an org name that isn't present */ - Organization findOrganizationNamed(@Nullable String name); - - /** - * Please use #findCatalogInOrgNamed(null, null) - */ - @Deprecated - Catalog getDefaultCatalog(); + Org findOrgNamed(@Nullable String name); Catalog getCatalog(URI catalogId); @@ -149,21 +138,9 @@ public interface VCloudClient { */ VDC findVDCInOrgNamed(String orgName, String vdcName); - /** - * Please use #findVDCInOrgNamed - */ - @Deprecated - VDC getDefaultVDC(); - TasksList getTasksList(URI tasksListId); - TasksList findTasksListInOrgNamed(String orgName, String tasksListName); - - /** - * Please use #getTasksListInOrg(null, null) - */ - @Deprecated - TasksList getDefaultTasksList(); + TasksList findTasksListInOrgNamed(String orgName); Task deployVApp(URI vAppId); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java index da8341ba11..9acd9e928d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java @@ -63,9 +63,9 @@ import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameAndTasksListNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; +import org.jclouds.vcloud.functions.OrganizationNameAndCatalogNameToEndpoint; +import org.jclouds.vcloud.functions.OrganizationNameAndTasksListNameToEndpoint; +import org.jclouds.vcloud.functions.OrganizationNameAndVDCNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameToEndpoint; @@ -75,7 +75,7 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.CatalogItemHandler; import org.jclouds.vcloud.xml.NetworkHandler; -import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.OrganizationHandler; import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.TasksListHandler; import org.jclouds.vcloud.xml.VAppHandler; @@ -101,14 +101,14 @@ public interface VCloudExpressAsyncClient { @GET @Endpoint(Org.class) @Consumes(ORG_XML) - @XMLResponseParser(OrgHandler.class) + @XMLResponseParser(OrganizationHandler.class) ListenableFuture getDefaultOrganization(); /** * @see VCloudExpressClient#getOrganization */ @GET - @XMLResponseParser(OrgHandler.class) + @XMLResponseParser(OrganizationHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Consumes(ORG_XML) ListenableFuture getOrganization(@EndpointParam URI orgId); @@ -117,7 +117,7 @@ public interface VCloudExpressAsyncClient { * @see VCloudExpressClient#getOrganizationNamed */ @GET - @XMLResponseParser(OrgHandler.class) + @XMLResponseParser(OrganizationHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Consumes(ORG_XML) ListenableFuture findOrganizationNamed( @@ -150,8 +150,8 @@ public interface VCloudExpressAsyncClient { @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Consumes(CATALOG_XML) ListenableFuture findCatalogInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); + @Nullable @EndpointParam(parser = OrganizationNameAndCatalogNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrganizationNameAndCatalogNameToEndpoint.class) String catalogName); /** * @see VCloudExpressClient#getVAppTemplate @@ -243,8 +243,8 @@ public interface VCloudExpressAsyncClient { @Consumes(VDC_XML) @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture findVDCInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); + @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String vdcName); /** * @see VCloudExpressClient#getTasksList @@ -263,8 +263,8 @@ public interface VCloudExpressAsyncClient { @XMLResponseParser(TasksListHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture findTasksListInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndTasksListNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndTasksListNameToEndpoint.class) String tasksListName); + @Nullable @EndpointParam(parser = OrganizationNameAndTasksListNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrganizationNameAndTasksListNameToEndpoint.class) String tasksListName); /** * @see VCloudExpressClient#getDefaultTasksList diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java index 00abf0da97..2dae160a9b 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java @@ -86,7 +86,7 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { public Iterable list() { Set nodes = Sets.newHashSet(); for (String org : orgNameToEndpoint.get().keySet()) { - for (NamedResource vdc : client.findOrganizationNamed(org).getVDCs().values()) { + for (NamedResource vdc : client.findOrgNamed(org).getVDCs().values()) { for (NamedResource resource : client.getVDC(vdc.getId()).getResourceEntities().values()) { if (validVApp(resource)) { nodes.add(convertVAppToComputeMetadata(vdc, resource)); @@ -111,7 +111,7 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { public Iterable listDetailsOnNodesMatching(Predicate filter) { Set nodes = Sets.newHashSet(); for (String org : orgNameToEndpoint.get().keySet()) { - for (NamedResource vdc : client.findOrganizationNamed(org).getVDCs().values()) { + for (NamedResource vdc : client.findOrgNamed(org).getVDCs().values()) { for (NamedResource resource : client.getVDC(vdc.getId()).getResourceEntities().values()) { if (validVApp(resource) && filter.apply(convertVAppToComputeMetadata(vdc, resource))) { addVAppToSetRetryingIfNotYetPresent(nodes, vdc, resource); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java index 772f41f35f..b4f85c0d1d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java @@ -21,18 +21,27 @@ package org.jclouds.vcloud.config; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.get; +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_IDENTITY; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; import java.net.URI; import java.util.Map; +import java.util.Map.Entry; +import javax.inject.Inject; import javax.inject.Named; +import javax.inject.Singleton; import org.jclouds.domain.Location; import org.jclouds.http.RequiresHttp; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.Catalog; @@ -41,28 +50,33 @@ import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.endpoints.TasksList; import org.jclouds.vcloud.functions.VCloudExpressAllCatalogItemsInCatalog; import org.jclouds.vcloud.functions.VCloudExpressAllCatalogsInOrganization; import org.jclouds.vcloud.functions.VCloudExpressAllVDCsInOrganization; import org.jclouds.vcloud.functions.VCloudExpressOrganizationsForNames; import org.jclouds.vcloud.functions.VCloudExpressOrganizatonsForLocations; import org.jclouds.vcloud.functions.VCloudExpressVAppTemplatesForCatalogItems; +import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.predicates.VCloudExpressTaskSuccess; import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.base.Supplier; import com.google.inject.Injector; +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 BaseVCloudExpressRestClientModule - extends CommonVCloudRestClientModule { + extends CommonVCloudRestClientModule { public BaseVCloudExpressRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); @@ -91,7 +105,8 @@ public abstract class BaseVCloudExpressRestClientModule successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { return new RetryablePredicate(injector.getInstance(VCloudExpressTaskSuccess.class), completed); } + + @Provides + @Singleton + @org.jclouds.vcloud.endpoints.VDC + protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final Supplier> orgToVDCSupplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; + } + }); + + } + + @Provides + @org.jclouds.vcloud.endpoints.VDC + @Singleton + protected URI provideDefaultVDC(Organization org) { + checkState(org.getVDCs().size() > 0, "No vdcs present in org: " + org.getName()); + return get(org.getVDCs().values(), 0).getId(); + } + + @Provides + @org.jclouds.vcloud.endpoints.Catalog + @Singleton + protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { + checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); + return get(org.getCatalogs().values(), 0).getId(); + } + + @Provides + @Singleton + protected Supplier> provideOrgMapCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationMapSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + + }); + } + + @Singleton + public static class OrganizationMapSupplier implements Supplier> { + protected final Supplier sessionSupplier; + private final Function, Iterable> organizationsForNames; + + @Inject + protected OrganizationMapSupplier(Supplier sessionSupplier, + Function, Iterable> organizationsForNames) { + this.sessionSupplier = sessionSupplier; + this.organizationsForNames = organizationsForNames; + } + + @Override + public Map get() { + return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); + } + } + + @Singleton + public static class OrganizationCatalogSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allCatalogsInOrganization; + + @Inject + protected OrganizationCatalogSupplier(Supplier> orgSupplier, + Function> allCatalogsInOrganization) { + this.orgSupplier = orgSupplier; + this.allCatalogsInOrganization = allCatalogsInOrganization; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allCatalogsInOrganization), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } + } + + @Provides + @Singleton + protected Supplier>> provideOrganizationCatalogItemMapSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Provides + @Singleton + protected Supplier>> provideOrganizationVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Singleton + public static class OrganizationVDCSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allVDCsInOrganization; + + @Inject + protected OrganizationVDCSupplier(Supplier> orgSupplier, + Function> allVDCsInOrganization) { + this.orgSupplier = orgSupplier; + this.allVDCsInOrganization = allVDCsInOrganization; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allVDCsInOrganization), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } + } + + @Singleton + public static class OrganizationCatalogItemSupplier implements + Supplier>>> { + protected final Supplier>> catalogSupplier; + private final Function> allCatalogItemsInCatalog; + + @Inject + protected OrganizationCatalogItemSupplier( + Supplier>> catalogSupplier, + Function> allCatalogItemsInCatalog) { + this.catalogSupplier = catalogSupplier; + this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; + } + + @Override + public Map>> get() { + return transformValues( + catalogSupplier.get(), + new Function, Map>>() { + + @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); + } + }); + + } + }); + } + } + + @Provides + @Singleton + protected Supplier>>> provideOrganizationCatalogItemSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogItemSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( + authException, seconds, + new Supplier>>>() { + @Override + public Map>> get() { + return supplier.get(); + } + }); + } + + @Provides + @TasksList + @Singleton + protected URI provideDefaultTasksList(Organization org) { + checkState(org.getTasksLists().size() > 0, "No tasks lists present in org: " + org.getName()); + return get(org.getTasksLists().values(), 0).getId(); + } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java index eca147a9dd..94286c3424 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java @@ -21,48 +21,62 @@ package org.jclouds.vcloud.config; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.get; +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_IDENTITY; +import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; import java.net.URI; import java.util.Map; +import java.util.Map.Entry; +import javax.inject.Inject; import javax.inject.Named; +import javax.inject.Singleton; import org.jclouds.domain.Location; import org.jclouds.http.RequiresHttp; import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.endpoints.TasksList; import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog; -import org.jclouds.vcloud.functions.AllCatalogsInOrganization; -import org.jclouds.vcloud.functions.AllVDCsInOrganization; +import org.jclouds.vcloud.functions.AllCatalogsInOrg; +import org.jclouds.vcloud.functions.AllVDCsInOrg; +import org.jclouds.vcloud.functions.OrgsForLocations; +import org.jclouds.vcloud.functions.OrgsForNames; import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; -import org.jclouds.vcloud.functions.OrganizatonsForLocations; -import org.jclouds.vcloud.functions.OrganizationsForNames; +import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.predicates.TaskSuccess; import com.google.common.base.Function; import com.google.common.base.Predicate; +import com.google.common.base.Supplier; import com.google.inject.Injector; +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); @@ -74,35 +88,23 @@ public abstract class BaseVCloudRestClientModule>>() { }).to(new TypeLiteral() { }); - bind(new TypeLiteral>>() { - }).to(new TypeLiteral() { + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { }); - bind(new TypeLiteral>>() { - }).to(new TypeLiteral() { + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { }); bind(new TypeLiteral, Iterable>>() { }).to(new TypeLiteral() { }); } - @Override - protected Organization provideOrganization(VCloudClient discovery) { - if (authException.get() != null) - throw authException.get(); - try { - return discovery.findOrganizationNamed(null); - } catch (AuthorizationException e) { - authException.set(e); - throw e; - } - } - @Override protected URI provideDefaultNetwork(VCloudClient client) { if (authException.get() != null) @@ -116,10 +118,239 @@ public abstract class BaseVCloudRestClientModule 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 + @org.jclouds.vcloud.endpoints.VDC + protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final Supplier> orgToVDCSupplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; + } + }); + + } + + @Provides + @org.jclouds.vcloud.endpoints.VDC + @Singleton + protected URI provideDefaultVDC(Org org) { + checkState(org.getVDCs().size() > 0, "No vdcs present in org: " + org.getName()); + return get(org.getVDCs().values(), 0).getId(); + } + + @Provides + @org.jclouds.vcloud.endpoints.Catalog + @Singleton + protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user) { + checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); + return get(org.getCatalogs().values(), 0).getId(); + } + + @Provides + @Singleton + protected Supplier> provideOrgMapCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final OrgMapSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, + seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + + }); + } + + @Singleton + public static class OrgMapSupplier implements Supplier> { + protected final Supplier sessionSupplier; + private final Function, Iterable> organizationsForNames; + + @Inject + protected OrgMapSupplier(Supplier sessionSupplier, + Function, Iterable> organizationsForNames) { + this.sessionSupplier = sessionSupplier; + this.organizationsForNames = organizationsForNames; + } + + @Override + public Map get() { + return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); + } + } + + @Singleton + public static class OrgCatalogSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allCatalogsInOrg; + + @Inject + protected OrgCatalogSupplier(Supplier> orgSupplier, + Function> allCatalogsInOrg) { + this.orgSupplier = orgSupplier; + this.allCatalogsInOrg = allCatalogsInOrg; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allCatalogsInOrg), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } + } + + @Provides + @Singleton + protected Supplier>> provideOrgCatalogItemMapSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Provides + @Singleton + protected Supplier>> provideOrgVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Singleton + public static class OrgVDCSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allVDCsInOrg; + + @Inject + protected OrgVDCSupplier(Supplier> orgSupplier, + Function> allVDCsInOrg) { + this.orgSupplier = orgSupplier; + this.allVDCsInOrg = allVDCsInOrg; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allVDCsInOrg), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } + } + + @Singleton + public static class OrgCatalogItemSupplier implements + Supplier>>> { + protected final Supplier>> catalogSupplier; + private final Function> allCatalogItemsInCatalog; + + @Inject + protected OrgCatalogItemSupplier( + Supplier>> catalogSupplier, + Function> allCatalogItemsInCatalog) { + this.catalogSupplier = catalogSupplier; + this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; + } + + @Override + public Map>> get() { + return transformValues( + catalogSupplier.get(), + new Function, Map>>() { + + @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); + } + }); + + } + }); + } + } + + @Provides + @Singleton + protected Supplier>>> provideOrgCatalogItemSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogItemSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( + authException, seconds, + new Supplier>>>() { + @Override + public Map>> get() { + return supplier.get(); + } + }); + } + + @Provides + @TasksList + @Singleton + protected URI provideDefaultTasksList(Org org) { + return org.getTasksList().getId(); + } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java index 98c402b25e..6652f29633 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java @@ -23,11 +23,8 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Throwables.propagate; import static com.google.common.collect.Iterables.concat; -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; @@ -38,7 +35,6 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEO import java.net.URI; import java.util.Map; import java.util.SortedMap; -import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -61,14 +57,10 @@ import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudToken; -import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.endpoints.Catalog; import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.endpoints.TasksList; -import org.jclouds.vcloud.endpoints.VDC; import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse; import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; @@ -81,7 +73,8 @@ 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 */ @@ -105,7 +98,7 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Provides @Singleton protected abstract Predicate successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed); + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed); @VCloudToken @Provides @@ -131,48 +124,27 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Org @Singleton protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final OrgNameToOrgSupplier supplier) { + final OrgNameToOrgSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); } @Provides @Singleton protected Supplier> provideURIToVDC( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final URItoVDC supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final URItoVDC supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); - } - - @Provides - @Singleton - @VDC - protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> orgToVDCSupplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; - } - }); - + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); } @Singleton @@ -187,24 +159,24 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Override public Map 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.getId(); - } + @Override + public URI apply(org.jclouds.vcloud.domain.VDC from) { + return from.getId(); + } - }); + }); } } @@ -223,39 +195,25 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Provides @Singleton protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { + final VCloudLoginAsyncClient login) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier(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; } + } - }); + }); } - @Provides - @Singleton - protected Supplier> provideOrgMapCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationMapSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - - }); - } - - private final static Function name = new Function() { + final static Function name = new Function() { @Override public String apply(NamedResource from) { @@ -264,171 +222,11 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul }; - @Singleton - public static class OrganizationMapSupplier implements Supplier> { - protected final Supplier sessionSupplier; - private final Function, Iterable> organizationsForNames; - - @Inject - protected OrganizationMapSupplier(Supplier sessionSupplier, - Function, Iterable> organizationsForNames) { - this.sessionSupplier = sessionSupplier; - this.organizationsForNames = organizationsForNames; - } - - @Override - public Map get() { - return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); - } - } - - @Singleton - public static class OrganizationCatalogSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final Function> allCatalogsInOrganization; - - @Inject - protected OrganizationCatalogSupplier(Supplier> orgSupplier, - Function> allCatalogsInOrganization) { - this.orgSupplier = orgSupplier; - this.allCatalogsInOrganization = allCatalogsInOrganization; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allCatalogsInOrganization), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Provides - @Singleton - protected Supplier>> provideOrganizationCatalogItemMapSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Provides - @Singleton - protected Supplier>> provideOrganizationVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Singleton - public static class OrganizationVDCSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final Function> allVDCsInOrganization; - - @Inject - protected OrganizationVDCSupplier(Supplier> orgSupplier, - Function> allVDCsInOrganization) { - this.orgSupplier = orgSupplier; - this.allVDCsInOrganization = allVDCsInOrganization; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allVDCsInOrganization), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Singleton - public static class OrganizationCatalogItemSupplier implements - Supplier>>> { - protected final Supplier>> catalogSupplier; - private final Function> allCatalogItemsInCatalog; - - @Inject - protected OrganizationCatalogItemSupplier( - Supplier>> catalogSupplier, - Function> allCatalogItemsInCatalog) { - this.catalogSupplier = catalogSupplier; - this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; - } - - @Override - public Map>> get() { - return transformValues( - catalogSupplier.get(), - new Function, Map>>() { - - @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); - } - }); - - } - }); - } - } - - @Provides - @Singleton - protected Supplier>>> provideOrganizationCatalogItemSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogItemSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( - authException, seconds, - new Supplier>>>() { - @Override - public Map>> get() { - return supplier.get(); - } - }); - } - @Provides @Singleton @org.jclouds.vcloud.endpoints.VCloudLogin protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, - TimeoutException { + @Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, TimeoutException { SortedMap versions = versionService.getSupportedVersions().get(180, TimeUnit.SECONDS); checkState(versions.size() > 0, "No versions present"); checkState(versions.containsKey(version), "version " + version + " not present in: " + versions); @@ -464,31 +262,11 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul return factory.create(VCloudVersionsAsyncClient.class); } - @Provides - @Singleton - protected abstract Organization provideOrganization(S client); - - @Provides - @VDC - @Singleton - protected URI provideDefaultVDC(Organization org) { - checkState(org.getVDCs().size() > 0, "No vdcs present in org: " + org.getName()); - return get(org.getVDCs().values(), 0).getId(); - } - - @Provides - @Catalog - @Singleton - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { - checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); - return get(org.getCatalogs().values(), 0).getId(); - } - @Provides @Catalog @Singleton protected String provideCatalogName( - Supplier>> catalogs) { + Supplier>> catalogs) { return getLast(getLast(catalogs.get().values()).keySet()); } @@ -510,12 +288,4 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ParseVCloudErrorFromHttpResponse.class); bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseVCloudErrorFromHttpResponse.class); } - - @Provides - @TasksList - @Singleton - protected URI provideDefaultTasksList(Organization org) { - checkState(org.getTasksLists().size() > 0, "No tasks lists present in org: " + org.getName()); - return get(org.getTasksLists().values(), 0).getId(); - } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java new file mode 100644 index 0000000000..44d1810151 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java @@ -0,0 +1,56 @@ +/** + * + * Copyright (C) 2010 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.domain; + +import java.util.Map; + +import org.jclouds.vcloud.domain.internal.OrgImpl; + +import com.google.inject.ImplementedBy; + +/** + * A vCloud organization is a high-level abstraction that provides a unit of + * administration for objects and resources. As viewed by a user, an + * organization (represented by an Org element) can contain Catalog, Network, + * and vDC elements. If there are any queued, running, or recently completed + * tasks owned by a member of the organization, it also contains a TasksList + * element. As viewed by an administrator, an organization also contains users, + * groups, and other information + * + * @author Adrian Cole + */ +@ImplementedBy(OrgImpl.class) +public interface Org extends NamedResource { + + String getDescription(); + + Map getCatalogs(); + + Map getVDCs(); + + /** + * If there are any queued, running, or recently completed tasks owned by a + * member of the organization, it also contains a TasksList. + */ + NamedResource getTasksList(); + + Map getNetworks(); + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Organization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Organization.java index 4701e47ad9..b848a7861f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Organization.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Organization.java @@ -22,27 +22,19 @@ package org.jclouds.vcloud.domain; import java.util.Map; import org.jclouds.vcloud.domain.internal.OrganizationImpl; -import org.jclouds.vcloud.endpoints.Catalog; -import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.endpoints.TasksList; -import org.jclouds.vcloud.endpoints.VDC; import com.google.inject.ImplementedBy; /** * @author Adrian Cole */ -@Org @ImplementedBy(OrganizationImpl.class) public interface Organization extends NamedResource { - @Catalog Map getCatalogs(); - @VDC Map getVDCs(); - @TasksList Map getTasksLists(); } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java new file mode 100644 index 0000000000..8e44403b8c --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java @@ -0,0 +1,167 @@ +/** + * + * Copyright (C) 2010 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.domain.internal; + +import java.net.URI; +import java.util.Map; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Org; + +/** + * Locations of resources in vCloud + * + * @author Adrian Cole + * + */ +public class OrgImpl implements Org { + private final String name; + private final URI id; + private final String description; + private final Map catalogs; + private final Map vdcs; + private final Map networks; + private final NamedResource tasksList; + + public OrgImpl(String name, URI id, String description, Map catalogs, + Map vdcs, Map networks, @Nullable NamedResource tasksList) { + this.name = name; + this.id = id; + this.description = description; + this.catalogs = catalogs; + this.vdcs = vdcs; + this.networks = networks; + this.tasksList = tasksList; + } + + @Override + public String getName() { + return name; + } + + @Override + public URI getId() { + return id; + } + + @Override + public Map getCatalogs() { + return catalogs; + } + + @Override + public Map getVDCs() { + return vdcs; + } + + @Override + public NamedResource getTasksList() { + return tasksList; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((catalogs == null) ? 0 : catalogs.hashCode()); + result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((networks == null) ? 0 : networks.hashCode()); + result = prime * result + ((tasksList == null) ? 0 : tasksList.hashCode()); + result = prime * result + ((vdcs == null) ? 0 : vdcs.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + OrgImpl other = (OrgImpl) obj; + if (catalogs == null) { + if (other.catalogs != null) + return false; + } else if (!catalogs.equals(other.catalogs)) + return false; + if (description == null) { + if (other.description != null) + return false; + } else if (!description.equals(other.description)) + return false; + if (id == null) { + if (other.id != null) + return false; + } else if (!id.equals(other.id)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (networks == null) { + if (other.networks != null) + return false; + } else if (!networks.equals(other.networks)) + return false; + if (tasksList == null) { + if (other.tasksList != null) + return false; + } else if (!tasksList.equals(other.tasksList)) + return false; + if (vdcs == null) { + if (other.vdcs != null) + return false; + } else if (!vdcs.equals(other.vdcs)) + return false; + return true; + } + + @Override + public String getType() { + return VCloudMediaType.ORG_XML; + } + + @Override + public int compareTo(NamedResource o) { + return (this == o) ? 0 : getId().compareTo(o.getId()); + } + + @Override + public String toString() { + return "[id=" + id + ", name=" + name + ", type=" + getType() + "]"; + } + + @Override + public Map getNetworks() { + return networks; + } + + @Override + public String getDescription() { + return description; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java index 1abe2bbf0f..77ae7ee730 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java @@ -25,9 +25,6 @@ import java.util.Map; import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Catalog; -import org.jclouds.vcloud.endpoints.TasksList; -import org.jclouds.vcloud.endpoints.VDC; /** * Locations of resources in vCloud @@ -42,8 +39,8 @@ public class OrganizationImpl implements Organization { private final Map vdcs; private final Map tasksLists; - public OrganizationImpl(String name, URI id, Map catalogs, - Map vdcs, Map tasksLists) { + public OrganizationImpl(String name, URI id, Map catalogs, Map vdcs, + Map tasksLists) { this.name = name; this.id = id; this.catalogs = catalogs; @@ -61,20 +58,17 @@ public class OrganizationImpl implements Organization { return id; } - @Catalog @Override public Map getCatalogs() { return catalogs; } @Override - @VDC public Map getVDCs() { return vdcs; } @Override - @TasksList public Map getTasksLists() { return tasksLists; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInOrg.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInOrg.java new file mode 100644 index 0000000000..13970d8c6d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInOrg.java @@ -0,0 +1,68 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.Org; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + +/** + * @author Adrian Cole + */ +@Singleton +public class AllCatalogItemsInOrg implements Function> { + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + + private final Function> allCatalogsInOrg; + + private final Function> allCatalogItemsInCatalog; + + @Inject + AllCatalogItemsInOrg(Function> allCatalogsInOrg, + Function> allCatalogItemsInCatalog) { + this.allCatalogsInOrg = allCatalogsInOrg; + this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; + } + + @Override + public Iterable apply(Org from) { + return Iterables.concat(Iterables.transform(allCatalogsInOrg.apply(from), + new Function>() { + @Override + public Iterable apply(Catalog from) { + return allCatalogItemsInCatalog.apply(from); + } + + })); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java new file mode 100644 index 0000000000..730e602141 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java @@ -0,0 +1,73 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Org; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class AllCatalogsInOrg implements Function> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + + private final VCloudAsyncClient aclient; + private final ExecutorService executor; + + @Inject + AllCatalogsInOrg(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + @Override + public Iterable apply(final Org org) { + Iterable catalogs = transformParallel(org.getCatalogs().values(), + new Function>() { + @SuppressWarnings("unchecked") + @Override + public Future apply(NamedResource from) { + return (Future) aclient.getCatalog(from.getId()); + } + + }, executor, null, logger, "catalogs in " + org.getName()); + return catalogs; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java new file mode 100644 index 0000000000..d2e638d3f6 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java @@ -0,0 +1,75 @@ +/** + * + * Copyright (C) 2010 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.functions; + +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.VDC; + +import com.google.common.base.Function; + +/** + * @author Adrian Cole + */ +@Singleton +public class AllVDCsInOrg implements Function> { + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + + private final VCloudAsyncClient aclient; + private final ExecutorService executor; + + @Inject + AllVDCsInOrg(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.aclient = aclient; + this.executor = executor; + } + + @Override + public Iterable apply(final Org org) { + + Iterable catalogItems = transformParallel(org.getVDCs().values(), + new Function>() { + @SuppressWarnings("unchecked") + @Override + public Future apply(NamedResource from) { + return (Future) aclient.getVDC(from.getId()); + } + + }, executor, null, logger, "vdcs in org " + org.getName()); + return catalogItems; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java index 9362ecd478..aae470399e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java @@ -29,9 +29,8 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.endpoints.Catalog; -import org.jclouds.vcloud.endpoints.Org; import com.google.common.base.Function; import com.google.common.base.Supplier; @@ -43,13 +42,13 @@ import com.google.common.collect.Iterables; */ @Singleton public class OrgNameAndCatalogNameToEndpoint implements Function { - private final Supplier> orgMap; + private final Supplier> orgMap; private final String defaultOrg; private final URI defaultUri; @Inject - public OrgNameAndCatalogNameToEndpoint(Supplier> orgMap, @Org String defaultOrg, - @Catalog URI defaultUri) { + public OrgNameAndCatalogNameToEndpoint(Supplier> orgMap, + @org.jclouds.vcloud.endpoints.Org String defaultOrg, @Catalog URI defaultUri) { this.orgMap = orgMap; this.defaultOrg = defaultOrg; this.defaultUri = defaultUri; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java index 7a2a65f026..abbb52a4f5 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java @@ -29,8 +29,7 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.endpoints.VDC; import com.google.common.base.Function; @@ -43,13 +42,13 @@ import com.google.common.collect.Iterables; */ @Singleton public class OrgNameAndVDCNameToEndpoint implements Function { - private final Supplier> orgNameToVDCEndpoint; + private final Supplier> orgNameToVDCEndpoint; private final String defaultOrg; private final URI defaultUri; @Inject - public OrgNameAndVDCNameToEndpoint(Supplier> orgNameToVDCEndpoint, - @Org String defaultOrg, @VDC URI defaultUri) { + public OrgNameAndVDCNameToEndpoint(Supplier> orgNameToVDCEndpoint, + @org.jclouds.vcloud.endpoints.Org String defaultOrg, @VDC URI defaultUri) { this.orgNameToVDCEndpoint = orgNameToVDCEndpoint; this.defaultOrg = defaultOrg; this.defaultUri = defaultUri; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java new file mode 100644 index 0000000000..be76180b13 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java @@ -0,0 +1,64 @@ +/** + * + * Copyright (C) 2010 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.functions; + +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.vcloud.domain.Org; +import org.jclouds.vcloud.endpoints.TasksList; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class OrgNameToTasksListEndpoint implements Function { + private final Supplier> orgMap; + private final URI defaultUri; + + @Inject + public OrgNameToTasksListEndpoint(Supplier> orgMap, @TasksList URI defaultUri) { + this.orgMap = orgMap; + this.defaultUri = defaultUri; + } + + public URI apply(Object from) { + Object org = checkNotNull(from, "args"); + if (org == null) + return defaultUri; + + try { + return checkNotNull(orgMap.get().get(org)).getTasksList().getId(); + } catch (NullPointerException e) { + throw new NoSuchElementException(org + " not found in " + orgMap.get()); + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java new file mode 100644 index 0000000000..d8417e55e8 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java @@ -0,0 +1,76 @@ +/** + * + * Copyright (C) 2010 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.functions; + +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.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.endpoints.Catalog; +import org.jclouds.vcloud.endpoints.Org; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class OrganizationNameAndCatalogNameToEndpoint implements Function { + private final Supplier> orgMap; + private final String defaultOrg; + private final URI defaultUri; + + @Inject + public OrganizationNameAndCatalogNameToEndpoint(Supplier> orgMap, @Org String defaultOrg, + @Catalog URI defaultUri) { + this.orgMap = orgMap; + this.defaultOrg = defaultOrg; + this.defaultUri = defaultUri; + } + + @SuppressWarnings("unchecked") + public URI apply(Object from) { + Iterable orgCatalog = (Iterable) checkNotNull(from, "args"); + Object org = Iterables.get(orgCatalog, 0); + Object catalog = Iterables.get(orgCatalog, 1); + if (org == null && catalog == null) + return defaultUri; + else if (org == null) + org = defaultOrg; + + try { + Map catalogs = checkNotNull(orgMap.get().get(org)).getCatalogs(); + return catalog == null ? Iterables.getLast(catalogs.values()).getId() : catalogs.get(catalog).getId(); + } catch (NullPointerException e) { + throw new NoSuchElementException(org + "/" + catalog + " not found in " + orgMap.get()); + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndTasksListNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndTasksListNameToEndpoint.java similarity index 92% rename from vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndTasksListNameToEndpoint.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndTasksListNameToEndpoint.java index 15e847705f..851351035c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameAndTasksListNameToEndpoint.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndTasksListNameToEndpoint.java @@ -42,13 +42,13 @@ import com.google.common.collect.Iterables; * @author Adrian Cole */ @Singleton -public class OrgNameAndTasksListNameToEndpoint implements Function { +public class OrganizationNameAndTasksListNameToEndpoint implements Function { private final Supplier> orgMap; private final String defaultOrg; private final URI defaultUri; @Inject - public OrgNameAndTasksListNameToEndpoint(Supplier> orgMap, + public OrganizationNameAndTasksListNameToEndpoint(Supplier> orgMap, @Org String defaultOrg, @TasksList URI defaultUri) { this.orgMap = orgMap; this.defaultOrg = defaultOrg; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java new file mode 100644 index 0000000000..d3b3091516 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java @@ -0,0 +1,76 @@ +/** + * + * Copyright (C) 2010 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.functions; + +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.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.endpoints.VDC; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class OrganizationNameAndVDCNameToEndpoint implements Function { + private final Supplier> orgNameToVDCEndpoint; + private final String defaultOrg; + private final URI defaultUri; + + @Inject + public OrganizationNameAndVDCNameToEndpoint(Supplier> orgNameToVDCEndpoint, + @Org String defaultOrg, @VDC URI defaultUri) { + this.orgNameToVDCEndpoint = orgNameToVDCEndpoint; + this.defaultOrg = defaultOrg; + this.defaultUri = defaultUri; + } + + @SuppressWarnings("unchecked") + public URI apply(Object from) { + Iterable orgVdc = (Iterable) checkNotNull(from, "args"); + Object org = Iterables.get(orgVdc, 0); + Object vdc = Iterables.get(orgVdc, 1); + if (org == null && vdc == null) + return defaultUri; + else if (org == null) + org = defaultOrg; + + try { + Map vdcs = checkNotNull(orgNameToVDCEndpoint.get().get(org)).getVDCs(); + return vdc == null ? Iterables.getLast(vdcs.values()).getId() : vdcs.get(vdc).getId(); + } catch (NullPointerException e) { + throw new NoSuchElementException(org + "/" + vdc + " not found in " + orgNameToVDCEndpoint.get()); + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizatonsForLocations.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java similarity index 82% rename from vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizatonsForLocations.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java index 031cc2efb1..7b75ecf959 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizatonsForLocations.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java @@ -39,7 +39,7 @@ import org.jclouds.domain.LocationScope; import org.jclouds.logging.Logger; import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.compute.domain.VCloudLocation; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -49,8 +49,7 @@ import com.google.common.collect.Sets; * @author Adrian Cole */ @Singleton -public class OrganizatonsForLocations implements - Function, Iterable> { +public class OrgsForLocations implements Function, Iterable> { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; @@ -58,7 +57,7 @@ public class OrganizatonsForLocations implements private final ExecutorService executor; @Inject - OrganizatonsForLocations(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + OrgsForLocations(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.aclient = aclient; this.executor = executor; } @@ -68,7 +67,7 @@ public class OrganizatonsForLocations implements * parent is region. then, we use a set to extract the unique set. */ @Override - public Iterable apply(Iterable from) { + public Iterable apply(Iterable from) { return transformParallel(Sets.newLinkedHashSet(transform(filter(from, new Predicate() { @@ -84,12 +83,12 @@ public class OrganizatonsForLocations implements return VCloudLocation.class.cast(from.getParent()).getResource().getId(); } - })), new Function>() { + })), new Function>() { @SuppressWarnings("unchecked") @Override - public Future apply(URI from) { - return (Future) aclient.getOrganization(from); + public Future apply(URI from) { + return (Future) aclient.getOrg(from); } }, executor, null, logger, "organizations for uris"); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationsForNames.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForNames.java similarity index 78% rename from vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationsForNames.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForNames.java index 45f28db659..9defba4044 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationsForNames.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForNames.java @@ -33,7 +33,7 @@ import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import com.google.common.base.Function; @@ -41,7 +41,7 @@ import com.google.common.base.Function; * @author Adrian Cole */ @Singleton -public class OrganizationsForNames implements Function, Iterable> { +public class OrgsForNames implements Function, Iterable> { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; @@ -49,19 +49,19 @@ public class OrganizationsForNames implements Function, Iterabl private final ExecutorService executor; @Inject - OrganizationsForNames(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + OrgsForNames(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.aclient = aclient; this.executor = executor; } @Override - public Iterable apply(Iterable from) { - return transformParallel(from, new Function>() { + public Iterable apply(Iterable from) { + return transformParallel(from, new Function>() { @SuppressWarnings("unchecked") @Override - public Future apply(String from) { - return (Future) aclient.findOrganizationNamed(from); + public Future apply(String from) { + return (Future) aclient.findOrgNamed(from); } }, executor, null, logger, "organizations for names"); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java index 3be3c036b8..d0706bb260 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java @@ -19,9 +19,10 @@ package org.jclouds.vcloud.xml; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; +import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML; +import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; import static org.jclouds.vcloud.util.Utils.newNamedResource; import static org.jclouds.vcloud.util.Utils.putNamedResource; @@ -29,8 +30,8 @@ import java.util.Map; import org.jclouds.http.functions.ParseSax; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.internal.OrganizationImpl; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.internal.OrgImpl; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -39,14 +40,19 @@ import com.google.common.collect.Maps; /** * @author Adrian Cole */ -public class OrgHandler extends ParseSax.HandlerWithResult { +public class OrgHandler extends ParseSax.HandlerWithResult { + private StringBuilder currentText = new StringBuilder(); + protected NamedResource org; protected Map vdcs = Maps.newLinkedHashMap(); - protected Map tasksLists = Maps.newLinkedHashMap(); + protected NamedResource tasksList; protected Map catalogs = Maps.newLinkedHashMap(); + protected Map networks = Maps.newLinkedHashMap(); - public Organization getResult() { - return new OrganizationImpl(org.getName(), org.getId(), catalogs, vdcs, tasksLists); + private String description; + + public Org getResult() { + return new OrgImpl(org.getName(), org.getId(), description, catalogs, vdcs, networks, tasksList); } @Override @@ -61,9 +67,27 @@ public class OrgHandler extends ParseSax.HandlerWithResult { } else if (attributes.getValue(typeIndex).equals(CATALOG_XML)) { putNamedResource(catalogs, attributes); } else if (attributes.getValue(typeIndex).equals(TASKSLIST_XML)) { - putNamedResource(tasksLists, attributes); + tasksList = newNamedResource(attributes); + } else if (attributes.getValue(typeIndex).equals(NETWORK_XML)) { + putNamedResource(networks, attributes); } } } } + + public void endElement(String uri, String name, String qName) { + if (qName.equals("Description")) { + description = currentOrNull(); + } + currentText = new StringBuilder(); + } + + public void characters(char ch[], int start, int length) { + currentText.append(ch, start, length); + } + + protected String currentOrNull() { + String returnVal = currentText.toString().trim(); + return returnVal.equals("") ? null : returnVal; + } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java new file mode 100644 index 0000000000..141f68605c --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java @@ -0,0 +1,69 @@ +/** + * + * Copyright (C) 2010 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.xml; + +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; +import static org.jclouds.vcloud.util.Utils.newNamedResource; +import static org.jclouds.vcloud.util.Utils.putNamedResource; + +import java.util.Map; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.internal.OrganizationImpl; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +import com.google.common.collect.Maps; + +/** + * @author Adrian Cole + */ +public class OrganizationHandler extends ParseSax.HandlerWithResult { + protected NamedResource org; + protected Map vdcs = Maps.newLinkedHashMap(); + protected Map tasksLists = Maps.newLinkedHashMap(); + protected Map catalogs = Maps.newLinkedHashMap(); + + public Organization getResult() { + return new OrganizationImpl(org.getName(), org.getId(), catalogs, vdcs, tasksLists); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (qName.equals("Org")) { + org = newNamedResource(attributes); + } else if (qName.equals("Link")) { + int typeIndex = attributes.getIndex("type"); + if (typeIndex != -1) { + if (attributes.getValue(typeIndex).equals(VDC_XML)) { + putNamedResource(vdcs, attributes); + } else if (attributes.getValue(typeIndex).equals(CATALOG_XML)) { + putNamedResource(catalogs, attributes); + } else if (attributes.getValue(typeIndex).equals(TASKSLIST_XML)) { + putNamedResource(tasksLists, attributes); + } + } + } + } +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java index bf8d273754..ca57ca8296 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java @@ -50,13 +50,12 @@ import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.util.Utils; import org.jclouds.vcloud.config.VCloudRestClientModule; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; -import org.jclouds.vcloud.domain.internal.OrganizationImpl; +import org.jclouds.vcloud.domain.internal.OrgImpl; import org.jclouds.vcloud.domain.internal.VDCImpl; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; @@ -90,16 +89,16 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testInstantiateVAppTemplateInVDCURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); + String.class, InstantiateVAppTemplateOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp"); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp"); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp.xml")), - "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, VAppHandler.class); @@ -109,20 +108,19 @@ public class VCloudAsyncClientTest extends RestClientTest { } public void testInstantiateVAppTemplateInVDCURIOptions() throws SecurityException, NoSuchMethodException, - IOException { + IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); - HttpRequest request = processor - .createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp", - processorCount(1).memory(512).disk(1024).inNetwork( - URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"))); + String.class, InstantiateVAppTemplateOptions[].class); + HttpRequest request = processor.createRequest(method, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp", processorCount(1).memory( + 512).disk(1024).inNetwork(URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"))); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp-cpumemdisk.xml")), - "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, VAppHandler.class); @@ -133,26 +131,26 @@ public class VCloudAsyncClientTest extends RestClientTest { @Test(expectedExceptions = IllegalArgumentException.class) public void testInstantiateVAppTemplateInOrgOptionsIllegalName() throws SecurityException, NoSuchMethodException, - IOException { + IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); + String.class, InstantiateVAppTemplateOptions[].class); processor.createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "CentOS 01", processorCount(1).memory(512) - .disk(1024).inNetwork(URI.create("https://vcenterprise.bluelock.com/network/1990"))); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "CentOS 01", processorCount(1).memory(512) + .disk(1024).inNetwork(URI.create("https://vcenterprise.bluelock.com/network/1990"))); } public void testCloneVAppInVDC() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, - CloneVAppOptions[].class); + CloneVAppOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/4181"), "my-vapp"); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/4181"), "my-vapp"); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/cloneVApp-default.xml")), - "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, TaskHandler.class); @@ -163,17 +161,17 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCloneVAppInVDCOptions() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, - CloneVAppOptions[].class); + CloneVAppOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/201"), "new-linux-server", - new CloneVAppOptions().deploy().powerOn().withDescription("The description of the new vApp")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/201"), "new-linux-server", new CloneVAppOptions() + .deploy().powerOn().withDescription("The description of the new vApp")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/cloneVApp.xml")), - "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, TaskHandler.class); @@ -182,25 +180,10 @@ public class VCloudAsyncClientTest extends RestClientTest { checkFilters(request); } - public void testDefaultOrganization() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudAsyncClient.class.getMethod("getDefaultOrganization"); - HttpRequest request = processor.createRequest(method); - - assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); - assertPayloadEquals(request, null, null, false); - - assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, OrgHandler.class); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - - public void testOrganization() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudAsyncClient.class.getMethod("getOrganization", URI.class); + public void testOrg() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudAsyncClient.class.getMethod("getOrg", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/org/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/org/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); @@ -213,8 +196,8 @@ public class VCloudAsyncClientTest extends RestClientTest { checkFilters(request); } - public void testFindOrganizationNamed() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudAsyncClient.class.getMethod("findOrganizationNamed", String.class); + public void testFindOrgNamed() throws SecurityException, NoSuchMethodException, IOException { + Method method = VCloudAsyncClient.class.getMethod("findOrgNamed", String.class); HttpRequest request = processor.createRequest(method, "org"); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org/1 HTTP/1.1"); @@ -228,25 +211,10 @@ public class VCloudAsyncClientTest extends RestClientTest { checkFilters(request); } - public void testDefaultCatalog() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudAsyncClient.class.getMethod("getDefaultCatalog"); - HttpRequest request = processor.createRequest(method); - - assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalog HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); - assertPayloadEquals(request, null, null, false); - - assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, CatalogHandler.class); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - public void testCatalog() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getCatalog", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalog/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); @@ -277,7 +245,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testNetwork() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getNetwork", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/network/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/network/2")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/network/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.network+xml\n"); @@ -293,7 +261,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCatalogItemURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getCatalogItem", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalogItem+xml\n"); @@ -308,7 +276,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testFindCatalogItemInOrgCatalogNamed() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("findCatalogItemInOrgCatalogNamed", String.class, String.class, - String.class); + String.class); HttpRequest request = processor.createRequest(method, "org", "catalog", "item"); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1 HTTP/1.1"); @@ -324,7 +292,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testFindVAppTemplate() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("findVAppTemplateInOrgCatalogNamed", String.class, - String.class, String.class); + String.class, String.class); HttpRequest request = processor.createRequest(method, "org", "catalog", "template"); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2 HTTP/1.1"); @@ -341,7 +309,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testVAppTemplateURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVAppTemplate", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vAppTemplate+xml\n"); @@ -354,21 +322,6 @@ public class VCloudAsyncClientTest extends RestClientTest { checkFilters(request); } - public void testGetDefaultVDC() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudAsyncClient.class.getMethod("getDefaultVDC"); - HttpRequest request = processor.createRequest(method); - - assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); - assertPayloadEquals(request, null, null, false); - - assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, VDCHandler.class); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - public void testFindVDCInOrgNamed() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("findVDCInOrgNamed", String.class, String.class); HttpRequest request = processor.createRequest(method, "org", "vdc"); @@ -429,7 +382,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetVDC() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVDC", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); @@ -442,25 +395,10 @@ public class VCloudAsyncClientTest extends RestClientTest { checkFilters(request); } - public void testGetDefaultTasksList() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudAsyncClient.class.getMethod("getDefaultTasksList"); - HttpRequest request = processor.createRequest(method); - - assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/taskslist HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); - assertPayloadEquals(request, null, null, false); - - assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, TasksListHandler.class); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - public void testGetTasksList() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getTasksList", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/tasksList/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); @@ -474,8 +412,8 @@ public class VCloudAsyncClientTest extends RestClientTest { } public void testFindTasksListInOrgNamed() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudAsyncClient.class.getMethod("findTasksListInOrgNamed", String.class, String.class); - HttpRequest request = processor.createRequest(method, "org", "tasksList"); + Method method = VCloudAsyncClient.class.getMethod("findTasksListInOrgNamed", String.class); + HttpRequest request = processor.createRequest(method, "org"); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/tasksList/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); @@ -491,7 +429,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testDeployVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("deployVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/deploy HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); @@ -507,7 +445,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vApp/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); @@ -523,10 +461,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testUndeployVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("undeployVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/undeploy HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/undeploy HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -540,7 +478,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testDeleteVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("deleteVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, "DELETE https://vcenterprise.bluelock.com/api/v1.0/vApp/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); @@ -556,10 +494,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testPowerOn() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("powerOnVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOn HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOn HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -573,10 +511,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testPowerOff() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("powerOffVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOff HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOff HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -590,10 +528,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testReset() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("resetVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/reset HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/reset HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -607,10 +545,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testSuspend() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("suspendVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/suspend HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/suspend HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -624,10 +562,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testShutdown() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("shutdownVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/shutdown HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/shutdown HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); assertPayloadEquals(request, null, null, false); @@ -641,7 +579,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetTask() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getTask", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/task/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); @@ -657,7 +595,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCancelTask() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cancelTask", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); assertRequestLineEquals(request, "POST https://vcenterprise.bluelock.com/api/v1.0/task/1/action/cancel HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); @@ -699,29 +637,29 @@ public class VCloudAsyncClientTest extends RestClientTest { public static class VCloudRestClientModuleExtension extends VCloudRestClientModule { @Override protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { + @Named(PROPERTY_API_VERSION) String version) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/login"); } @Override - protected URI provideOrg(@Org Iterable orgs) { + protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/org"); } @Override - protected String provideOrgName(@Org Iterable orgs) { + protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return "org"; } @Override - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { + protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog"); } @Override - protected Organization provideOrganization(VCloudClient discovery) { + protected Org provideOrg(VCloudClient discovery) { return null; } @@ -731,12 +669,12 @@ public class VCloudAsyncClientTest extends RestClientTest { } @Override - protected URI provideDefaultTasksList(Organization org) { + protected URI provideDefaultTasksList(Org org) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/taskslist"); } @Override - protected URI provideDefaultVDC(Organization org) { + protected URI provideDefaultVDC(Org org) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"); } @@ -747,13 +685,13 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { + final VCloudLoginAsyncClient login) { return Suppliers. ofInstance(new VCloudSession() { @Override public Map getOrgs() { return ImmutableMap. of("org", new NamedResourceImpl("org", - VCloudMediaType.ORG_XML, URI.create("https://vcenterprise.bluelock.com/api/v1.0/org/1"))); + VCloudMediaType.ORG_XML, URI.create("https://vcenterprise.bluelock.com/api/v1.0/org/1"))); } @Override @@ -768,138 +706,86 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override protected void configure() { super.configure(); - bind(OrganizationMapSupplier.class).to(TestOrganizationMapSupplier.class); - bind(OrganizationCatalogSupplier.class).to(TestOrganizationCatalogSupplier.class); - bind(OrganizationCatalogItemSupplier.class).to(TestOrganizationCatalogItemSupplier.class); + bind(OrgMapSupplier.class).to(TestOrgMapSupplier.class); + bind(OrgCatalogSupplier.class).to(TestOrgCatalogSupplier.class); + bind(OrgCatalogItemSupplier.class).to(TestOrgCatalogItemSupplier.class); } - protected Supplier>> provideOrganizationVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { + protected Supplier>> provideOrgVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { - return Suppliers - .>> ofInstance(ImmutableMap - .> of( - "org", + return Suppliers.>> ofInstance(ImmutableMap + .> of("org", - ImmutableMap - . of( - "vdc", - new VDCImpl( - "vdc", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), - "description", - null, - null, - null, - null, - null, - ImmutableMap - . of( - "vapp", - new NamedResourceImpl( - "vapp", - "application/vnd.vmware.vcloud.vApp+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), - "network", - new NamedResourceImpl( - "network", - "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), - null)))); + ImmutableMap. of("vdc", new VDCImpl("vdc", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "description", null, null, null, + null, null, ImmutableMap. of("vapp", new NamedResourceImpl("vapp", + "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), "network", + new NamedResourceImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), null)))); } @Singleton - public static class TestOrganizationMapSupplier extends OrganizationMapSupplier { + public static class TestOrgMapSupplier extends OrgMapSupplier { @Inject - protected TestOrganizationMapSupplier() { + protected TestOrgMapSupplier() { super(null, null); } @Override - public Map get() { - return ImmutableMap. of("org", new OrganizationImpl("org", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), ImmutableMap - . of("catalog", new NamedResourceImpl("catalog", - VCloudMediaType.CATALOG_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap - . of("vdc", new NamedResourceImpl("vdc", VCloudMediaType.VDC_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap - . of("tasksList", new NamedResourceImpl("tasksList", - VCloudMediaType.TASKSLIST_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1"))))); + public Map get() { + return ImmutableMap. of("org", new OrgImpl("org", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "description", ImmutableMap + . of("catalog", new NamedResourceImpl("catalog", VCloudMediaType.CATALOG_XML, + URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap + . of("vdc", new NamedResourceImpl("vdc", VCloudMediaType.VDC_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap + . of("network", new NamedResourceImpl("network", VCloudMediaType.NETWORK_XML, + URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1"))), new NamedResourceImpl( + "tasksList", VCloudMediaType.TASKSLIST_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")))); } } @Singleton - public static class TestOrganizationCatalogSupplier extends OrganizationCatalogSupplier { + public static class TestOrgCatalogSupplier extends OrgCatalogSupplier { @Inject - protected TestOrganizationCatalogSupplier() { + protected TestOrgCatalogSupplier() { super(null, null); } @Override public Map> get() { - return ImmutableMap - .> of( - "org", + return ImmutableMap.> of("org", - ImmutableMap - . of( - "catalog", - new CatalogImpl( - "catalog", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), - "description", - ImmutableMap - . of( - "item", - new NamedResourceImpl( - "item", - "application/vnd.vmware.vcloud.catalogItem+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), - "template", - new NamedResourceImpl( - "template", - "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")))))); + ImmutableMap. of("catalog", new CatalogImpl("catalog", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), "description", ImmutableMap + . of("item", new NamedResourceImpl("item", + "application/vnd.vmware.vcloud.catalogItem+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), "template", + new NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")))))); } } @Singleton - public static class TestOrganizationCatalogItemSupplier extends OrganizationCatalogItemSupplier { - protected TestOrganizationCatalogItemSupplier() { + public static class TestOrgCatalogItemSupplier extends OrgCatalogItemSupplier { + protected TestOrgCatalogItemSupplier() { super(null, null); } @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 NamedResourceImpl( - "template", - "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")), - ImmutableMap. of())))); + 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 NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")), + ImmutableMap. of())))); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java index 600fda0805..5a2f9e4923 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java @@ -32,7 +32,7 @@ import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VDC; @@ -56,14 +56,14 @@ public class VCloudClientLiveTest { private String credential; @Test - public void testOrganization() throws Exception { - Organization response = connection.findOrganizationNamed(null); + public void testOrg() throws Exception { + Org response = connection.findOrgNamed(null); assertNotNull(response); assertNotNull(response.getName()); assert response.getCatalogs().size() >= 1; - assert response.getTasksLists().size() >= 1; + assert response.getTasksList() != null; assert response.getVDCs().size() >= 1; - assertEquals(connection.findOrganizationNamed(response.getName()), response); + assertEquals(connection.findOrgNamed(response.getName()), response); } @Test @@ -127,7 +127,7 @@ public class VCloudClientLiveTest { @Test public void testDefaultTasksList() throws Exception { - org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null, null); + org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null); assertNotNull(response); assertNotNull(response.getLocation()); assertNotNull(response.getTasks()); @@ -136,7 +136,7 @@ public class VCloudClientLiveTest { @Test public void testGetTask() throws Exception { - org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null, null); + org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null); assertNotNull(response); assertNotNull(response.getLocation()); assertNotNull(response.getTasks()); @@ -167,7 +167,7 @@ public class VCloudClientLiveTest { setupCredentials(); Properties props = new Properties(); context = new RestContextFactory().createContext("vcloud", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), props); + . of(new Log4JLoggingModule()), props); connection = context.getApi(); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index a809bb99c6..bc23d2149a 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -66,7 +66,7 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.CatalogItemHandler; import org.jclouds.vcloud.xml.NetworkHandler; -import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.OrganizationHandler; import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.TasksListHandler; import org.jclouds.vcloud.xml.VAppHandler; @@ -191,7 +191,7 @@ public class VCloudExpressAsyncClientTest extends RestClientTest + * + * ==================================================================== + * 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.xml; + +import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; +import java.net.URI; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ParseSax.Factory; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.vcloud.VCloudExpressMediaType; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.internal.NamedResourceImpl; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Tests behavior of {@code OrgHandler} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.OrgHandlerTest") +public class OrganizationHandlerTest { + + public void testApplyInputStream() { + InputStream is = getClass().getResourceAsStream("/express/org.xml"); + + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + + Organization result = (Organization) factory.create(injector.getInstance(OrganizationHandler.class)).parse(is); + assertEquals(result.getName(), "adrian@jclouds.org"); + assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")); + assertEquals(result.getCatalogs(), ImmutableMap.of("Miami Environment 1 Catalog", new NamedResourceImpl( + "Miami Environment 1 Catalog", CATALOG_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32/catalog")))); + assertEquals(result.getVDCs(), ImmutableMap.of("Miami Environment 1", new NamedResourceImpl( + "Miami Environment 1", VCloudExpressMediaType.VDC_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32")))); + assertEquals(result.getTasksLists(), ImmutableMap.of("Miami Environment 1 Tasks List", new NamedResourceImpl( + "Miami Environment 1 Tasks List", TASKSLIST_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/tasksList/32")))); + } + + public void testHosting() { + InputStream is = getClass().getResourceAsStream("/express/org-hosting.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + Organization result = (Organization) factory.create(injector.getInstance(OrganizationHandler.class)).parse(is); + assertEquals(result.getName(), "Customer 188849"); + assertEquals(result.getId(), URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/188849")); + assertEquals(result.getCatalogs(), ImmutableMap.of("HMS Shared Catalog", new NamedResourceImpl( + "HMS Shared Catalog", CATALOG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")))); + assertEquals(result.getVDCs(), ImmutableMap.of("188849 Virtual DataCenter", new NamedResourceImpl( + "188849 Virtual DataCenter", VCloudExpressMediaType.VDC_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/188849")))); + assertEquals(result.getTasksLists(), ImmutableMap.of("188849 Task List", + new NamedResourceImpl("188849 Task List", TASKSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/188849")))); + } +} diff --git a/vcloud/core/src/test/resources/org-hosting.xml b/vcloud/core/src/test/resources/express/org-hosting.xml similarity index 100% rename from vcloud/core/src/test/resources/org-hosting.xml rename to vcloud/core/src/test/resources/express/org-hosting.xml diff --git a/vcloud/core/src/test/resources/express/org.xml b/vcloud/core/src/test/resources/express/org.xml new file mode 100644 index 0000000000..1728721aa0 --- /dev/null +++ b/vcloud/core/src/test/resources/express/org.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/vcloud/core/src/test/resources/org.xml b/vcloud/core/src/test/resources/org.xml index 1728721aa0..af9803fc59 100644 --- a/vcloud/core/src/test/resources/org.xml +++ b/vcloud/core/src/test/resources/org.xml @@ -1,5 +1,24 @@ - - - - + + + + + + + + + + + + Example Corp's Primary Organization. \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java index c7a051bb0c..88f02f68a4 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java @@ -64,7 +64,7 @@ import org.jclouds.vcloud.domain.VApp; 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.OrganizationNameAndVDCNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameToEndpoint; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -198,8 +198,8 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @Consumes(VDC_XML) @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture findVDCInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); + @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String vdcName); /** * @see VCloudExpressClient#instantiateVAppTemplateInVDC diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java index 6c7a1c5f31..d42a63f195 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java @@ -25,14 +25,14 @@ import static org.jclouds.vcloud.util.Utils.newNamedResource; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.terremark.domain.TerremarkOrganization; import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrganizationImpl; -import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.OrganizationHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; /** * @author Adrian Cole */ -public class TerremarkOrgHandler extends OrgHandler { +public class TerremarkOrgHandler extends OrganizationHandler { private NamedResource keysList; From 72a0bb58a766a84b3d4ebb940843a3cc5ac1a695 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 20 Aug 2010 11:33:38 -0700 Subject: [PATCH 05/16] Issue 280: ported more organization code from 0.8 -> 1.0 --- .../domain/VCloudExpressLoginAsyncClient.java | 55 ++++ .../VCloudLoginAsyncClient.java | 20 +- .../VCloudVersionsAsyncClient.java | 2 +- ...mmonVCloudComputeServiceContextModule.java | 16 +- .../VCloudComputeServiceContextModule.java | 19 ++ ...oudExpressComputeServiceContextModule.java | 18 ++ .../vcloud/compute/functions/ImagesInOrg.java | 61 +++++ .../OrgAndVDCToLocationSupplier.java | 9 +- .../OrganizationAndVDCToLocationSupplier.java | 70 +++++ .../suppliers/VCloudExpressImageSupplier.java | 92 +++++++ .../suppliers/VCloudImageSupplier.java | 20 +- .../BaseVCloudExpressRestClientModule.java | 203 ++++++++------ .../config/BaseVCloudRestClientModule.java | 203 ++++++++------ .../config/CommonVCloudRestClientModule.java | 100 +++---- .../jclouds/vcloud/domain/VCloudSession.java | 32 +++ .../ParseLoginResponseFromHeaders.java | 2 +- .../jclouds/vcloud/VCloudAsyncClientTest.java | 256 +++++++++++------- .../vcloud/VCloudExpressAsyncClientTest.java | 9 +- .../vcloud/VCloudLoginAsyncClientTest.java | 15 +- .../jclouds/vcloud/VCloudLoginLiveTest.java | 13 +- .../vcloud/VCloudVersionsAsyncClientTest.java | 3 +- .../vcloud/VCloudVersionsLiveTest.java | 3 +- .../ParseLoginResponseFromHeadersTest.java | 2 +- .../HostingDotComVCloudAsyncClientTest.java | 5 +- ...erremarkVCloudExpressRestClientModule.java | 2 +- .../TerremarkECloudAsyncClientTest.java | 5 +- ...TerremarkVCloudExpressAsyncClientTest.java | 5 +- 27 files changed, 831 insertions(+), 409 deletions(-) create mode 100755 vcloud/core/src/main/java/domain/VCloudExpressLoginAsyncClient.java rename vcloud/core/src/main/java/{org/jclouds/vcloud/internal => domain}/VCloudLoginAsyncClient.java (80%) mode change 100755 => 100644 rename vcloud/core/src/main/java/{org/jclouds/vcloud/internal => domain}/VCloudVersionsAsyncClient.java (97%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrg.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudSession.java diff --git a/vcloud/core/src/main/java/domain/VCloudExpressLoginAsyncClient.java b/vcloud/core/src/main/java/domain/VCloudExpressLoginAsyncClient.java new file mode 100755 index 0000000000..153a022ae0 --- /dev/null +++ b/vcloud/core/src/main/java/domain/VCloudExpressLoginAsyncClient.java @@ -0,0 +1,55 @@ +/** + * + * Copyright (C) 2010 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 domain; + + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; + +import org.jclouds.http.filters.BasicAuthentication; +import org.jclouds.rest.annotations.Endpoint; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.ResponseParser; +import org.jclouds.vcloud.VCloudExpressMediaType; +import org.jclouds.vcloud.domain.VCloudSession; +import org.jclouds.vcloud.functions.ParseLoginResponseFromHeaders; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Establishes a context with a VCloud endpoint. + *

+ * + * @see + * @author Adrian Cole + */ +@Endpoint(org.jclouds.vcloud.endpoints.VCloudLogin.class) +@RequestFilters(BasicAuthentication.class) +public interface VCloudExpressLoginAsyncClient { + + /** + * This request returns a token to use in subsequent requests. After ten minutes of inactivity, + * the token expires and you have to request a new token with this call. + */ + @POST + @ResponseParser(ParseLoginResponseFromHeaders.class) + @Consumes(VCloudExpressMediaType.ORGLIST_XML) + ListenableFuture login(); +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudLoginAsyncClient.java b/vcloud/core/src/main/java/domain/VCloudLoginAsyncClient.java old mode 100755 new mode 100644 similarity index 80% rename from vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudLoginAsyncClient.java rename to vcloud/core/src/main/java/domain/VCloudLoginAsyncClient.java index 2d2d21ec94..fbd3d86c98 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudLoginAsyncClient.java +++ b/vcloud/core/src/main/java/domain/VCloudLoginAsyncClient.java @@ -17,9 +17,7 @@ * ==================================================================== */ -package org.jclouds.vcloud.internal; - -import java.util.Map; +package domain; import javax.ws.rs.Consumes; import javax.ws.rs.POST; @@ -28,10 +26,8 @@ import org.jclouds.http.filters.BasicAuthentication; import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.ResponseParser; -import org.jclouds.vcloud.VCloudExpressMediaType; -import org.jclouds.vcloud.VCloudToken; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.functions.ParseLoginResponseFromHeaders; import com.google.common.util.concurrent.ListenableFuture; @@ -47,20 +43,12 @@ import com.google.common.util.concurrent.ListenableFuture; @RequestFilters(BasicAuthentication.class) public interface VCloudLoginAsyncClient { - public interface VCloudSession { - @VCloudToken - String getVCloudToken(); - - @Org - Map getOrgs(); - } - /** * This request returns a token to use in subsequent requests. After ten minutes of inactivity, * the token expires and you have to request a new token with this call. */ @POST @ResponseParser(ParseLoginResponseFromHeaders.class) - @Consumes(VCloudExpressMediaType.ORGLIST_XML) + @Consumes(VCloudMediaType.ORGLIST_XML) ListenableFuture login(); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudVersionsAsyncClient.java b/vcloud/core/src/main/java/domain/VCloudVersionsAsyncClient.java similarity index 97% rename from vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudVersionsAsyncClient.java rename to vcloud/core/src/main/java/domain/VCloudVersionsAsyncClient.java index 16a2f9301e..3c7ff7e1b2 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/internal/VCloudVersionsAsyncClient.java +++ b/vcloud/core/src/main/java/domain/VCloudVersionsAsyncClient.java @@ -17,7 +17,7 @@ * ==================================================================== */ -package org.jclouds.vcloud.internal; +package domain; import java.net.URI; import java.util.SortedMap; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java index 6410bfdc89..b2b9563d92 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java @@ -27,14 +27,10 @@ import javax.inject.Singleton; import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.config.ComputeServiceTimeoutsModule; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.Size; -import org.jclouds.domain.Location; import org.jclouds.vcloud.compute.BaseVCloudComputeClient; -import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; import org.jclouds.vcloud.compute.suppliers.StaticSizeSupplier; -import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; import org.jclouds.vcloud.domain.VAppStatus; import com.google.common.annotations.VisibleForTesting; @@ -50,7 +46,7 @@ import com.google.inject.util.Providers; * * @author Adrian Cole */ -public class CommonVCloudComputeServiceContextModule extends BaseComputeServiceContextModule { +public abstract class CommonVCloudComputeServiceContextModule extends BaseComputeServiceContextModule { @VisibleForTesting static final Map vAppStatusToNodeState = ImmutableMap. builder().put( @@ -74,16 +70,6 @@ public class CommonVCloudComputeServiceContextModule extends BaseComputeServiceC bind(LoadBalancerService.class).toProvider(Providers. of(null)); } - @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(VCloudImageSupplier.class); - } - - @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(OrgAndVDCToLocationSupplier.class); - } - @Override protected Supplier> getSourceSizeSupplier(Injector injector) { return injector.getInstance(StaticSizeSupplier.class); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java index 623ff2cf1a..c0316ec5a6 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java @@ -19,7 +19,10 @@ package org.jclouds.vcloud.compute.config; +import java.util.Set; + import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.Image; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.compute.strategy.DestroyNodeStrategy; @@ -28,6 +31,7 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.domain.Location; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.vcloud.VCloudClient; @@ -37,7 +41,11 @@ import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; +import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; +import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; +import com.google.common.base.Supplier; +import com.google.inject.Injector; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -65,4 +73,15 @@ public class VCloudComputeServiceContextModule extends CommonVCloudComputeServic bind(GetNodeMetadataStrategy.class).to(VCloudGetNodeMetadataStrategy.class); bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); } + + @Override + protected Supplier> getSourceLocationSupplier(Injector injector) { + return injector.getInstance(OrgAndVDCToLocationSupplier.class); + } + + @Override + protected Supplier> getSourceImageSupplier(Injector injector) { + return injector.getInstance(VCloudImageSupplier.class); + } + } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java index 688050440d..f3220b3f6d 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java @@ -19,7 +19,10 @@ package org.jclouds.vcloud.compute.config; +import java.util.Set; + import org.jclouds.compute.ComputeServiceContext; +import org.jclouds.compute.domain.Image; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; import org.jclouds.compute.strategy.DestroyNodeStrategy; @@ -28,6 +31,7 @@ import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.domain.Location; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.vcloud.VCloudExpressClient; @@ -37,7 +41,11 @@ import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; +import org.jclouds.vcloud.compute.suppliers.OrganizationAndVDCToLocationSupplier; +import org.jclouds.vcloud.compute.suppliers.VCloudExpressImageSupplier; +import com.google.common.base.Supplier; +import com.google.inject.Injector; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; @@ -66,4 +74,14 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); } + @Override + protected Supplier> getSourceLocationSupplier(Injector injector) { + return injector.getInstance(OrganizationAndVDCToLocationSupplier.class); + } + + @Override + protected Supplier> getSourceImageSupplier(Injector injector) { + return injector.getInstance(VCloudExpressImageSupplier.class); + } + } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrg.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrg.java new file mode 100644 index 0000000000..82afba6ffc --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrg.java @@ -0,0 +1,61 @@ +/** + * + * Copyright (C) 2010 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.compute.functions; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.Image; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.functions.AllCatalogItemsInOrg; + +import com.google.common.base.Function; +import com.google.common.collect.Iterables; + +/** + * @author Adrian Cole + */ +@Singleton +public class ImagesInOrg implements Function> { + + private final AllCatalogItemsInOrg allCatalogItemsInOrg; + private final Function, Iterable> vAppTemplatesForCatalogItems; + private final Provider imageForVAppTemplateProvider; + + @Inject + ImagesInOrg(AllCatalogItemsInOrg allCatalogItemsInOrg, + Provider imageForVAppTemplateProvider, + Function, Iterable> vAppTemplatesForCatalogItems) { + this.imageForVAppTemplateProvider = imageForVAppTemplateProvider; + this.allCatalogItemsInOrg = allCatalogItemsInOrg; + this.vAppTemplatesForCatalogItems = vAppTemplatesForCatalogItems; + } + + @Override + public Iterable apply(Org from) { + Iterable catalogs = allCatalogItemsInOrg.apply(from); + Iterable vAppTemplates = vAppTemplatesForCatalogItems.apply(catalogs); + return Iterables.transform(vAppTemplates, imageForVAppTemplateProvider.get().withParent(from)); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java index a0cd85140c..ef055bd9c6 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrgAndVDCToLocationSupplier.java @@ -30,8 +30,7 @@ import org.jclouds.domain.LocationScope; import org.jclouds.domain.internal.LocationImpl; import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.domain.Org; import com.google.common.base.Supplier; import com.google.common.collect.Sets; @@ -43,12 +42,12 @@ import com.google.common.collect.Sets; public class OrgAndVDCToLocationSupplier implements Supplier> { private final String providerName; private final Supplier> orgNameToResource; - private final Supplier> orgNameToVDCResource; + private final Supplier> orgNameToVDCResource; @Inject OrgAndVDCToLocationSupplier(@org.jclouds.rest.annotations.Provider String providerName, - @Org Supplier> orgNameToResource, - Supplier> orgNameToVDCResource) { + @org.jclouds.vcloud.endpoints.Org Supplier> orgNameToResource, + Supplier> orgNameToVDCResource) { this.providerName = providerName; this.orgNameToResource = orgNameToResource; this.orgNameToVDCResource = orgNameToVDCResource; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java new file mode 100644 index 0000000000..5aca1ab284 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java @@ -0,0 +1,70 @@ +/** + * + * Copyright (C) 2010 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.compute.suppliers; + +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationScope; +import org.jclouds.domain.internal.LocationImpl; +import org.jclouds.vcloud.compute.domain.VCloudLocation; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.endpoints.Org; + +import com.google.common.base.Supplier; +import com.google.common.collect.Sets; + +/** + * @author Adrian Cole + */ +@Singleton +public class OrganizationAndVDCToLocationSupplier implements Supplier> { + private final String providerName; + private final Supplier> orgNameToResource; + private final Supplier> orgNameToVDCResource; + + @Inject + OrganizationAndVDCToLocationSupplier(@org.jclouds.rest.annotations.Provider String providerName, + @Org Supplier> orgNameToResource, + Supplier> orgNameToVDCResource) { + this.providerName = providerName; + this.orgNameToResource = orgNameToResource; + this.orgNameToVDCResource = orgNameToVDCResource; + } + + @Override + public Set get() { + Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); + Set locations = Sets.newLinkedHashSet(); + + for (NamedResource org : orgNameToResource.get().values()) { + Location orgL = new VCloudLocation(org, provider); + for (NamedResource vdc : orgNameToVDCResource.get().get(org.getName()).getVDCs().values()) { + locations.add(new VCloudLocation(vdc, orgL)); + } + } + return locations; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java new file mode 100644 index 0000000000..5e5d30c030 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java @@ -0,0 +1,92 @@ +/** + * + * Copyright (C) 2010 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.compute.suppliers; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.concat; +import static com.google.common.collect.Sets.newLinkedHashSet; +import static org.jclouds.concurrent.FutureIterables.transformParallel; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + +import javax.annotation.Resource; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.jclouds.Constants; +import org.jclouds.compute.domain.Image; +import org.jclouds.compute.reference.ComputeServiceConstants; +import org.jclouds.logging.Logger; +import org.jclouds.vcloud.compute.functions.ImagesInOrganization; +import org.jclouds.vcloud.domain.Organization; + +import com.google.common.base.Function; +import com.google.common.base.Supplier; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressImageSupplier implements Supplier> { + + @Resource + @Named(ComputeServiceConstants.COMPUTE_LOGGER) + public Logger logger = Logger.NULL; + + private final Supplier> orgMap; + private final ImagesInOrganization imagesInOrganization; + private final ExecutorService executor; + + @Inject + VCloudExpressImageSupplier(Supplier> orgMap, ImagesInOrganization imagesInOrganization, + @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + this.orgMap = checkNotNull(orgMap, "orgMap"); + this.imagesInOrganization = checkNotNull(imagesInOrganization, "imagesInOrganization"); + this.executor = checkNotNull(executor, "executor"); + } + + @Override + public Set get() { + Iterable orgs = checkNotNull(orgMap.get().values(), "orgs"); + Iterable> images = transformParallel(orgs, + new Function>>() { + + @Override + public Future> apply(final Organization from) { + checkNotNull(from, "org"); + return executor.submit(new Callable>() { + + @Override + public Iterable call() throws Exception { + return imagesInOrganization.apply(from); + } + + }); + } + + }, executor, null, logger, "images in " + orgs); + return newLinkedHashSet(concat(images)); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java index 59635918b8..6bceb48741 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java @@ -39,8 +39,8 @@ import org.jclouds.Constants; import org.jclouds.compute.domain.Image; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.compute.functions.ImagesInOrganization; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.compute.functions.ImagesInOrg; +import org.jclouds.vcloud.domain.Org; import com.google.common.base.Function; import com.google.common.base.Supplier; @@ -55,32 +55,32 @@ public class VCloudImageSupplier implements Supplier> { @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; - private final Supplier> orgMap; - private final ImagesInOrganization imagesInOrganization; + private final Supplier> orgMap; + private final ImagesInOrg imagesInOrg; private final ExecutorService executor; @Inject - VCloudImageSupplier(Supplier> orgMap, ImagesInOrganization imagesInOrganization, + VCloudImageSupplier(Supplier> orgMap, ImagesInOrg imagesInOrg, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.orgMap = checkNotNull(orgMap, "orgMap"); - this.imagesInOrganization = checkNotNull(imagesInOrganization, "imagesInOrganization"); + this.imagesInOrg = checkNotNull(imagesInOrg, "imagesInOrg"); this.executor = checkNotNull(executor, "executor"); } @Override public Set get() { - Iterable orgs = checkNotNull(orgMap.get().values(), "orgs"); + Iterable orgs = checkNotNull(orgMap.get().values(), "orgs"); Iterable> images = transformParallel(orgs, - new Function>>() { + new Function>>() { @Override - public Future> apply(final Organization from) { + public Future> apply(final Org from) { checkNotNull(from, "org"); return executor.submit(new Callable>() { @Override public Iterable call() throws Exception { - return imagesInOrganization.apply(from); + return imagesInOrg.apply(from); } }); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java index b4f85c0d1d..f371e19efe 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java @@ -20,6 +20,7 @@ package org.jclouds.vcloud.config; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Throwables.propagate; import static com.google.common.collect.Iterables.get; import static com.google.common.collect.Maps.newLinkedHashMap; import static com.google.common.collect.Maps.transformValues; @@ -31,6 +32,7 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEO import java.net.URI; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Named; @@ -39,6 +41,7 @@ import javax.inject.Singleton; import org.jclouds.domain.Location; import org.jclouds.http.RequiresHttp; import org.jclouds.predicates.RetryablePredicate; +import org.jclouds.rest.AsyncClientFactory; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; @@ -49,6 +52,7 @@ import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.endpoints.TasksList; import org.jclouds.vcloud.functions.VCloudExpressAllCatalogItemsInCatalog; @@ -57,7 +61,6 @@ import org.jclouds.vcloud.functions.VCloudExpressAllVDCsInOrganization; import org.jclouds.vcloud.functions.VCloudExpressOrganizationsForNames; import org.jclouds.vcloud.functions.VCloudExpressOrganizatonsForLocations; import org.jclouds.vcloud.functions.VCloudExpressVAppTemplatesForCatalogItems; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.predicates.VCloudExpressTaskSuccess; import com.google.common.base.Function; @@ -67,16 +70,17 @@ import com.google.inject.Injector; import com.google.inject.Provides; import com.google.inject.TypeLiteral; +import domain.VCloudExpressLoginAsyncClient; + /** - * 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 BaseVCloudExpressRestClientModule - extends CommonVCloudRestClientModule { + extends CommonVCloudRestClientModule { public BaseVCloudExpressRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); @@ -135,7 +139,7 @@ public abstract class BaseVCloudExpressRestClientModule successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { return new RetryablePredicate(injector.getInstance(VCloudExpressTaskSuccess.class), completed); } @@ -143,20 +147,20 @@ public abstract class BaseVCloudExpressRestClientModule> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> orgToVDCSupplier) { + final Supplier> orgToVDCSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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()); + 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; } - return returnVal; - } - }); + }); } @@ -179,15 +183,15 @@ public abstract class BaseVCloudExpressRestClientModule> provideOrgMapCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationMapSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationMapSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } - }); + }); } @Singleton @@ -197,7 +201,7 @@ public abstract class BaseVCloudExpressRestClientModule sessionSupplier, - Function, Iterable> organizationsForNames) { + Function, Iterable> organizationsForNames) { this.sessionSupplier = sessionSupplier; this.organizationsForNames = organizationsForNames; } @@ -210,13 +214,13 @@ public abstract class BaseVCloudExpressRestClientModule>> { + Supplier>> { protected final Supplier> orgSupplier; private final Function> allCatalogsInOrganization; @Inject protected OrganizationCatalogSupplier(Supplier> orgSupplier, - Function> allCatalogsInOrganization) { + Function> allCatalogsInOrganization) { this.orgSupplier = orgSupplier; this.allCatalogsInOrganization = allCatalogsInOrganization; } @@ -224,57 +228,58 @@ public abstract class BaseVCloudExpressRestClientModule> get() { return transformValues( - transformValues(orgSupplier.get(), allCatalogsInOrganization), - new Function, Map>() { + transformValues(orgSupplier.get(), allCatalogsInOrganization), + new Function, Map>() { - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } - }); + }); } } @Provides @Singleton protected Supplier>> provideOrganizationCatalogItemMapSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } - }); + }); } @Provides @Singleton protected Supplier>> provideOrganizationVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } - }); + }); } @Singleton public static class OrganizationVDCSupplier implements - Supplier>> { + Supplier>> { protected final Supplier> orgSupplier; private final Function> allVDCsInOrganization; @Inject protected OrganizationVDCSupplier(Supplier> orgSupplier, - Function> allVDCsInOrganization) { + Function> allVDCsInOrganization) { this.orgSupplier = orgSupplier; this.allVDCsInOrganization = allVDCsInOrganization; } @@ -282,29 +287,29 @@ public abstract class BaseVCloudExpressRestClientModule> get() { return transformValues( - transformValues(orgSupplier.get(), allVDCsInOrganization), - new Function, Map>() { + transformValues(orgSupplier.get(), allVDCsInOrganization), + 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 OrganizationCatalogItemSupplier implements - Supplier>>> { + Supplier>>> { protected final Supplier>> catalogSupplier; private final Function> allCatalogItemsInCatalog; @Inject protected OrganizationCatalogItemSupplier( - Supplier>> catalogSupplier, - Function> allCatalogItemsInCatalog) { + Supplier>> catalogSupplier, + Function> allCatalogItemsInCatalog) { this.catalogSupplier = catalogSupplier; this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; } @@ -312,39 +317,67 @@ public abstract class BaseVCloudExpressRestClientModule>> 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>>> provideOrganizationCatalogItemSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogItemSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogItemSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( - authException, seconds, - new Supplier>>>() { - @Override - public Map>> get() { - return supplier.get(); - } - }); + authException, seconds, + new Supplier>>>() { + @Override + public Map>> get() { + return supplier.get(); + } + }); + } + + @Provides + @Singleton + protected VCloudExpressLoginAsyncClient provideVCloudLogin(AsyncClientFactory factory) { + return factory.create(VCloudExpressLoginAsyncClient.class); + } + + @Provides + @Singleton + protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final VCloudExpressLoginAsyncClient login) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier(authException, seconds, + new Supplier() { + + @Override + public VCloudSession get() { + try { + return login.login().get(10, TimeUnit.SECONDS); + } catch (Exception e) { + propagate(e); + assert false : e; + return null; + } + } + + }); } @Provides diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java index 94286c3424..6c03660788 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java @@ -20,6 +20,7 @@ package org.jclouds.vcloud.config; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Throwables.propagate; import static com.google.common.collect.Iterables.get; import static com.google.common.collect.Maps.newLinkedHashMap; import static com.google.common.collect.Maps.transformValues; @@ -31,6 +32,7 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEO import java.net.URI; import java.util.Map; import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Named; @@ -39,6 +41,7 @@ import javax.inject.Singleton; import org.jclouds.domain.Location; import org.jclouds.http.RequiresHttp; import org.jclouds.predicates.RetryablePredicate; +import org.jclouds.rest.AsyncClientFactory; import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; @@ -49,6 +52,7 @@ import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.endpoints.TasksList; import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog; @@ -57,7 +61,6 @@ import org.jclouds.vcloud.functions.AllVDCsInOrg; import org.jclouds.vcloud.functions.OrgsForLocations; import org.jclouds.vcloud.functions.OrgsForNames; import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.predicates.TaskSuccess; import com.google.common.base.Function; @@ -67,16 +70,17 @@ import com.google.inject.Injector; import com.google.inject.Provides; import com.google.inject.TypeLiteral; +import domain.VCloudLoginAsyncClient; + /** - * 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); @@ -135,7 +139,7 @@ public abstract class BaseVCloudRestClientModule 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); } @@ -143,20 +147,20 @@ public abstract class BaseVCloudRestClientModule> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> orgToVDCSupplier) { + final Supplier> orgToVDCSupplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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()); + 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; } - return returnVal; - } - }); + }); } @@ -179,15 +183,15 @@ public abstract class BaseVCloudRestClientModule> provideOrgMapCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final OrgMapSupplier supplier) { + final OrgMapSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } + seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } - }); + }); } @Singleton @@ -197,7 +201,7 @@ public abstract class BaseVCloudRestClientModule sessionSupplier, - Function, Iterable> organizationsForNames) { + Function, Iterable> organizationsForNames) { this.sessionSupplier = sessionSupplier; this.organizationsForNames = organizationsForNames; } @@ -210,13 +214,13 @@ public abstract class BaseVCloudRestClientModule>> { + Supplier>> { protected final Supplier> orgSupplier; private final Function> allCatalogsInOrg; @Inject protected OrgCatalogSupplier(Supplier> orgSupplier, - Function> allCatalogsInOrg) { + Function> allCatalogsInOrg) { this.orgSupplier = orgSupplier; this.allCatalogsInOrg = allCatalogsInOrg; } @@ -224,57 +228,58 @@ public abstract class BaseVCloudRestClientModule> 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); + } - }); + }); } } @Provides @Singleton protected Supplier>> provideOrgCatalogItemMapSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } - }); + }); } @Provides @Singleton protected Supplier>> provideOrgVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } - }); + }); } @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; } @@ -282,29 +287,29 @@ public abstract class BaseVCloudRestClientModule> 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; @Inject protected OrgCatalogItemSupplier( - Supplier>> catalogSupplier, - Function> allCatalogItemsInCatalog) { + Supplier>> catalogSupplier, + Function> allCatalogItemsInCatalog) { this.catalogSupplier = catalogSupplier; this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; } @@ -312,39 +317,40 @@ public abstract class BaseVCloudRestClientModule>> 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, final OrgCatalogItemSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( - authException, seconds, - new Supplier>>>() { - @Override - public Map>> get() { - return supplier.get(); - } - }); + authException, seconds, + new Supplier>>>() { + @Override + public Map>> get() { + return supplier.get(); + } + }); } @Provides @@ -353,4 +359,31 @@ public abstract class BaseVCloudRestClientModule provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final VCloudLoginAsyncClient login) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier(authException, seconds, + new Supplier() { + + @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/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java index 6652f29633..13b9d79782 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java @@ -21,7 +21,6 @@ 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.base.Throwables.propagate; import static com.google.common.collect.Iterables.concat; import static com.google.common.collect.Iterables.getLast; import static com.google.common.collect.Iterables.transform; @@ -58,13 +57,11 @@ import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudToken; import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.endpoints.Catalog; import org.jclouds.vcloud.endpoints.Network; import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import com.google.common.base.Function; import com.google.common.base.Predicate; @@ -72,9 +69,10 @@ import com.google.common.base.Supplier; import com.google.inject.Injector; import com.google.inject.Provides; +import domain.VCloudVersionsAsyncClient; + /** - * 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 */ @@ -98,7 +96,7 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Provides @Singleton protected abstract Predicate successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed); + @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed); @VCloudToken @Provides @@ -124,27 +122,27 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Org @Singleton protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final OrgNameToOrgSupplier supplier) { + final OrgNameToOrgSupplier supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); } @Provides @Singleton protected Supplier> provideURIToVDC( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final URItoVDC supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final URItoVDC supplier) { return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - }); + authException, seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + }); } @Singleton @@ -159,24 +157,24 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Override public Map 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.getId(); - } + @Override + public URI apply(org.jclouds.vcloud.domain.VDC from) { + return from.getId(); + } - }); + }); } } @@ -192,27 +190,6 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul protected AtomicReference authException = new AtomicReference(); - @Provides - @Singleton - protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier(authException, seconds, - new Supplier() { - - @Override - public VCloudSession get() { - try { - return login.login().get(10, TimeUnit.SECONDS); - } catch (Exception e) { - propagate(e); - assert false : e; - return null; - } - } - - }); - } - final static Function name = new Function() { @Override @@ -226,7 +203,8 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Singleton @org.jclouds.vcloud.endpoints.VCloudLogin protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, TimeoutException { + @Named(PROPERTY_API_VERSION) String version) throws InterruptedException, ExecutionException, + TimeoutException { SortedMap versions = versionService.getSupportedVersions().get(180, TimeUnit.SECONDS); checkState(versions.size() > 0, "No versions present"); checkState(versions.containsKey(version), "version " + version + " not present in: " + versions); @@ -250,12 +228,6 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul } - @Provides - @Singleton - protected VCloudLoginAsyncClient provideVCloudLogin(AsyncClientFactory factory) { - return factory.create(VCloudLoginAsyncClient.class); - } - @Provides @Singleton protected VCloudVersionsAsyncClient provideVCloudVersions(AsyncClientFactory factory) { @@ -266,7 +238,7 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul @Catalog @Singleton protected String provideCatalogName( - Supplier>> catalogs) { + Supplier>> catalogs) { return getLast(getLast(catalogs.get().values()).keySet()); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudSession.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudSession.java new file mode 100644 index 0000000000..c977d1079c --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VCloudSession.java @@ -0,0 +1,32 @@ +/** + * + * Copyright (C) 2010 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.domain; + +import java.util.Map; + +/** + * + * @author Adrian Cole + */ +public interface VCloudSession { + String getVCloudToken(); + + Map getOrgs(); +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java index 01e52be703..1b87d4118f 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeaders.java @@ -37,8 +37,8 @@ import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.Factory; import org.jclouds.vcloud.VCloudToken; import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.xml.OrgListHandler; import com.google.common.base.Function; diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java index ca57ca8296..a00f2a6d93 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java @@ -51,15 +51,13 @@ import org.jclouds.util.Utils; import org.jclouds.vcloud.config.VCloudRestClientModule; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.jclouds.vcloud.domain.internal.OrgImpl; import org.jclouds.vcloud.domain.internal.VDCImpl; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.xml.CatalogHandler; @@ -79,6 +77,9 @@ import com.google.common.collect.ImmutableMap; import com.google.inject.Module; import com.google.inject.TypeLiteral; +import domain.VCloudLoginAsyncClient; +import domain.VCloudVersionsAsyncClient; + /** * Tests behavior of {@code VCloudAsyncClient} * @@ -89,16 +90,16 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testInstantiateVAppTemplateInVDCURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); + String.class, InstantiateVAppTemplateOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp"); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp"); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp.xml")), - "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, VAppHandler.class); @@ -108,19 +109,20 @@ public class VCloudAsyncClientTest extends RestClientTest { } public void testInstantiateVAppTemplateInVDCURIOptions() throws SecurityException, NoSuchMethodException, - IOException { + IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); - HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp", processorCount(1).memory( - 512).disk(1024).inNetwork(URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"))); + String.class, InstantiateVAppTemplateOptions[].class); + HttpRequest request = processor + .createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/3"), "my-vapp", + processorCount(1).memory(512).disk(1024).inNetwork( + URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"))); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/instantiateVAppTemplate HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/newvapp-cpumemdisk.xml")), - "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); + "application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, VAppHandler.class); @@ -131,26 +133,26 @@ public class VCloudAsyncClientTest extends RestClientTest { @Test(expectedExceptions = IllegalArgumentException.class) public void testInstantiateVAppTemplateInOrgOptionsIllegalName() throws SecurityException, NoSuchMethodException, - IOException { + IOException { Method method = VCloudAsyncClient.class.getMethod("instantiateVAppTemplateInVDC", URI.class, URI.class, - String.class, InstantiateVAppTemplateOptions[].class); + String.class, InstantiateVAppTemplateOptions[].class); processor.createRequest(method, URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "CentOS 01", processorCount(1).memory(512) - .disk(1024).inNetwork(URI.create("https://vcenterprise.bluelock.com/network/1990"))); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "CentOS 01", processorCount(1).memory(512) + .disk(1024).inNetwork(URI.create("https://vcenterprise.bluelock.com/network/1990"))); } public void testCloneVAppInVDC() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, - CloneVAppOptions[].class); + CloneVAppOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/4181"), "my-vapp"); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/4181"), "my-vapp"); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/cloneVApp-default.xml")), - "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, TaskHandler.class); @@ -161,17 +163,17 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCloneVAppInVDCOptions() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cloneVAppInVDC", URI.class, URI.class, String.class, - CloneVAppOptions[].class); + CloneVAppOptions[].class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/201"), "new-linux-server", new CloneVAppOptions() - .deploy().powerOn().withDescription("The description of the new vApp")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vapp/201"), "new-linux-server", + new CloneVAppOptions().deploy().powerOn().withDescription("The description of the new vApp")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vdc/1/action/cloneVApp HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, Utils.toStringAndClose(getClass().getResourceAsStream("/cloneVApp.xml")), - "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); + "application/vnd.vmware.vcloud.cloneVAppParams+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, TaskHandler.class); @@ -183,7 +185,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testOrg() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getOrg", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/org/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/org/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/org/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.org+xml\n"); @@ -214,7 +216,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCatalog() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getCatalog", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalog/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); @@ -245,7 +247,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testNetwork() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getNetwork", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/network/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/network/2")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/network/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.network+xml\n"); @@ -261,7 +263,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCatalogItemURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getCatalogItem", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalogItem+xml\n"); @@ -276,7 +278,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testFindCatalogItemInOrgCatalogNamed() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("findCatalogItemInOrgCatalogNamed", String.class, String.class, - String.class); + String.class); HttpRequest request = processor.createRequest(method, "org", "catalog", "item"); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1 HTTP/1.1"); @@ -292,7 +294,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testFindVAppTemplate() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("findVAppTemplateInOrgCatalogNamed", String.class, - String.class, String.class); + String.class, String.class); HttpRequest request = processor.createRequest(method, "org", "catalog", "template"); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2 HTTP/1.1"); @@ -309,7 +311,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testVAppTemplateURI() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVAppTemplate", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vAppTemplate+xml\n"); @@ -382,7 +384,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetVDC() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVDC", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vdc/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vdc+xml\n"); @@ -398,7 +400,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetTasksList() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getTasksList", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/tasksList/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.tasksList+xml\n"); @@ -429,7 +431,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testDeployVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("deployVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/deploy HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); @@ -445,7 +447,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/vApp/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.vApp+xml\n"); @@ -461,10 +463,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testUndeployVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("undeployVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/undeploy HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/action/undeploy HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -478,7 +480,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testDeleteVApp() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("deleteVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, "DELETE https://vcenterprise.bluelock.com/api/v1.0/vApp/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); @@ -494,10 +496,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testPowerOn() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("powerOnVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOn HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOn HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -511,10 +513,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testPowerOff() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("powerOffVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOff HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/powerOff HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -528,10 +530,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testReset() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("resetVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/reset HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/reset HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -545,10 +547,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testSuspend() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("suspendVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/suspend HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/suspend HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); assertPayloadEquals(request, null, null, false); @@ -562,10 +564,10 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testShutdown() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("shutdownVApp", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/1")); assertRequestLineEquals(request, - "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/shutdown HTTP/1.1"); + "POST https://vcenterprise.bluelock.com/api/v1.0/vApp/1/power/action/shutdown HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); assertPayloadEquals(request, null, null, false); @@ -579,7 +581,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testGetTask() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("getTask", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); assertRequestLineEquals(request, "GET https://vcenterprise.bluelock.com/api/v1.0/task/1 HTTP/1.1"); assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.task+xml\n"); @@ -595,7 +597,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public void testCancelTask() throws SecurityException, NoSuchMethodException, IOException { Method method = VCloudAsyncClient.class.getMethod("cancelTask", URI.class); HttpRequest request = processor.createRequest(method, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); + .create("https://vcenterprise.bluelock.com/api/v1.0/task/1")); assertRequestLineEquals(request, "POST https://vcenterprise.bluelock.com/api/v1.0/task/1/action/cancel HTTP/1.1"); assertNonPayloadHeadersEqual(request, ""); @@ -637,7 +639,7 @@ public class VCloudAsyncClientTest extends RestClientTest { public static class VCloudRestClientModuleExtension extends VCloudRestClientModule { @Override protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { + @Named(PROPERTY_API_VERSION) String version) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/login"); } @@ -663,11 +665,6 @@ public class VCloudAsyncClientTest extends RestClientTest { 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://vcenterprise.bluelock.com/api/v1.0/taskslist"); @@ -685,13 +682,13 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override protected Supplier provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { + final VCloudLoginAsyncClient login) { return Suppliers. ofInstance(new VCloudSession() { @Override public Map getOrgs() { return ImmutableMap. of("org", new NamedResourceImpl("org", - VCloudMediaType.ORG_XML, URI.create("https://vcenterprise.bluelock.com/api/v1.0/org/1"))); + VCloudMediaType.ORG_XML, URI.create("https://vcenterprise.bluelock.com/api/v1.0/org/1"))); } @Override @@ -712,18 +709,41 @@ public class VCloudAsyncClientTest extends RestClientTest { } protected Supplier>> provideOrgVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { - return Suppliers.>> ofInstance(ImmutableMap - .> of("org", + return Suppliers + .>> ofInstance(ImmutableMap + .> of( + "org", - ImmutableMap. of("vdc", new VDCImpl("vdc", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), "description", null, null, null, - null, null, ImmutableMap. of("vapp", new NamedResourceImpl("vapp", - "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), "network", - new NamedResourceImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), null)))); + ImmutableMap + . of( + "vdc", + new VDCImpl( + "vdc", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), + "description", + null, + null, + null, + null, + null, + ImmutableMap + . of( + "vapp", + new NamedResourceImpl( + "vapp", + "application/vnd.vmware.vcloud.vApp+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vApp/188849-1")), + "network", + new NamedResourceImpl( + "network", + "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), + null)))); } @@ -737,15 +757,17 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public Map get() { return ImmutableMap. of("org", new OrgImpl("org", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "description", ImmutableMap - . of("catalog", new NamedResourceImpl("catalog", VCloudMediaType.CATALOG_XML, - URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap - . of("vdc", new NamedResourceImpl("vdc", VCloudMediaType.VDC_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap - . of("network", new NamedResourceImpl("network", VCloudMediaType.NETWORK_XML, - URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1"))), new NamedResourceImpl( - "tasksList", VCloudMediaType.TASKSLIST_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")))); + .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "description", ImmutableMap + . of("catalog", new NamedResourceImpl("catalog", + VCloudMediaType.CATALOG_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap + . of("vdc", new NamedResourceImpl("vdc", VCloudMediaType.VDC_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"))), ImmutableMap + . of("network", new NamedResourceImpl("network", + VCloudMediaType.NETWORK_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/network/1"))), + new NamedResourceImpl("tasksList", VCloudMediaType.TASKSLIST_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")))); } } @@ -758,15 +780,32 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public Map> get() { - return ImmutableMap.> of("org", + return ImmutableMap + .> of( + "org", - ImmutableMap. of("catalog", new CatalogImpl("catalog", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), "description", ImmutableMap - . of("item", new NamedResourceImpl("item", - "application/vnd.vmware.vcloud.catalogItem+xml", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), "template", - new NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")))))); + ImmutableMap + . of( + "catalog", + new CatalogImpl( + "catalog", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), + "description", + ImmutableMap + . of( + "item", + new NamedResourceImpl( + "item", + "application/vnd.vmware.vcloud.catalogItem+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), + "template", + new NamedResourceImpl( + "template", + "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")))))); } } @@ -778,18 +817,35 @@ public class VCloudAsyncClientTest 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 NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI.create("https://vcenterprise.bluelock.com/api/v1.0/vAppTemplate/2")), - ImmutableMap. of())))); + 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 NamedResourceImpl( + "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/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index bc23d2149a..0057c7420a 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -51,6 +51,7 @@ import org.jclouds.util.Utils; import org.jclouds.vcloud.config.VCloudExpressRestClientModule; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; @@ -58,9 +59,6 @@ import org.jclouds.vcloud.domain.internal.OrganizationImpl; import org.jclouds.vcloud.domain.internal.VDCImpl; import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.xml.CatalogHandler; @@ -80,6 +78,9 @@ import com.google.common.collect.ImmutableMap; import com.google.inject.Module; import com.google.inject.TypeLiteral; +import domain.VCloudExpressLoginAsyncClient; +import domain.VCloudVersionsAsyncClient; + /** * Tests behavior of {@code VCloudExpressAsyncClient} * @@ -746,7 +747,7 @@ public class VCloudExpressAsyncClientTest extends RestClientTest provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final VCloudLoginAsyncClient login) { + final VCloudExpressLoginAsyncClient login) { return Suppliers. ofInstance(new VCloudSession() { @Override diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java index e113977838..5352948c24 100755 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginAsyncClientTest.java @@ -37,7 +37,6 @@ import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.vcloud.VCloudLoginLiveTest.VCloudLoginClient; import org.jclouds.vcloud.endpoints.VCloudLogin; import org.jclouds.vcloud.functions.ParseLoginResponseFromHeaders; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; import org.testng.annotations.Test; import com.google.inject.Binder; @@ -45,16 +44,18 @@ import com.google.inject.Module; import com.google.inject.Provides; import com.google.inject.TypeLiteral; +import domain.VCloudExpressLoginAsyncClient; + /** * Tests behavior of {@code VCloudLogin} * * @author Adrian Cole */ @Test(groups = "unit", testName = "vcloud.VCloudLoginTest") -public class VCloudLoginAsyncClientTest extends RestClientTest { +public class VCloudLoginAsyncClientTest extends RestClientTest { public void testLogin() throws SecurityException, NoSuchMethodException, IOException { - Method method = VCloudLoginAsyncClient.class.getMethod("login"); + Method method = VCloudExpressLoginAsyncClient.class.getMethod("login"); HttpRequest request = processor.createRequest(method); assertEquals(request.getRequestLine(), "POST http://localhost:8080/login HTTP/1.1"); @@ -76,8 +77,8 @@ public class VCloudLoginAsyncClientTest extends RestClientTest> createTypeLiteral() { - return new TypeLiteral>() { + protected TypeLiteral> createTypeLiteral() { + return new TypeLiteral>() { }; } @@ -100,8 +101,8 @@ public class VCloudLoginAsyncClientTest extends RestClientTest createContextSpec() { + public ContextSpec createContextSpec() { return contextSpec("test", "http://localhost:8080/login", "1", "identity", "credential", VCloudLoginClient.class, - VCloudLoginAsyncClient.class); + VCloudExpressLoginAsyncClient.class); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginLiveTest.java index 6cdd65a194..53309f3f61 100755 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudLoginLiveTest.java @@ -34,9 +34,8 @@ import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContextFactory.ContextSpec; import org.jclouds.rest.annotations.Provider; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.endpoints.VCloudLogin; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -45,6 +44,8 @@ import com.google.inject.AbstractModule; import com.google.inject.Module; import com.google.inject.Provides; +import domain.VCloudExpressLoginAsyncClient; + /** * Tests behavior of {@code VCloudLogin} * @@ -53,11 +54,11 @@ import com.google.inject.Provides; @Test(groups = "live", testName = "vcloud.VCloudLoginLiveTest") public class VCloudLoginLiveTest { - private RestContext context; + private RestContext context; @Test public void testLogin() throws Exception { - VCloudLoginAsyncClient authentication = context.getAsyncApi(); + VCloudExpressLoginAsyncClient authentication = context.getAsyncApi(); for (int i = 0; i < 5; i++) { VCloudSession response = authentication.login().get(45, TimeUnit.SECONDS); assertNotNull(response); @@ -80,8 +81,8 @@ public class VCloudLoginLiveTest { String identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - ContextSpec contextSpec = contextSpec("test", endpoint, "1", identity, - credential, VCloudLoginClient.class, VCloudLoginAsyncClient.class); + ContextSpec contextSpec = contextSpec("test", endpoint, "1", identity, + credential, VCloudLoginClient.class, VCloudExpressLoginAsyncClient.class); context = createContextBuilder( contextSpec, diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java index 7259998f20..96ee6de720 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsAsyncClientTest.java @@ -31,12 +31,13 @@ import org.jclouds.rest.RestClientTest; import org.jclouds.rest.RestContextFactory.ContextSpec; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.vcloud.VCloudVersionsLiveTest.VCloudVersionsClient; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; import org.jclouds.vcloud.xml.SupportedVersionsHandler; import org.testng.annotations.Test; import com.google.inject.TypeLiteral; +import domain.VCloudVersionsAsyncClient; + /** * Tests behavior of {@code VCloudVersions} * diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsLiveTest.java index d9872167fc..f5fa1379d4 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudVersionsLiveTest.java @@ -34,13 +34,14 @@ import org.jclouds.concurrent.config.ExecutorServiceModule; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; import org.jclouds.rest.RestContextFactory.ContextSpec; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.collect.ImmutableSet; import com.google.inject.Module; +import domain.VCloudVersionsAsyncClient; + /** * Tests behavior of {@code VCloudVersions} * diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java index 49842e393b..ec4d9ebdfb 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/functions/ParseLoginResponseFromHeadersTest.java @@ -29,8 +29,8 @@ import org.jclouds.http.HttpResponse; import org.jclouds.http.functions.BaseHandlerTest; import org.jclouds.io.Payloads; import org.jclouds.vcloud.VCloudExpressMediaType; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java index ecbada0a2b..9afa7d2fc0 100644 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java +++ b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java @@ -41,11 +41,10 @@ import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.hostingdotcom.config.HostingDotComVCloudRestClientModule; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.xml.CatalogHandler; import org.testng.annotations.Test; @@ -53,6 +52,8 @@ import com.google.common.base.Supplier; import com.google.inject.Module; import com.google.inject.TypeLiteral; +import domain.VCloudVersionsAsyncClient; + /** * Tests behavior of {@code HostingDotComVCloudAsyncClient} * diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java index e15a3f971a..f8290e5be6 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java @@ -35,7 +35,7 @@ import org.jclouds.util.Utils; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClient; diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java index 2bb7eb1543..1e9061e857 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java @@ -49,10 +49,9 @@ import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExt import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrganizationCatalogSupplier; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestOrgNameToKeysListSupplier; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestTerremarkOrganizationMapSupplier; @@ -77,6 +76,8 @@ import com.google.common.base.Supplier; import com.google.inject.Module; import com.google.inject.TypeLiteral; +import domain.VCloudVersionsAsyncClient; + /** * Tests behavior of {@code TerremarkECloudAsyncClient} * diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java index edacf67644..7836d704fe 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java @@ -54,11 +54,10 @@ import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExt import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.internal.VCloudVersionsAsyncClient; -import org.jclouds.vcloud.internal.VCloudLoginAsyncClient.VCloudSession; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.terremark.config.TerremarkVCloudExpressRestClientModule; import org.jclouds.vcloud.terremark.domain.Protocol; @@ -88,6 +87,8 @@ import com.google.common.collect.Maps; import com.google.inject.Module; import com.google.inject.TypeLiteral; +import domain.VCloudVersionsAsyncClient; + /** * Tests behavior of {@code TerremarkVCloudExpressAsyncClient} * From df50812b533c349e2c08dac54ffd0720616bac25 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 20 Aug 2010 13:56:05 -0700 Subject: [PATCH 06/16] Issue 342: implemented self-signed cert option for default http service --- core/src/main/java/org/jclouds/Constants.java | 46 ++++++++++-------- .../java/org/jclouds/PropertiesBuilder.java | 17 +++++-- .../main/java/org/jclouds/http/HttpUtils.java | 7 +++ ...vaUrlHttpCommandExecutorServiceModule.java | 47 +++++++++++++++++-- .../JavaUrlHttpCommandExecutorService.java | 14 ++++-- .../BackoffLimitedRetryHandlerTest.java | 13 ++++- 6 files changed, 110 insertions(+), 34 deletions(-) diff --git a/core/src/main/java/org/jclouds/Constants.java b/core/src/main/java/org/jclouds/Constants.java index 280cd79ca3..f4e8207aa5 100644 --- a/core/src/main/java/org/jclouds/Constants.java +++ b/core/src/main/java/org/jclouds/Constants.java @@ -30,21 +30,21 @@ public interface Constants { *

* Amount of threads servicing the user requests and transformations */ - public static final String PROPERTY_USER_THREADS = "jclouds.user_threads"; + public static final String PROPERTY_USER_THREADS = "jclouds.user-threads"; /** * Integer property. default (20) *

* Amount of threads servicing the I/O of http connections. */ - public static final String PROPERTY_IO_WORKER_THREADS = "jclouds.io_worker_threads"; + public static final String PROPERTY_IO_WORKER_THREADS = "jclouds.io-worker-threads"; /** * Integer property. default (20) *

* Limits the amount of connections per context. */ - public static final String PROPERTY_MAX_CONNECTIONS_PER_CONTEXT = "jclouds.max_connections_per_context"; + public static final String PROPERTY_MAX_CONNECTIONS_PER_CONTEXT = "jclouds.max-connections-per_context"; /** * Integer property. default (0) @@ -52,73 +52,73 @@ public interface Constants { * Limits the amount of connections per host. 0 means indirectly limited by * {@link #PROPERTY_MAX_CONNECTIONS_PER_CONTEXT}. */ - public static final String PROPERTY_MAX_CONNECTIONS_PER_HOST = "jclouds.max_connections_per_host"; + public static final String PROPERTY_MAX_CONNECTIONS_PER_HOST = "jclouds.max-connections-per-host"; /** * Integer property. default (2) *

* Maximum amount of http session failures before a pool is disabled. */ - public static final String PROPERTY_MAX_SESSION_FAILURES = "jclouds.max_session_failures"; + public static final String PROPERTY_MAX_SESSION_FAILURES = "jclouds.max-session-failures"; /** * Integer property. default (75) *

* Maximum amount of times to re_use an http connection. Services like Amazon S3 throw errors if * connections are reused too many times. */ - public static final String PROPERTY_MAX_CONNECTION_REUSE = "jclouds.max_connection_reuse"; + public static final String PROPERTY_MAX_CONNECTION_REUSE = "jclouds.max-connection-reuse"; /** * int property. default (60000) *

* How many milliseconds to wait before a socket connection times out. 0 means infinity. */ - public static final String PROPERTY_SO_TIMEOUT = "jclouds.so_timeout"; + public static final String PROPERTY_SO_TIMEOUT = "jclouds.so-timeout"; /** * Long property. default (60000) *

* How many milliseconds to wait before a connection times out. 0 means infinity. */ - public static final String PROPERTY_CONNECTION_TIMEOUT = "jclouds.connection_timeout"; + public static final String PROPERTY_CONNECTION_TIMEOUT = "jclouds.connection-timeout"; /** * Long property. default (60) *

* How many seconds to wait before creating a new session */ - public static final String PROPERTY_SESSION_INTERVAL = "jclouds.session_interval"; + public static final String PROPERTY_SESSION_INTERVAL = "jclouds.session-interval"; /** * Boolean property. *

* Whether or not to use the proxy setup from the underlying operating system. */ - public static final String PROPERTY_PROXY_SYSTEM = "jclouds.use_system_proxy"; + public static final String PROPERTY_PROXY_SYSTEM = "jclouds.use-system-proxy"; /** * String property. *

*Explicitly sets the host name of a HTTP proxy server. */ - public static final String PROPERTY_PROXY_HOST = "jclouds.proxy_host"; + public static final String PROPERTY_PROXY_HOST = "jclouds.proxy-host"; /** * Integer property. *

* Explicitly sets the port number of a HTTP proxy server. */ - public static final String PROPERTY_PROXY_PORT = "jclouds.proxy_port"; + public static final String PROPERTY_PROXY_PORT = "jclouds.proxy-port"; /** * String property. *

* Explicitly sets the user name credential for proxy authentication. */ - public static final String PROPERTY_PROXY_USER = "jclouds.proxy_user"; + public static final String PROPERTY_PROXY_USER = "jclouds.proxy-user"; /** * String property. *

* Explicitly sets the password credential for proxy authentication. */ - public static final String PROPERTY_PROXY_PASSWORD = "jclouds.proxy_password"; + public static final String PROPERTY_PROXY_PASSWORD = "jclouds.proxy-password"; /** * Integer property. @@ -126,26 +126,32 @@ public interface Constants { * Commands are retried, if the problem on the server side was a resolvable conflict. However, * the maximum tries of a single command is bounded. */ - public static final String PROPERTY_MAX_RETRIES = "jclouds.max_retries"; + public static final String PROPERTY_MAX_RETRIES = "jclouds.max-retries"; /** * Integer property. *

* Commands are limited to only a certain amount of redirects. */ - public static final String PROPERTY_MAX_REDIRECTS = "jclouds.max_redirects"; + public static final String PROPERTY_MAX_REDIRECTS = "jclouds.max-redirects"; /** * Long property. *

* longest time a single request can take before throwing an exception. */ - public static final String PROPERTY_REQUEST_TIMEOUT = "jclouds.request_timeout"; + public static final String PROPERTY_REQUEST_TIMEOUT = "jclouds.request-timeout"; /** * Boolean property. *

* allow mismatch between hostname and ssl cerificate. Set to true in DNS_based services like * Amazon S3. */ - public static final String PROPERTY_RELAX_HOSTNAME = "jclouds.relax_hostname"; + public static final String PROPERTY_RELAX_HOSTNAME = "jclouds.relax-hostname"; + /** + * Boolean property. + *

+ * trust self-signed certs + */ + public static final String PROPERTY_TRUST_ALL_CERTS = "jclouds.trust-all-certs"; /** * Name of the logger that records all http headers from the client and the server. */ @@ -161,7 +167,7 @@ public interface Constants { /** * Name of the custom adapter bindings map for Json */ - public static final String PROPERTY_GSON_ADAPTERS = "jclouds.gson_adapters"; + public static final String PROPERTY_GSON_ADAPTERS = "jclouds.gson-adapters"; /** * String property. @@ -182,7 +188,7 @@ public interface Constants { *

* Explicitly identifies the version of an api. */ - public static final String PROPERTY_API_VERSION = "jclouds.api_version"; + public static final String PROPERTY_API_VERSION = "jclouds.api-version"; /** * String property. diff --git a/core/src/main/java/org/jclouds/PropertiesBuilder.java b/core/src/main/java/org/jclouds/PropertiesBuilder.java index 6b509773c4..21a312ca19 100755 --- a/core/src/main/java/org/jclouds/PropertiesBuilder.java +++ b/core/src/main/java/org/jclouds/PropertiesBuilder.java @@ -23,6 +23,7 @@ import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.Constants.PROPERTY_CONNECTION_TIMEOUT; import static org.jclouds.Constants.PROPERTY_CREDENTIAL; import static org.jclouds.Constants.PROPERTY_ENDPOINT; +import static org.jclouds.Constants.PROPERTY_IDENTITY; import static org.jclouds.Constants.PROPERTY_IO_WORKER_THREADS; import static org.jclouds.Constants.PROPERTY_MAX_CONNECTIONS_PER_CONTEXT; import static org.jclouds.Constants.PROPERTY_MAX_CONNECTIONS_PER_HOST; @@ -30,7 +31,6 @@ import static org.jclouds.Constants.PROPERTY_MAX_CONNECTION_REUSE; import static org.jclouds.Constants.PROPERTY_MAX_REDIRECTS; import static org.jclouds.Constants.PROPERTY_MAX_RETRIES; import static org.jclouds.Constants.PROPERTY_MAX_SESSION_FAILURES; -import static org.jclouds.Constants.PROPERTY_IDENTITY; import static org.jclouds.Constants.PROPERTY_PROVIDER; import static org.jclouds.Constants.PROPERTY_PROXY_HOST; import static org.jclouds.Constants.PROPERTY_PROXY_PASSWORD; @@ -40,6 +40,7 @@ import static org.jclouds.Constants.PROPERTY_PROXY_USER; import static org.jclouds.Constants.PROPERTY_RELAX_HOSTNAME; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; import static org.jclouds.Constants.PROPERTY_SO_TIMEOUT; +import static org.jclouds.Constants.PROPERTY_TRUST_ALL_CERTS; import static org.jclouds.Constants.PROPERTY_USER_THREADS; import java.util.Properties; @@ -63,6 +64,14 @@ public class PropertiesBuilder { return this; } + /** + * @see org.jclouds.Constants.PROPERTY_TRUST_ALL_CERTS + */ + public PropertiesBuilder trustAllCerts(boolean trust) { + properties.setProperty(PROPERTY_TRUST_ALL_CERTS, trust + ""); + return this; + } + /** * @see org.jclouds.Constants.PROPERTY_PROXY_SYSTEM */ @@ -147,8 +156,7 @@ public class PropertiesBuilder { * @see org.jclouds.Constants.PROPERTY_MAX_SESSION_FAILURES */ public PropertiesBuilder withMaxSessionFailures(int poolMaxSessionFailures) { - properties.setProperty(PROPERTY_MAX_SESSION_FAILURES, Integer - .toString(poolMaxSessionFailures)); + properties.setProperty(PROPERTY_MAX_SESSION_FAILURES, Integer.toString(poolMaxSessionFailures)); return this; } @@ -173,8 +181,7 @@ public class PropertiesBuilder { * @see org.jclouds.Constants.PROPERTY_MAX_CONNECTIONS_PER_CONTEXT */ public PropertiesBuilder limitConnectionsTo(int connectionLimit) { - properties.setProperty(PROPERTY_MAX_CONNECTIONS_PER_CONTEXT, Integer - .toString(connectionLimit)); + properties.setProperty(PROPERTY_MAX_CONNECTIONS_PER_CONTEXT, Integer.toString(connectionLimit)); return this; } diff --git a/core/src/main/java/org/jclouds/http/HttpUtils.java b/core/src/main/java/org/jclouds/http/HttpUtils.java index 4af5d79d2e..c72266660e 100644 --- a/core/src/main/java/org/jclouds/http/HttpUtils.java +++ b/core/src/main/java/org/jclouds/http/HttpUtils.java @@ -117,6 +117,9 @@ public class HttpUtils { @Inject(optional = true) @Named(Constants.PROPERTY_PROXY_PASSWORD) private String proxyPassword; + @Inject(optional = true) + @Named(Constants.PROPERTY_TRUST_ALL_CERTS) + private boolean trustAllCerts; @Inject public HttpUtils(@Named(Constants.PROPERTY_CONNECTION_TIMEOUT) int connectionTimeout, @@ -169,6 +172,10 @@ public class HttpUtils { return relaxHostname; } + public boolean trustAllCerts() { + return trustAllCerts; + } + public boolean useSystemProxies() { return systemProxies; } diff --git a/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java b/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java index 95390cc27a..ff1facf787 100644 --- a/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java +++ b/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java @@ -19,12 +19,20 @@ package org.jclouds.http.config; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; import java.util.Map; import javax.annotation.Resource; +import javax.inject.Named; import javax.inject.Singleton; import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; import org.jclouds.http.HttpCommandExecutorService; import org.jclouds.http.TransformingHttpCommandExecutorService; @@ -34,6 +42,7 @@ import org.jclouds.logging.Logger; import com.google.common.collect.Maps; import com.google.inject.AbstractModule; +import com.google.inject.Provides; import com.google.inject.Scopes; /** @@ -52,11 +61,10 @@ public class JavaUrlHttpCommandExecutorServiceModule extends AbstractModule { } protected void bindClient() { - bind(HttpCommandExecutorService.class).to(JavaUrlHttpCommandExecutorService.class).in( - Scopes.SINGLETON); + bind(HttpCommandExecutorService.class).to(JavaUrlHttpCommandExecutorService.class).in(Scopes.SINGLETON); bind(HostnameVerifier.class).to(LogToMapHostnameVerifier.class); - bind(TransformingHttpCommandExecutorService.class).to( - TransformingHttpCommandExecutorServiceImpl.class).in(Scopes.SINGLETON); + bind(TransformingHttpCommandExecutorService.class).to(TransformingHttpCommandExecutorServiceImpl.class).in( + Scopes.SINGLETON); } /** @@ -77,4 +85,35 @@ public class JavaUrlHttpCommandExecutorServiceModule extends AbstractModule { return true; } } + + @Provides + @Singleton + @Named("untrusted") + SSLContext provideUntrustedSSLContext(TrustAllCerts trustAllCerts) throws NoSuchAlgorithmException, + KeyManagementException { + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { trustAllCerts }, new SecureRandom()); + return sc; + } + + /** + * + * Used to trust all certs + * + * @author Adrian Cole + */ + @Singleton + static class TrustAllCerts implements X509TrustManager { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(X509Certificate[] certs, String authType) { + return; + } + + public void checkServerTrusted(X509Certificate[] certs, String authType) { + return; + } + } } \ No newline at end of file diff --git a/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java b/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java index 9d85444857..4eb68d199c 100644 --- a/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java +++ b/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java @@ -44,9 +44,11 @@ import java.util.concurrent.ExecutorService; import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Named; +import javax.inject.Provider; import javax.inject.Singleton; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; import javax.ws.rs.core.HttpHeaders; import org.jclouds.Constants; @@ -77,6 +79,7 @@ public class JavaUrlHttpCommandExecutorService extends BaseHttpCommandExecutorSe public static final String USER_AGENT = "jclouds/1.0 java/" + System.getProperty("java.version"); @Resource protected Logger logger = Logger.NULL; + private final Provider untrustedSSLContextProvider; private final HostnameVerifier verifier; private final Field methodField; @@ -84,11 +87,13 @@ public class JavaUrlHttpCommandExecutorService extends BaseHttpCommandExecutorSe public JavaUrlHttpCommandExecutorService(HttpUtils utils, @Named(Constants.PROPERTY_IO_WORKER_THREADS) ExecutorService ioWorkerExecutor, DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler, - DelegatingErrorHandler errorHandler, HttpWire wire, HostnameVerifier verifier) throws SecurityException, + DelegatingErrorHandler errorHandler, HttpWire wire, HostnameVerifier verifier, + @Named("untrusted") Provider untrustedSSLContextProvider) throws SecurityException, NoSuchFieldException { super(utils, ioWorkerExecutor, retryHandler, ioRetryHandler, errorHandler, wire); if (utils.getMaxConnections() > 0) System.setProperty("http.maxConnections", String.valueOf(checkNotNull(utils, "utils").getMaxConnections())); + this.untrustedSSLContextProvider = checkNotNull(untrustedSSLContextProvider, "untrustedSSLContextProvider"); this.verifier = checkNotNull(verifier, "verifier"); this.methodField = HttpURLConnection.class.getDeclaredField("method"); methodField.setAccessible(true); @@ -160,9 +165,12 @@ public class JavaUrlHttpCommandExecutorService extends BaseHttpCommandExecutorSe } else { connection = (HttpURLConnection) url.openConnection(); } - if (utils.relaxHostname() && connection instanceof HttpsURLConnection) { + if (connection instanceof HttpsURLConnection) { HttpsURLConnection sslCon = (HttpsURLConnection) connection; - sslCon.setHostnameVerifier(verifier); + if (utils.relaxHostname()) + sslCon.setHostnameVerifier(verifier); + if (utils.trustAllCerts()) + sslCon.setSSLSocketFactory(untrustedSSLContextProvider.get().getSocketFactory()); } connection.setDoOutput(true); connection.setAllowUserInteraction(false); diff --git a/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java b/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java index c494c8caa5..9dd25c8f92 100644 --- a/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java +++ b/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java @@ -31,6 +31,7 @@ import java.util.concurrent.Executors; import javax.inject.Provider; import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.ws.rs.core.UriBuilder; @@ -112,12 +113,20 @@ public class BackoffLimitedRetryHandlerTest { RedirectionRetryHandler retry = new RedirectionRetryHandler(uriBuilderProvider, backoff); JavaUrlHttpCommandExecutorService httpService = new JavaUrlHttpCommandExecutorService(utils, execService, new DelegatingRetryHandler(backoff, retry), new BackoffLimitedRetryHandler(), - new DelegatingErrorHandler(), new HttpWire(), new HostnameVerifier(){ + new DelegatingErrorHandler(), new HttpWire(), new HostnameVerifier() { @Override public boolean verify(String hostname, SSLSession session) { return false; - }}); + } + }, new Provider() { + + @Override + public SSLContext get() { + return null; + } + + }); executorService = new TransformingHttpCommandExecutorServiceImpl(httpService, execService); } From 2db03edb18ea258a87894558323f62cef3cfff8e Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 20 Aug 2010 14:03:18 -0700 Subject: [PATCH 07/16] Issue 280: more changes related to vcloud 1.0 orgs --- .../BlueLockVCloudDirectorClientLiveTest.java | 6 +++--- .../BlueLockVCloudExpressClientLiveTest.java | 6 +++--- .../jclouds/vcloud/functions/OrgNameToEndpoint.java | 11 ++++++----- .../functions/OrgNameToTasksListEndpoint.java | 3 +-- .../org/jclouds/vcloud/VCloudClientLiveTest.java | 7 +++---- .../jclouds/vcloud/VCloudExpressClientLiveTest.java | 6 +++--- .../vcloud/compute/VCloudComputeClientLiveTest.java | 13 +++++++++---- .../HostingDotComVCloudClientLiveTest.java | 6 +++--- ...erremarkVCloudExpressComputeServiceLiveTest.java | 2 +- 9 files changed, 32 insertions(+), 28 deletions(-) diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java index 53dbbe5533..929c25059a 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudDirectorClientLiveTest.java @@ -23,8 +23,8 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Properties; +import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; -import org.jclouds.rest.RestContextFactory; import org.jclouds.vcloud.VCloudClientLiveTest; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -47,8 +47,8 @@ public class BlueLockVCloudDirectorClientLiveTest extends VCloudClientLiveTest { "bluelock-vclouddirector.identity"); String credential = checkNotNull(System.getProperty("bluelock-vclouddirector.credential"), "bluelock-vclouddirector.credential"); - context = new RestContextFactory().createContext("bluelock-vclouddirector", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), new Properties()); + context = new ComputeServiceContextFactory().createContext("bluelock-vclouddirector", identity, credential, ImmutableSet + . of(new Log4JLoggingModule()), new Properties()).getProviderSpecificContext(); connection = context.getApi(); } diff --git a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java index c8185718e7..0b6412b02f 100644 --- a/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java +++ b/vcloud/bluelock/src/test/java/org/jclouds/vcloud/bluelock/BlueLockVCloudExpressClientLiveTest.java @@ -23,8 +23,8 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Properties; +import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; -import org.jclouds.rest.RestContextFactory; import org.jclouds.vcloud.VCloudExpressClientLiveTest; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -46,8 +46,8 @@ public class BlueLockVCloudExpressClientLiveTest extends VCloudExpressClientLive identity = checkNotNull(System.getProperty("bluelock-vcloudexpress.identity"), "bluelock-vcloudexpress.identity"); String credential = checkNotNull(System.getProperty("bluelock-vcloudexpress.credential"), "bluelock-vcloudexpress.credential"); - context = new RestContextFactory().createContext("bluelock-vcloudexpress", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), new Properties()); + context = new ComputeServiceContextFactory().createContext("bluelock-vcloudexpress", identity, credential, + ImmutableSet. of(new Log4JLoggingModule()), new Properties()).getProviderSpecificContext(); connection = context.getApi(); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java index 0bbee964ba..0e19d3bff1 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToEndpoint.java @@ -38,20 +38,21 @@ import com.google.common.base.Supplier; */ @Singleton public class OrgNameToEndpoint implements Function { - private final Supplier> orgNameToEndpoint; + private final Supplier> orgNameToEndpointSupplier; private final URI defaultUri; @Inject - public OrgNameToEndpoint(@Org Supplier> orgNameToEndpoint, @Org URI defaultUri) { - this.orgNameToEndpoint = orgNameToEndpoint; + public OrgNameToEndpoint(@Org Supplier> orgNameToEndpointSupplier, @Org URI defaultUri) { + this.orgNameToEndpointSupplier = orgNameToEndpointSupplier; this.defaultUri = defaultUri; } public URI apply(Object from) { try { - return from == null ? defaultUri : orgNameToEndpoint.get().get(from).getId(); + Map orgNameToEndpoint = orgNameToEndpointSupplier.get(); + return from == null ? defaultUri : orgNameToEndpoint.get(from).getId(); } catch (NullPointerException e) { - throw new NoSuchElementException("org " + from + " not found in " + orgNameToEndpoint.get().keySet()); + throw new NoSuchElementException("org " + from + " not found in " + orgNameToEndpointSupplier.get().keySet()); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java index be76180b13..1085d83800 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgNameToTasksListEndpoint.java @@ -50,10 +50,9 @@ public class OrgNameToTasksListEndpoint implements Function { } public URI apply(Object from) { - Object org = checkNotNull(from, "args"); + Object org = from; if (org == null) return defaultUri; - try { return checkNotNull(orgMap.get().get(org)).getTasksList().getId(); } catch (NullPointerException e) { diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java index 5a2f9e4923..7de96dea7f 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java @@ -25,9 +25,9 @@ import static org.testng.Assert.assertNotNull; import java.util.Properties; +import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; -import org.jclouds.rest.RestContextFactory; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; @@ -166,10 +166,9 @@ public class VCloudClientLiveTest { public void setupClient() { setupCredentials(); Properties props = new Properties(); - context = new RestContextFactory().createContext("vcloud", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), props); + context = new ComputeServiceContextFactory().createContext("vcloud", identity, credential, + ImmutableSet. of(new Log4JLoggingModule()), props).getProviderSpecificContext(); connection = context.getApi(); } - } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java index b14e0d6a8d..f710e76da7 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressClientLiveTest.java @@ -25,9 +25,9 @@ import static org.testng.Assert.assertNotNull; import java.util.Properties; +import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; -import org.jclouds.rest.RestContextFactory; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; @@ -166,8 +166,8 @@ public class VCloudExpressClientLiveTest { public void setupClient() { setupCredentials(); Properties props = new Properties(); - context = new RestContextFactory().createContext("vcloudexpress", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), props); + context = new ComputeServiceContextFactory().createContext("vcloudexpress", identity, credential, ImmutableSet + . of(new Log4JLoggingModule()), props).getProviderSpecificContext(); connection = context.getApi(); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java index 8b01de97a2..50188deddb 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/compute/VCloudComputeClientLiveTest.java @@ -21,6 +21,7 @@ package org.jclouds.vcloud.compute; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.filter; +import static org.jclouds.Constants.PROPERTY_TRUST_ALL_CERTS; import static org.jclouds.vcloud.options.InstantiateVAppTemplateOptions.Builder.processorCount; import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType; import static org.testng.Assert.assertEquals; @@ -28,11 +29,13 @@ import static org.testng.Assert.assertEquals; import java.io.IOException; import java.net.URI; import java.util.Map; +import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeoutException; import org.jclouds.compute.domain.OsFamily; import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.jclouds.net.IPSocket; import org.jclouds.rest.RestContextFactory; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.domain.ResourceType; @@ -81,7 +84,7 @@ public class VCloudComputeClientLiveTest { protected Map expectationMap; - protected Predicate addressTester; + protected Predicate addressTester; private String identity; private String credential; @@ -114,7 +117,7 @@ public class VCloudComputeClientLiveTest { @Test(dependsOnMethods = "testPowerOn", enabled = true) public void testGetPublicAddresses() { publicAddress = Iterables.getLast(computeClient.getPublicAddresses(id)); - assert !addressTester.apply(publicAddress); + assert !addressTester.apply(new IPSocket(publicAddress, 22)); } private void verifyConfigurationOfVApp(VApp vApp, String serverName, String expectedOs, int processorCount, @@ -148,12 +151,14 @@ public class VCloudComputeClientLiveTest { @BeforeGroups(groups = { "live" }) public void setupClient() { setupCredentials(); + Properties properties = new Properties(); + properties.setProperty(PROPERTY_TRUST_ALL_CERTS, "true"); Injector injector = new RestContextFactory().createContextBuilder("vcloud", identity, credential, - ImmutableSet. of(new Log4JLoggingModule())).buildInjector(); + ImmutableSet. of(new Log4JLoggingModule()), properties).buildInjector(); computeClient = injector.getInstance(VCloudComputeClient.class); client = injector.getInstance(VCloudClient.class); - addressTester = injector.getInstance(Key.get(new TypeLiteral>() { + addressTester = injector.getInstance(Key.get(new TypeLiteral>() { })); expectationMap = ImmutableMap. builder().put(OsFamily.CENTOS, new Expectation(4194304 / 2 * 10, "Red Hat Enterprise Linux 5 (64-bit)")).build(); diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java index 8791708d87..063f4a1a45 100644 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java +++ b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java @@ -23,8 +23,8 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.util.Properties; +import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; -import org.jclouds.rest.RestContextFactory; import org.jclouds.vcloud.VCloudExpressClientLiveTest; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -46,8 +46,8 @@ public class HostingDotComVCloudClientLiveTest extends VCloudExpressClientLiveTe identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - context = new RestContextFactory().createContext("hostingdotcom", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), new Properties()); + context = new ComputeServiceContextFactory().createContext("hostingdotcom", identity, credential, + ImmutableSet. of(new Log4JLoggingModule()), new Properties()).getProviderSpecificContext(); connection = context.getApi(); } diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java index 96ddfc5cd8..27c38fa867 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudExpressComputeServiceLiveTest.java @@ -46,7 +46,7 @@ public class TerremarkVCloudExpressComputeServiceLiveTest extends VCloudExpressC @Override public void setServiceDefaults() { provider = "trmk-vcloudexpress"; - tag = "trmkvcx"; + tag = "vcx"; } @Override From 6b832c79cf6391f44d1ba6c81667846e80b96a0c Mon Sep 17 00:00:00 2001 From: Lili Nader Date: Fri, 20 Aug 2010 18:20:58 -0700 Subject: [PATCH 08/16] minor improvements to elastic load balancer functionality --- .../main/java/org/jclouds/aws/elb/ELBAsyncClient.java | 3 +-- .../src/main/java/org/jclouds/aws/elb/ELBClient.java | 7 ++++++- .../ec2/compute/EC2LoadBalancerServiceLiveTest.java | 10 ++++++---- .../java/org/jclouds/aws/elb/ELBClientLiveTest.java | 3 +-- .../java/org/jclouds/compute/LoadBalancerService.java | 3 +++ .../compute/internal/BaseLoadBalancerService.java | 11 +++++++++++ 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/aws/core/src/main/java/org/jclouds/aws/elb/ELBAsyncClient.java b/aws/core/src/main/java/org/jclouds/aws/elb/ELBAsyncClient.java index 53c76a190f..f0e1c47f49 100644 --- a/aws/core/src/main/java/org/jclouds/aws/elb/ELBAsyncClient.java +++ b/aws/core/src/main/java/org/jclouds/aws/elb/ELBAsyncClient.java @@ -114,7 +114,6 @@ public interface ELBAsyncClient { @XMLResponseParser(DescribeLoadBalancersResponseHandler.class) @FormParams(keys = ACTION, values = "DescribeLoadBalancers") ListenableFuture> describeLoadBalancersInRegion( - @EndpointParam(parser = RegionToEndpoint.class) @Nullable String region, - @FormParam("LoadBalancerName") @Nullable String name); + @EndpointParam(parser = RegionToEndpoint.class) @Nullable String region); } diff --git a/aws/core/src/main/java/org/jclouds/aws/elb/ELBClient.java b/aws/core/src/main/java/org/jclouds/aws/elb/ELBClient.java index 86a49d6853..2013fe03a0 100644 --- a/aws/core/src/main/java/org/jclouds/aws/elb/ELBClient.java +++ b/aws/core/src/main/java/org/jclouds/aws/elb/ELBClient.java @@ -94,6 +94,11 @@ public interface ELBClient { void deregisterInstancesWithLoadBalancerInRegion(@Nullable String region, String name, String... instanceIds); - Set describeLoadBalancersInRegion(@Nullable String region, @Nullable String name); + /** + * Returns a set of elastic load balancers + * @param region + * @return + */ + Set describeLoadBalancersInRegion(@Nullable String region); } \ No newline at end of file diff --git a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2LoadBalancerServiceLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2LoadBalancerServiceLiveTest.java index d829f1720b..89c5cbe932 100644 --- a/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2LoadBalancerServiceLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/ec2/compute/EC2LoadBalancerServiceLiveTest.java @@ -84,10 +84,12 @@ public class EC2LoadBalancerServiceLiveTest extends BaseLoadBalancerServiceLiveT for (NodeMetadata node : nodes) { instanceIds.add(node.getProviderId()); } - Set elbs = elbClient.describeLoadBalancersInRegion(Region.US_EAST_1, tag); + Set elbs = elbClient.describeLoadBalancersInRegion(Region.US_EAST_1); assertNotNull(elbs); - LoadBalancer elb = elbs.iterator().next(); - assertEquals(elb.getInstanceIds(), instanceIds); + for(LoadBalancer elb:elbs) + { + if(elb.getName().equals(tag)) + assertEquals(elb.getInstanceIds(), instanceIds); + } } - } diff --git a/aws/core/src/test/java/org/jclouds/aws/elb/ELBClientLiveTest.java b/aws/core/src/test/java/org/jclouds/aws/elb/ELBClientLiveTest.java index 238c10ee7a..00b2c8c734 100644 --- a/aws/core/src/test/java/org/jclouds/aws/elb/ELBClientLiveTest.java +++ b/aws/core/src/test/java/org/jclouds/aws/elb/ELBClientLiveTest.java @@ -78,10 +78,9 @@ public class ELBClientLiveTest { @Test(dependsOnMethods = "testCreateLoadBalancer") void testDescribeLoadBalancers() { - String name = "TestDescribeLoadBalancer"; for (String region : Lists.newArrayList(null, Region.EU_WEST_1, Region.US_EAST_1, Region.US_WEST_1, Region.AP_SOUTHEAST_1)) { - Set allResults = client.describeLoadBalancersInRegion(region, name); + Set allResults = client.describeLoadBalancersInRegion(region); assertNotNull(allResults); assert (allResults.size() >= 1); } diff --git a/compute/src/main/java/org/jclouds/compute/LoadBalancerService.java b/compute/src/main/java/org/jclouds/compute/LoadBalancerService.java index ea6e4560ea..d66c7b38f3 100644 --- a/compute/src/main/java/org/jclouds/compute/LoadBalancerService.java +++ b/compute/src/main/java/org/jclouds/compute/LoadBalancerService.java @@ -68,5 +68,8 @@ public interface LoadBalancerService { @Beta void destroyLoadBalancer(String handle); + + @Beta + Set listLoadBalancers(); } diff --git a/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java b/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java index de6e5b0d22..e12028d669 100644 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java @@ -35,6 +35,7 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.DestroyLoadBalancerStrategy; +import org.jclouds.compute.strategy.ListLoadBalancersStrategy; import org.jclouds.compute.strategy.LoadBalanceNodesStrategy; import org.jclouds.domain.Location; import org.jclouds.http.handlers.BackoffLimitedRetryHandler; @@ -68,17 +69,21 @@ public class BaseLoadBalancerService implements LoadBalancerService { protected final ComputeServiceContext context; protected final LoadBalanceNodesStrategy loadBalancerStrategy; protected final DestroyLoadBalancerStrategy destroyLoadBalancerStrategy; + protected final ListLoadBalancersStrategy listLoadBalancersStrategy; protected final BackoffLimitedRetryHandler backoffLimitedRetryHandler; @Inject protected BaseLoadBalancerService(ComputeServiceContext context, LoadBalanceNodesStrategy loadBalancerStrategy, DestroyLoadBalancerStrategy destroyLoadBalancerStrategy, + ListLoadBalancersStrategy listLoadBalancersStrategy, BackoffLimitedRetryHandler backoffLimitedRetryHandler) { this.context = checkNotNull(context, "context"); this.loadBalancerStrategy = checkNotNull(loadBalancerStrategy, "loadBalancerStrategy"); this.destroyLoadBalancerStrategy = checkNotNull(destroyLoadBalancerStrategy, "destroyLoadBalancerStrategy"); + this.listLoadBalancersStrategy = checkNotNull(listLoadBalancersStrategy, + "listLoadBalancersStrategy"); this.backoffLimitedRetryHandler = checkNotNull(backoffLimitedRetryHandler, "backoffLimitedRetryHandler"); } @@ -130,5 +135,11 @@ public class BaseLoadBalancerService implements LoadBalancerService { boolean successful = destroyLoadBalancerStrategy.execute(loadBalancer); logger.debug("<< destroyed load balancer(%s) success(%s)", loadBalancer, successful); } + + public Set listLoadBalancers() + { + Set loadBalancerSet = listLoadBalancersStrategy.execute(); + return loadBalancerSet; + } } \ No newline at end of file From c0f454e7eba5a6c7ba63dfe91607eb22f53591ae Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sat, 21 Aug 2010 21:06:52 -0700 Subject: [PATCH 09/16] Issue 280: converged vcloud express and vcloud org and vdc objects --- .../BlueLockVCloudDirectorComputeClient.java | 4 +- .../BlueLockVCloudExpressComputeClient.java | 4 +- ...BlueLockVCloudExpressRestClientModule.java | 8 +- .../vcloud/CommonVCloudAsyncClient.java | 332 +++++++++++++++++ .../jclouds/vcloud/CommonVCloudClient.java | 184 ++++++++++ .../org/jclouds/vcloud/VCloudAsyncClient.java | 295 +-------------- .../java/org/jclouds/vcloud/VCloudClient.java | 144 +------- .../vcloud/VCloudExpressAsyncClient.java | 341 +----------------- .../jclouds/vcloud/VCloudExpressClient.java | 172 +-------- .../BaseVCloudExpressComputeClient.java | 216 ----------- .../compute/CommonVCloudComputeClient.java | 62 ++++ .../vcloud/compute/VCloudComputeClient.java | 48 +-- .../compute/VCloudExpressComputeClient.java | 48 +-- ...mmonVCloudComputeServiceContextModule.java | 33 +- .../VCloudComputeServiceContextModule.java | 43 +-- ...oudExpressComputeServiceContextModule.java | 43 +-- .../vcloud/compute/functions/GetExtra.java | 4 +- .../functions/ImagesInOrganization.java | 61 ---- .../CommonVCloudComputeClientImpl.java} | 50 +-- .../internal/VCloudComputeClientImpl.java | 89 +++++ .../VCloudExpressComputeClientImpl.java | 90 +++++ .../strategy/VCloudDestroyNodeStrategy.java | 6 +- .../VCloudExpressDestroyNodeStrategy.java | 55 --- .../VCloudExpressGetNodeMetadataStrategy.java | 95 ----- .../VCloudExpressListNodesStrategy.java | 141 -------- .../VCloudExpressRebootNodeStrategy.java | 60 --- .../VCloudGetNodeMetadataStrategy.java | 10 +- .../strategy/VCloudListNodesStrategy.java | 9 +- .../strategy/VCloudRebootNodeStrategy.java | 7 +- .../OrganizationAndVDCToLocationSupplier.java | 70 ---- .../suppliers/VCloudExpressImageSupplier.java | 92 ----- .../suppliers/VCloudImageSupplier.java | 6 +- .../BaseVCloudExpressRestClientModule.java | 306 ---------------- .../config/BaseVCloudRestClientModule.java | 306 ---------------- .../config/CommonVCloudRestClientModule.java | 340 ++++++++++++++++- .../vcloud/domain/AllocationModel.java | 69 ++++ .../org/jclouds/vcloud/domain/Capacity.java | 41 ++- .../java/org/jclouds/vcloud/domain/Org.java | 37 +- .../java/org/jclouds/vcloud/domain/Quota.java | 67 ---- .../java/org/jclouds/vcloud/domain/VDC.java | 111 +++++- .../{Organization.java => VDCStatus.java} | 46 ++- .../vcloud/domain/internal/OrgImpl.java | 46 +-- .../domain/internal/OrganizationImpl.java | 139 ------- .../vcloud/domain/internal/VDCImpl.java | 271 +++++++++----- .../functions/AllCatalogItemsInCatalog.java | 6 +- .../AllCatalogItemsInOrganization.java | 68 ---- .../vcloud/functions/AllCatalogsInOrg.java | 6 +- .../functions/AllCatalogsInOrganization.java | 74 ---- .../vcloud/functions/AllVDCsInOrg.java | 6 +- .../functions/AllVDCsInOrganization.java | 76 ---- ...anizationNameAndCatalogNameToEndpoint.java | 76 ---- ...izationNameAndTasksListNameToEndpoint.java | 76 ---- .../OrganizationNameAndVDCNameToEndpoint.java | 76 ---- .../vcloud/functions/OrgsForLocations.java | 6 +- .../vcloud/functions/OrgsForNames.java | 6 +- .../VAppTemplatesForCatalogItems.java | 6 +- ...CloudExpressAllCatalogsInOrganization.java | 73 ---- .../VCloudExpressAllVDCsInOrganization.java | 75 ---- .../VCloudExpressOrganizationsForNames.java | 70 ---- ...VCloudExpressOrganizatonsForLocations.java | 98 ----- .../vcloud/functions/VDCNameToEndpoint.java | 55 --- .../vcloud/predicates/TaskSuccess.java | 6 +- .../predicates/VCloudExpressTaskSuccess.java | 65 ---- .../java/org/jclouds/vcloud/util/Utils.java | 6 +- .../org/jclouds/vcloud/xml/OrgHandler.java | 16 +- .../vcloud/xml/OrganizationHandler.java | 69 ---- .../org/jclouds/vcloud/xml/TaskHandler.java | 6 +- .../org/jclouds/vcloud/xml/VDCHandler.java | 106 ++++-- .../vcloud/CommonVCloudClientLiveTest.java | 171 +++++++++ .../jclouds/vcloud/VCloudAsyncClientTest.java | 12 +- .../jclouds/vcloud/VCloudClientLiveTest.java | 138 +------ .../vcloud/VCloudExpressAsyncClientTest.java | 142 ++------ .../vcloud/VCloudExpressClientLiveTest.java | 142 +------- .../jclouds/vcloud/xml/OrgHandlerTest.java | 51 ++- .../vcloud/xml/OrganizationHandlerTest.java | 85 ----- .../jclouds/vcloud/xml/VDCHandlerTest.java | 107 ++++-- .../resources/{ => express}/vdc-hosting.xml | 0 .../resources/{ => express}/vdc-nonet.xml | 0 .../core/src/test/resources/express/vdc.xml | 36 ++ vcloud/core/src/test/resources/vdc.xml | 55 ++- .../HostingDotComVCloudAsyncClient.java | 24 +- .../HostingDotComVCloudComputeClient.java | 4 +- .../HostingDotComVCloudRestClientModule.java | 17 +- .../HostingDotComVCloudAsyncClientTest.java | 148 -------- .../terremark/TerremarkVCloudAsyncClient.java | 77 ++-- .../terremark/TerremarkVCloudClient.java | 37 +- .../compute/TerremarkVCloudComputeClient.java | 77 ++-- ...markVCloudComputeServiceContextModule.java | 13 +- .../functions/NodeMetadataToOrgAndName.java | 4 +- ...erremarkVCloudGetNodeMetadataStrategy.java | 16 +- .../suppliers/VAppTemplatesInOrgs.java | 16 +- ...erremarkVCloudExpressRestClientModule.java | 2 +- ...arkOrganization.java => TerremarkOrg.java} | 11 +- ...izationImpl.java => TerremarkOrgImpl.java} | 15 +- .../domain/internal/TerremarkVDCImpl.java | 20 +- .../functions/OrgURIToKeysListEndpoint.java | 26 +- .../terremark/xml/TerremarkOrgHandler.java | 13 +- .../terremark/xml/TerremarkVDCHandler.java | 14 +- .../terremark/TerremarkClientLiveTest.java | 4 +- .../TerremarkECloudAsyncClientTest.java | 134 +++---- ...TerremarkVCloudExpressAsyncClientTest.java | 225 ++++++------ .../TerremarkVCloudExpressClientLiveTest.java | 6 +- .../VAppTemplatesInOrgsLiveTest.java | 10 +- .../xml/TerremarkOrgHandlerTest.java | 30 +- .../src/test/resources/terremark/vdc.xml | 23 ++ 105 files changed, 2576 insertions(+), 5057 deletions(-) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/CommonVCloudComputeClient.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java rename vcloud/core/src/main/java/org/jclouds/vcloud/compute/{BaseVCloudComputeClient.java => internal/CommonVCloudComputeClientImpl.java} (73%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/AllocationModel.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/Quota.java rename vcloud/core/src/main/java/org/jclouds/vcloud/domain/{Organization.java => VDCStatus.java} (51%) delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInOrganization.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrganization.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndTasksListNameToEndpoint.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllCatalogsInOrganization.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/functions/VDCNameToEndpoint.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VCloudExpressTaskSuccess.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java delete mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrganizationHandlerTest.java rename vcloud/core/src/test/resources/{ => express}/vdc-hosting.xml (100%) rename vcloud/core/src/test/resources/{ => express}/vdc-nonet.xml (100%) create mode 100644 vcloud/core/src/test/resources/express/vdc.xml delete mode 100644 vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java rename vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/{TerremarkOrganization.java => TerremarkOrg.java} (83%) rename vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/{TerremarkOrganizationImpl.java => TerremarkOrgImpl.java} (67%) diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java index 7ab82f6be6..4409d1c3e5 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java @@ -29,7 +29,7 @@ import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.domain.Credentials; import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.compute.internal.VCloudComputeClientImpl; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; @@ -40,7 +40,7 @@ import com.google.common.base.Predicate; * @author Adrian Cole */ @Singleton -public class BlueLockVCloudDirectorComputeClient extends BaseVCloudComputeClient { +public class BlueLockVCloudDirectorComputeClient extends VCloudComputeClientImpl { private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; @Inject diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java index dd685c19df..0cef4655d6 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java @@ -29,7 +29,7 @@ import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.domain.Credentials; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; +import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; @@ -40,7 +40,7 @@ import com.google.common.base.Predicate; * @author Adrian Cole */ @Singleton -public class BlueLockVCloudExpressComputeClient extends BaseVCloudExpressComputeClient { +public class BlueLockVCloudExpressComputeClient extends VCloudExpressComputeClientImpl { private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; @Inject diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java index cd77f6d93a..9d9ca3714f 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/config/BlueLockVCloudExpressRestClientModule.java @@ -29,10 +29,10 @@ import javax.inject.Named; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.config.VCloudExpressRestClientModule; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; @@ -47,7 +47,7 @@ import com.google.common.collect.Iterables; public class BlueLockVCloudExpressRestClientModule extends VCloudExpressRestClientModule { @Override - protected URI provideDefaultNetwork(VCloudExpressClient client) { + protected URI provideDefaultNetwork(CommonVCloudClient client) { org.jclouds.vcloud.domain.VDC vDC = client.findVDCInOrgNamed(null, null); Map networks = vDC.getAvailableNetworks(); checkState(networks.size() > 0, "No networks present in vDC: " + vDC.getName()); @@ -62,7 +62,7 @@ public class BlueLockVCloudExpressRestClientModule extends VCloudExpressRestClie } @Override - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) final String user) { + protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) final String user) { checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); return Iterables.getOnlyElement(Iterables.filter(org.getCatalogs().values(), new Predicate() { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java new file mode 100644 index 0000000000..dd8b1a11eb --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java @@ -0,0 +1,332 @@ +/** + * + * Copyright (C) 2010 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; + +import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; +import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML; +import static org.jclouds.vcloud.VCloudMediaType.ORG_XML; +import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudMediaType.TASK_XML; +import static org.jclouds.vcloud.VCloudMediaType.VAPPTEMPLATE_XML; +import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; + +import java.net.URI; + +import javax.annotation.Nullable; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; + +import org.jclouds.rest.annotations.EndpointParam; +import org.jclouds.rest.annotations.ExceptionParser; +import org.jclouds.rest.annotations.RequestFilters; +import org.jclouds.rest.annotations.XMLResponseParser; +import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; +import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.Network; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.TasksList; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.filters.SetVCloudTokenCookie; +import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameToTasksListEndpoint; +import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; +import org.jclouds.vcloud.xml.CatalogHandler; +import org.jclouds.vcloud.xml.CatalogItemHandler; +import org.jclouds.vcloud.xml.NetworkHandler; +import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.TaskHandler; +import org.jclouds.vcloud.xml.TasksListHandler; +import org.jclouds.vcloud.xml.VAppHandler; +import org.jclouds.vcloud.xml.VAppTemplateHandler; +import org.jclouds.vcloud.xml.VDCHandler; + +import com.google.common.util.concurrent.ListenableFuture; + +/** + * Provides access to VCloud resources via their REST API. + *

+ * + * @see + * @author Adrian Cole + */ +@RequestFilters(SetVCloudTokenCookie.class) +public interface CommonVCloudAsyncClient { + + /** + * @see VCloudClient#getOrg + */ + @GET + @XMLResponseParser(OrgHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(ORG_XML) + ListenableFuture getOrg(@EndpointParam URI orgId); + + /** + * @see VCloudClient#getOrgNamed + */ + @GET + @XMLResponseParser(OrgHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(ORG_XML) + ListenableFuture findOrgNamed( + @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); + + /** + * @see VCloudClient#getCatalog + */ + @GET + @XMLResponseParser(CatalogHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(CATALOG_XML) + ListenableFuture getCatalog(@EndpointParam URI catalogId); + + /** + * @see VCloudClient#findCatalogInOrgNamed + */ + @GET + @XMLResponseParser(CatalogHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + @Consumes(CATALOG_XML) + ListenableFuture findCatalogInOrgNamed( + @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); + + /** + * @see VCloudClient#getVAppTemplate + */ + @GET + @Consumes(VAPPTEMPLATE_XML) + @XMLResponseParser(VAppTemplateHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getVAppTemplate(@EndpointParam URI vAppTemplate); + + /** + * @see VCloudClient#findVAppTemplateInOrgCatalogNameds + */ + @GET + @Consumes(VAPPTEMPLATE_XML) + @XMLResponseParser(VAppTemplateHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findVAppTemplateInOrgCatalogNamed( + @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); + + /** + * @see VCloudClient#getCatalogItem + */ + @GET + @Consumes(CATALOGITEM_XML) + @XMLResponseParser(CatalogItemHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getCatalogItem(@EndpointParam URI catalogItem); + + /** + * @see VCloudClient#getCatalogItemInOrg + */ + @GET + @Consumes(CATALOGITEM_XML) + @XMLResponseParser(CatalogItemHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findCatalogItemInOrgCatalogNamed( + @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); + + /** + * @see VCloudClient#findNetworkInOrgVDCNamed + */ + @GET + @Consumes(NETWORK_XML) + @XMLResponseParser(NetworkHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findNetworkInOrgVDCNamed( + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); + + /** + * @see VCloudClient#getNetwork + */ + @GET + @Consumes(NETWORK_XML) + @XMLResponseParser(NetworkHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getNetwork(@EndpointParam URI network); + + /** + * @see VCloudClient#getVDC(URI) + */ + @GET + @XMLResponseParser(VDCHandler.class) + @Consumes(VDC_XML) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getVDC(@EndpointParam URI vdc); + + /** + * @see VCloudClient#findVDCInOrgNamed(String, String) + */ + @GET + @XMLResponseParser(VDCHandler.class) + @Consumes(VDC_XML) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findVDCInOrgNamed( + @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); + + /** + * @see VCloudClient#getTasksList + */ + @GET + @Consumes(TASKSLIST_XML) + @XMLResponseParser(TasksListHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getTasksList(@EndpointParam URI tasksListId); + + /** + * @see VCloudClient#findTasksListInOrgNamed + */ + @GET + @Consumes(TASKSLIST_XML) + @XMLResponseParser(TasksListHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findTasksListInOrgNamed( + @Nullable @EndpointParam(parser = OrgNameToTasksListEndpoint.class) String orgName); + + /** + * @see VCloudClient#deployVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/action/deploy") + @XMLResponseParser(TaskHandler.class) + ListenableFuture deployVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#deleteVApp + */ + @DELETE + @ExceptionParser(ReturnVoidOnNotFoundOr404.class) + ListenableFuture deleteVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#undeployVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/action/undeploy") + @XMLResponseParser(TaskHandler.class) + ListenableFuture undeployVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#powerOnVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/powerOn") + @XMLResponseParser(TaskHandler.class) + ListenableFuture powerOnVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#powerOffVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/powerOff") + @XMLResponseParser(TaskHandler.class) + ListenableFuture powerOffVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#shutdownVApp + */ + @POST + @Path("/power/action/shutdown") + ListenableFuture shutdownVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#resetVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/reset") + @XMLResponseParser(TaskHandler.class) + ListenableFuture resetVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#suspendVApp + */ + @POST + @Consumes(TASK_XML) + @Path("/power/action/suspend") + @XMLResponseParser(TaskHandler.class) + ListenableFuture suspendVApp(@EndpointParam URI vAppId); + + /** + * @see VCloudClient#getTask + */ + @GET + @Consumes(TASK_XML) + @XMLResponseParser(TaskHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getTask(@EndpointParam URI taskId); + + /** + * @see VCloudClient#cancelTask + */ + @POST + @Path("/action/cancel") + ListenableFuture cancelTask(@EndpointParam URI taskId); + + /** + * @see VCloudClient#findVAppInOrgVDCNamed + */ + @GET + @Consumes(VAPP_XML) + @XMLResponseParser(VAppHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findVAppInOrgVDCNamed( + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); + + /** + * @see VCloudClient#getVApp + */ + @GET + @Consumes(VAPP_XML) + @XMLResponseParser(VAppHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getVApp(@EndpointParam URI vApp); + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java new file mode 100644 index 0000000000..752194cfc2 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java @@ -0,0 +1,184 @@ +/** + * + * Copyright (C) 2010 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; + +import java.net.URI; +import java.util.NoSuchElementException; +import java.util.concurrent.TimeUnit; + +import javax.annotation.Nullable; + +import org.jclouds.concurrent.Timeout; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.Network; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.TasksList; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; + +/** + * Provides access to VCloud resources via their REST API. + *

+ * + * @see + * @author Adrian Cole + */ +@Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) +public interface CommonVCloudClient { + + Org getOrg(URI orgId); + + /** + * This call returns a list of all vCloud Data Centers (vdcs), catalogs, and + * task lists within the organization. + * + * @param name + * organization name, or null for the default + * @throws NoSuchElementException + * if you specified an org name that isn't present + */ + Org findOrgNamed(@Nullable String name); + + Catalog getCatalog(URI catalogId); + + /** + * returns the catalog in the organization associated with the specified + * name. Note that both parameters can be null to choose default. + * + * @param orgName + * organization name, or null for the default + * @param catalogName + * catalog name, or null for the default + * @throws NoSuchElementException + * if you specified an org or catalog name that isn't present + */ + Catalog findCatalogInOrgNamed(@Nullable String orgName, @Nullable String catalogName); + + CatalogItem getCatalogItem(URI catalogItem); + + /** + * returns the catalog item in the catalog associated with the specified + * name. Note that the org and catalog parameters can be null to choose + * default. + * + * @param orgName + * organization name, or null for the default + * @param catalogName + * catalog name, or null for the default + * @param itemName + * item you wish to lookup + * + * @throws NoSuchElementException + * if you specified an org, catalog, or catalog item name that + * isn't present + */ + CatalogItem findCatalogItemInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, String itemName); + + VAppTemplate getVAppTemplate(URI vAppTemplate); + + /** + * returns the vapp template corresponding to a catalog item in the catalog + * associated with the specified name. Note that the org and catalog + * parameters can be null to choose default. + * + * @param orgName + * organization name, or null for the default + * @param catalogName + * catalog name, or null for the default + * @param itemName + * item you wish to lookup + * + * @throws NoSuchElementException + * if you specified an org, catalog, or catalog item name that + * isn't present + */ + VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, + String itemName); + + Network findNetworkInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String networkName); + + Network getNetwork(URI network); + + VDC getVDC(URI vdc); + + /** + * returns the VDC in the organization associated with the specified name. + * Note that both parameters can be null to choose default. + * + * @param orgName + * organization name, or null for the default + * @param vdcName + * catalog name, or null for the default + * @throws NoSuchElementException + * if you specified an org or vdc name that isn't present + */ + VDC findVDCInOrgNamed(String orgName, String vdcName); + + TasksList getTasksList(URI tasksListId); + + TasksList findTasksListInOrgNamed(String orgName); + + Task deployVApp(URI vAppId); + + void deleteVApp(URI vAppId); + + Task undeployVApp(URI vAppId); + + /** + * This call powers on the vApp, as specified in the vApp's ovf:Startup + * element. + */ + Task powerOnVApp(URI vAppId); + + /** + * This call powers off the vApp, as specified in the vApp's ovf:Startup + * element. + */ + Task powerOffVApp(URI vAppId); + + /** + * This call shuts down the vApp. + */ + void shutdownVApp(URI vAppId); + + /** + * This call resets the vApp. + */ + Task resetVApp(URI vAppId); + + /** + * This call suspends the vApp. + */ + Task suspendVApp(URI vAppId); + + Task getTask(URI taskId); + + void cancelTask(URI taskId); + + VApp findVAppInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String vAppName); + + VApp getVApp(URI vApp); + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java index 9501164770..b1a9b79263 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java @@ -19,66 +19,32 @@ package org.jclouds.vcloud; -import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; -import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML; -import static org.jclouds.vcloud.VCloudMediaType.ORG_XML; -import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; import static org.jclouds.vcloud.VCloudMediaType.TASK_XML; -import static org.jclouds.vcloud.VCloudMediaType.VAPPTEMPLATE_XML; import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; -import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; import java.net.URI; -import javax.annotation.Nullable; import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.jclouds.predicates.validators.DnsNameValidator; import org.jclouds.rest.annotations.EndpointParam; -import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.MapBinder; import org.jclouds.rest.annotations.MapPayloadParam; import org.jclouds.rest.annotations.ParamValidators; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.XMLResponseParser; -import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; -import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.vcloud.binders.BindCloneVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; -import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameToTasksListEndpoint; -import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; -import org.jclouds.vcloud.xml.CatalogHandler; -import org.jclouds.vcloud.xml.CatalogItemHandler; -import org.jclouds.vcloud.xml.NetworkHandler; -import org.jclouds.vcloud.xml.OrgHandler; import org.jclouds.vcloud.xml.TaskHandler; -import org.jclouds.vcloud.xml.TasksListHandler; import org.jclouds.vcloud.xml.VAppHandler; -import org.jclouds.vcloud.xml.VAppTemplateHandler; -import org.jclouds.vcloud.xml.VDCHandler; import com.google.common.util.concurrent.ListenableFuture; @@ -86,258 +52,11 @@ import com.google.common.util.concurrent.ListenableFuture; * Provides access to VCloud resources via their REST API. *

* - * @see + * @see * @author Adrian Cole */ @RequestFilters(SetVCloudTokenCookie.class) -public interface VCloudAsyncClient { - - /** - * @see VCloudClient#getOrg - */ - @GET - @XMLResponseParser(OrgHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(ORG_XML) - ListenableFuture getOrg(@EndpointParam URI orgId); - - /** - * @see VCloudClient#getOrgNamed - */ - @GET - @XMLResponseParser(OrgHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(ORG_XML) - ListenableFuture findOrgNamed( - @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); - - /** - * @see VCloudClient#getCatalog - */ - @GET - @XMLResponseParser(CatalogHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(CATALOG_XML) - ListenableFuture getCatalog(@EndpointParam URI catalogId); - - /** - * @see VCloudClient#findCatalogInOrgNamed - */ - @GET - @XMLResponseParser(CatalogHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(CATALOG_XML) - ListenableFuture findCatalogInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); - - /** - * @see VCloudClient#getVAppTemplate - */ - @GET - @Consumes(VAPPTEMPLATE_XML) - @XMLResponseParser(VAppTemplateHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getVAppTemplate(@EndpointParam URI vAppTemplate); - - /** - * @see VCloudClient#findVAppTemplateInOrgCatalogNameds - */ - @GET - @Consumes(VAPPTEMPLATE_XML) - @XMLResponseParser(VAppTemplateHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findVAppTemplateInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); - - /** - * @see VCloudClient#getCatalogItem - */ - @GET - @Consumes(CATALOGITEM_XML) - @XMLResponseParser(CatalogItemHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getCatalogItem(@EndpointParam URI catalogItem); - - /** - * @see VCloudClient#getCatalogItemInOrg - */ - @GET - @Consumes(CATALOGITEM_XML) - @XMLResponseParser(CatalogItemHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findCatalogItemInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); - - /** - * @see VCloudClient#findNetworkInOrgVDCNamed - */ - @GET - @Consumes(NETWORK_XML) - @XMLResponseParser(NetworkHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findNetworkInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); - - /** - * @see VCloudClient#getNetwork - */ - @GET - @Consumes(NETWORK_XML) - @XMLResponseParser(NetworkHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getNetwork(@EndpointParam URI network); - - /** - * @see VCloudClient#getVDC(URI) - */ - @GET - @XMLResponseParser(VDCHandler.class) - @Consumes(VDC_XML) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getVDC(@EndpointParam URI vdc); - - /** - * @see VCloudClient#findVDCInOrgNamed(String, String) - */ - @GET - @XMLResponseParser(VDCHandler.class) - @Consumes(VDC_XML) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findVDCInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); - - /** - * @see VCloudClient#getTasksList - */ - @GET - @Consumes(TASKSLIST_XML) - @XMLResponseParser(TasksListHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getTasksList(@EndpointParam URI tasksListId); - - /** - * @see VCloudClient#findTasksListInOrgNamed - */ - @GET - @Consumes(TASKSLIST_XML) - @XMLResponseParser(TasksListHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findTasksListInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameToTasksListEndpoint.class) String orgName); - - /** - * @see VCloudClient#deployVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/action/deploy") - @XMLResponseParser(TaskHandler.class) - ListenableFuture deployVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#deleteVApp - */ - @DELETE - @ExceptionParser(ReturnVoidOnNotFoundOr404.class) - ListenableFuture deleteVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#undeployVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/action/undeploy") - @XMLResponseParser(TaskHandler.class) - ListenableFuture undeployVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#powerOnVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/powerOn") - @XMLResponseParser(TaskHandler.class) - ListenableFuture powerOnVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#powerOffVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/powerOff") - @XMLResponseParser(TaskHandler.class) - ListenableFuture powerOffVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#shutdownVApp - */ - @POST - @Path("/power/action/shutdown") - ListenableFuture shutdownVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#resetVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/reset") - @XMLResponseParser(TaskHandler.class) - ListenableFuture resetVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#suspendVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/suspend") - @XMLResponseParser(TaskHandler.class) - ListenableFuture suspendVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudClient#getTask - */ - @GET - @Consumes(TASK_XML) - @XMLResponseParser(TaskHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getTask(@EndpointParam URI taskId); - - /** - * @see VCloudClient#cancelTask - */ - @POST - @Path("/action/cancel") - ListenableFuture cancelTask(@EndpointParam URI taskId); - - /** - * @see VCloudClient#findVAppInOrgVDCNamed - */ - @GET - @Consumes(VAPP_XML) - @XMLResponseParser(VAppHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findVAppInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); - - /** - * @see VCloudClient#getVApp - */ - @GET - @Consumes(VAPP_XML) - @XMLResponseParser(VAppHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getVApp(@EndpointParam URI vApp); +public interface VCloudAsyncClient extends CommonVCloudAsyncClient { /** * @see VCloudClient#instantiateVAppTemplateInVDC @@ -349,9 +68,9 @@ public interface VCloudAsyncClient { @XMLResponseParser(VAppHandler.class) @MapBinder(BindInstantiateVAppTemplateParamsToXmlPayload.class) ListenableFuture instantiateVAppTemplateInVDC(@EndpointParam URI vdc, - @MapPayloadParam("template") URI template, - @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, - InstantiateVAppTemplateOptions... options); + @MapPayloadParam("template") URI template, + @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, + InstantiateVAppTemplateOptions... options); /** * @see VCloudClient#cloneVAppInVDC @@ -363,7 +82,7 @@ public interface VCloudAsyncClient { @XMLResponseParser(TaskHandler.class) @MapBinder(BindCloneVAppParamsToXmlPayload.class) ListenableFuture cloneVAppInVDC(@EndpointParam URI vdc, @MapPayloadParam("vApp") URI toClone, - @MapPayloadParam("newName") @ParamValidators(DnsNameValidator.class) String newName, - CloneVAppOptions... options); + @MapPayloadParam("newName") @ParamValidators(DnsNameValidator.class) String newName, + CloneVAppOptions... options); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java index 25dfe79fa3..1c12549f18 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudClient.java @@ -20,21 +20,11 @@ package org.jclouds.vcloud; import java.net.URI; -import java.util.NoSuchElementException; import java.util.concurrent.TimeUnit; -import javax.annotation.Nullable; - import org.jclouds.concurrent.Timeout; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; -import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -48,140 +38,8 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; * @author Adrian Cole */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) -public interface VCloudClient { +public interface VCloudClient extends CommonVCloudClient { - Org getOrg(URI orgId); - - /** - * This call returns a list of all vCloud Data Centers (vdcs), catalogs, and - * task lists within the organization. - * - * @param name - * organization name, or null for the default - * @throws NoSuchElementException - * if you specified an org name that isn't present - */ - Org findOrgNamed(@Nullable String name); - - Catalog getCatalog(URI catalogId); - - /** - * returns the catalog in the organization associated with the specified - * name. Note that both parameters can be null to choose default. - * - * @param orgName - * organization name, or null for the default - * @param catalogName - * catalog name, or null for the default - * @throws NoSuchElementException - * if you specified an org or catalog name that isn't present - */ - Catalog findCatalogInOrgNamed(@Nullable String orgName, @Nullable String catalogName); - - CatalogItem getCatalogItem(URI catalogItem); - - /** - * returns the catalog item in the catalog associated with the specified - * name. Note that the org and catalog parameters can be null to choose - * default. - * - * @param orgName - * organization name, or null for the default - * @param catalogName - * catalog name, or null for the default - * @param itemName - * item you wish to lookup - * - * @throws NoSuchElementException - * if you specified an org, catalog, or catalog item name that - * isn't present - */ - CatalogItem findCatalogItemInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, String itemName); - - VAppTemplate getVAppTemplate(URI vAppTemplate); - - /** - * returns the vapp template corresponding to a catalog item in the catalog - * associated with the specified name. Note that the org and catalog - * parameters can be null to choose default. - * - * @param orgName - * organization name, or null for the default - * @param catalogName - * catalog name, or null for the default - * @param itemName - * item you wish to lookup - * - * @throws NoSuchElementException - * if you specified an org, catalog, or catalog item name that - * isn't present - */ - VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, - String itemName); - - Network findNetworkInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String networkName); - - Network getNetwork(URI network); - - VDC getVDC(URI vdc); - - /** - * returns the VDC in the organization associated with the specified name. - * Note that both parameters can be null to choose default. - * - * @param orgName - * organization name, or null for the default - * @param vdcName - * catalog name, or null for the default - * @throws NoSuchElementException - * if you specified an org or vdc name that isn't present - */ - VDC findVDCInOrgNamed(String orgName, String vdcName); - - TasksList getTasksList(URI tasksListId); - - TasksList findTasksListInOrgNamed(String orgName); - - Task deployVApp(URI vAppId); - - void deleteVApp(URI vAppId); - - Task undeployVApp(URI vAppId); - - /** - * This call powers on the vApp, as specified in the vApp's ovf:Startup - * element. - */ - Task powerOnVApp(URI vAppId); - - /** - * This call powers off the vApp, as specified in the vApp's ovf:Startup - * element. - */ - Task powerOffVApp(URI vAppId); - - /** - * This call shuts down the vApp. - */ - void shutdownVApp(URI vAppId); - - /** - * This call resets the vApp. - */ - Task resetVApp(URI vAppId); - - /** - * This call suspends the vApp. - */ - Task suspendVApp(URI vAppId); - - Task getTask(URI taskId); - - void cancelTask(URI taskId); - - VApp findVAppInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String vAppName); - - VApp getVApp(URI vApp); VApp instantiateVAppTemplateInVDC(URI vDC, URI template, String appName, InstantiateVAppTemplateOptions... options); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java index 9acd9e928d..3849c9fca1 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java @@ -19,68 +19,32 @@ package org.jclouds.vcloud; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.NETWORK_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.ORG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASK_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VAPPTEMPLATE_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; +import static org.jclouds.vcloud.VCloudMediaType.TASK_XML; +import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; import java.net.URI; -import javax.annotation.Nullable; import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.jclouds.predicates.validators.DnsNameValidator; -import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.EndpointParam; -import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.MapBinder; import org.jclouds.rest.annotations.MapPayloadParam; import org.jclouds.rest.annotations.ParamValidators; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.XMLResponseParser; -import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; -import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.vcloud.binders.BindCloneVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.domain.Task; -import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.functions.OrganizationNameAndCatalogNameToEndpoint; -import org.jclouds.vcloud.functions.OrganizationNameAndTasksListNameToEndpoint; -import org.jclouds.vcloud.functions.OrganizationNameAndVDCNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; -import org.jclouds.vcloud.xml.CatalogHandler; -import org.jclouds.vcloud.xml.CatalogItemHandler; -import org.jclouds.vcloud.xml.NetworkHandler; -import org.jclouds.vcloud.xml.OrganizationHandler; import org.jclouds.vcloud.xml.TaskHandler; -import org.jclouds.vcloud.xml.TasksListHandler; import org.jclouds.vcloud.xml.VAppHandler; -import org.jclouds.vcloud.xml.VAppTemplateHandler; -import org.jclouds.vcloud.xml.VDCHandler; import com.google.common.util.concurrent.ListenableFuture; @@ -88,298 +52,11 @@ import com.google.common.util.concurrent.ListenableFuture; * Provides access to VCloud resources via their REST API. *

* - * @see + * @see * @author Adrian Cole */ @RequestFilters(SetVCloudTokenCookie.class) -public interface VCloudExpressAsyncClient { - /** - * @see VCloudExpressClient#getDefaultOrganization - */ - @Deprecated - @GET - @Endpoint(Org.class) - @Consumes(ORG_XML) - @XMLResponseParser(OrganizationHandler.class) - ListenableFuture getDefaultOrganization(); - - /** - * @see VCloudExpressClient#getOrganization - */ - @GET - @XMLResponseParser(OrganizationHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(ORG_XML) - ListenableFuture getOrganization(@EndpointParam URI orgId); - - /** - * @see VCloudExpressClient#getOrganizationNamed - */ - @GET - @XMLResponseParser(OrganizationHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(ORG_XML) - ListenableFuture findOrganizationNamed( - @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); - - /** - * @see VCloudExpressClient#getDefaultCatalog - */ - @Deprecated - @GET - @Endpoint(org.jclouds.vcloud.endpoints.Catalog.class) - @Consumes(CATALOG_XML) - @XMLResponseParser(CatalogHandler.class) - ListenableFuture getDefaultCatalog(); - - /** - * @see VCloudExpressClient#getCatalog - */ - @GET - @XMLResponseParser(CatalogHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(CATALOG_XML) - ListenableFuture getCatalog(@EndpointParam URI catalogId); - - /** - * @see VCloudExpressClient#findCatalogInOrgNamed - */ - @GET - @XMLResponseParser(CatalogHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Consumes(CATALOG_XML) - ListenableFuture findCatalogInOrgNamed( - @Nullable @EndpointParam(parser = OrganizationNameAndCatalogNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrganizationNameAndCatalogNameToEndpoint.class) String catalogName); - - /** - * @see VCloudExpressClient#getVAppTemplate - */ - @GET - @Consumes(VAPPTEMPLATE_XML) - @XMLResponseParser(VAppTemplateHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getVAppTemplate(@EndpointParam URI vAppTemplate); - - /** - * @see VCloudExpressClient#findVAppTemplateInOrgCatalogNameds - */ - @GET - @Consumes(VAPPTEMPLATE_XML) - @XMLResponseParser(VAppTemplateHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findVAppTemplateInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); - - /** - * @see VCloudExpressClient#getCatalogItem - */ - @GET - @Consumes(CATALOGITEM_XML) - @XMLResponseParser(CatalogItemHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getCatalogItem(@EndpointParam URI catalogItem); - - /** - * @see VCloudExpressClient#getCatalogItemInOrg - */ - @GET - @Consumes(CATALOGITEM_XML) - @XMLResponseParser(CatalogItemHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findCatalogItemInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); - - /** - * @see VCloudExpressClient#findNetworkInOrgVDCNamed - */ - @GET - @Consumes(NETWORK_XML) - @XMLResponseParser(NetworkHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findNetworkInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); - - /** - * @see VCloudExpressClient#getNetwork - */ - @GET - @Consumes(NETWORK_XML) - @XMLResponseParser(NetworkHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getNetwork(@EndpointParam URI network); - - /** - * @see VCloudExpressClient#getDefaultVDC - */ - @Deprecated - @GET - @Endpoint(org.jclouds.vcloud.endpoints.VDC.class) - @XMLResponseParser(VDCHandler.class) - @Consumes(VDC_XML) - ListenableFuture getDefaultVDC(); - - /** - * @see VCloudExpressClient#getVDC(URI) - */ - @GET - @XMLResponseParser(VDCHandler.class) - @Consumes(VDC_XML) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getVDC(@EndpointParam URI vdc); - - /** - * @see VCloudExpressClient#findVDCInOrgNamed(String, String) - */ - @GET - @XMLResponseParser(VDCHandler.class) - @Consumes(VDC_XML) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findVDCInOrgNamed( - @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String vdcName); - - /** - * @see VCloudExpressClient#getTasksList - */ - @GET - @Consumes(TASKSLIST_XML) - @XMLResponseParser(TasksListHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getTasksList(@EndpointParam URI tasksListId); - - /** - * @see VCloudExpressClient#getTasksListInOrg - */ - @GET - @Consumes(TASKSLIST_XML) - @XMLResponseParser(TasksListHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findTasksListInOrgNamed( - @Nullable @EndpointParam(parser = OrganizationNameAndTasksListNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrganizationNameAndTasksListNameToEndpoint.class) String tasksListName); - - /** - * @see VCloudExpressClient#getDefaultTasksList - */ - @Deprecated - @GET - @Endpoint(org.jclouds.vcloud.endpoints.TasksList.class) - @Consumes(TASKSLIST_XML) - @XMLResponseParser(TasksListHandler.class) - ListenableFuture getDefaultTasksList(); - - /** - * @see VCloudExpressClient#deployVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/action/deploy") - @XMLResponseParser(TaskHandler.class) - ListenableFuture deployVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#deleteVApp - */ - @DELETE - @ExceptionParser(ReturnVoidOnNotFoundOr404.class) - ListenableFuture deleteVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#undeployVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/action/undeploy") - @XMLResponseParser(TaskHandler.class) - ListenableFuture undeployVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#powerOnVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/powerOn") - @XMLResponseParser(TaskHandler.class) - ListenableFuture powerOnVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#powerOffVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/powerOff") - @XMLResponseParser(TaskHandler.class) - ListenableFuture powerOffVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#shutdownVApp - */ - @POST - @Path("/power/action/shutdown") - ListenableFuture shutdownVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#resetVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/reset") - @XMLResponseParser(TaskHandler.class) - ListenableFuture resetVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#suspendVApp - */ - @POST - @Consumes(TASK_XML) - @Path("/power/action/suspend") - @XMLResponseParser(TaskHandler.class) - ListenableFuture suspendVApp(@EndpointParam URI vAppId); - - /** - * @see VCloudExpressClient#getTask - */ - @GET - @Consumes(TASK_XML) - @XMLResponseParser(TaskHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getTask(@EndpointParam URI taskId); - - /** - * @see VCloudExpressClient#cancelTask - */ - @POST - @Path("/action/cancel") - ListenableFuture cancelTask(@EndpointParam URI taskId); - - /** - * @see VCloudExpressClient#findVAppInOrgVDCNamed - */ - @GET - @Consumes(VAPP_XML) - @XMLResponseParser(VAppHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findVAppInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); - - /** - * @see VCloudExpressClient#getVApp - */ - @GET - @Consumes(VAPP_XML) - @XMLResponseParser(VAppHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getVApp(@EndpointParam URI vApp); +public interface VCloudExpressAsyncClient extends CommonVCloudAsyncClient { /** * @see VCloudExpressClient#instantiateVAppTemplateInVDC @@ -391,9 +68,9 @@ public interface VCloudExpressAsyncClient { @XMLResponseParser(VAppHandler.class) @MapBinder(BindInstantiateVAppTemplateParamsToXmlPayload.class) ListenableFuture instantiateVAppTemplateInVDC(@EndpointParam URI vdc, - @MapPayloadParam("template") URI template, - @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, - InstantiateVAppTemplateOptions... options); + @MapPayloadParam("template") URI template, + @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, + InstantiateVAppTemplateOptions... options); /** * @see VCloudExpressClient#cloneVAppInVDC @@ -405,7 +82,7 @@ public interface VCloudExpressAsyncClient { @XMLResponseParser(TaskHandler.class) @MapBinder(BindCloneVAppParamsToXmlPayload.class) ListenableFuture cloneVAppInVDC(@EndpointParam URI vdc, @MapPayloadParam("vApp") URI toClone, - @MapPayloadParam("newName") @ParamValidators(DnsNameValidator.class) String newName, - CloneVAppOptions... options); + @MapPayloadParam("newName") @ParamValidators(DnsNameValidator.class) String newName, + CloneVAppOptions... options); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java index ad99254809..c9c468a372 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressClient.java @@ -20,21 +20,11 @@ package org.jclouds.vcloud; import java.net.URI; -import java.util.NoSuchElementException; import java.util.concurrent.TimeUnit; -import javax.annotation.Nullable; - import org.jclouds.concurrent.Timeout; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Organization; import org.jclouds.vcloud.domain.Task; -import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -42,169 +32,11 @@ import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; * Provides access to VCloud resources via their REST API. *

* - * @see + * @see * @author Adrian Cole */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) -public interface VCloudExpressClient { - - /** - * Please use {@link #findOrganizationNamed(String)} passing null - */ - @Deprecated - Organization getDefaultOrganization(); - - Organization getOrganization(URI orgId); - - /** - * This call returns a list of all vCloud Data Centers (vdcs), catalogs, and - * task lists within the organization. - * - * @param name - * organization name, or null for the default - * @throws NoSuchElementException - * if you specified an org name that isn't present - */ - Organization findOrganizationNamed(@Nullable String name); - - /** - * Please use #findCatalogInOrgNamed(null, null) - */ - @Deprecated - Catalog getDefaultCatalog(); - - Catalog getCatalog(URI catalogId); - - /** - * returns the catalog in the organization associated with the specified - * name. Note that both parameters can be null to choose default. - * - * @param orgName - * organization name, or null for the default - * @param catalogName - * catalog name, or null for the default - * @throws NoSuchElementException - * if you specified an org or catalog name that isn't present - */ - Catalog findCatalogInOrgNamed(@Nullable String orgName, @Nullable String catalogName); - - CatalogItem getCatalogItem(URI catalogItem); - - /** - * returns the catalog item in the catalog associated with the specified - * name. Note that the org and catalog parameters can be null to choose - * default. - * - * @param orgName - * organization name, or null for the default - * @param catalogName - * catalog name, or null for the default - * @param itemName - * item you wish to lookup - * - * @throws NoSuchElementException - * if you specified an org, catalog, or catalog item name that - * isn't present - */ - CatalogItem findCatalogItemInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, String itemName); - - VAppTemplate getVAppTemplate(URI vAppTemplate); - - /** - * returns the vapp template corresponding to a catalog item in the catalog - * associated with the specified name. Note that the org and catalog - * parameters can be null to choose default. - * - * @param orgName - * organization name, or null for the default - * @param catalogName - * catalog name, or null for the default - * @param itemName - * item you wish to lookup - * - * @throws NoSuchElementException - * if you specified an org, catalog, or catalog item name that - * isn't present - */ - VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, - String itemName); - - Network findNetworkInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String networkName); - - Network getNetwork(URI network); - - VDC getVDC(URI vdc); - - /** - * returns the VDC in the organization associated with the specified name. - * Note that both parameters can be null to choose default. - * - * @param orgName - * organization name, or null for the default - * @param vdcName - * catalog name, or null for the default - * @throws NoSuchElementException - * if you specified an org or vdc name that isn't present - */ - VDC findVDCInOrgNamed(String orgName, String vdcName); - - /** - * Please use #findVDCInOrgNamed - */ - @Deprecated - VDC getDefaultVDC(); - - TasksList getTasksList(URI tasksListId); - - TasksList findTasksListInOrgNamed(String orgName, String tasksListName); - - /** - * Please use #getTasksListInOrg(null, null) - */ - @Deprecated - TasksList getDefaultTasksList(); - - Task deployVApp(URI vAppId); - - void deleteVApp(URI vAppId); - - Task undeployVApp(URI vAppId); - - /** - * This call powers on the vApp, as specified in the vApp's ovf:Startup - * element. - */ - Task powerOnVApp(URI vAppId); - - /** - * This call powers off the vApp, as specified in the vApp's ovf:Startup - * element. - */ - Task powerOffVApp(URI vAppId); - - /** - * This call shuts down the vApp. - */ - void shutdownVApp(URI vAppId); - - /** - * This call resets the vApp. - */ - Task resetVApp(URI vAppId); - - /** - * This call suspends the vApp. - */ - Task suspendVApp(URI vAppId); - - Task getTask(URI taskId); - - void cancelTask(URI taskId); - - VApp findVAppInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String vAppName); - - VApp getVApp(URI vApp); +public interface VCloudExpressClient extends CommonVCloudClient { VApp instantiateVAppTemplateInVDC(URI vDC, URI template, String appName, InstantiateVAppTemplateOptions... options); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java deleted file mode 100644 index 38cbca0732..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudExpressComputeClient.java +++ /dev/null @@ -1,216 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import java.net.URI; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nullable; -import javax.annotation.Resource; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.Task; -import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; -import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; -import com.google.inject.Inject; - -/** - * @author Adrian Cole - */ -@Singleton -public class BaseVCloudExpressComputeClient implements VCloudExpressComputeClient { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - protected Logger logger = Logger.NULL; - - protected final VCloudExpressClient client; - protected final Predicate taskTester; - protected final Map vAppStatusToNodeState; - - @Inject - public BaseVCloudExpressComputeClient(VCloudExpressClient client, Predicate successTester, - Map vAppStatusToNodeState) { - this.client = client; - this.taskTester = successTester; - this.vAppStatusToNodeState = vAppStatusToNodeState; - } - - @Override - public Map start(@Nullable URI VDC, URI templateId, String name, - InstantiateVAppTemplateOptions options, int... portsToOpen) { - checkNotNull(options, "options"); - logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); - - VDC vdc = client.getVDC(VDC); - VAppTemplate template = client.getVAppTemplate(templateId); - - VApp vAppResponse = client.instantiateVAppTemplateInVDC(vdc.getId(), template.getId(), name, options); - logger.debug("<< instantiated VApp(%s)", vAppResponse.getName()); - - logger.debug(">> deploying vApp(%s)", vAppResponse.getName()); - - Task task = client.deployVApp(vAppResponse.getId()); - if (options.shouldBlockOnDeploy()) { - if (!taskTester.apply(task.getLocation())) { - throw new TaskException("deploy", vAppResponse, task); - } - logger.debug("<< deployed vApp(%s)", vAppResponse.getName()); - - logger.debug(">> powering vApp(%s)", vAppResponse.getName()); - task = client.powerOnVApp(vAppResponse.getId()); - if (!taskTester.apply(task.getLocation())) { - throw new TaskException("powerOn", vAppResponse, task); - } - logger.debug("<< on vApp(%s)", vAppResponse.getName()); - } - return parseAndValidateResponse(template, vAppResponse); - } - - protected Map parseAndValidateResponse(VAppTemplate template, VApp vAppResponse) { - Map response = parseResponse(template, vAppResponse); - checkState(response.containsKey("id"), "bad configuration: [id] should be in response"); - checkState(response.containsKey("username"), "bad configuration: [username] should be in response"); - checkState(response.containsKey("password"), "bad configuration: [password] should be in response"); - return response; - } - - protected Map parseResponse(VAppTemplate template, VApp vAppResponse) { - Map config = Maps.newLinkedHashMap();// Allows nulls - config.put("id", vAppResponse.getId().toASCIIString()); - config.put("username", null); - config.put("password", null); - return config; - } - - @Override - public void reboot(URI id) { - VApp vApp = client.getVApp(id); - logger.debug(">> resetting vApp(%s)", vApp.getName()); - Task task = client.resetVApp(vApp.getId()); - if (!taskTester.apply(task.getLocation())) { - throw new TaskException("resetVApp", vApp, task); - } - logger.debug("<< on vApp(%s)", vApp.getName()); - } - - @Override - public void stop(URI id) { - VApp vApp = client.getVApp(id); - vApp = powerOffVAppIfDeployed(vApp); - vApp = undeployVAppIfDeployed(vApp); - deleteVApp(vApp); - logger.debug("<< deleted vApp(%s)", vApp.getName()); - } - - private void deleteVApp(VApp vApp) { - logger.debug(">> deleting vApp(%s)", vApp.getName()); - client.deleteVApp(vApp.getId()); - } - - private VApp undeployVAppIfDeployed(VApp vApp) { - if (vApp.getStatus().compareTo(VAppStatus.RESOLVED) > 0) { - logger.debug(">> undeploying vApp(%s), current status: %s", vApp.getName(), vApp.getStatus()); - Task task = client.undeployVApp(vApp.getId()); - if (!taskTester.apply(task.getLocation())) { - throw new TaskException("undeploy", vApp, task); - } - vApp = client.getVApp(vApp.getId()); - logger.debug("<< %s vApp(%s)", vApp.getStatus(), vApp.getName()); - } - return vApp; - } - - private VApp powerOffVAppIfDeployed(VApp vApp) { - if (vApp.getStatus().compareTo(VAppStatus.OFF) > 0) { - logger.debug(">> powering off vApp(%s), current status: %s", vApp.getName(), vApp.getStatus()); - Task task = client.powerOffVApp(vApp.getId()); - if (!taskTester.apply(task.getLocation())) { - throw new TaskException("powerOff", vApp, task); - } - vApp = client.getVApp(vApp.getId()); - logger.debug("<< %s vApp(%s)", vApp.getStatus(), vApp.getName()); - } - return vApp; - } - - public static class TaskException extends VAppException { - - private final Task task; - /** The serialVersionUID */ - private static final long serialVersionUID = 251801929573211256L; - - public TaskException(String type, VApp vApp, Task task) { - super(String.format("failed to %s vApp %s status %s;task %s status %s", type, vApp.getName(), - vApp.getStatus(), task.getLocation(), task.getStatus()), vApp); - this.task = task; - } - - public Task getTask() { - return task; - } - - } - - public static class VAppException extends RuntimeException { - - private final VApp vApp; - /** The serialVersionUID */ - private static final long serialVersionUID = 251801929573211256L; - - public VAppException(String message, VApp vApp) { - super(message); - this.vApp = vApp; - } - - public VApp getvApp() { - return vApp; - } - - } - - @Override - public Set getPrivateAddresses(URI id) { - return ImmutableSet.of(); - } - - @Override - public Set getPublicAddresses(URI id) { - VApp vApp = client.getVApp(id); - return Sets.newHashSet(vApp.getNetworkToAddresses().values()); - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/CommonVCloudComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/CommonVCloudComputeClient.java new file mode 100644 index 0000000000..656b25ad9d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/CommonVCloudComputeClient.java @@ -0,0 +1,62 @@ +/** + * + * Copyright (C) 2010 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.compute; + +import java.net.URI; +import java.util.Set; + +/** + * + * @author Adrian Cole + */ +public interface CommonVCloudComputeClient { + + /** + * returns a set of addresses that are only visible to the private network. + */ + Set getPrivateAddresses(URI vAppId); + + /** + * returns a set of addresses that are publically visible + */ + Set getPublicAddresses(URI vAppId); + + /** + * reboots the vApp, blocking until the following state transition is complete: + *

+ * current -> {@code VAppStatus#OFF} -> {@code VAppStatus#ON} + * + * @param vAppId + * vApp to reboot + */ + void reboot(URI vAppId); + + /** + * Destroys dependent resources, powers off and deletes the vApp, blocking until the following + * state transition is complete: + *

+ * current -> {@code VAppStatus#OFF} -> deleted + * + * @param vAppId + * vApp to stop + */ + void stop(URI vAppId); + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudComputeClient.java index ea388f0c8e..9f8e8ec37f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudComputeClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudComputeClient.java @@ -21,10 +21,10 @@ package org.jclouds.vcloud.compute; import java.net.URI; import java.util.Map; -import java.util.Set; import javax.annotation.Nullable; +import org.jclouds.vcloud.compute.internal.VCloudComputeClientImpl; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import com.google.inject.ImplementedBy; @@ -33,11 +33,11 @@ import com.google.inject.ImplementedBy; * * @author Adrian Cole */ -@ImplementedBy(BaseVCloudComputeClient.class) -public interface VCloudComputeClient { +@ImplementedBy(VCloudComputeClientImpl.class) +public interface VCloudComputeClient extends CommonVCloudComputeClient { /** - * Runs through all commands necessary to startup a vApp, opening at least - * one ip address to the public network. These are the steps: + * Runs through all commands necessary to startup a vApp, opening at least one ip address to the + * public network. These are the steps: *

* instantiate -> deploy -> powerOn *

@@ -59,43 +59,11 @@ public interface VCloudComputeClient { * opens the following ports on the public ip address * @return map contains at least the following properties *

    - *
  1. id - vApp id
  2. username - console login user
  3. - * password - console login password
  4. + *
  5. id - vApp id
  6. username - console login user
  7. password - console + * login password
  8. *
*/ Map start(@Nullable URI VDC, URI templateId, String name, InstantiateVAppTemplateOptions options, - int... portsToOpen); - - /** - * returns a set of addresses that are only visible to the private network. - */ - Set getPrivateAddresses(URI vAppId); - - /** - * returns a set of addresses that are publically visible - */ - Set getPublicAddresses(URI vAppId); - - /** - * reboots the vApp, blocking until the following state transition is - * complete: - *

- * current -> {@code VAppStatus#OFF} -> {@code VAppStatus#ON} - * - * @param vAppId - * vApp to reboot - */ - void reboot(URI vAppId); - - /** - * Destroys dependent resources, powers off and deletes the vApp, blocking - * until the following state transition is complete: - *

- * current -> {@code VAppStatus#OFF} -> deleted - * - * @param vAppId - * vApp to stop - */ - void stop(URI vAppId); + int... portsToOpen); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java index 516a8d7a81..e58d4da07a 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/VCloudExpressComputeClient.java @@ -21,10 +21,10 @@ package org.jclouds.vcloud.compute; import java.net.URI; import java.util.Map; -import java.util.Set; import javax.annotation.Nullable; +import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import com.google.inject.ImplementedBy; @@ -33,11 +33,11 @@ import com.google.inject.ImplementedBy; * * @author Adrian Cole */ -@ImplementedBy(BaseVCloudExpressComputeClient.class) -public interface VCloudExpressComputeClient { +@ImplementedBy(VCloudExpressComputeClientImpl.class) +public interface VCloudExpressComputeClient extends CommonVCloudComputeClient { /** - * Runs through all commands necessary to startup a vApp, opening at least - * one ip address to the public network. These are the steps: + * Runs through all commands necessary to startup a vApp, opening at least one ip address to the + * public network. These are the steps: *

* instantiate -> deploy -> powerOn *

@@ -59,43 +59,11 @@ public interface VCloudExpressComputeClient { * opens the following ports on the public ip address * @return map contains at least the following properties *

    - *
  1. id - vApp id
  2. username - console login user
  3. - * password - console login password
  4. + *
  5. id - vApp id
  6. username - console login user
  7. password - console + * login password
  8. *
*/ Map start(@Nullable URI VDC, URI templateId, String name, InstantiateVAppTemplateOptions options, - int... portsToOpen); - - /** - * returns a set of addresses that are only visible to the private network. - */ - Set getPrivateAddresses(URI vAppId); - - /** - * returns a set of addresses that are publically visible - */ - Set getPublicAddresses(URI vAppId); - - /** - * reboots the vApp, blocking until the following state transition is - * complete: - *

- * current -> {@code VAppStatus#OFF} -> {@code VAppStatus#ON} - * - * @param vAppId - * vApp to reboot - */ - void reboot(URI vAppId); - - /** - * Destroys dependent resources, powers off and deletes the vApp, blocking - * until the following state transition is complete: - *

- * current -> {@code VAppStatus#OFF} -> deleted - * - * @param vAppId - * vApp to stop - */ - void stop(URI vAppId); + int... portsToOpen); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java index b2b9563d92..4e9239c94d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java @@ -27,10 +27,24 @@ import javax.inject.Singleton; import org.jclouds.compute.LoadBalancerService; import org.jclouds.compute.config.BaseComputeServiceContextModule; import org.jclouds.compute.config.ComputeServiceTimeoutsModule; +import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.Size; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.compute.strategy.DestroyNodeStrategy; +import org.jclouds.compute.strategy.GetNodeMetadataStrategy; +import org.jclouds.compute.strategy.ListNodesStrategy; +import org.jclouds.compute.strategy.RebootNodeStrategy; +import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; +import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; +import org.jclouds.domain.Location; +import org.jclouds.vcloud.compute.internal.VCloudComputeClientImpl; +import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; +import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; import org.jclouds.vcloud.compute.suppliers.StaticSizeSupplier; +import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; import org.jclouds.vcloud.domain.VAppStatus; import com.google.common.annotations.VisibleForTesting; @@ -41,7 +55,7 @@ import com.google.inject.Provides; import com.google.inject.util.Providers; /** - * Configures the {@link VCloudComputeServiceContext}; requires {@link BaseVCloudComputeClient} + * Configures the {@link VCloudComputeServiceContext}; requires {@link VCloudComputeClientImpl} * bound. * * @author Adrian Cole @@ -63,6 +77,11 @@ public abstract class CommonVCloudComputeServiceContextModule extends BaseComput @Override protected void configure() { install(new ComputeServiceTimeoutsModule()); + bind(DestroyNodeStrategy.class).to(VCloudDestroyNodeStrategy.class); + bind(RunNodesAndAddToSetStrategy.class).to(EncodeTagIntoNameRunNodesAndAddToSetStrategy.class); + bind(ListNodesStrategy.class).to(VCloudListNodesStrategy.class); + bind(GetNodeMetadataStrategy.class).to(VCloudGetNodeMetadataStrategy.class); + bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); bindLoadBalancer(); } @@ -75,4 +94,14 @@ public abstract class CommonVCloudComputeServiceContextModule extends BaseComput return injector.getInstance(StaticSizeSupplier.class); } + @Override + protected Supplier> getSourceLocationSupplier(Injector injector) { + return injector.getInstance(OrgAndVDCToLocationSupplier.class); + } + + @Override + protected Supplier> getSourceImageSupplier(Injector injector) { + return injector.getInstance(VCloudImageSupplier.class); + } + } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java index c0316ec5a6..6c663faf4c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudComputeServiceContextModule.java @@ -19,38 +19,25 @@ package org.jclouds.vcloud.compute.config; -import java.util.Set; +import javax.inject.Singleton; import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; -import org.jclouds.domain.Location; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.BaseVCloudComputeClient; +import org.jclouds.vcloud.compute.CommonVCloudComputeClient; +import org.jclouds.vcloud.compute.VCloudComputeClient; +import org.jclouds.vcloud.compute.internal.VCloudComputeClientImpl; import org.jclouds.vcloud.compute.strategy.VCloudAddNodeWithTagStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; -import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; -import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; -import com.google.common.base.Supplier; -import com.google.inject.Injector; +import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; /** - * Configures the {@link VCloudComputeServiceContext}; requires {@link BaseVCloudComputeClient} + * Configures the {@link VCloudComputeServiceContext}; requires {@link VCloudComputeClientImpl} * bound. * * @author Adrian Cole @@ -67,21 +54,11 @@ public class VCloudComputeServiceContextModule extends CommonVCloudComputeServic }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); bind(AddNodeWithTagStrategy.class).to(VCloudAddNodeWithTagStrategy.class); - bind(DestroyNodeStrategy.class).to(VCloudDestroyNodeStrategy.class); - bind(RunNodesAndAddToSetStrategy.class).to(EncodeTagIntoNameRunNodesAndAddToSetStrategy.class); - bind(ListNodesStrategy.class).to(VCloudListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(VCloudGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); } - @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(OrgAndVDCToLocationSupplier.class); + @Provides + @Singleton + CommonVCloudComputeClient provideCommonVCloudComputeClient(VCloudComputeClient in) { + return in; } - - @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(VCloudImageSupplier.class); - } - } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java index f3220b3f6d..f1818694cf 100755 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/VCloudExpressComputeServiceContextModule.java @@ -19,39 +19,26 @@ package org.jclouds.vcloud.compute.config; -import java.util.Set; +import javax.inject.Singleton; import org.jclouds.compute.ComputeServiceContext; -import org.jclouds.compute.domain.Image; import org.jclouds.compute.internal.ComputeServiceContextImpl; import org.jclouds.compute.strategy.AddNodeWithTagStrategy; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.compute.strategy.RunNodesAndAddToSetStrategy; -import org.jclouds.compute.strategy.impl.EncodeTagIntoNameRunNodesAndAddToSetStrategy; -import org.jclouds.domain.Location; import org.jclouds.rest.RestContext; import org.jclouds.rest.internal.RestContextImpl; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; +import org.jclouds.vcloud.compute.CommonVCloudComputeClient; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.compute.strategy.VCloudExpressAddNodeWithTagStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressGetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; -import org.jclouds.vcloud.compute.suppliers.OrganizationAndVDCToLocationSupplier; -import org.jclouds.vcloud.compute.suppliers.VCloudExpressImageSupplier; -import com.google.common.base.Supplier; -import com.google.inject.Injector; +import com.google.inject.Provides; import com.google.inject.Scopes; import com.google.inject.TypeLiteral; /** * Configures the {@link VCloudComputeServiceContext}; requires - * {@link BaseVCloudExpressComputeClient} bound. + * {@link VCloudExpressComputeClientImpl} bound. * * @author Adrian Cole */ @@ -67,21 +54,11 @@ public class VCloudExpressComputeServiceContextModule extends CommonVCloudComput }).to(new TypeLiteral>() { }).in(Scopes.SINGLETON); bind(AddNodeWithTagStrategy.class).to(VCloudExpressAddNodeWithTagStrategy.class); - bind(DestroyNodeStrategy.class).to(VCloudExpressDestroyNodeStrategy.class); - bind(RunNodesAndAddToSetStrategy.class).to(EncodeTagIntoNameRunNodesAndAddToSetStrategy.class); - bind(ListNodesStrategy.class).to(VCloudExpressListNodesStrategy.class); - bind(GetNodeMetadataStrategy.class).to(VCloudExpressGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); } - @Override - protected Supplier> getSourceLocationSupplier(Injector injector) { - return injector.getInstance(OrganizationAndVDCToLocationSupplier.class); + @Provides + @Singleton + CommonVCloudComputeClient provideCommonVCloudComputeClient(VCloudExpressComputeClient in) { + return in; } - - @Override - protected Supplier> getSourceImageSupplier(Injector injector) { - return injector.getInstance(VCloudExpressImageSupplier.class); - } - } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java index 21648b4832..87ea870f6a 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/GetExtra.java @@ -31,7 +31,7 @@ import javax.annotation.Resource; import javax.inject.Singleton; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; +import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; import org.jclouds.vcloud.domain.VApp; @@ -40,7 +40,7 @@ import com.google.common.base.Function; /** * Configures the {@link VCloudComputeServiceContext}; requires - * {@link BaseVCloudExpressComputeClient} bound. + * {@link VCloudExpressComputeClientImpl} bound. * * @author Adrian Cole */ diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java deleted file mode 100644 index 6724eb69d2..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/functions/ImagesInOrganization.java +++ /dev/null @@ -1,61 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute.functions; - -import javax.inject.Inject; -import javax.inject.Provider; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.Image; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.functions.AllCatalogItemsInOrganization; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; - -/** - * @author Adrian Cole - */ -@Singleton -public class ImagesInOrganization implements Function> { - - private final AllCatalogItemsInOrganization allCatalogItemsInOrganization; - private final Function, Iterable> vAppTemplatesForCatalogItems; - private final Provider imageForVAppTemplateProvider; - - @Inject - ImagesInOrganization(AllCatalogItemsInOrganization allCatalogItemsInOrganization, - Provider imageForVAppTemplateProvider, - Function, Iterable> vAppTemplatesForCatalogItems) { - this.imageForVAppTemplateProvider = imageForVAppTemplateProvider; - this.allCatalogItemsInOrganization = allCatalogItemsInOrganization; - this.vAppTemplatesForCatalogItems = vAppTemplatesForCatalogItems; - } - - @Override - public Iterable apply(Organization from) { - Iterable catalogs = allCatalogItemsInOrganization.apply(from); - Iterable vAppTemplates = vAppTemplatesForCatalogItems.apply(catalogs); - return Iterables.transform(vAppTemplates, imageForVAppTemplateProvider.get().withParent(from)); - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java similarity index 73% rename from vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java index 3970622875..a42241b275 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/BaseVCloudComputeClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java @@ -17,30 +17,26 @@ * ==================================================================== */ -package org.jclouds.vcloud.compute; +package org.jclouds.vcloud.compute.internal; -import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import java.net.URI; import java.util.Map; import java.util.Set; -import javax.annotation.Nullable; import javax.annotation.Resource; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.CommonVCloudClient; +import org.jclouds.vcloud.compute.CommonVCloudComputeClient; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableSet; @@ -52,52 +48,18 @@ import com.google.inject.Inject; * @author Adrian Cole */ @Singleton -public class BaseVCloudComputeClient implements VCloudComputeClient { +public class CommonVCloudComputeClientImpl implements CommonVCloudComputeClient { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; - protected final VCloudClient client; + protected final CommonVCloudClient client; protected final Predicate taskTester; - protected final Map vAppStatusToNodeState; @Inject - public BaseVCloudComputeClient(VCloudClient client, Predicate successTester, - Map vAppStatusToNodeState) { + public CommonVCloudComputeClientImpl(CommonVCloudClient client, Predicate successTester) { this.client = client; this.taskTester = successTester; - this.vAppStatusToNodeState = vAppStatusToNodeState; - } - - @Override - public Map start(@Nullable URI VDC, URI templateId, String name, - InstantiateVAppTemplateOptions options, int... portsToOpen) { - checkNotNull(options, "options"); - logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); - - VDC vdc = client.getVDC(VDC); - VAppTemplate template = client.getVAppTemplate(templateId); - - VApp vAppResponse = client.instantiateVAppTemplateInVDC(vdc.getId(), template.getId(), name, options); - logger.debug("<< instantiated VApp(%s)", vAppResponse.getName()); - - logger.debug(">> deploying vApp(%s)", vAppResponse.getName()); - - Task task = client.deployVApp(vAppResponse.getId()); - if (options.shouldBlockOnDeploy()) { - if (!taskTester.apply(task.getLocation())) { - throw new TaskException("deploy", vAppResponse, task); - } - logger.debug("<< deployed vApp(%s)", vAppResponse.getName()); - - logger.debug(">> powering vApp(%s)", vAppResponse.getName()); - task = client.powerOnVApp(vAppResponse.getId()); - if (!taskTester.apply(task.getLocation())) { - throw new TaskException("powerOn", vAppResponse, task); - } - logger.debug("<< on vApp(%s)", vAppResponse.getName()); - } - return parseAndValidateResponse(template, vAppResponse); } protected Map parseAndValidateResponse(VAppTemplate template, VApp vAppResponse) { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java new file mode 100644 index 0000000000..da79879ebc --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java @@ -0,0 +1,89 @@ +/** + * + * Copyright (C) 2010 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.compute.internal; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; + +import javax.annotation.Nullable; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeState; +import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.compute.VCloudComputeClient; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; + +import com.google.common.base.Predicate; +import com.google.inject.Inject; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudComputeClientImpl extends CommonVCloudComputeClientImpl implements VCloudComputeClient { + + protected final Map vAppStatusToNodeState; + + @Inject + public VCloudComputeClientImpl(VCloudClient client, Predicate successTester, + Map vAppStatusToNodeState) { + super(client, successTester); + this.vAppStatusToNodeState = vAppStatusToNodeState; + } + + @Override + public Map start(@Nullable URI VDC, URI templateId, String name, + InstantiateVAppTemplateOptions options, int... portsToOpen) { + checkNotNull(options, "options"); + logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); + + VDC vdc = client.getVDC(VDC); + VAppTemplate template = client.getVAppTemplate(templateId); + + VApp vAppResponse = VCloudClient.class.cast(client).instantiateVAppTemplateInVDC(vdc.getId(), template.getId(), + name, options); + logger.debug("<< instantiated VApp(%s)", vAppResponse.getName()); + + logger.debug(">> deploying vApp(%s)", vAppResponse.getName()); + + Task task = client.deployVApp(vAppResponse.getId()); + if (options.shouldBlockOnDeploy()) { + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("deploy", vAppResponse, task); + } + logger.debug("<< deployed vApp(%s)", vAppResponse.getName()); + + logger.debug(">> powering vApp(%s)", vAppResponse.getName()); + task = client.powerOnVApp(vAppResponse.getId()); + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("powerOn", vAppResponse, task); + } + logger.debug("<< on vApp(%s)", vAppResponse.getName()); + } + return parseAndValidateResponse(template, vAppResponse); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java new file mode 100644 index 0000000000..cd13619818 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java @@ -0,0 +1,90 @@ +/** + * + * Copyright (C) 2010 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.compute.internal; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.Map; + +import javax.annotation.Nullable; +import javax.inject.Singleton; + +import org.jclouds.compute.domain.NodeState; +import org.jclouds.vcloud.VCloudExpressClient; +import org.jclouds.vcloud.compute.VCloudExpressComputeClient; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.VAppTemplate; +import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; + +import com.google.common.base.Predicate; +import com.google.inject.Inject; + +/** + * @author Adrian Cole + */ +@Singleton +public class VCloudExpressComputeClientImpl extends CommonVCloudComputeClientImpl implements VCloudExpressComputeClient { + + protected final Map vAppStatusToNodeState; + + @Inject + public VCloudExpressComputeClientImpl(VCloudExpressClient client, Predicate successTester, + Map vAppStatusToNodeState) { + super(client, successTester); + this.vAppStatusToNodeState = vAppStatusToNodeState; + } + + @Override + public Map start(@Nullable URI VDC, URI templateId, String name, + InstantiateVAppTemplateOptions options, int... portsToOpen) { + checkNotNull(options, "options"); + logger.debug(">> instantiating vApp vDC(%s) template(%s) name(%s) options(%s) ", VDC, templateId, name, options); + + VDC vdc = client.getVDC(VDC); + VAppTemplate template = client.getVAppTemplate(templateId); + + VApp vAppResponse = VCloudExpressClient.class.cast(client).instantiateVAppTemplateInVDC(vdc.getId(), + template.getId(), name, options); + logger.debug("<< instantiated VApp(%s)", vAppResponse.getName()); + + logger.debug(">> deploying vApp(%s)", vAppResponse.getName()); + + Task task = client.deployVApp(vAppResponse.getId()); + if (options.shouldBlockOnDeploy()) { + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("deploy", vAppResponse, task); + } + logger.debug("<< deployed vApp(%s)", vAppResponse.getName()); + + logger.debug(">> powering vApp(%s)", vAppResponse.getName()); + task = client.powerOnVApp(vAppResponse.getId()); + if (!taskTester.apply(task.getLocation())) { + throw new TaskException("powerOn", vAppResponse, task); + } + logger.debug("<< on vApp(%s)", vAppResponse.getName()); + } + return parseAndValidateResponse(template, vAppResponse); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java index 3f0f59ced2..5ebfe793cf 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudDestroyNodeStrategy.java @@ -29,18 +29,18 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.strategy.DestroyNodeStrategy; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.VCloudComputeClient; +import org.jclouds.vcloud.compute.CommonVCloudComputeClient; /** * @author Adrian Cole */ @Singleton public class VCloudDestroyNodeStrategy implements DestroyNodeStrategy { - protected final VCloudComputeClient computeClient; + protected final CommonVCloudComputeClient computeClient; protected final GetNodeMetadataStrategy getNode; @Inject - protected VCloudDestroyNodeStrategy(VCloudComputeClient computeClient, GetNodeMetadataStrategy getNode) { + protected VCloudDestroyNodeStrategy(CommonVCloudComputeClient computeClient, GetNodeMetadataStrategy getNode) { this.computeClient = computeClient; this.getNode = getNode; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java deleted file mode 100644 index 43ebb452a8..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressDestroyNodeStrategy.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute.strategy; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.net.URI; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.strategy.DestroyNodeStrategy; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.vcloud.compute.VCloudExpressComputeClient; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressDestroyNodeStrategy implements DestroyNodeStrategy { - protected final VCloudExpressComputeClient computeClient; - protected final GetNodeMetadataStrategy getNode; - - @Inject - protected VCloudExpressDestroyNodeStrategy(VCloudExpressComputeClient computeClient, GetNodeMetadataStrategy getNode) { - this.computeClient = computeClient; - this.getNode = getNode; - - } - - @Override - public NodeMetadata execute(String id) { - computeClient.stop(URI.create(checkNotNull(id, "node.id"))); - return getNode.execute(id); - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java deleted file mode 100644 index cae361c8a8..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressGetNodeMetadataStrategy.java +++ /dev/null @@ -1,95 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute.strategy; - -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.compute.util.ComputeServiceUtils.parseTagFromName; - -import java.net.URI; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.NodeState; -import org.jclouds.compute.domain.internal.NodeMetadataImpl; -import org.jclouds.compute.domain.os.CIMOperatingSystem; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.domain.Location; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.compute.VCloudExpressComputeClient; -import org.jclouds.vcloud.compute.functions.FindLocationForResource; -import org.jclouds.vcloud.compute.functions.GetExtra; -import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; - -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressGetNodeMetadataStrategy implements GetNodeMetadataStrategy { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - protected final VCloudExpressClient client; - protected final VCloudExpressComputeClient computeClient; - protected final Supplier> images; - protected final FindLocationForResource findLocationForResourceInVDC; - protected final GetExtra getExtra; - protected final Map vAppStatusToNodeState; - - @Inject - protected VCloudExpressGetNodeMetadataStrategy(VCloudExpressClient client, VCloudExpressComputeClient computeClient, - Map vAppStatusToNodeState, GetExtra getExtra, - FindLocationForResource findLocationForResourceInVDC, Supplier> images) { - this.client = checkNotNull(client, "client"); - this.images = checkNotNull(images, "images"); - this.getExtra = checkNotNull(getExtra, "getExtra"); - this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC"); - this.computeClient = checkNotNull(computeClient, "computeClient"); - this.vAppStatusToNodeState = checkNotNull(vAppStatusToNodeState, "vAppStatusToNodeState"); - } - - public NodeMetadata execute(String in) { - URI id = URI.create(in); - VApp from = client.getVApp(id); - if (from == null) - return null; - String tag = parseTagFromName(from.getName()); - Location location = findLocationForResourceInVDC.apply(from.getVDC()); - return new NodeMetadataImpl(in, from.getName(), in, location, from.getId(), ImmutableMap. of(), - tag, null, from.getOsType() != null ? new CIMOperatingSystem(CIMOperatingSystem.OSType.fromValue(from - .getOsType()), null, null, from.getOperatingSystemDescription()) : null, vAppStatusToNodeState - .get(from.getStatus()), computeClient.getPublicAddresses(id), computeClient - .getPrivateAddresses(id), getExtra.apply(from), null); - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java deleted file mode 100644 index 12bb9ae52d..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressListNodesStrategy.java +++ /dev/null @@ -1,141 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute.strategy; - -import static org.jclouds.compute.reference.ComputeServiceConstants.COMPUTE_LOGGER; -import static org.jclouds.compute.reference.ComputeServiceConstants.PROPERTY_BLACKLIST_NODES; - -import java.util.Map; -import java.util.Set; - -import javax.annotation.Resource; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.ComputeMetadata; -import org.jclouds.compute.domain.ComputeType; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.internal.ComputeMetadataImpl; -import org.jclouds.compute.strategy.ListNodesStrategy; -import org.jclouds.domain.Location; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.VCloudExpressMediaType; -import org.jclouds.vcloud.compute.functions.FindLocationForResource; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.endpoints.Org; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Predicate; -import com.google.common.base.Splitter; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Sets; -import com.google.inject.Inject; -import com.google.inject.internal.util.ImmutableSet; - -/** - * @author Adrian Cole - */ -// TODO REFACTOR!!! needs to be parallel -@Singleton -public class VCloudExpressListNodesStrategy implements ListNodesStrategy { - @Resource - @Named(COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - protected final VCloudExpressGetNodeMetadataStrategy getNodeMetadata; - protected final VCloudExpressClient client; - protected final FindLocationForResource findLocationForResourceInVDC; - Set blackListVAppNames = ImmutableSet. of(); - - @Inject(optional = true) - void setBlackList(@Named(PROPERTY_BLACKLIST_NODES) String blackListNodes) { - if (blackListNodes != null && !"".equals(blackListNodes)) - this.blackListVAppNames = ImmutableSet.copyOf(Splitter.on(',').split(blackListNodes)); - } - - private final Supplier> orgNameToEndpoint; - - @Inject - protected VCloudExpressListNodesStrategy(VCloudExpressClient client, - @Org Supplier> orgNameToEndpoint, - VCloudExpressGetNodeMetadataStrategy getNodeMetadata, FindLocationForResource findLocationForResourceInVDC) { - this.client = client; - this.orgNameToEndpoint = orgNameToEndpoint; - this.getNodeMetadata = getNodeMetadata; - this.findLocationForResourceInVDC = findLocationForResourceInVDC; - } - - @Override - public Iterable list() { - Set nodes = Sets.newHashSet(); - for (String org : orgNameToEndpoint.get().keySet()) { - for (NamedResource vdc : client.findOrganizationNamed(org).getVDCs().values()) { - for (NamedResource resource : client.getVDC(vdc.getId()).getResourceEntities().values()) { - if (validVApp(resource)) { - nodes.add(convertVAppToComputeMetadata(vdc, resource)); - } - } - } - } - return nodes; - } - - private boolean validVApp(NamedResource resource) { - return resource.getType().equals(VCloudExpressMediaType.VAPP_XML) - && !blackListVAppNames.contains(resource.getName()); - } - - private ComputeMetadata convertVAppToComputeMetadata(NamedResource vdc, NamedResource resource) { - Location location = findLocationForResourceInVDC.apply(vdc); - return new ComputeMetadataImpl(ComputeType.NODE, resource.getId().toASCIIString(), resource.getName(), resource - .getId().toASCIIString(), location, null, ImmutableMap. of()); - } - - @Override - public Iterable listDetailsOnNodesMatching(Predicate filter) { - Set nodes = Sets.newHashSet(); - for (String org : orgNameToEndpoint.get().keySet()) { - for (NamedResource vdc : client.findOrganizationNamed(org).getVDCs().values()) { - for (NamedResource resource : client.getVDC(vdc.getId()).getResourceEntities().values()) { - if (validVApp(resource) && filter.apply(convertVAppToComputeMetadata(vdc, resource))) { - addVAppToSetRetryingIfNotYetPresent(nodes, vdc, resource); - } - } - } - } - return nodes; - } - - @VisibleForTesting - void addVAppToSetRetryingIfNotYetPresent(Set nodes, NamedResource vdc, NamedResource resource) { - NodeMetadata node = null; - int i = 0; - while (node == null && i++ < 3) { - try { - node = getNodeMetadata.execute(resource.getId().toASCIIString()); - nodes.add(node); - } catch (NullPointerException e) { - logger.warn("vApp %s not yet present in vdc %s", resource.getName(), vdc.getName()); - } - } - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java deleted file mode 100644 index ee09736728..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressRebootNodeStrategy.java +++ /dev/null @@ -1,60 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute.strategy; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.net.URI; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.strategy.GetNodeMetadataStrategy; -import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.Task; - -import com.google.common.base.Predicate; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressRebootNodeStrategy implements RebootNodeStrategy { - private final VCloudExpressClient client; - protected final Predicate taskTester; - protected final GetNodeMetadataStrategy getNode; - - @Inject - protected VCloudExpressRebootNodeStrategy(VCloudExpressClient client, Predicate taskTester, GetNodeMetadataStrategy getNode) { - this.client = client; - this.taskTester = taskTester; - this.getNode = getNode; - } - - @Override - public NodeMetadata execute(String in) { - URI id = URI.create(checkNotNull(in, "node.id")); - Task task = client.resetVApp(id); - taskTester.apply(task.getLocation()); - return getNode.execute(in); - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java index 18b5ee6271..e561d02be5 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java @@ -40,8 +40,8 @@ import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.compute.VCloudComputeClient; +import org.jclouds.vcloud.CommonVCloudClient; +import org.jclouds.vcloud.compute.CommonVCloudComputeClient; import org.jclouds.vcloud.compute.functions.FindLocationForResource; import org.jclouds.vcloud.compute.functions.GetExtra; import org.jclouds.vcloud.domain.VApp; @@ -58,15 +58,15 @@ public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy { @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; - protected final VCloudClient client; - protected final VCloudComputeClient computeClient; + protected final CommonVCloudClient client; + protected final CommonVCloudComputeClient computeClient; protected final Supplier> images; protected final FindLocationForResource findLocationForResourceInVDC; protected final GetExtra getExtra; protected final Map vAppStatusToNodeState; @Inject - VCloudGetNodeMetadataStrategy(VCloudClient client, VCloudComputeClient computeClient, + protected VCloudGetNodeMetadataStrategy(CommonVCloudClient client, CommonVCloudComputeClient computeClient, Map vAppStatusToNodeState, GetExtra getExtra, FindLocationForResource findLocationForResourceInVDC, Supplier> images) { this.client = checkNotNull(client, "client"); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java index 2dae160a9b..e002e09d04 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudListNodesStrategy.java @@ -36,7 +36,7 @@ import org.jclouds.compute.domain.internal.ComputeMetadataImpl; import org.jclouds.compute.strategy.ListNodesStrategy; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.compute.functions.FindLocationForResource; import org.jclouds.vcloud.domain.NamedResource; @@ -61,7 +61,7 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { @Named(COMPUTE_LOGGER) public Logger logger = Logger.NULL; protected final VCloudGetNodeMetadataStrategy getNodeMetadata; - protected final VCloudClient client; + protected final CommonVCloudClient client; protected final FindLocationForResource findLocationForResourceInVDC; Set blackListVAppNames = ImmutableSet. of(); @@ -74,8 +74,9 @@ public class VCloudListNodesStrategy implements ListNodesStrategy { private final Supplier> orgNameToEndpoint; @Inject - protected VCloudListNodesStrategy(VCloudClient client, @Org Supplier> orgNameToEndpoint, - VCloudGetNodeMetadataStrategy getNodeMetadata, FindLocationForResource findLocationForResourceInVDC) { + protected VCloudListNodesStrategy(CommonVCloudClient client, + @Org Supplier> orgNameToEndpoint, VCloudGetNodeMetadataStrategy getNodeMetadata, + FindLocationForResource findLocationForResourceInVDC) { this.client = client; this.orgNameToEndpoint = orgNameToEndpoint; this.getNodeMetadata = getNodeMetadata; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java index f221dfa9f1..1288e09a35 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudRebootNodeStrategy.java @@ -29,7 +29,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.strategy.GetNodeMetadataStrategy; import org.jclouds.compute.strategy.RebootNodeStrategy; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.domain.Task; import com.google.common.base.Predicate; @@ -39,12 +39,13 @@ import com.google.common.base.Predicate; */ @Singleton public class VCloudRebootNodeStrategy implements RebootNodeStrategy { - private final VCloudClient client; + private final CommonVCloudClient client; protected final Predicate taskTester; protected final GetNodeMetadataStrategy getNode; @Inject - protected VCloudRebootNodeStrategy(VCloudClient client, Predicate taskTester, GetNodeMetadataStrategy getNode) { + protected VCloudRebootNodeStrategy(CommonVCloudClient client, Predicate taskTester, + GetNodeMetadataStrategy getNode) { this.client = client; this.taskTester = taskTester; this.getNode = getNode; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java deleted file mode 100644 index 5aca1ab284..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/OrganizationAndVDCToLocationSupplier.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute.suppliers; - -import java.util.Map; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.domain.internal.LocationImpl; -import org.jclouds.vcloud.compute.domain.VCloudLocation; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Org; - -import com.google.common.base.Supplier; -import com.google.common.collect.Sets; - -/** - * @author Adrian Cole - */ -@Singleton -public class OrganizationAndVDCToLocationSupplier implements Supplier> { - private final String providerName; - private final Supplier> orgNameToResource; - private final Supplier> orgNameToVDCResource; - - @Inject - OrganizationAndVDCToLocationSupplier(@org.jclouds.rest.annotations.Provider String providerName, - @Org Supplier> orgNameToResource, - Supplier> orgNameToVDCResource) { - this.providerName = providerName; - this.orgNameToResource = orgNameToResource; - this.orgNameToVDCResource = orgNameToVDCResource; - } - - @Override - public Set get() { - Location provider = new LocationImpl(LocationScope.PROVIDER, providerName, providerName, null); - Set locations = Sets.newLinkedHashSet(); - - for (NamedResource org : orgNameToResource.get().values()) { - Location orgL = new VCloudLocation(org, provider); - for (NamedResource vdc : orgNameToVDCResource.get().get(org.getName()).getVDCs().values()) { - locations.add(new VCloudLocation(vdc, orgL)); - } - } - return locations; - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java deleted file mode 100644 index 5e5d30c030..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudExpressImageSupplier.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * - * Copyright (C) 2010 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.compute.suppliers; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.Iterables.concat; -import static com.google.common.collect.Sets.newLinkedHashSet; -import static org.jclouds.concurrent.FutureIterables.transformParallel; - -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.domain.Image; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.compute.functions.ImagesInOrganization; -import org.jclouds.vcloud.domain.Organization; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressImageSupplier implements Supplier> { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - - private final Supplier> orgMap; - private final ImagesInOrganization imagesInOrganization; - private final ExecutorService executor; - - @Inject - VCloudExpressImageSupplier(Supplier> orgMap, ImagesInOrganization imagesInOrganization, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { - this.orgMap = checkNotNull(orgMap, "orgMap"); - this.imagesInOrganization = checkNotNull(imagesInOrganization, "imagesInOrganization"); - this.executor = checkNotNull(executor, "executor"); - } - - @Override - public Set get() { - Iterable orgs = checkNotNull(orgMap.get().values(), "orgs"); - Iterable> images = transformParallel(orgs, - new Function>>() { - - @Override - public Future> apply(final Organization from) { - checkNotNull(from, "org"); - return executor.submit(new Callable>() { - - @Override - public Iterable call() throws Exception { - return imagesInOrganization.apply(from); - } - - }); - } - - }, executor, null, logger, "images in " + orgs); - return newLinkedHashSet(concat(images)); - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java index 6bceb48741..1fa04b6f1a 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/suppliers/VCloudImageSupplier.java @@ -39,7 +39,6 @@ import org.jclouds.Constants; import org.jclouds.compute.domain.Image; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.compute.functions.ImagesInOrg; import org.jclouds.vcloud.domain.Org; import com.google.common.base.Function; @@ -56,11 +55,12 @@ public class VCloudImageSupplier implements Supplier> { public Logger logger = Logger.NULL; private final Supplier> orgMap; - private final ImagesInOrg imagesInOrg; + private final Function> imagesInOrg; private final ExecutorService executor; @Inject - VCloudImageSupplier(Supplier> orgMap, ImagesInOrg imagesInOrg, + VCloudImageSupplier(Supplier> orgMap, + Function> imagesInOrg, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.orgMap = checkNotNull(orgMap, "orgMap"); this.imagesInOrg = checkNotNull(imagesInOrg, "imagesInOrg"); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java index f371e19efe..25bd236428 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java @@ -19,56 +19,24 @@ package org.jclouds.vcloud.config; -import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Throwables.propagate; -import static com.google.common.collect.Iterables.get; -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_IDENTITY; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; -import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; -import java.net.URI; -import java.util.Map; -import java.util.Map.Entry; import java.util.concurrent.TimeUnit; -import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.domain.Location; import org.jclouds.http.RequiresHttp; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.AsyncClientFactory; -import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VCloudSession; -import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.endpoints.TasksList; -import org.jclouds.vcloud.functions.VCloudExpressAllCatalogItemsInCatalog; -import org.jclouds.vcloud.functions.VCloudExpressAllCatalogsInOrganization; -import org.jclouds.vcloud.functions.VCloudExpressAllVDCsInOrganization; -import org.jclouds.vcloud.functions.VCloudExpressOrganizationsForNames; -import org.jclouds.vcloud.functions.VCloudExpressOrganizatonsForLocations; -import org.jclouds.vcloud.functions.VCloudExpressVAppTemplatesForCatalogItems; -import org.jclouds.vcloud.predicates.VCloudExpressTaskSuccess; -import com.google.common.base.Function; -import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.inject.Injector; import com.google.inject.Provides; -import com.google.inject.TypeLiteral; import domain.VCloudExpressLoginAsyncClient; @@ -86,273 +54,6 @@ public abstract class BaseVCloudExpressRestClientModule>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { - }); - } - - @Provides - @Singleton - protected Organization provideOrganization(VCloudExpressClient discovery) { - if (authException.get() != null) - throw authException.get(); - try { - return discovery.findOrganizationNamed(null); - } catch (AuthorizationException e) { - authException.set(e); - throw e; - } - } - - @Override - protected URI provideDefaultNetwork(VCloudExpressClient client) { - if (authException.get() != null) - throw authException.get(); - try { - org.jclouds.vcloud.domain.VDC vDC = client.findVDCInOrgNamed(null, null); - Map networks = vDC.getAvailableNetworks(); - checkState(networks.size() > 0, "No networks present in vDC: " + vDC.getName()); - return get(networks.values(), 0).getId(); - } catch (AuthorizationException e) { - authException.set(e); - throw e; - } - } - - @Override - protected Predicate successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { - return new RetryablePredicate(injector.getInstance(VCloudExpressTaskSuccess.class), completed); - } - - @Provides - @Singleton - @org.jclouds.vcloud.endpoints.VDC - protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> orgToVDCSupplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; - } - }); - - } - - @Provides - @org.jclouds.vcloud.endpoints.VDC - @Singleton - protected URI provideDefaultVDC(Organization org) { - checkState(org.getVDCs().size() > 0, "No vdcs present in org: " + org.getName()); - return get(org.getVDCs().values(), 0).getId(); - } - - @Provides - @org.jclouds.vcloud.endpoints.Catalog - @Singleton - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { - checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); - return get(org.getCatalogs().values(), 0).getId(); - } - - @Provides - @Singleton - protected Supplier> provideOrgMapCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationMapSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>( - authException, seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - - }); - } - - @Singleton - public static class OrganizationMapSupplier implements Supplier> { - protected final Supplier sessionSupplier; - private final Function, Iterable> organizationsForNames; - - @Inject - protected OrganizationMapSupplier(Supplier sessionSupplier, - Function, Iterable> organizationsForNames) { - this.sessionSupplier = sessionSupplier; - this.organizationsForNames = organizationsForNames; - } - - @Override - public Map get() { - return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); - } - } - - @Singleton - public static class OrganizationCatalogSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final Function> allCatalogsInOrganization; - - @Inject - protected OrganizationCatalogSupplier(Supplier> orgSupplier, - Function> allCatalogsInOrganization) { - this.orgSupplier = orgSupplier; - this.allCatalogsInOrganization = allCatalogsInOrganization; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allCatalogsInOrganization), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Provides - @Singleton - protected Supplier>> provideOrganizationCatalogItemMapSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Provides - @Singleton - protected Supplier>> provideOrganizationVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Singleton - public static class OrganizationVDCSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final Function> allVDCsInOrganization; - - @Inject - protected OrganizationVDCSupplier(Supplier> orgSupplier, - Function> allVDCsInOrganization) { - this.orgSupplier = orgSupplier; - this.allVDCsInOrganization = allVDCsInOrganization; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allVDCsInOrganization), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Singleton - public static class OrganizationCatalogItemSupplier implements - Supplier>>> { - protected final Supplier>> catalogSupplier; - private final Function> allCatalogItemsInCatalog; - - @Inject - protected OrganizationCatalogItemSupplier( - Supplier>> catalogSupplier, - Function> allCatalogItemsInCatalog) { - this.catalogSupplier = catalogSupplier; - this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; - } - - @Override - public Map>> get() { - return transformValues( - catalogSupplier.get(), - new Function, Map>>() { - - @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); - } - }); - - } - }); - } - } - - @Provides - @Singleton - protected Supplier>>> provideOrganizationCatalogItemSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationCatalogItemSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( - authException, seconds, - new Supplier>>>() { - @Override - public Map>> get() { - return supplier.get(); - } - }); - } - @Provides @Singleton protected VCloudExpressLoginAsyncClient provideVCloudLogin(AsyncClientFactory factory) { @@ -380,11 +81,4 @@ public abstract class BaseVCloudExpressRestClientModule 0, "No tasks lists present in org: " + org.getName()); - return get(org.getTasksLists().values(), 0).getId(); - } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java index 6c03660788..b066e969b9 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/BaseVCloudRestClientModule.java @@ -19,56 +19,24 @@ package org.jclouds.vcloud.config; -import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Throwables.propagate; -import static com.google.common.collect.Iterables.get; -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_IDENTITY; import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL; -import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; -import java.net.URI; -import java.util.Map; -import java.util.Map.Entry; import java.util.concurrent.TimeUnit; -import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import org.jclouds.domain.Location; import org.jclouds.http.RequiresHttp; -import org.jclouds.predicates.RetryablePredicate; import org.jclouds.rest.AsyncClientFactory; -import org.jclouds.rest.AuthorizationException; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; import org.jclouds.vcloud.VCloudAsyncClient; import org.jclouds.vcloud.VCloudClient; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Org; -import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VCloudSession; -import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.endpoints.TasksList; -import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog; -import org.jclouds.vcloud.functions.AllCatalogsInOrg; -import org.jclouds.vcloud.functions.AllVDCsInOrg; -import org.jclouds.vcloud.functions.OrgsForLocations; -import org.jclouds.vcloud.functions.OrgsForNames; -import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; -import org.jclouds.vcloud.predicates.TaskSuccess; -import com.google.common.base.Function; -import com.google.common.base.Predicate; import com.google.common.base.Supplier; -import com.google.inject.Injector; import com.google.inject.Provides; -import com.google.inject.TypeLiteral; import domain.VCloudLoginAsyncClient; @@ -86,280 +54,6 @@ public abstract class BaseVCloudRestClientModule>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { - }); - bind(new TypeLiteral, Iterable>>() { - }).to(new TypeLiteral() { - }); - } - - @Override - protected URI provideDefaultNetwork(VCloudClient client) { - if (authException.get() != null) - throw authException.get(); - try { - org.jclouds.vcloud.domain.VDC vDC = client.findVDCInOrgNamed(null, null); - Map networks = vDC.getAvailableNetworks(); - checkState(networks.size() > 0, "No networks present in vDC: " + vDC.getName()); - return get(networks.values(), 0).getId(); - } catch (AuthorizationException e) { - authException.set(e); - throw e; - } - } - - @Provides - @Singleton - protected Org provideOrg(VCloudClient discovery) { - if (authException.get() != null) - throw authException.get(); - try { - return discovery.findOrgNamed(null); - } catch (AuthorizationException e) { - authException.set(e); - throw e; - } - } - - @Override - protected Predicate successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) { - return new RetryablePredicate(injector.getInstance(TaskSuccess.class), completed); - } - - @Provides - @Singleton - @org.jclouds.vcloud.endpoints.VDC - protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final Supplier> orgToVDCSupplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; - } - }); - - } - - @Provides - @org.jclouds.vcloud.endpoints.VDC - @Singleton - protected URI provideDefaultVDC(Org org) { - checkState(org.getVDCs().size() > 0, "No vdcs present in org: " + org.getName()); - return get(org.getVDCs().values(), 0).getId(); - } - - @Provides - @org.jclouds.vcloud.endpoints.Catalog - @Singleton - protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user) { - checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); - return get(org.getCatalogs().values(), 0).getId(); - } - - @Provides - @Singleton - protected Supplier> provideOrgMapCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, - final OrgMapSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, - seconds, new Supplier>() { - @Override - public Map get() { - return supplier.get(); - } - - }); - } - - @Singleton - public static class OrgMapSupplier implements Supplier> { - protected final Supplier sessionSupplier; - private final Function, Iterable> organizationsForNames; - - @Inject - protected OrgMapSupplier(Supplier sessionSupplier, - Function, Iterable> organizationsForNames) { - this.sessionSupplier = sessionSupplier; - this.organizationsForNames = organizationsForNames; - } - - @Override - public Map get() { - return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); - } - } - - @Singleton - public static class OrgCatalogSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final Function> allCatalogsInOrg; - - @Inject - protected OrgCatalogSupplier(Supplier> orgSupplier, - Function> allCatalogsInOrg) { - this.orgSupplier = orgSupplier; - this.allCatalogsInOrg = allCatalogsInOrg; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allCatalogsInOrg), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Provides - @Singleton - protected Supplier>> provideOrgCatalogItemMapSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Provides - @Singleton - protected Supplier>> provideOrgVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( - authException, seconds, - new Supplier>>() { - @Override - public Map> get() { - return supplier.get(); - } - - }); - } - - @Singleton - public static class OrgVDCSupplier implements - Supplier>> { - protected final Supplier> orgSupplier; - private final Function> allVDCsInOrg; - - @Inject - protected OrgVDCSupplier(Supplier> orgSupplier, - Function> allVDCsInOrg) { - this.orgSupplier = orgSupplier; - this.allVDCsInOrg = allVDCsInOrg; - } - - @Override - public Map> get() { - return transformValues( - transformValues(orgSupplier.get(), allVDCsInOrg), - new Function, Map>() { - - @Override - public Map apply( - Iterable from) { - return uniqueIndex(from, name); - } - - }); - } - } - - @Singleton - public static class OrgCatalogItemSupplier implements - Supplier>>> { - protected final Supplier>> catalogSupplier; - private final Function> allCatalogItemsInCatalog; - - @Inject - protected OrgCatalogItemSupplier( - Supplier>> catalogSupplier, - Function> allCatalogItemsInCatalog) { - this.catalogSupplier = catalogSupplier; - this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; - } - - @Override - public Map>> get() { - return transformValues( - catalogSupplier.get(), - new Function, Map>>() { - - @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); - } - }); - - } - }); - } - } - - @Provides - @Singleton - protected Supplier>>> provideOrgCatalogItemSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogItemSupplier supplier) { - return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( - authException, seconds, - new Supplier>>>() { - @Override - public Map>> get() { - return supplier.get(); - } - }); - } - - @Provides - @TasksList - @Singleton - protected URI provideDefaultTasksList(Org org) { - return org.getTasksList().getId(); - } - @Provides @Singleton protected VCloudLoginAsyncClient provideVCloudLogin(AsyncClientFactory factory) { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java index 13b9d79782..8a21ceed18 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/config/CommonVCloudRestClientModule.java @@ -22,8 +22,11 @@ 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.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; @@ -34,6 +37,7 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEO import java.net.URI; import java.util.Map; import java.util.SortedMap; +import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -44,30 +48,48 @@ import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; +import org.jclouds.compute.domain.Image; +import org.jclouds.domain.Location; import org.jclouds.http.HttpErrorHandler; 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; import org.jclouds.rest.ConfiguresRestClient; import org.jclouds.rest.config.RestClientModule; import org.jclouds.rest.suppliers.RetryOnTimeOutButNotOnAuthorizationExceptionSupplier; +import org.jclouds.vcloud.CommonVCloudAsyncClient; +import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.VCloudToken; +import org.jclouds.vcloud.compute.functions.ImagesInOrg; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VCloudSession; -import org.jclouds.vcloud.endpoints.Catalog; +import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.endpoints.Network; -import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.endpoints.TasksList; +import org.jclouds.vcloud.functions.AllCatalogItemsInCatalog; +import org.jclouds.vcloud.functions.AllCatalogsInOrg; +import org.jclouds.vcloud.functions.AllVDCsInOrg; +import org.jclouds.vcloud.functions.OrgsForLocations; +import org.jclouds.vcloud.functions.OrgsForNames; +import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems; import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse; +import org.jclouds.vcloud.predicates.TaskSuccess; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Supplier; import com.google.inject.Injector; import com.google.inject.Provides; +import com.google.inject.TypeLiteral; import domain.VCloudVersionsAsyncClient; @@ -78,7 +100,8 @@ import domain.VCloudVersionsAsyncClient; */ @RequiresHttp @ConfiguresRestClient -public abstract class CommonVCloudRestClientModule extends RestClientModule { +public class CommonVCloudRestClientModule extends + RestClientModule { public CommonVCloudRestClientModule(Class syncClientType, Class asyncClientType) { super(syncClientType, asyncClientType); @@ -88,16 +111,142 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul protected void configure() { requestInjection(this); super.configure(); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral>>() { + }).to(new TypeLiteral() { + }); + bind(new TypeLiteral, Iterable>>() { + }).to(new TypeLiteral() { + }); + } + + @Singleton + @Provides + CommonVCloudAsyncClient provideCommonVCloudAsyncClient(A in){ + return in; + } + + @Singleton + @Provides + CommonVCloudClient provideCommonVCloudClient(S in){ + return in; + } + + @Provides + @Singleton + @org.jclouds.vcloud.endpoints.VDC + protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final Supplier> orgToVDCSupplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(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; + } + }); + + } + + @Provides + @org.jclouds.vcloud.endpoints.VDC + @Singleton + protected URI provideDefaultVDC(Org org) { + checkState(org.getVDCs().size() > 0, "No vdcs present in org: " + org.getName()); + return get(org.getVDCs().values(), 0).getId(); + } + + @Provides + @org.jclouds.vcloud.endpoints.Catalog + @Singleton + protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user) { + checkState(org.getCatalogs().size() > 0, "No catalogs present in org: " + org.getName()); + return get(org.getCatalogs().values(), 0).getId(); + } + + @Provides + @Singleton + protected Supplier> provideOrgMapCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds, + final OrgMapSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>(authException, + seconds, new Supplier>() { + @Override + public Map get() { + return supplier.get(); + } + + }); + } + + @Singleton + public static class OrgMapSupplier implements Supplier> { + protected final Supplier sessionSupplier; + private final Function, Iterable> organizationsForNames; + + @Inject + protected OrgMapSupplier(Supplier sessionSupplier, + Function, Iterable> organizationsForNames) { + this.sessionSupplier = sessionSupplier; + this.organizationsForNames = organizationsForNames; + } + + @Override + public Map get() { + return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name); + } + } + + @Singleton + public static class OrgCatalogSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allCatalogsInOrg; + + @Inject + protected OrgCatalogSupplier(Supplier> orgSupplier, + Function> allCatalogsInOrg) { + this.orgSupplier = orgSupplier; + this.allCatalogsInOrg = allCatalogsInOrg; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allCatalogsInOrg), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } } @Resource protected Logger logger = Logger.NULL; - @Provides - @Singleton - protected abstract Predicate successTester(Injector injector, - @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed); - @VCloudToken @Provides String provideVCloudToken(Supplier cache) { @@ -105,21 +254,21 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul } @Provides - @Org + @org.jclouds.vcloud.endpoints.Org @Singleton - protected URI provideOrg(@Org Iterable orgs) { + protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return getLast(orgs).getId(); } @Provides - @Org + @org.jclouds.vcloud.endpoints.Org @Singleton - protected String provideOrgName(@Org Iterable orgs) { + protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return getLast(orgs).getName(); } @Provides - @Org + @org.jclouds.vcloud.endpoints.Org @Singleton protected Supplier> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgNameToOrgSupplier supplier) { @@ -180,7 +329,7 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul } @Provides - @Org + @org.jclouds.vcloud.endpoints.Org @Singleton protected Iterable provideOrgs(Supplier cache, @Named(PROPERTY_IDENTITY) String user) { VCloudSession discovery = cache.get(); @@ -235,18 +384,13 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul } @Provides - @Catalog + @org.jclouds.vcloud.endpoints.Catalog @Singleton protected String provideCatalogName( Supplier>> catalogs) { return getLast(getLast(catalogs.get().values()).keySet()); } - @Provides - @Network - @Singleton - protected abstract URI provideDefaultNetwork(S client); - @Provides @Named(PROPERTY_VCLOUD_DEFAULT_NETWORK) @Singleton @@ -254,6 +398,162 @@ public abstract class CommonVCloudRestClientModule extends RestClientModul return network.toASCIIString(); } + @Provides + @Network + @Singleton + protected URI provideDefaultNetwork(CommonVCloudClient client) { + if (authException.get() != null) + throw authException.get(); + try { + org.jclouds.vcloud.domain.VDC vDC = client.findVDCInOrgNamed(null, null); + Map networks = vDC.getAvailableNetworks(); + checkState(networks.size() > 0, "No networks present in vDC: " + vDC.getName()); + return get(networks.values(), 0).getId(); + } catch (AuthorizationException e) { + authException.set(e); + throw e; + } + } + + @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; + } + } + + @Provides + @Singleton + protected Predicate successTester(Injector injector, + @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) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Provides + @Singleton + protected Supplier>> provideOrgVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>( + authException, seconds, + new Supplier>>() { + @Override + public Map> get() { + return supplier.get(); + } + + }); + } + + @Singleton + public static class OrgVDCSupplier implements + Supplier>> { + protected final Supplier> orgSupplier; + private final Function> allVDCsInOrg; + + @Inject + protected OrgVDCSupplier(Supplier> orgSupplier, + Function> allVDCsInOrg) { + this.orgSupplier = orgSupplier; + this.allVDCsInOrg = allVDCsInOrg; + } + + @Override + public Map> get() { + return transformValues( + transformValues(orgSupplier.get(), allVDCsInOrg), + new Function, Map>() { + + @Override + public Map apply( + Iterable from) { + return uniqueIndex(from, name); + } + + }); + } + } + + @Singleton + public static class OrgCatalogItemSupplier implements + Supplier>>> { + protected final Supplier>> catalogSupplier; + private final Function> allCatalogItemsInCatalog; + + @Inject + protected OrgCatalogItemSupplier( + Supplier>> catalogSupplier, + Function> allCatalogItemsInCatalog) { + this.catalogSupplier = catalogSupplier; + this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; + } + + @Override + public Map>> get() { + return transformValues( + catalogSupplier.get(), + new Function, Map>>() { + + @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); + } + }); + + } + }); + } + } + + @Provides + @Singleton + protected Supplier>>> provideOrgCatalogItemSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgCatalogItemSupplier supplier) { + return new RetryOnTimeOutButNotOnAuthorizationExceptionSupplier>>>( + authException, seconds, + new Supplier>>>() { + @Override + public Map>> get() { + return supplier.get(); + } + }); + } + + @Provides + @TasksList + @Singleton + protected URI provideDefaultTasksList(Org org) { + return org.getTasksList().getId(); + } + @Override protected void bindErrorHandlers() { bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseVCloudErrorFromHttpResponse.class); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/AllocationModel.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/AllocationModel.java new file mode 100644 index 0000000000..ac4452e1fd --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/AllocationModel.java @@ -0,0 +1,69 @@ +/** + * + * Copyright (C) 2010 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.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * The AllocationModel element defines how resources are allocated in a vDC. + */ +public enum AllocationModel { + /** + * Resources are committed to a vDC only when vApps are created in it + */ + ALLOCATION_VAPP, + /** + * Only a percentage of the resources you allocate are committed to the organization vDC. + */ + ALLOCATION_POOL, + /** + * All the resources you allocate are committed as a pool to the organization vDC. vApps in vDCs + * that support this allocation model can specify values for resource and limit. + */ + RESERVATION_POOL, + /** + * The VCloud API returned a model unsupported in the version 1.0 spec. + */ + UNRECOGNIZED_MODEL; + + public String value() { + switch (this) { + case ALLOCATION_VAPP: + return "AllocationVApp"; + case ALLOCATION_POOL: + return "AllocationPool"; + case RESERVATION_POOL: + return "ReservationPool"; + default: + return "UnrecognizedModel"; + } + } + + @Override + public String toString() { + return value(); + } + + public static AllocationModel fromValue(String model) { + return valueOf(CaseFormat.UPPER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(model, "model"))); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Capacity.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Capacity.java index f33e9b46e0..8ed05b188d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Capacity.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Capacity.java @@ -19,39 +19,60 @@ package org.jclouds.vcloud.domain; - /** + * reports storage resource consumption in a vDC. + * * @author Adrian Cole */ public class Capacity { private final String units; - private final int allocated; + private final long allocated; + private final long limit; private final int used; + private final long overhead; - public Capacity(String units, int allocated, int used) { + public Capacity(String units, long allocated, long limit, int used, long overhead) { this.units = units; + this.limit = limit; this.allocated = allocated; this.used = used; + this.overhead = overhead; } public String getUnits() { return units; } - public int getAllocated() { + public long getAllocated() { return allocated; } + public long getLimit() { + return limit; + } + + /** + * percentage of the allocation in use. + */ public int getUsed() { return used; } + /** + * number of Units allocated to vShield Manager virtual machines provisioned from this vDC. + */ + public long getOverhead() { + return overhead; + } + @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + allocated; + result = prime * result + (int) (allocated ^ (allocated >>> 32)); + result = prime * result + (int) (limit ^ (limit >>> 32)); + result = prime * result + (int) (overhead ^ (overhead >>> 32)); result = prime * result + ((units == null) ? 0 : units.hashCode()); result = prime * result + used; return result; @@ -68,6 +89,10 @@ public class Capacity { Capacity other = (Capacity) obj; if (allocated != other.allocated) return false; + if (limit != other.limit) + return false; + if (overhead != other.overhead) + return false; if (units == null) { if (other.units != null) return false; @@ -77,4 +102,10 @@ public class Capacity { return false; return true; } + + @Override + public String toString() { + return "[allocated=" + allocated + ", limit=" + limit + ", overhead=" + overhead + ", units=" + units + ", used=" + + used + "]"; + } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java index 44d1810151..2d7bf6885b 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java @@ -21,36 +21,53 @@ package org.jclouds.vcloud.domain; import java.util.Map; +import javax.annotation.Nullable; + import org.jclouds.vcloud.domain.internal.OrgImpl; import com.google.inject.ImplementedBy; /** - * A vCloud organization is a high-level abstraction that provides a unit of - * administration for objects and resources. As viewed by a user, an - * organization (represented by an Org element) can contain Catalog, Network, - * and vDC elements. If there are any queued, running, or recently completed - * tasks owned by a member of the organization, it also contains a TasksList - * element. As viewed by an administrator, an organization also contains users, - * groups, and other information + * A vCloud organization is a high-level abstraction that provides a unit of administration for + * objects and resources. As viewed by a user, an organization (represented by an Org element) can + * contain Catalog, Network, and vDC elements. If there are any queued, running, or recently + * completed tasks owned by a member of the organization, it also contains a TasksList element. As + * viewed by an administrator, an organization also contains users, groups, and other information * * @author Adrian Cole */ @ImplementedBy(OrgImpl.class) public interface Org extends NamedResource { - + /** + * optional description + * + * @since vcloud api 0.8 + */ + @Nullable String getDescription(); + /** + * @since vcloud api 0.8 + */ Map getCatalogs(); + /** + * @since vcloud api 0.8 + */ Map getVDCs(); /** - * If there are any queued, running, or recently completed tasks owned by a - * member of the organization, it also contains a TasksList. + * If there are any queued, running, or recently completed tasks owned by a member of the + * organization, it also contains a TasksList. + * + * @since vcloud api 0.8 */ + @Nullable NamedResource getTasksList(); + /** + * @since vcloud api 1.0 + */ Map getNetworks(); } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Quota.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Quota.java deleted file mode 100644 index fb1acf1097..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Quota.java +++ /dev/null @@ -1,67 +0,0 @@ -/** - * - * Copyright (C) 2010 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.domain; - -/** - * @author Adrian Cole - */ -public class Quota { - - private final int limit; - private final int used; - - public Quota(int limit, int used) { - this.limit = limit; - this.used = used; - } - - public int getLimit() { - return limit; - } - - public int getUsed() { - return used; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + limit; - result = prime * result + used; - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Quota other = (Quota) obj; - if (limit != other.limit) - return false; - if (used != other.used) - return false; - return true; - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VDC.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VDC.java index 291752bbe8..4eadfeec0e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VDC.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VDC.java @@ -19,33 +19,132 @@ package org.jclouds.vcloud.domain; +import java.util.List; import java.util.Map; +import javax.annotation.Nullable; + import org.jclouds.vcloud.domain.internal.VDCImpl; import com.google.inject.ImplementedBy; /** + * A vDC is a deployment environment for vApps. A Vdc element provides a user view of a vDC. + * * @author Adrian Cole */ @org.jclouds.vcloud.endpoints.VDC @ImplementedBy(VDCImpl.class) public interface VDC extends NamedResource { + /** + * Reference to the org containing this vDC. + * + * @since vcloud api 1.0 + * @return org, or null if this is a version before 1.0 where the org isn't present + */ + NamedResource getOrg(); + /** + * The creation status of the vDC + * + * @since vcloud api 1.0 + */ + VDCStatus getStatus(); + + /** + * optional description + * + * @since vcloud api 0.8 + */ + @Nullable String getDescription(); + /** + * read‐only container for Task elements. Each element in the container represents a queued, + * running, or failed task owned by this object. + * + * @since vcloud api 1.0 + */ + List getTasks(); + + /** + * defines how resources are allocated by the vDC. The value of this element is set by the + * administrator who created the vDC. It is read‐only to users. + * + * @since vcloud api 1.0 + */ + AllocationModel getAllocationModel(); + + /** + * defines the storage capacity available in the vDC + * + * @since vcloud api 0.8 + * @return null if the provider doesn't support storage capacity + */ + @Nullable Capacity getStorageCapacity(); + /** + * reports CPU resource consumption in a vDC + * + * @since vcloud api 0.8 + * @return null if the provider doesn't support cpu capacity + */ + @Nullable Capacity getCpuCapacity(); + /** + * reports memory resource consumption in a vDC + * + * @since vcloud api 0.8 + * @return null if the provider doesn't support memory capacity + */ + @Nullable Capacity getMemoryCapacity(); - Quota getInstantiatedVmsQuota(); - - Quota getDeployedVmsQuota(); - - Map getAvailableNetworks(); - + /** + * container for ResourceEntity elements + * + * @since vcloud api 0.8 + */ Map getResourceEntities(); + /** + * container for OrgNetwork elements that represent organization networks contained by the vDC + * + * @since vcloud api 0.8 + */ + Map getAvailableNetworks(); + + /** + * maximum number of virtual NICs allowed in this vDC. Defaults to 0, which specifies an + * unlimited number. + * + * @since vcloud api 1.0 + */ + int getNicQuota(); + + /** + * maximum number of OrgNetwork objects that can be deployed in this vDC. Defaults to 0, which + * specifies an unlimited number. + * + * @since vcloud api 1.0 + */ + int getNetworkQuota(); + + /** + * maximum number of virtual machines that can be deployed in this vDC. Defaults to 0, which + * specifies an unlimited number. + * + * @since vcloud api 0.8 + */ + int getVmQuota(); + + /** + * true if this vDC is enabled + * + * @since vcloud api 1.0 + */ + boolean isEnabled(); + } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Organization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VDCStatus.java similarity index 51% rename from vcloud/core/src/main/java/org/jclouds/vcloud/domain/Organization.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/domain/VDCStatus.java index b848a7861f..9348c45a4d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Organization.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VDCStatus.java @@ -19,22 +19,42 @@ package org.jclouds.vcloud.domain; -import java.util.Map; - -import org.jclouds.vcloud.domain.internal.OrganizationImpl; - -import com.google.inject.ImplementedBy; - /** - * @author Adrian Cole + * The creation status of the vDC + * + * @see VDC#getStatus */ -@ImplementedBy(OrganizationImpl.class) -public interface Organization extends NamedResource { +public enum VDCStatus { - Map getCatalogs(); + CREATION_FAILED, NOT_READY, READY, UNKNOWN, UNRECOGNIZED_STATUS; - Map getVDCs(); - - Map getTasksLists(); + public int value() { + switch (this) { + case CREATION_FAILED: + return -1; + case NOT_READY: + return 0; + case READY: + return 1; + case UNKNOWN: + return 2; + default: + return 3; + } + } + public static VDCStatus fromValue(int status) { + switch (status) { + case -1: + return CREATION_FAILED; + case 0: + return NOT_READY; + case 1: + return READY; + case 2: + return UNKNOWN; + default: + return UNRECOGNIZED_STATUS; + } + } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java index 8e44403b8c..0612385387 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java @@ -24,7 +24,6 @@ import java.util.Map; import javax.annotation.Nullable; -import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; @@ -34,19 +33,17 @@ import org.jclouds.vcloud.domain.Org; * @author Adrian Cole * */ -public class OrgImpl implements Org { - private final String name; - private final URI id; +public class OrgImpl extends NamedResourceImpl implements Org { + private final String description; private final Map catalogs; private final Map vdcs; private final Map networks; private final NamedResource tasksList; - public OrgImpl(String name, URI id, String description, Map catalogs, - Map vdcs, Map networks, @Nullable NamedResource tasksList) { - this.name = name; - this.id = id; + public OrgImpl(String name, String type, URI id, String description, Map catalogs, + Map vdcs, Map networks, @Nullable NamedResource tasksList) { + super(name, type, id); this.description = description; this.catalogs = catalogs; this.vdcs = vdcs; @@ -54,16 +51,6 @@ public class OrgImpl implements Org { this.tasksList = tasksList; } - @Override - public String getName() { - return name; - } - - @Override - public URI getId() { - return id; - } - @Override public Map getCatalogs() { return catalogs; @@ -82,11 +69,9 @@ public class OrgImpl implements Org { @Override public int hashCode() { final int prime = 31; - int result = 1; + int result = super.hashCode(); result = prime * result + ((catalogs == null) ? 0 : catalogs.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode()); - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + ((networks == null) ? 0 : networks.hashCode()); result = prime * result + ((tasksList == null) ? 0 : tasksList.hashCode()); result = prime * result + ((vdcs == null) ? 0 : vdcs.hashCode()); @@ -97,7 +82,7 @@ public class OrgImpl implements Org { public boolean equals(Object obj) { if (this == obj) return true; - if (obj == null) + if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; @@ -112,16 +97,6 @@ public class OrgImpl implements Org { return false; } else if (!description.equals(other.description)) return false; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; if (networks == null) { if (other.networks != null) return false; @@ -140,11 +115,6 @@ public class OrgImpl implements Org { return true; } - @Override - public String getType() { - return VCloudMediaType.ORG_XML; - } - @Override public int compareTo(NamedResource o) { return (this == o) ? 0 : getId().compareTo(o.getId()); @@ -152,7 +122,7 @@ public class OrgImpl implements Org { @Override public String toString() { - return "[id=" + id + ", name=" + name + ", type=" + getType() + "]"; + return "[id=" + getId() + ", name=" + getName() + ", type=" + getType() + "]"; } @Override diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java deleted file mode 100644 index 77ae7ee730..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrganizationImpl.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * - * Copyright (C) 2010 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.domain.internal; - -import java.net.URI; -import java.util.Map; - -import org.jclouds.vcloud.VCloudExpressMediaType; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; - -/** - * Locations of resources in vCloud - * - * @author Adrian Cole - * - */ -public class OrganizationImpl implements Organization { - private final String name; - private final URI id; - private final Map catalogs; - private final Map vdcs; - private final Map tasksLists; - - public OrganizationImpl(String name, URI id, Map catalogs, Map vdcs, - Map tasksLists) { - this.name = name; - this.id = id; - this.catalogs = catalogs; - this.vdcs = vdcs; - this.tasksLists = tasksLists; - } - - @Override - public String getName() { - return name; - } - - @Override - public URI getId() { - return id; - } - - @Override - public Map getCatalogs() { - return catalogs; - } - - @Override - public Map getVDCs() { - return vdcs; - } - - @Override - public Map getTasksLists() { - return tasksLists; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((catalogs == null) ? 0 : catalogs.hashCode()); - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((tasksLists == null) ? 0 : tasksLists.hashCode()); - result = prime * result + ((vdcs == null) ? 0 : vdcs.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - OrganizationImpl other = (OrganizationImpl) obj; - if (catalogs == null) { - if (other.catalogs != null) - return false; - } else if (!catalogs.equals(other.catalogs)) - return false; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - if (tasksLists == null) { - if (other.tasksLists != null) - return false; - } else if (!tasksLists.equals(other.tasksLists)) - return false; - if (vdcs == null) { - if (other.vdcs != null) - return false; - } else if (!vdcs.equals(other.vdcs)) - return false; - return true; - } - - @Override - public String getType() { - return VCloudExpressMediaType.ORG_XML; - } - - @Override - public int compareTo(NamedResource o) { - return (this == o) ? 0 : getId().compareTo(o.getId()); - } - - @Override - public String toString() { - return "[id=" + id + ", name=" + name + ", type=" + getType() + "]"; - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java index 8da53d08de..acfb6c2d79 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VDCImpl.java @@ -22,13 +22,21 @@ package org.jclouds.vcloud.domain.internal; import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; +import java.util.List; import java.util.Map; -import org.jclouds.vcloud.VCloudExpressMediaType; +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.AllocationModel; import org.jclouds.vcloud.domain.Capacity; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Quota; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.domain.VDCStatus; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; /** * Locations of resources in vCloud @@ -36,71 +44,176 @@ import org.jclouds.vcloud.domain.VDC; * @author Adrian Cole * */ -public class VDCImpl implements VDC { +public class VDCImpl extends NamedResourceImpl implements VDC { - private final String name; - private final URI id; + private final VDCStatus status; + private final NamedResource org; + @Nullable private final String description; + private final List tasks = Lists.newArrayList(); + private final AllocationModel allocationModel; private final Capacity storageCapacity; private final Capacity cpuCapacity; private final Capacity memoryCapacity; - private final Quota instantiatedVmsQuota; - private final Quota deployedVmsQuota; - private final Map availableNetworks; - private final Map resourceEntities; + private final Map resourceEntities = Maps.newLinkedHashMap(); + private final Map availableNetworks = Maps.newLinkedHashMap(); + private final int nicQuota; + private final int networkQuota; + private final int vmQuota; + private final boolean isEnabled; - public VDCImpl(String name, URI id, String description, Capacity storageCapacity, Capacity cpuCapacity, - Capacity memoryCapacity, Quota instantiatedVmsQuota, Quota deployedVmsQuota, - Map resourceEntities, Map availableNetworks) { - this.name = checkNotNull(name, "name"); - this.id = checkNotNull(id, "id"); + public VDCImpl(String name, String type, URI id, VDCStatus status, NamedResource org, @Nullable String description, + Iterable tasks, AllocationModel allocationModel, @Nullable Capacity storageCapacity, + @Nullable Capacity cpuCapacity, @Nullable Capacity memoryCapacity, + Map resourceEntities, Map availableNetworks, int nicQuota, + int networkQuota, int vmQuota, boolean isEnabled) { + super(name, type, id); + this.status = checkNotNull(status, "status"); + this.org = org;// TODO: once <1.0 is killed check not null this.description = description; - this.storageCapacity = storageCapacity; - this.cpuCapacity = cpuCapacity; - this.memoryCapacity = memoryCapacity; - this.instantiatedVmsQuota = instantiatedVmsQuota; - this.deployedVmsQuota = deployedVmsQuota; - this.availableNetworks = checkNotNull(availableNetworks, "availableNetworks"); - this.resourceEntities = checkNotNull(resourceEntities, "resourceEntities"); + Iterables.addAll(this.tasks, checkNotNull(tasks, "tasks")); + this.allocationModel = checkNotNull(allocationModel, "allocationModel"); + this.storageCapacity = storageCapacity;// TODO: once <1.0 is killed check not null + this.cpuCapacity = cpuCapacity;// TODO: once <1.0 is killed check not null + this.memoryCapacity = memoryCapacity;// TODO: once <1.0 is killed check not null + this.resourceEntities.putAll(checkNotNull(resourceEntities, "resourceEntities")); + this.availableNetworks.putAll(checkNotNull(availableNetworks, "availableNetworks")); + this.nicQuota = nicQuota; + this.networkQuota = networkQuota; + this.vmQuota = vmQuota; + this.isEnabled = isEnabled; } - /** The serialVersionUID */ - private static final long serialVersionUID = 8464716396538298809L; - + /** + * {@inheritDoc} + */ @Override - public String getName() { - return name; + public VDCStatus getStatus() { + return status; } + /** + * {@inheritDoc} + */ @Override - public URI getId() { - return id; + public NamedResource getOrg() { + return org; } + /** + * {@inheritDoc} + */ @Override - public Map getAvailableNetworks() { - return availableNetworks; + public String getDescription() { + return description; } + /** + * {@inheritDoc} + */ + @Override + public List getTasks() { + return tasks; + } + + /** + * {@inheritDoc} + */ + @Override + public AllocationModel getAllocationModel() { + return allocationModel; + } + + /** + * {@inheritDoc} + */ + @Override + public Capacity getStorageCapacity() { + return storageCapacity; + } + + /** + * {@inheritDoc} + */ + @Override + public Capacity getCpuCapacity() { + return cpuCapacity; + } + + /** + * {@inheritDoc} + */ + @Override + public Capacity getMemoryCapacity() { + return memoryCapacity; + } + + /** + * {@inheritDoc} + */ @Override public Map getResourceEntities() { return resourceEntities; } + /** + * {@inheritDoc} + */ + @Override + public Map getAvailableNetworks() { + return availableNetworks; + } + + /** + * {@inheritDoc} + */ + @Override + public int getNicQuota() { + return nicQuota; + } + + /** + * {@inheritDoc} + */ + @Override + public int getNetworkQuota() { + return networkQuota; + } + + /** + * {@inheritDoc} + */ + @Override + public int getVmQuota() { + return vmQuota; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isEnabled() { + return isEnabled; + } + @Override public int hashCode() { final int prime = 31; - int result = 1; + int result = super.hashCode(); + result = prime * result + ((allocationModel == null) ? 0 : allocationModel.hashCode()); result = prime * result + ((availableNetworks == null) ? 0 : availableNetworks.hashCode()); result = prime * result + ((cpuCapacity == null) ? 0 : cpuCapacity.hashCode()); - result = prime * result + ((deployedVmsQuota == null) ? 0 : deployedVmsQuota.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode()); - result = prime * result + ((instantiatedVmsQuota == null) ? 0 : instantiatedVmsQuota.hashCode()); - result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + (isEnabled ? 1231 : 1237); result = prime * result + ((memoryCapacity == null) ? 0 : memoryCapacity.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + networkQuota; + result = prime * result + nicQuota; + result = prime * result + ((org == null) ? 0 : org.hashCode()); result = prime * result + ((resourceEntities == null) ? 0 : resourceEntities.hashCode()); + result = prime * result + ((status == null) ? 0 : status.hashCode()); result = prime * result + ((storageCapacity == null) ? 0 : storageCapacity.hashCode()); + result = prime * result + ((tasks == null) ? 0 : tasks.hashCode()); + result = prime * result + vmQuota; return result; } @@ -108,11 +221,16 @@ public class VDCImpl implements VDC { public boolean equals(Object obj) { if (this == obj) return true; - if (obj == null) + if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; VDCImpl other = (VDCImpl) obj; + if (allocationModel == null) { + if (other.allocationModel != null) + return false; + } else if (!allocationModel.equals(other.allocationModel)) + return false; if (availableNetworks == null) { if (other.availableNetworks != null) return false; @@ -123,91 +241,56 @@ public class VDCImpl implements VDC { return false; } else if (!cpuCapacity.equals(other.cpuCapacity)) return false; - if (deployedVmsQuota == null) { - if (other.deployedVmsQuota != null) - return false; - } else if (!deployedVmsQuota.equals(other.deployedVmsQuota)) - return false; if (description == null) { if (other.description != null) return false; } else if (!description.equals(other.description)) return false; - if (instantiatedVmsQuota == null) { - if (other.instantiatedVmsQuota != null) - return false; - } else if (!instantiatedVmsQuota.equals(other.instantiatedVmsQuota)) - return false; - if (id == null) { - if (other.id != null) - return false; - } else if (!id.equals(other.id)) + if (isEnabled != other.isEnabled) return false; if (memoryCapacity == null) { if (other.memoryCapacity != null) return false; } else if (!memoryCapacity.equals(other.memoryCapacity)) return false; - if (name == null) { - if (other.name != null) + if (networkQuota != other.networkQuota) + return false; + if (nicQuota != other.nicQuota) + return false; + if (org == null) { + if (other.org != null) return false; - } else if (!name.equals(other.name)) + } else if (!org.equals(other.org)) return false; if (resourceEntities == null) { if (other.resourceEntities != null) return false; } else if (!resourceEntities.equals(other.resourceEntities)) return false; + if (status == null) { + if (other.status != null) + return false; + } else if (!status.equals(other.status)) + return false; if (storageCapacity == null) { if (other.storageCapacity != null) return false; } else if (!storageCapacity.equals(other.storageCapacity)) return false; + if (tasks == null) { + if (other.tasks != null) + return false; + } else if (!tasks.equals(other.tasks)) + return false; + if (vmQuota != other.vmQuota) + return false; return true; } - @Override - public String getDescription() { - return description; - } - - @Override - public Capacity getStorageCapacity() { - return storageCapacity; - } - - @Override - public Capacity getCpuCapacity() { - return cpuCapacity; - } - - @Override - public Capacity getMemoryCapacity() { - return memoryCapacity; - } - - @Override - public Quota getInstantiatedVmsQuota() { - return instantiatedVmsQuota; - } - - @Override - public Quota getDeployedVmsQuota() { - return deployedVmsQuota; - } - - @Override - public String getType() { - return VCloudExpressMediaType.VDC_XML; - } - - @Override - public int compareTo(NamedResource o) { - return (this == o) ? 0 : getId().compareTo(o.getId()); - } - @Override public String toString() { - return "[id=" + id + ", name=" + name + ", description=" + description + "]"; + return "[id=" + getId() + ", name=" + getName() + ", org=" + org + ", description=" + description + ", status=" + + status + ", isEnabled=" + isEnabled + "]"; } + } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java index 3e269f5594..b9493a856b 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogItemsInCatalog.java @@ -33,7 +33,7 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.CommonVCloudAsyncClient; import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; @@ -51,11 +51,11 @@ public class AllCatalogItemsInCatalog implements Function - * - * ==================================================================== - * 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.functions; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Organization; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; - -/** - * @author Adrian Cole - */ -@Singleton -public class AllCatalogItemsInOrganization implements Function> { - - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - - private final Function> allCatalogsInOrganization; - - private final Function> allCatalogItemsInCatalog; - - @Inject - AllCatalogItemsInOrganization(Function> allCatalogsInOrganization, - Function> allCatalogItemsInCatalog) { - this.allCatalogsInOrganization = allCatalogsInOrganization; - this.allCatalogItemsInCatalog = allCatalogItemsInCatalog; - } - - @Override - public Iterable apply(Organization from) { - return Iterables.concat(Iterables.transform(allCatalogsInOrganization.apply(from), - new Function>() { - @Override - public Iterable apply(Catalog from) { - return allCatalogItemsInCatalog.apply(from); - } - - })); - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java index 730e602141..d4580cca2a 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllCatalogsInOrg.java @@ -32,7 +32,7 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.CommonVCloudAsyncClient; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; @@ -48,11 +48,11 @@ public class AllCatalogsInOrg implements Function - * - * ==================================================================== - * 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.functions; - -import static org.jclouds.concurrent.FutureIterables.transformParallel; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; - -import com.google.common.base.Function; - -/** - * @author Adrian Cole - */ -@Singleton -public class AllCatalogsInOrganization implements Function> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - - private final VCloudAsyncClient aclient; - private final ExecutorService executor; - - @Inject - AllCatalogsInOrganization(VCloudAsyncClient aclient, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { - this.aclient = aclient; - this.executor = executor; - } - - @Override - public Iterable apply(final Organization org) { - Iterable catalogs = transformParallel(org.getCatalogs().values(), - new Function>() { - @SuppressWarnings("unchecked") - @Override - public Future apply(NamedResource from) { - return (Future) aclient.getCatalog(from.getId()); - } - - }, executor, null, logger, "catalogs in " + org.getName()); - return catalogs; - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java index d2e638d3f6..a10a4a0ff9 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrg.java @@ -32,7 +32,7 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.CommonVCloudAsyncClient; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VDC; @@ -48,11 +48,11 @@ public class AllVDCsInOrg implements Function> { @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; - private final VCloudAsyncClient aclient; + private final CommonVCloudAsyncClient aclient; private final ExecutorService executor; @Inject - AllVDCsInOrg(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + AllVDCsInOrg(CommonVCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.aclient = aclient; this.executor = executor; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java deleted file mode 100644 index bc61a34be3..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/AllVDCsInOrganization.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -import static org.jclouds.concurrent.FutureIterables.transformParallel; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.VDC; - -import com.google.common.base.Function; - -/** - * @author Adrian Cole - */ -@Singleton -public class AllVDCsInOrganization implements Function> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - - private final VCloudAsyncClient aclient; - private final ExecutorService executor; - - @Inject - AllVDCsInOrganization(VCloudAsyncClient aclient, - @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { - this.aclient = aclient; - this.executor = executor; - } - - @Override - public Iterable apply(final Organization org) { - - Iterable catalogItems = transformParallel(org.getVDCs().values(), - new Function>() { - @SuppressWarnings("unchecked") - @Override - public Future apply(NamedResource from) { - return (Future) aclient.getVDC(from.getId()); - } - - }, executor, null, logger, "vdcs in org " + org.getName()); - return catalogItems; - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java deleted file mode 100644 index d8417e55e8..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndCatalogNameToEndpoint.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -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.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Catalog; -import org.jclouds.vcloud.endpoints.Org; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; - -/** - * - * @author Adrian Cole - */ -@Singleton -public class OrganizationNameAndCatalogNameToEndpoint implements Function { - private final Supplier> orgMap; - private final String defaultOrg; - private final URI defaultUri; - - @Inject - public OrganizationNameAndCatalogNameToEndpoint(Supplier> orgMap, @Org String defaultOrg, - @Catalog URI defaultUri) { - this.orgMap = orgMap; - this.defaultOrg = defaultOrg; - this.defaultUri = defaultUri; - } - - @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgCatalog = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgCatalog, 0); - Object catalog = Iterables.get(orgCatalog, 1); - if (org == null && catalog == null) - return defaultUri; - else if (org == null) - org = defaultOrg; - - try { - Map catalogs = checkNotNull(orgMap.get().get(org)).getCatalogs(); - return catalog == null ? Iterables.getLast(catalogs.values()).getId() : catalogs.get(catalog).getId(); - } catch (NullPointerException e) { - throw new NoSuchElementException(org + "/" + catalog + " not found in " + orgMap.get()); - } - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndTasksListNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndTasksListNameToEndpoint.java deleted file mode 100644 index 851351035c..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndTasksListNameToEndpoint.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -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.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.endpoints.TasksList; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; - -/** - * - * @author Adrian Cole - */ -@Singleton -public class OrganizationNameAndTasksListNameToEndpoint implements Function { - private final Supplier> orgMap; - private final String defaultOrg; - private final URI defaultUri; - - @Inject - public OrganizationNameAndTasksListNameToEndpoint(Supplier> orgMap, - @Org String defaultOrg, @TasksList URI defaultUri) { - this.orgMap = orgMap; - this.defaultOrg = defaultOrg; - this.defaultUri = defaultUri; - } - - @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgTasksList = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgTasksList, 0); - Object tasksList = Iterables.get(orgTasksList, 1); - if (org == null && tasksList == null) - return defaultUri; - else if (org == null) - org = defaultOrg; - - try { - Map tasksLists = checkNotNull(orgMap.get().get(org)).getTasksLists(); - return tasksList == null ? Iterables.getLast(tasksLists.values()).getId() : tasksLists.get(tasksList).getId(); - } catch (NullPointerException e) { - throw new NoSuchElementException(org + "/" + tasksList + " not found in " + orgMap.get()); - } - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java deleted file mode 100644 index d3b3091516..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrganizationNameAndVDCNameToEndpoint.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -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.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.endpoints.VDC; - -import com.google.common.base.Function; -import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; - -/** - * - * @author Adrian Cole - */ -@Singleton -public class OrganizationNameAndVDCNameToEndpoint implements Function { - private final Supplier> orgNameToVDCEndpoint; - private final String defaultOrg; - private final URI defaultUri; - - @Inject - public OrganizationNameAndVDCNameToEndpoint(Supplier> orgNameToVDCEndpoint, - @Org String defaultOrg, @VDC URI defaultUri) { - this.orgNameToVDCEndpoint = orgNameToVDCEndpoint; - this.defaultOrg = defaultOrg; - this.defaultUri = defaultUri; - } - - @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgVdc = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgVdc, 0); - Object vdc = Iterables.get(orgVdc, 1); - if (org == null && vdc == null) - return defaultUri; - else if (org == null) - org = defaultOrg; - - try { - Map vdcs = checkNotNull(orgNameToVDCEndpoint.get().get(org)).getVDCs(); - return vdc == null ? Iterables.getLast(vdcs.values()).getId() : vdcs.get(vdc).getId(); - } catch (NullPointerException e) { - throw new NoSuchElementException(org + "/" + vdc + " not found in " + orgNameToVDCEndpoint.get()); - } - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java index 7b75ecf959..00972c4a4e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForLocations.java @@ -37,7 +37,7 @@ import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.CommonVCloudAsyncClient; import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.domain.Org; @@ -53,11 +53,11 @@ public class OrgsForLocations implements Function, @Resource @Named(ComputeServiceConstants.COMPUTE_LOGGER) public Logger logger = Logger.NULL; - private final VCloudAsyncClient aclient; + private final CommonVCloudAsyncClient aclient; private final ExecutorService executor; @Inject - OrgsForLocations(VCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { + OrgsForLocations(CommonVCloudAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { this.aclient = aclient; this.executor = executor; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForNames.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForNames.java index 9defba4044..cb86e576e5 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForNames.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/OrgsForNames.java @@ -32,7 +32,7 @@ import javax.inject.Singleton; import org.jclouds.Constants; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudAsyncClient; +import org.jclouds.vcloud.CommonVCloudAsyncClient; import org.jclouds.vcloud.domain.Org; import com.google.common.base.Function; @@ -45,11 +45,11 @@ public class OrgsForNames implements Function, Iterable - * - * ==================================================================== - * 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.functions; - -import static org.jclouds.concurrent.FutureIterables.transformParallel; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressAsyncClient; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; - -import com.google.common.base.Function; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressAllCatalogsInOrganization implements Function> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - - private final VCloudExpressAsyncClient aclient; - private final ExecutorService executor; - - @Inject - VCloudExpressAllCatalogsInOrganization(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { - this.aclient = aclient; - this.executor = executor; - } - - @Override - public Iterable apply(final Organization org) { - Iterable catalogs = transformParallel(org.getCatalogs().values(), - new Function>() { - @SuppressWarnings("unchecked") - @Override - public Future apply(NamedResource from) { - return (Future) aclient.getCatalog(from.getId()); - } - - }, executor, null, logger, "catalogs in " + org.getName()); - return catalogs; - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java deleted file mode 100644 index 1bada11e0d..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressAllVDCsInOrganization.java +++ /dev/null @@ -1,75 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -import static org.jclouds.concurrent.FutureIterables.transformParallel; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressAsyncClient; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.VDC; - -import com.google.common.base.Function; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressAllVDCsInOrganization implements Function> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - - private final VCloudExpressAsyncClient aclient; - private final ExecutorService executor; - - @Inject - VCloudExpressAllVDCsInOrganization(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { - this.aclient = aclient; - this.executor = executor; - } - - @Override - public Iterable apply(final Organization org) { - - Iterable catalogItems = transformParallel(org.getVDCs().values(), - new Function>() { - @SuppressWarnings("unchecked") - @Override - public Future apply(NamedResource from) { - return (Future) aclient.getVDC(from.getId()); - } - - }, executor, null, logger, "vdcs in org " + org.getName()); - return catalogItems; - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java deleted file mode 100644 index 4b4d1a14ae..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizationsForNames.java +++ /dev/null @@ -1,70 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -import static org.jclouds.concurrent.FutureIterables.transformParallel; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressAsyncClient; -import org.jclouds.vcloud.domain.Organization; - -import com.google.common.base.Function; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressOrganizationsForNames implements Function, Iterable> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - private final VCloudExpressAsyncClient aclient; - private final ExecutorService executor; - - @Inject - VCloudExpressOrganizationsForNames(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { - this.aclient = aclient; - this.executor = executor; - } - - @Override - public Iterable apply(Iterable from) { - return transformParallel(from, new Function>() { - - @SuppressWarnings("unchecked") - @Override - public Future apply(String from) { - return (Future) aclient.findOrganizationNamed(from); - } - - }, executor, null, logger, "organizations for names"); - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java deleted file mode 100644 index 5b15bde489..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VCloudExpressOrganizatonsForLocations.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -import static com.google.common.collect.Iterables.filter; -import static com.google.common.collect.Iterables.transform; -import static org.jclouds.concurrent.FutureIterables.transformParallel; - -import java.net.URI; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.compute.reference.ComputeServiceConstants; -import org.jclouds.domain.Location; -import org.jclouds.domain.LocationScope; -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressAsyncClient; -import org.jclouds.vcloud.compute.domain.VCloudLocation; -import org.jclouds.vcloud.domain.Organization; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Sets; - -/** - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressOrganizatonsForLocations implements - Function, Iterable> { - @Resource - @Named(ComputeServiceConstants.COMPUTE_LOGGER) - public Logger logger = Logger.NULL; - private final VCloudExpressAsyncClient aclient; - private final ExecutorService executor; - - @Inject - VCloudExpressOrganizatonsForLocations(VCloudExpressAsyncClient aclient, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) { - this.aclient = aclient; - this.executor = executor; - } - - /** - * Zones are assignable, but we want regions. so we look for zones, whose - * parent is region. then, we use a set to extract the unique set. - */ - @Override - public Iterable apply(Iterable from) { - - return transformParallel(Sets.newLinkedHashSet(transform(filter(from, new Predicate() { - - @Override - public boolean apply(Location input) { - return input.getScope() == LocationScope.ZONE; - } - - }), new Function() { - - @Override - public URI apply(Location from) { - return VCloudLocation.class.cast(from.getParent()).getResource().getId(); - } - - })), new Function>() { - - @SuppressWarnings("unchecked") - @Override - public Future apply(URI from) { - return (Future) aclient.getOrganization(from); - } - - }, executor, null, logger, "organizations for uris"); - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VDCNameToEndpoint.java b/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VDCNameToEndpoint.java deleted file mode 100644 index 4d7f05431e..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/functions/VDCNameToEndpoint.java +++ /dev/null @@ -1,55 +0,0 @@ -/** - * - * Copyright (C) 2010 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.functions; - -import java.net.URI; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.VDC; - -import com.google.common.base.Function; - -/** - * - * @author Adrian Cole - */ -@Singleton -public class VDCNameToEndpoint implements Function { - private final URI defaultVDC; - private final Organization org; - - @Inject - public VDCNameToEndpoint(Organization org, @VDC URI defaultVDC) { - this.org = org; - this.defaultVDC = defaultVDC; - } - - public URI apply(Object from) { - try { - return from == null ? defaultVDC : org.getVDCs().get(from).getId(); - } catch (NullPointerException e) { - throw new IllegalArgumentException("vdc name: " + from + " not in " + org.getVDCs()); - } - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/TaskSuccess.java b/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/TaskSuccess.java index 969a0dc589..3572a597a7 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/TaskSuccess.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/TaskSuccess.java @@ -25,7 +25,7 @@ import javax.annotation.Resource; import javax.inject.Singleton; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudClient; +import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TaskStatus; @@ -41,13 +41,13 @@ import com.google.inject.Inject; @Singleton public class TaskSuccess implements Predicate { - private final VCloudClient client; + private final CommonVCloudClient client; @Resource protected Logger logger = Logger.NULL; @Inject - public TaskSuccess(VCloudClient client) { + public TaskSuccess(CommonVCloudClient client) { this.client = client; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VCloudExpressTaskSuccess.java b/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VCloudExpressTaskSuccess.java deleted file mode 100644 index 4234c08f62..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/predicates/VCloudExpressTaskSuccess.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * - * Copyright (C) 2010 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.predicates; - -import java.net.URI; - -import javax.annotation.Resource; -import javax.inject.Singleton; - -import org.jclouds.logging.Logger; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.Task; -import org.jclouds.vcloud.domain.TaskStatus; - -import com.google.common.base.Predicate; -import com.google.inject.Inject; - -/** - * - * Tests to see if a task succeeds. - * - * @author Adrian Cole - */ -@Singleton -public class VCloudExpressTaskSuccess implements Predicate { - - private final VCloudExpressClient client; - - @Resource - protected Logger logger = Logger.NULL; - - @Inject - public VCloudExpressTaskSuccess(VCloudExpressClient client) { - this.client = client; - } - - public boolean apply(URI taskId) { - logger.trace("looking for status on task %s", taskId); - - Task task = client.getTask(taskId); - logger.trace("%s: looking for status %s: currently: %s", task, TaskStatus.SUCCESS, task - .getStatus()); - if (task.getStatus() == TaskStatus.ERROR) - throw new RuntimeException("error on task: " + task.getLocation() + " error: " + task.getError()); - return task.getStatus() == TaskStatus.SUCCESS; - } - -} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/util/Utils.java b/vcloud/core/src/main/java/org/jclouds/vcloud/util/Utils.java index 1164194d66..b9999c5d8a 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/util/Utils.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/util/Utils.java @@ -37,15 +37,15 @@ public class Utils { public static NamedResource newNamedResource(Attributes attributes) { String uri = attributes.getValue(attributes.getIndex("href")); return new NamedResourceImpl(attributes.getValue(attributes.getIndex("name")), attributes.getValue(attributes - .getIndex("type")), URI.create(uri)); + .getIndex("type")), URI.create(uri)); } public static Task.Error newError(Attributes attributes) { return new ErrorImpl(attrOrNull(attributes, "message"), attrOrNull(attributes, "majorErrorCode"), attrOrNull( - attributes, "minorErrorCode")); + attributes, "minorErrorCode")); } - private static String attrOrNull(Attributes attributes, String attr) { + public static String attrOrNull(Attributes attributes, String attr) { return attributes.getIndex(attr) >= 0 ? attributes.getValue(attributes.getIndex(attr)) : null; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java index d0706bb260..d2ddc4288b 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java @@ -19,10 +19,6 @@ package org.jclouds.vcloud.xml; -import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML; -import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; -import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; import static org.jclouds.vcloud.util.Utils.newNamedResource; import static org.jclouds.vcloud.util.Utils.putNamedResource; @@ -49,10 +45,10 @@ public class OrgHandler extends ParseSax.HandlerWithResult { protected Map catalogs = Maps.newLinkedHashMap(); protected Map networks = Maps.newLinkedHashMap(); - private String description; + protected String description; public Org getResult() { - return new OrgImpl(org.getName(), org.getId(), description, catalogs, vdcs, networks, tasksList); + return new OrgImpl(org.getName(), org.getType(), org.getId(), description, catalogs, vdcs, networks, tasksList); } @Override @@ -62,13 +58,13 @@ public class OrgHandler extends ParseSax.HandlerWithResult { } else if (qName.equals("Link")) { int typeIndex = attributes.getIndex("type"); if (typeIndex != -1) { - if (attributes.getValue(typeIndex).equals(VDC_XML)) { + if (attributes.getValue(typeIndex).indexOf("vdc+xml") != -1) { putNamedResource(vdcs, attributes); - } else if (attributes.getValue(typeIndex).equals(CATALOG_XML)) { + } else if (attributes.getValue(typeIndex).indexOf("catalog+xml") != -1) { putNamedResource(catalogs, attributes); - } else if (attributes.getValue(typeIndex).equals(TASKSLIST_XML)) { + } else if (attributes.getValue(typeIndex).indexOf("tasksList+xml") != -1) { tasksList = newNamedResource(attributes); - } else if (attributes.getValue(typeIndex).equals(NETWORK_XML)) { + } else if (attributes.getValue(typeIndex).indexOf("network+xml") != -1) { putNamedResource(networks, attributes); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java deleted file mode 100644 index 141f68605c..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrganizationHandler.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * - * Copyright (C) 2010 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.xml; - -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; -import static org.jclouds.vcloud.util.Utils.newNamedResource; -import static org.jclouds.vcloud.util.Utils.putNamedResource; - -import java.util.Map; - -import org.jclouds.http.functions.ParseSax; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.internal.OrganizationImpl; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; - -import com.google.common.collect.Maps; - -/** - * @author Adrian Cole - */ -public class OrganizationHandler extends ParseSax.HandlerWithResult { - protected NamedResource org; - protected Map vdcs = Maps.newLinkedHashMap(); - protected Map tasksLists = Maps.newLinkedHashMap(); - protected Map catalogs = Maps.newLinkedHashMap(); - - public Organization getResult() { - return new OrganizationImpl(org.getName(), org.getId(), catalogs, vdcs, tasksLists); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if (qName.equals("Org")) { - org = newNamedResource(attributes); - } else if (qName.equals("Link")) { - int typeIndex = attributes.getIndex("type"); - if (typeIndex != -1) { - if (attributes.getValue(typeIndex).equals(VDC_XML)) { - putNamedResource(vdcs, attributes); - } else if (attributes.getValue(typeIndex).equals(CATALOG_XML)) { - putNamedResource(catalogs, attributes); - } else if (attributes.getValue(typeIndex).equals(TASKSLIST_XML)) { - putNamedResource(tasksLists, attributes); - } - } - } - } -} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/TaskHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/TaskHandler.java index 121fe9b251..972cf38877 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/TaskHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/TaskHandler.java @@ -69,7 +69,7 @@ public class TaskHandler extends ParseSax.HandlerWithResult { public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("Task")) { if (attributes.getIndex("href") != -1)// queued tasks may not have an - // href yet + // href yet taskLink = Utils.newNamedResource(attributes); status = TaskStatus.fromValue(attributes.getValue(attributes.getIndex("status"))); if (attributes.getIndex("startTime") != -1) @@ -81,7 +81,7 @@ public class TaskHandler extends ParseSax.HandlerWithResult { } else if (qName.equals("Owner")) { owner = Utils.newNamedResource(attributes); } else if (qName.equals("Link") && attributes.getIndex("rel") != -1 - && attributes.getValue(attributes.getIndex("rel")).equals("self")) { + && attributes.getValue(attributes.getIndex("rel")).equals("self")) { taskLink = Utils.newNamedResource(attributes); } else if (qName.equals("Result")) { result = Utils.newNamedResource(attributes); @@ -111,7 +111,7 @@ public class TaskHandler extends ParseSax.HandlerWithResult { } @Override - public void endElement(String uri, String localName, String qName) throws SAXException { + public void endElement(String uri, String localName, String qName) { if (qName.equalsIgnoreCase("Task")) { this.task = new TaskImpl(taskLink.getId(), status, startTime, endTime, expiryTime, owner, result, error); taskLink = null; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VDCHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VDCHandler.java index 78069256f5..00b0b2c830 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VDCHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VDCHandler.java @@ -22,68 +22,106 @@ package org.jclouds.vcloud.xml; import static org.jclouds.vcloud.util.Utils.newNamedResource; import static org.jclouds.vcloud.util.Utils.putNamedResource; +import java.util.List; import java.util.Map; +import javax.inject.Inject; + import org.jclouds.http.functions.ParseSax; +import org.jclouds.vcloud.domain.AllocationModel; import org.jclouds.vcloud.domain.Capacity; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Quota; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.domain.VDCStatus; import org.jclouds.vcloud.domain.internal.VDCImpl; +import org.jclouds.vcloud.util.Utils; import org.xml.sax.Attributes; import org.xml.sax.SAXException; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * @author Adrian Cole */ public class VDCHandler extends ParseSax.HandlerWithResult { - private StringBuilder currentText = new StringBuilder(); - private NamedResource vDC; - private Map resourceEntities = Maps.newHashMap(); - private Map availableNetworks = Maps.newHashMap(); + protected final TaskHandler taskHandler; - private String description; + @Inject + public VDCHandler(TaskHandler taskHandler) { + this.taskHandler = taskHandler; + } - private Quota instantiatedVmsQuota; + protected StringBuilder currentText = new StringBuilder(); - private Capacity memoryCapacity; + protected NamedResource vDC; + protected VDCStatus status = VDCStatus.READY; + protected NamedResource org; + protected String description; + protected List tasks = Lists.newArrayList(); + protected AllocationModel allocationModel = AllocationModel.UNRECOGNIZED_MODEL; - private Capacity cpuCapacity; + protected Capacity storageCapacity; + protected Capacity cpuCapacity; + protected Capacity memoryCapacity; - private Capacity storageCapacity; + protected String units; + protected long allocated = 0; + protected long limit = 0; + protected int used = 0; + protected long overhead = 0; - private Quota deployedVmsQuota; + protected Map resourceEntities = Maps.newLinkedHashMap(); + protected Map availableNetworks = Maps.newLinkedHashMap(); - private String units; - - private int allocated; - - private int used; - - private int limit; + protected int nicQuota; + protected int networkQuota; + protected int vmQuota; + protected boolean isEnabled = true; public VDC getResult() { - return new VDCImpl(vDC.getName(), vDC.getId(), description, storageCapacity, cpuCapacity, memoryCapacity, - instantiatedVmsQuota, deployedVmsQuota, resourceEntities, availableNetworks); + return new VDCImpl(vDC.getName(), vDC.getType(), vDC.getId(), status, org, description, tasks, allocationModel, + storageCapacity, cpuCapacity, memoryCapacity, resourceEntities, availableNetworks, nicQuota, + networkQuota, vmQuota, isEnabled); + } + + void resetCapacity() { + units = null; + allocated = 0; + limit = 0; + used = 0; + overhead = 0; } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equals("Vdc")) { vDC = newNamedResource(attributes); + String status = Utils.attrOrNull(attributes, "status"); + if (status != null) + this.status = VDCStatus.fromValue(Integer.parseInt(status)); } else if (qName.equals("Network")) { putNamedResource(availableNetworks, attributes); } else if (qName.equals("ResourceEntity")) { putNamedResource(resourceEntities, attributes); + } else if (qName.equals("Link") && "up".equals(Utils.attrOrNull(attributes, "rel"))) { + org = newNamedResource(attributes); + } else { + taskHandler.startElement(uri, localName, qName, attributes); } + } public void endElement(String uri, String name, String qName) { - if (qName.equals("Description")) { + taskHandler.endElement(uri, name, qName); + if (qName.equals("Task")) { + this.tasks.add(taskHandler.getResult()); + } else if (qName.equals("Description")) { description = currentOrNull(); + } else if (qName.equals("AllocationModel")) { + allocationModel = AllocationModel.fromValue(currentOrNull()); } else if (qName.equals("Units")) { units = currentOrNull(); } else if (qName.equals("Allocated")) { @@ -92,16 +130,30 @@ public class VDCHandler extends ParseSax.HandlerWithResult { used = Integer.parseInt(currentOrNull()); } else if (qName.equals("Limit")) { limit = Integer.parseInt(currentOrNull()); + } else if (qName.equals("Overhead")) { + overhead = Integer.parseInt(currentOrNull()); } else if (qName.equals("StorageCapacity")) { - storageCapacity = new Capacity(units, allocated, used); + storageCapacity = new Capacity(units, allocated, limit, used, overhead); + resetCapacity(); } else if (qName.equals("Cpu")) { - cpuCapacity = new Capacity(units, allocated, used); + cpuCapacity = new Capacity(units, allocated, limit, used, overhead); + resetCapacity(); } else if (qName.equals("Memory")) { - memoryCapacity = new Capacity(units, allocated, used); - } else if (qName.equals("InstantiatedVmsQuota")) { - instantiatedVmsQuota = new Quota(limit, used); + memoryCapacity = new Capacity(units, allocated, limit, used, overhead); + resetCapacity(); } else if (qName.equals("DeployedVmsQuota")) { - deployedVmsQuota = new Quota(limit, used); + vmQuota = (int) limit; + // vcloud express doesn't have the zero is unlimited rule + if (vmQuota == -1) + vmQuota = 0; + } else if (qName.equals("VmQuota")) { + vmQuota = Integer.parseInt(currentOrNull()); + } else if (qName.equals("NicQuota")) { + nicQuota = Integer.parseInt(currentOrNull()); + } else if (qName.equals("NetworkQuota")) { + networkQuota = Integer.parseInt(currentOrNull()); + } else if (qName.equals("IsEnabled")) { + isEnabled = Boolean.parseBoolean(currentOrNull()); } currentText = new StringBuilder(); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java new file mode 100644 index 0000000000..9f8990905a --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java @@ -0,0 +1,171 @@ +/** + * + * Copyright (C) 2010 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; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; + +import java.util.Properties; + +import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.logging.log4j.config.Log4JLoggingModule; +import org.jclouds.rest.RestContext; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Network; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.VDC; +import org.testng.annotations.BeforeGroups; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Module; + +/** + * Tests behavior of {@code VCloudClient} + * + * @author Adrian Cole + */ +@Test(groups = "live", sequential = true, testName = "vcloud.VCloudClientLiveTest") +public abstract class CommonVCloudClientLiveTest { + + protected S connection; + protected String provider; + protected String identity; + protected RestContext context; + protected String credential; + + @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); + } + + @Test + public void testCatalog() throws Exception { + Catalog response = connection.findCatalogInOrgNamed(null, null); + assertNotNull(response); + assertNotNull(response.getName()); + assertNotNull(response.getId()); + assertEquals(connection.findCatalogInOrgNamed(null, response.getName()), response); + } + + @Test + public void testGetNetwork() throws Exception { + VDC response = connection.findVDCInOrgNamed(null, null); + for (NamedResource resource : response.getAvailableNetworks().values()) { + if (resource.getType().equals(VCloudMediaType.NETWORK_XML)) { + Network item = connection.getNetwork(resource.getId()); + assertNotNull(item); + } + } + } + + @Test + public void testGetCatalogItem() throws Exception { + Catalog response = connection.findCatalogInOrgNamed(null, null); + for (NamedResource resource : response.values()) { + if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.findCatalogItemInOrgCatalogNamed(null, null, resource.getName()); + assertNotNull(item); + assertNotNull(item.getEntity()); + assertNotNull(item.getId()); + assertNotNull(item.getProperties()); + assertNotNull(item.getType()); + } + } + } + + @Test + public void testGetVAppTemplate() throws Exception { + Catalog response = connection.findCatalogInOrgNamed(null, null); + for (NamedResource resource : response.values()) { + if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { + CatalogItem item = connection.getCatalogItem(resource.getId()); + if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { + assertNotNull(connection.findVAppTemplateInOrgCatalogNamed(null, null, item.getEntity().getName())); + } + } + } + } + + @Test + public void testDefaultVDC() throws Exception { + VDC response = connection.findVDCInOrgNamed(null, null); + assertNotNull(response); + assertNotNull(response.getName()); + assertNotNull(response.getId()); + assertNotNull(response.getResourceEntities()); + assertNotNull(response.getAvailableNetworks()); + assertEquals(connection.getVDC(response.getId()), response); + } + + @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()); + } + + @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.getLocation()).getLocation(), task.getLocation()); + } + } + + @Test + public void testGetVApp() throws Exception { + VDC response = connection.findVDCInOrgNamed(null, null); + for (NamedResource item : response.getResourceEntities().values()) { + if (item.getType().equals(VCloudMediaType.VAPP_XML)) { + VApp app = connection.getVApp(item.getId()); + assertNotNull(app); + } + } + } + + protected abstract void setupCredentials(); + + @BeforeGroups(groups = { "live" }) + public void setupClient() { + setupCredentials(); + Properties props = new Properties(); + context = new ComputeServiceContextFactory().createContext(provider, identity, credential, + ImmutableSet. of(new Log4JLoggingModule()), props).getProviderSpecificContext(); + + connection = context.getApi(); + } +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java index a00f2a6d93..a8068deaee 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java @@ -661,7 +661,7 @@ public class VCloudAsyncClientTest extends RestClientTest { } @Override - protected Org provideOrg(VCloudClient discovery) { + protected Org provideOrg(CommonVCloudClient discovery) { return null; } @@ -676,7 +676,7 @@ public class VCloudAsyncClientTest extends RestClientTest { } @Override - protected URI provideDefaultNetwork(VCloudClient client) { + protected URI provideDefaultNetwork(CommonVCloudClient client) { return URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/1990"); } @@ -721,9 +721,9 @@ public class VCloudAsyncClientTest extends RestClientTest { "vdc", new VDCImpl( "vdc", - URI + null, URI .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), - "description", + null, null, "description", null, null, null, @@ -743,7 +743,7 @@ public class VCloudAsyncClientTest extends RestClientTest { "application/vnd.vmware.vcloud.vAppTemplate+xml", URI .create("https://vcenterprise.bluelock.com/api/v1.0/vdcItem/2"))), - null)))); + null, 0, 0, 0, false)))); } @@ -756,7 +756,7 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public Map get() { - return ImmutableMap. of("org", new OrgImpl("org", URI + return ImmutableMap. of("org", new OrgImpl("org", null, URI .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "description", ImmutableMap . of("catalog", new NamedResourceImpl("catalog", VCloudMediaType.CATALOG_XML, URI diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java index 7de96dea7f..7f62bcf59c 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudClientLiveTest.java @@ -20,155 +20,21 @@ package org.jclouds.vcloud; import static com.google.common.base.Preconditions.checkNotNull; -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; -import java.util.Properties; - -import org.jclouds.compute.ComputeServiceContextFactory; -import org.jclouds.logging.log4j.config.Log4JLoggingModule; -import org.jclouds.rest.RestContext; -import org.jclouds.vcloud.domain.Catalog; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.Org; -import org.jclouds.vcloud.domain.Task; -import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VDC; -import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableSet; -import com.google.inject.Module; - /** * Tests behavior of {@code VCloudClient} * * @author Adrian Cole */ @Test(groups = "live", sequential = true, testName = "vcloud.VCloudClientLiveTest") -public class VCloudClientLiveTest { - - protected VCloudClient connection; - protected String identity; - protected RestContext context; - private String credential; - - @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); - } - - @Test - public void testCatalog() throws Exception { - Catalog response = connection.findCatalogInOrgNamed(null, null); - assertNotNull(response); - assertNotNull(response.getName()); - assertNotNull(response.getId()); - assertEquals(connection.findCatalogInOrgNamed(null, response.getName()), response); - } - - @Test - public void testGetNetwork() throws Exception { - VDC response = connection.findVDCInOrgNamed(null, null); - for (NamedResource resource : response.getAvailableNetworks().values()) { - if (resource.getType().equals(VCloudMediaType.NETWORK_XML)) { - Network item = connection.getNetwork(resource.getId()); - assertNotNull(item); - } - } - } - - @Test - public void testGetCatalogItem() throws Exception { - Catalog response = connection.findCatalogInOrgNamed(null, null); - for (NamedResource resource : response.values()) { - if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { - CatalogItem item = connection.findCatalogItemInOrgCatalogNamed(null, null, resource.getName()); - assertNotNull(item); - assertNotNull(item.getEntity()); - assertNotNull(item.getId()); - assertNotNull(item.getProperties()); - assertNotNull(item.getType()); - } - } - } - - @Test - public void testGetVAppTemplate() throws Exception { - Catalog response = connection.findCatalogInOrgNamed(null, null); - for (NamedResource resource : response.values()) { - if (resource.getType().equals(VCloudMediaType.CATALOGITEM_XML)) { - CatalogItem item = connection.getCatalogItem(resource.getId()); - if (item.getEntity().getType().equals(VCloudMediaType.VAPPTEMPLATE_XML)) { - assertNotNull(connection.findVAppTemplateInOrgCatalogNamed(null, null, item.getEntity().getName())); - } - } - } - } - - @Test - public void testDefaultVDC() throws Exception { - VDC response = connection.findVDCInOrgNamed(null, null); - assertNotNull(response); - assertNotNull(response.getName()); - assertNotNull(response.getId()); - assertNotNull(response.getResourceEntities()); - assertNotNull(response.getAvailableNetworks()); - assertEquals(connection.getVDC(response.getId()), response); - } - - @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()); - } - - @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.getLocation()).getLocation(), task.getLocation()); - } - } - - @Test - public void testGetVApp() throws Exception { - VDC response = connection.findVDCInOrgNamed(null, null); - for (NamedResource item : response.getResourceEntities().values()) { - if (item.getType().equals(VCloudMediaType.VAPP_XML)) { - VApp app = connection.getVApp(item.getId()); - assertNotNull(app); - } - } - } +public class VCloudClientLiveTest extends CommonVCloudClientLiveTest { protected void setupCredentials() { + provider = "vcloud"; identity = checkNotNull(System.getProperty("vcloud.identity"), "vcloud.identity"); credential = checkNotNull(System.getProperty("vcloud.credential"), "vcloud.credential"); } - @BeforeGroups(groups = { "live" }) - public void setupClient() { - setupCredentials(); - Properties props = new Properties(); - context = new ComputeServiceContextFactory().createContext("vcloud", identity, credential, - ImmutableSet. of(new Log4JLoggingModule()), props).getProviderSpecificContext(); - - connection = context.getApi(); - } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index 0057c7420a..b49ee08f2c 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -50,21 +50,20 @@ import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.util.Utils; import org.jclouds.vcloud.config.VCloudExpressRestClientModule; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; -import org.jclouds.vcloud.domain.internal.OrganizationImpl; +import org.jclouds.vcloud.domain.internal.OrgImpl; import org.jclouds.vcloud.domain.internal.VDCImpl; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.CatalogItemHandler; import org.jclouds.vcloud.xml.NetworkHandler; -import org.jclouds.vcloud.xml.OrganizationHandler; +import org.jclouds.vcloud.xml.OrgHandler; import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.TasksListHandler; import org.jclouds.vcloud.xml.VAppHandler; @@ -183,23 +182,8 @@ public class VCloudExpressAsyncClientTest extends RestClientTest orgs) { + protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return URI.create("https://vcloud.safesecureweb.com/api/v0.8/org"); } @Override - protected String provideOrgName(@Org Iterable orgs) { + protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return "org"; } @Override - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { + protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user) { return URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog"); } @Override - protected Organization provideOrganization(VCloudExpressClient discovery) { + protected Org provideOrg(CommonVCloudClient discovery) { return null; } @@ -731,17 +670,17 @@ public class VCloudExpressAsyncClientTest extends RestClientTest>> provideOrganizationVDCSupplierCache( - @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrganizationVDCSupplier supplier) { + protected Supplier>> provideOrgVDCSupplierCache( + @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgVDCSupplier supplier) { return Suppliers.>> ofInstance(ImmutableMap .> of("org", - ImmutableMap. of("vdc", new VDCImpl("vdc", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), "description", null, null, null, - null, null, ImmutableMap. of("vapp", new NamedResourceImpl("vapp", - "application/vnd.vmware.vcloud.vApp+xml", URI + 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 NamedResourceImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), "network", new NamedResourceImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), - null)))); + null, 0, 0, 0, false)))); } @Singleton - public static class TestOrganizationMapSupplier extends OrganizationMapSupplier { + public static class TestOrgMapSupplier extends OrgMapSupplier { @Inject - protected TestOrganizationMapSupplier() { + protected TestOrgMapSupplier() { super(null, null); } @Override - public Map get() { - return ImmutableMap. of("org", new OrganizationImpl("org", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), ImmutableMap + public Map get() { + return ImmutableMap. of("org", new OrgImpl("org", null, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), null, ImmutableMap . of("catalog", new NamedResourceImpl("catalog", VCloudExpressMediaType.CATALOG_XML, URI .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap . of("vdc", new NamedResourceImpl("vdc", VCloudExpressMediaType.VDC_XML, - URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap - . of("tasksList", new NamedResourceImpl("tasksList", - VCloudExpressMediaType.TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))))); + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), null, + new NamedResourceImpl("tasksList", VCloudExpressMediaType.TASKSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")))); } } @Singleton - public static class TestOrganizationCatalogSupplier extends OrganizationCatalogSupplier { + public static class TestOrgCatalogSupplier extends OrgCatalogSupplier { @Inject - protected TestOrganizationCatalogSupplier() { + protected TestOrgCatalogSupplier() { super(null, null); } @@ -835,8 +773,8 @@ public class VCloudExpressAsyncClientTest extends RestClientTest context; - private String credential; - - @Test - public void testOrganization() throws Exception { - Organization response = connection.findOrganizationNamed(null); - assertNotNull(response); - assertNotNull(response.getName()); - assert response.getCatalogs().size() >= 1; - assert response.getTasksLists().size() >= 1; - assert response.getVDCs().size() >= 1; - assertEquals(connection.findOrganizationNamed(response.getName()), response); - } - - @Test - public void testCatalog() throws Exception { - Catalog response = connection.findCatalogInOrgNamed(null, null); - assertNotNull(response); - assertNotNull(response.getName()); - assertNotNull(response.getId()); - assertEquals(connection.findCatalogInOrgNamed(null, response.getName()), response); - } - - @Test - public void testGetNetwork() throws Exception { - VDC response = connection.findVDCInOrgNamed(null, null); - for (NamedResource resource : response.getAvailableNetworks().values()) { - if (resource.getType().equals(VCloudExpressMediaType.NETWORK_XML)) { - Network item = connection.getNetwork(resource.getId()); - assertNotNull(item); - } - } - } - - @Test - public void testGetCatalogItem() throws Exception { - Catalog response = connection.findCatalogInOrgNamed(null, null); - for (NamedResource resource : response.values()) { - if (resource.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML)) { - CatalogItem item = connection.findCatalogItemInOrgCatalogNamed(null, null, resource.getName()); - assertNotNull(item); - assertNotNull(item.getEntity()); - assertNotNull(item.getId()); - assertNotNull(item.getProperties()); - assertNotNull(item.getType()); - } - } - } - - @Test - public void testGetVAppTemplate() throws Exception { - Catalog response = connection.findCatalogInOrgNamed(null, null); - for (NamedResource resource : response.values()) { - if (resource.getType().equals(VCloudExpressMediaType.CATALOGITEM_XML)) { - CatalogItem item = connection.getCatalogItem(resource.getId()); - if (item.getEntity().getType().equals(VCloudExpressMediaType.VAPPTEMPLATE_XML)) { - assertNotNull(connection.findVAppTemplateInOrgCatalogNamed(null, null, item.getEntity().getName())); - } - } - } - } - - @Test - public void testDefaultVDC() throws Exception { - VDC response = connection.findVDCInOrgNamed(null, null); - assertNotNull(response); - assertNotNull(response.getName()); - assertNotNull(response.getId()); - assertNotNull(response.getResourceEntities()); - assertNotNull(response.getAvailableNetworks()); - assertEquals(connection.getVDC(response.getId()), response); - } - - @Test - public void testDefaultTasksList() throws Exception { - org.jclouds.vcloud.domain.TasksList response = connection.findTasksListInOrgNamed(null, null); - 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, null); - assertNotNull(response); - assertNotNull(response.getLocation()); - assertNotNull(response.getTasks()); - if (response.getTasks().size() > 0) { - Task task = response.getTasks().last(); - assertEquals(connection.getTask(task.getLocation()).getLocation(), task.getLocation()); - } - } - - @Test - public void testGetVApp() throws Exception { - VDC response = connection.findVDCInOrgNamed(null, null); - for (NamedResource item : response.getResourceEntities().values()) { - if (item.getType().equals(VCloudExpressMediaType.VAPP_XML)) { - VApp app = connection.getVApp(item.getId()); - assertNotNull(app); - } - } - } +public class VCloudExpressClientLiveTest extends + CommonVCloudClientLiveTest { protected void setupCredentials() { + provider = "vcloudexpress"; identity = checkNotNull(System.getProperty("vcloudexpress.identity"), "vcloudexpress.identity"); credential = checkNotNull(System.getProperty("vcloudexpress.credential"), "vcloudexpress.credential"); } - @BeforeGroups(groups = { "live" }) - public void setupClient() { - setupCredentials(); - Properties props = new Properties(); - context = new ComputeServiceContextFactory().createContext("vcloudexpress", identity, credential, ImmutableSet - . of(new Log4JLoggingModule()), props).getProviderSpecificContext(); - - connection = context.getApi(); - } - } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java index c8f7f1144a..d1ed080206 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java @@ -29,6 +29,7 @@ import java.net.URI; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.Factory; import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.VCloudMediaType; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; @@ -57,17 +58,51 @@ public class OrgHandlerTest { assertEquals(result.getDescription(), "Example Corp's Primary Organization."); assertEquals(result.getId(), URI.create("http://vcloud.example.com/api/v1.0/org/5")); assertEquals(result.getCatalogs(), ImmutableMap.of("Main Catalog", new NamedResourceImpl("Main Catalog", - CATALOG_XML, URI.create("http://vcloud.example.com/api/v1.0/catalog/32")), "Shared Catalog", - new NamedResourceImpl("Shared Catalog", CATALOG_XML, URI - .create("http://vcloud.example.com/api/v1.0/catalog/37")))); + CATALOG_XML, URI.create("http://vcloud.example.com/api/v1.0/catalog/32")), "Shared Catalog", + new NamedResourceImpl("Shared Catalog", CATALOG_XML, URI + .create("http://vcloud.example.com/api/v1.0/catalog/37")))); assertEquals(result.getVDCs(), ImmutableMap.of("ExampleVdc01", new NamedResourceImpl("ExampleVdc01", - VCloudMediaType.VDC_XML, URI.create("http://vcloud.example.com/api/v1.0/vdc/5")))); + VCloudMediaType.VDC_XML, URI.create("http://vcloud.example.com/api/v1.0/vdc/5")))); assertEquals(result.getNetworks(), ImmutableMap.of("TestNetwork", new NamedResourceImpl("TestNetwork", - VCloudMediaType.NETWORK_XML, URI.create("http://vcloud.example.com/api/v1.0/network/14")), - "ProductionNetwork", new NamedResourceImpl("ProductionNetwork", VCloudMediaType.NETWORK_XML, URI - .create("http://vcloud.example.com/api/v1.0/network/54")))); + VCloudMediaType.NETWORK_XML, URI.create("http://vcloud.example.com/api/v1.0/network/14")), + "ProductionNetwork", new NamedResourceImpl("ProductionNetwork", VCloudMediaType.NETWORK_XML, URI + .create("http://vcloud.example.com/api/v1.0/network/54")))); assertEquals(result.getTasksList(), new NamedResourceImpl(null, TASKSLIST_XML, URI - .create("http://vcloud.example.com/api/v1.0/tasksList/5"))); + .create("http://vcloud.example.com/api/v1.0/tasksList/5"))); } + public void testTerremark() { + InputStream is = getClass().getResourceAsStream("/express/org.xml"); + + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + + Org result = (Org) factory.create(injector.getInstance(OrgHandler.class)).parse(is); + assertEquals(result.getName(), "adrian@jclouds.org"); + assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")); + assertEquals(result.getCatalogs(), ImmutableMap.of("Miami Environment 1 Catalog", new NamedResourceImpl( + "Miami Environment 1 Catalog", CATALOG_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32/catalog")))); + assertEquals(result.getVDCs(), ImmutableMap.of("Miami Environment 1", new NamedResourceImpl( + "Miami Environment 1", VCloudExpressMediaType.VDC_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32")))); + assertEquals(result.getTasksList(), new NamedResourceImpl("Miami Environment 1 Tasks List", TASKSLIST_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/tasksList/32"))); + } + + public void testHosting() { + InputStream is = getClass().getResourceAsStream("/express/org-hosting.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + Org result = (Org) factory.create(injector.getInstance(OrgHandler.class)).parse(is); + assertEquals(result.getName(), "Customer 188849"); + assertEquals(result.getId(), URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/188849")); + assertEquals(result.getCatalogs(), ImmutableMap.of("HMS Shared Catalog", new NamedResourceImpl( + "HMS Shared Catalog", CATALOG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")))); + assertEquals(result.getVDCs(), ImmutableMap.of("188849 Virtual DataCenter", new NamedResourceImpl( + "188849 Virtual DataCenter", VCloudExpressMediaType.VDC_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/188849")))); + assertEquals(result.getTasksList(), new NamedResourceImpl("188849 Task List", TASKSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/188849"))); + } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrganizationHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrganizationHandlerTest.java deleted file mode 100644 index cbf2ac3814..0000000000 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrganizationHandlerTest.java +++ /dev/null @@ -1,85 +0,0 @@ -/** - * - * Copyright (C) 2010 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.xml; - -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; -import static org.testng.Assert.assertEquals; - -import java.io.InputStream; -import java.net.URI; - -import org.jclouds.http.functions.ParseSax; -import org.jclouds.http.functions.ParseSax.Factory; -import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.VCloudExpressMediaType; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.internal.NamedResourceImpl; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableMap; -import com.google.inject.Guice; -import com.google.inject.Injector; - -/** - * Tests behavior of {@code OrgHandler} - * - * @author Adrian Cole - */ -@Test(groups = "unit", testName = "vcloud.OrgHandlerTest") -public class OrganizationHandlerTest { - - public void testApplyInputStream() { - InputStream is = getClass().getResourceAsStream("/express/org.xml"); - - Injector injector = Guice.createInjector(new SaxParserModule()); - Factory factory = injector.getInstance(ParseSax.Factory.class); - - Organization result = (Organization) factory.create(injector.getInstance(OrganizationHandler.class)).parse(is); - assertEquals(result.getName(), "adrian@jclouds.org"); - assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")); - assertEquals(result.getCatalogs(), ImmutableMap.of("Miami Environment 1 Catalog", new NamedResourceImpl( - "Miami Environment 1 Catalog", CATALOG_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32/catalog")))); - assertEquals(result.getVDCs(), ImmutableMap.of("Miami Environment 1", new NamedResourceImpl( - "Miami Environment 1", VCloudExpressMediaType.VDC_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32")))); - assertEquals(result.getTasksLists(), ImmutableMap.of("Miami Environment 1 Tasks List", new NamedResourceImpl( - "Miami Environment 1 Tasks List", TASKSLIST_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/tasksList/32")))); - } - - public void testHosting() { - InputStream is = getClass().getResourceAsStream("/express/org-hosting.xml"); - Injector injector = Guice.createInjector(new SaxParserModule()); - Factory factory = injector.getInstance(ParseSax.Factory.class); - Organization result = (Organization) factory.create(injector.getInstance(OrganizationHandler.class)).parse(is); - assertEquals(result.getName(), "Customer 188849"); - assertEquals(result.getId(), URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/188849")); - assertEquals(result.getCatalogs(), ImmutableMap.of("HMS Shared Catalog", new NamedResourceImpl( - "HMS Shared Catalog", CATALOG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")))); - assertEquals(result.getVDCs(), ImmutableMap.of("188849 Virtual DataCenter", new NamedResourceImpl( - "188849 Virtual DataCenter", VCloudExpressMediaType.VDC_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/188849")))); - assertEquals(result.getTasksLists(), ImmutableMap.of("188849 Task List", - new NamedResourceImpl("188849 Task List", TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/188849")))); - } -} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java index ae8912d0fb..4e90f1870f 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java @@ -27,10 +27,13 @@ import java.net.URI; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.Factory; import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.vcloud.VCloudExpressMediaType; +import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.domain.AllocationModel; import org.jclouds.vcloud.domain.Capacity; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Quota; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.domain.VDCStatus; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.testng.annotations.Test; @@ -45,60 +48,90 @@ import com.google.inject.Injector; */ @Test(groups = "unit", testName = "vcloud.VDCHandlerTest") public class VDCHandlerTest { - - public void testApplyInputStream() { + public void testVCloud1_0() { InputStream is = getClass().getResourceAsStream("/vdc.xml"); Injector injector = Guice.createInjector(new SaxParserModule()); Factory factory = injector.getInstance(ParseSax.Factory.class); VDC result = factory.create(injector.getInstance(VDCHandler.class)).parse(is); + assertEquals(result.getName(), "Jclouds-Commit-compG1xstorA01"); + assertEquals(result.getId(), URI.create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1014839439")); + assertEquals(result.getType(), "application/vnd.vmware.vcloud.vdc+xml"); + assertEquals(result.getStatus(), VDCStatus.READY); + assertEquals(result.getOrg(), new NamedResourceImpl(null, VCloudMediaType.ORG_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/org/9566014"))); + assertEquals(result.getDescription(), null); + assertEquals(result.getAllocationModel(), AllocationModel.ALLOCATION_POOL); + assertEquals(result.getStorageCapacity(), new Capacity("MB", 1024000, 1024000, 0, 0)); + assertEquals(result.getCpuCapacity(), new Capacity("MHz", 20000, 20000, 0, 0)); + assertEquals(result.getMemoryCapacity(), new Capacity("MB", 30720, 30720, 0, 0)); + assertEquals(result.getResourceEntities(), ImmutableMap. of()); + assertEquals(result.getAvailableNetworks(), ImmutableMap.of("isolation01", new NamedResourceImpl("isolation01", + "application/vnd.vmware.vcloud.network+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/network/990419644")), "internet01", + new NamedResourceImpl("internet01", "application/vnd.vmware.vcloud.network+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/network/758634723")))); + assertEquals(result.getNicQuota(), 0); + assertEquals(result.getNetworkQuota(), 100); + assertEquals(result.getVmQuota(), 50); + assert result.isEnabled(); + } + + public void testTerremark() { + InputStream is = getClass().getResourceAsStream("/express/vdc.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + VDC result = factory.create(injector.getInstance(VDCHandler.class)).parse(is); assertEquals(result.getName(), "Miami Environment 1"); assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32")); assertEquals(result.getDescription(), null); - assertEquals(result.getStorageCapacity(), null); - assertEquals(result.getCpuCapacity(), null); - assertEquals(result.getMemoryCapacity(), null); - assertEquals(result.getInstantiatedVmsQuota(), null); - assertEquals(result.getDeployedVmsQuota(), null); - assertEquals(result.getResourceEntities(), ImmutableMap. of()); + assertEquals(result.getStorageCapacity(), new Capacity("bytes * 10^9", 100, 0, 8, 0)); + assertEquals(result.getCpuCapacity(), new Capacity("hz * 10^6", 5000, 0, 0, 0)); + assertEquals(result.getMemoryCapacity(), new Capacity("bytes * 2^20", 10240, 0, 0, 0)); + assertEquals(result.getVmQuota(), 0); + assertEquals(result.getResourceEntities(), ImmutableMap. of("adriantest", + new NamedResourceImpl("adriantest", VCloudExpressMediaType.VAPP_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/15124")), "centos-53", + new NamedResourceImpl("centos-53", VCloudExpressMediaType.VAPP_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/15120")))); assertEquals(result.getAvailableNetworks(), ImmutableMap.of("10.114.34.128/26", new NamedResourceImpl( - "10.114.34.128/26", "application/vnd.vmware.vcloud.network+xml", URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/network/1708")))); + "10.114.34.128/26", "application/vnd.vmware.vcloud.network+xml", URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/network/1708")))); } - public void testApplyHosting() { - InputStream is = getClass().getResourceAsStream("/vdc-hosting.xml"); + public void testHostingDotCom() { + InputStream is = getClass().getResourceAsStream("/express/vdc-hosting.xml"); Injector injector = Guice.createInjector(new SaxParserModule()); Factory factory = injector.getInstance(ParseSax.Factory.class); VDC result = factory.create(injector.getInstance(VDCHandler.class)).parse(is); assertEquals(result.getName(), "vDC Name"); assertEquals(result.getId(), URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/188849")); assertEquals(result.getDescription(), "vDC Name"); - assertEquals(result.getStorageCapacity(), new Capacity("bytes * 10^9", 0, 40960)); - assertEquals(result.getCpuCapacity(), new Capacity("hz * 10^6", 0, 2400)); - assertEquals(result.getMemoryCapacity(), new Capacity("bytes * 10^9", 0, 2)); - assertEquals(result.getInstantiatedVmsQuota(), new Quota(0, 2)); - assertEquals(result.getDeployedVmsQuota(), new Quota(0, 2)); + assertEquals(result.getStorageCapacity(), new Capacity("bytes * 10^9", 0, 0, 40960, 0)); + assertEquals(result.getCpuCapacity(), new Capacity("hz * 10^6", 0, 0, 2400, 0)); + assertEquals(result.getMemoryCapacity(), new Capacity("bytes * 10^9", 0, 0, 2, 0)); + assertEquals(result.getVmQuota(), 0); assertEquals(result.getResourceEntities(), new ImmutableMap.Builder().put( - "Plesk (Linux) 64-bit Template", - new NamedResourceImpl("Plesk (Linux) 64-bit Template", "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI.create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/1"))).put( + "Plesk (Linux) 64-bit Template", + new NamedResourceImpl("Plesk (Linux) 64-bit Template", "application/vnd.vmware.vcloud.vAppTemplate+xml", + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/1"))).put( - "Windows 2008 Datacenter 64 Bit Template", - new NamedResourceImpl("Windows 2008 Datacenter 64 Bit Template", - "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2"))).put( - "Cent OS 64 Bit Template", - new NamedResourceImpl("Cent OS 64 Bit Template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"))).put( - "cPanel (Linux) 64 Bit Template", - new NamedResourceImpl("cPanel (Linux) 64 Bit Template", "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI.create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/4"))).put( - "188849-1", - new NamedResourceImpl("188849-1", "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1"))).put( - "188849-2", - new NamedResourceImpl("188849-2", "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-2"))).build()); + "Windows 2008 Datacenter 64 Bit Template", + new NamedResourceImpl("Windows 2008 Datacenter 64 Bit Template", + "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2"))).put( + "Cent OS 64 Bit Template", + new NamedResourceImpl("Cent OS 64 Bit Template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/3"))).put( + "cPanel (Linux) 64 Bit Template", + new NamedResourceImpl("cPanel (Linux) 64 Bit Template", + "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/4"))).put( + "188849-1", + new NamedResourceImpl("188849-1", "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1"))).put( + "188849-2", + new NamedResourceImpl("188849-2", "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-2"))).build()); assertEquals(result.getAvailableNetworks(), ImmutableMap. of()); } diff --git a/vcloud/core/src/test/resources/vdc-hosting.xml b/vcloud/core/src/test/resources/express/vdc-hosting.xml similarity index 100% rename from vcloud/core/src/test/resources/vdc-hosting.xml rename to vcloud/core/src/test/resources/express/vdc-hosting.xml diff --git a/vcloud/core/src/test/resources/vdc-nonet.xml b/vcloud/core/src/test/resources/express/vdc-nonet.xml similarity index 100% rename from vcloud/core/src/test/resources/vdc-nonet.xml rename to vcloud/core/src/test/resources/express/vdc-nonet.xml diff --git a/vcloud/core/src/test/resources/express/vdc.xml b/vcloud/core/src/test/resources/express/vdc.xml new file mode 100644 index 0000000000..d5df92fb9f --- /dev/null +++ b/vcloud/core/src/test/resources/express/vdc.xml @@ -0,0 +1,36 @@ + + + + + + + bytes * 10^9 + 100 + 8 + + + + hz * 10^6 + 5000 + + + bytes * 2^20 + 10240 + + + -1 + -1 + + + -1 + -1 + + + + + + + + + + \ No newline at end of file diff --git a/vcloud/core/src/test/resources/vdc.xml b/vcloud/core/src/test/resources/vdc.xml index 0763af3841..286e42ca64 100644 --- a/vcloud/core/src/test/resources/vdc.xml +++ b/vcloud/core/src/test/resources/vdc.xml @@ -1,6 +1,49 @@ - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + AllocationPool + + MB + 1024000 + 1024000 + 0 + 0 + + + + MHz + 20000 + 20000 + 0 + 0 + + + MB + 30720 + 30720 + 0 + 0 + + + + + + + + 0 + 100 + 50 + true + diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java index 47b0bf8b06..f5f1d3ae0b 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java @@ -19,8 +19,7 @@ package org.jclouds.vcloud.hostingdotcom; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; import java.net.URI; @@ -31,7 +30,6 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.jclouds.predicates.validators.DnsNameValidator; -import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.EndpointParam; import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.MapBinder; @@ -42,12 +40,10 @@ import org.jclouds.rest.annotations.XMLResponseParser; import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; -import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; import org.jclouds.vcloud.hostingdotcom.xml.HostingDotComVAppHandler; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; -import org.jclouds.vcloud.xml.CatalogHandler; import com.google.common.util.concurrent.ListenableFuture; @@ -55,22 +51,12 @@ import com.google.common.util.concurrent.ListenableFuture; * Provides access to VCloud resources via their REST API. *

* - * @see + * @see * @author Adrian Cole */ @RequestFilters(SetVCloudTokenCookie.class) public interface HostingDotComVCloudAsyncClient extends VCloudExpressAsyncClient { - @GET - @Endpoint(org.jclouds.vcloud.endpoints.Catalog.class) - @Consumes(CATALOG_XML) - @Produces(CATALOG_XML) - // produces is incorrect, but required for hosting.com to operate - @XMLResponseParser(CatalogHandler.class) - @Override - ListenableFuture getDefaultCatalog(); - @GET @Consumes(VAPP_XML) @XMLResponseParser(HostingDotComVAppHandler.class) @@ -87,8 +73,8 @@ public interface HostingDotComVCloudAsyncClient extends VCloudExpressAsyncClient @MapBinder(BindInstantiateVAppTemplateParamsToXmlPayload.class) @Override ListenableFuture instantiateVAppTemplateInVDC(@EndpointParam URI vdc, - @MapPayloadParam("template") URI template, - @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, - InstantiateVAppTemplateOptions... options); + @MapPayloadParam("template") URI template, + @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, + InstantiateVAppTemplateOptions... options); } diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java index 6fd82e187b..f07ea462af 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java @@ -27,7 +27,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeState; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; +import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; @@ -40,7 +40,7 @@ import com.google.common.collect.ImmutableMap; * @author Adrian Cole */ @Singleton -public class HostingDotComVCloudComputeClient extends BaseVCloudExpressComputeClient { +public class HostingDotComVCloudComputeClient extends VCloudExpressComputeClientImpl { @Inject protected HostingDotComVCloudComputeClient(VCloudExpressClient client, Predicate successTester, diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java index 1034d4dfaf..6523ee1228 100644 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java +++ b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java @@ -25,6 +25,7 @@ import javax.inject.Singleton; import org.jclouds.http.RequiresHttp; import org.jclouds.rest.ConfiguresRestClient; +import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.config.BaseVCloudExpressRestClientModule; @@ -34,26 +35,22 @@ import org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudClient; 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 HostingDotComVCloudRestClientModule - extends - BaseVCloudExpressRestClientModule { +public class HostingDotComVCloudRestClientModule extends + BaseVCloudExpressRestClientModule { public HostingDotComVCloudRestClientModule() { - super(HostingDotComVCloudClient.class, - HostingDotComVCloudAsyncClient.class); + super(HostingDotComVCloudClient.class, HostingDotComVCloudAsyncClient.class); } @Provides @Singleton - protected VCloudExpressAsyncClient provideVCloudAsyncClient( - HostingDotComVCloudAsyncClient in) { + protected VCloudExpressAsyncClient provideVCloudAsyncClient(HostingDotComVCloudAsyncClient in) { return in; } @@ -64,7 +61,7 @@ public class HostingDotComVCloudRestClientModule } @Override - protected URI provideDefaultNetwork(VCloudExpressClient client) { + protected URI provideDefaultNetwork(CommonVCloudClient client) { return URI.create("https://vcloud.safesecureweb.com/network/1990"); } diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java deleted file mode 100644 index 9afa7d2fc0..0000000000 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClientTest.java +++ /dev/null @@ -1,148 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom; - -import static org.jclouds.Constants.PROPERTY_API_VERSION; -import static org.jclouds.Constants.PROPERTY_IDENTITY; -import static org.testng.Assert.assertEquals; - -import java.io.IOException; -import java.lang.reflect.Method; -import java.net.URI; -import java.util.Properties; - -import javax.inject.Named; - -import org.jclouds.http.HttpRequest; -import org.jclouds.http.RequiresHttp; -import org.jclouds.http.functions.ParseSax; -import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.rest.RestClientTest; -import org.jclouds.rest.RestContextFactory; -import org.jclouds.rest.RestContextFactory.ContextSpec; -import org.jclouds.rest.internal.RestAnnotationProcessor; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.domain.VCloudSession; -import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.hostingdotcom.config.HostingDotComVCloudRestClientModule; -import org.jclouds.vcloud.xml.CatalogHandler; -import org.testng.annotations.Test; - -import com.google.common.base.Supplier; -import com.google.inject.Module; -import com.google.inject.TypeLiteral; - -import domain.VCloudVersionsAsyncClient; - -/** - * Tests behavior of {@code HostingDotComVCloudAsyncClient} - * - * @author Adrian Cole - */ -@Test(groups = "unit", sequential = true, testName = "vcloud.HostingDotComVCloudAsyncClientTest") -public class HostingDotComVCloudAsyncClientTest extends RestClientTest { - public void testCatalog() throws SecurityException, NoSuchMethodException, IOException { - Method method = HostingDotComVCloudAsyncClient.class.getMethod("getDefaultCatalog"); - HttpRequest request = processor.createRequest(method); - - assertRequestLineEquals(request, "GET https://catalog HTTP/1.1"); - assertNonPayloadHeadersEqual(request, "Accept: application/vnd.vmware.vcloud.catalog+xml\n"); - assertPayloadEquals(request, null, "application/vnd.vmware.vcloud.catalog+xml", false); - - assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, CatalogHandler.class); - assertExceptionParserClassEquals(method, null); - - checkFilters(request); - } - - @Override - protected void checkFilters(HttpRequest request) { - assertEquals(request.getFilters().size(), 1); - assertEquals(request.getFilters().get(0).getClass(), SetVCloudTokenCookie.class); - } - - @Override - protected TypeLiteral> createTypeLiteral() { - return new TypeLiteral>() { - }; - } - - @Override - protected Module createModule() { - return new HostingDotComVCloudRestClientModuleExtension(); - } - - @Override - public ContextSpec createContextSpec() { - return new RestContextFactory().createContextSpec("hostingdotcom", "identity", "credential", new Properties()); - } - - @RequiresHttp - @ConfiguresRestClient - protected static class HostingDotComVCloudRestClientModuleExtension extends HostingDotComVCloudRestClientModule { - @Override - protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService, - @Named(PROPERTY_API_VERSION) String version) { - return URI.create("https://vcloud/login"); - } - - @Override - protected URI provideOrg(@Org Iterable orgs) { - return URI.create("https://org"); - - } - - @Override - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { - return URI.create("https://catalog"); - - } - - @Override - protected Organization provideOrganization(VCloudExpressClient discovery) { - return null; - } - - @Override - protected Iterable provideOrgs(Supplier cache, @Named(PROPERTY_IDENTITY) String user) { - return null; - } - - @Override - protected URI provideDefaultTasksList(Organization org) { - return URI.create("https://taskslist"); - } - - @Override - protected URI provideDefaultVDC(Organization org) { - return URI.create("https://vdc/1"); - } - - @Override - protected URI provideDefaultNetwork(VCloudExpressClient client) { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); - } - - } -} diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java index 88f02f68a4..892501c2ef 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java @@ -19,11 +19,11 @@ package org.jclouds.vcloud.terremark; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.ORG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VAPP_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.VDC_XML; +import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; +import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudMediaType.ORG_XML; +import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; +import static org.jclouds.vcloud.VCloudMediaType.VDC_XML; import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.CATALOGITEMCUSTOMIZATIONPARAMETERS_XML; import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.INTERNETSERVICESLIST_XML; import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.INTERNETSERVICE_XML; @@ -44,7 +44,6 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.jclouds.predicates.validators.DnsNameValidator; -import org.jclouds.rest.annotations.Endpoint; import org.jclouds.rest.annotations.EndpointParam; import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.MapBinder; @@ -62,9 +61,8 @@ import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VDC; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.functions.OrganizationNameAndVDCNameToEndpoint; +import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameToEndpoint; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -77,7 +75,7 @@ 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.TerremarkOrganization; +import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; import org.jclouds.vcloud.terremark.domain.VAppConfiguration; import org.jclouds.vcloud.terremark.functions.ParseTaskFromLocationHeader; @@ -104,8 +102,7 @@ import com.google.common.util.concurrent.ListenableFuture; * Provides access to VCloud resources via their REST API. *

* - * @see + * @see * @author Adrian Cole */ @RequestFilters(SetVCloudTokenCookie.class) @@ -119,9 +116,9 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @XMLResponseParser(TerremarkCatalogItemHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture findCatalogItemInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); + @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, + @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); /** * @see VCloudExpressClient#getCatalogItem @@ -133,41 +130,23 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture getCatalogItem(@EndpointParam URI catalogItem); - @Override - @GET - @Deprecated - @Endpoint(Org.class) - @Consumes(ORG_XML) - @XMLResponseParser(TerremarkOrgHandler.class) - ListenableFuture getDefaultOrganization(); - @Override @GET @XMLResponseParser(TerremarkOrgHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Consumes(ORG_XML) - ListenableFuture getOrganization(@EndpointParam URI orgId); + ListenableFuture getOrg(@EndpointParam URI orgId); /** - * @see VCloudExpressClient#findOrganizationNamed + * @see VCloudExpressClient#findOrgNamed */ @Override @GET @XMLResponseParser(TerremarkOrgHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) @Consumes(ORG_XML) - ListenableFuture findOrganizationNamed( - @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); - - /** - * @see TerremarkVCloudExpressClient#getDefaultVDC - */ - @Override - @GET - @Endpoint(org.jclouds.vcloud.endpoints.VDC.class) - @XMLResponseParser(TerremarkVDCHandler.class) - @Consumes(VDC_XML) - ListenableFuture getDefaultVDC(); + ListenableFuture findOrgNamed( + @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName); /** * Terremark does not have multiple catalogs, so we ignore this parameter. @@ -198,8 +177,8 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @Consumes(VDC_XML) @ExceptionParser(ReturnNullOnNotFoundOr404.class) ListenableFuture findVDCInOrgNamed( - @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrganizationNameAndVDCNameToEndpoint.class) String vdcName); + @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); /** * @see VCloudExpressClient#instantiateVAppTemplateInVDC @@ -212,9 +191,9 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @XMLResponseParser(VAppHandler.class) @MapBinder(TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.class) ListenableFuture instantiateVAppTemplateInVDC(@EndpointParam URI vdc, - @MapPayloadParam("template") URI template, - @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, - InstantiateVAppTemplateOptions... options); + @MapPayloadParam("template") URI template, + @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, + InstantiateVAppTemplateOptions... options); /** * @see TerremarkVCloudExpressClient#getAllInternetServicesInVDC @@ -224,7 +203,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @XMLResponseParser(InternetServicesHandler.class) @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) ListenableFuture> getAllInternetServicesInVDC( - @EndpointParam(parser = VDCURIToInternetServicesEndpoint.class) URI vDCId); + @EndpointParam(parser = VDCURIToInternetServicesEndpoint.class) URI vDCId); /** * @see TerremarkVCloudExpressClient#addInternetServiceToExistingIp @@ -236,8 +215,8 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @XMLResponseParser(InternetServiceHandler.class) @MapBinder(AddInternetServiceOptions.class) ListenableFuture addInternetServiceToExistingIp(@EndpointParam URI publicIpId, - @MapPayloadParam("name") String serviceName, @MapPayloadParam("protocol") Protocol protocol, - @MapPayloadParam("port") int port, AddInternetServiceOptions... options); + @MapPayloadParam("name") String serviceName, @MapPayloadParam("protocol") Protocol protocol, + @MapPayloadParam("port") int port, AddInternetServiceOptions... options); /** * @see TerremarkVCloudExpressClient#deletePublicIp @@ -274,7 +253,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @XMLResponseParser(PublicIpAddressesHandler.class) @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class) ListenableFuture> getPublicIpsAssociatedWithVDC( - @EndpointParam(parser = VDCURIToPublicIPsEndpoint.class) URI vDCId); + @EndpointParam(parser = VDCURIToPublicIPsEndpoint.class) URI vDCId); /** * @see TerremarkVCloudExpressClient#deleteInternetService @@ -302,8 +281,8 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @XMLResponseParser(NodeHandler.class) @MapBinder(AddNodeOptions.class) ListenableFuture addNode(@EndpointParam URI internetServiceId, - @MapPayloadParam("ipAddress") String ipAddress, @MapPayloadParam("name") String name, - @MapPayloadParam("port") int port, AddNodeOptions... options); + @MapPayloadParam("ipAddress") String ipAddress, @MapPayloadParam("name") String name, + @MapPayloadParam("port") int port, AddNodeOptions... options); /** * @see TerremarkVCloudExpressClient#getNodes @@ -333,7 +312,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @XMLResponseParser(NodeHandler.class) @MapBinder(BindNodeConfigurationToXmlPayload.class) ListenableFuture configureNode(@EndpointParam URI nodeId, @MapPayloadParam("name") String name, - @MapPayloadParam("enabled") boolean enabled, @Nullable @MapPayloadParam("description") String description); + @MapPayloadParam("enabled") boolean enabled, @Nullable @MapPayloadParam("description") String description); /** * @see TerremarkVCloudExpressClient#deleteNode @@ -351,7 +330,7 @@ public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient { @MapBinder(BindVAppConfigurationToXmlPayload.class) @ResponseParser(ParseTaskFromLocationHeader.class) ListenableFuture configureVApp( - @EndpointParam(parser = BindVAppConfigurationToXmlPayload.class) VApp vApp, VAppConfiguration configuration); + @EndpointParam(parser = BindVAppConfigurationToXmlPayload.class) VApp vApp, VAppConfiguration configuration); /** * @see TerremarkVCloudClient#getCustomizationOptions diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java index dbc638197a..a3e7f740a5 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java @@ -35,7 +35,7 @@ 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.TerremarkOrganization; +import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; import org.jclouds.vcloud.terremark.domain.VAppConfiguration; import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions; @@ -45,8 +45,7 @@ import org.jclouds.vcloud.terremark.options.AddNodeOptions; * Provides access to VCloud resources via their REST API. *

* - * @see + * @see * @author Adrian Cole */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) @@ -61,15 +60,11 @@ public interface TerremarkVCloudClient extends VCloudExpressClient { @Override TerremarkCatalogItem findCatalogItemInOrgCatalogNamed(String orgName, String catalogName, String itemName); - @Deprecated @Override - TerremarkOrganization getDefaultOrganization(); + TerremarkOrg getOrg(URI orgId); @Override - TerremarkOrganization getOrganization(URI orgId); - - @Override - TerremarkOrganization findOrganizationNamed(String orgName); + TerremarkOrg findOrgNamed(String orgName); CustomizationParameters getCustomizationOptions(URI customizationOptions); @@ -81,13 +76,12 @@ public interface TerremarkVCloudClient extends VCloudExpressClient { void deletePublicIp(URI ipId); /** - * This call adds an internet service to a known, existing public IP. This - * call is identical to Add Internet Service except you specify the public IP - * in the request. + * This call adds an internet service to a known, existing public IP. This call is identical to + * Add Internet Service except you specify the public IP in the request. * */ InternetService addInternetServiceToExistingIp(URI existingIpId, String serviceName, Protocol protocol, int port, - AddInternetServiceOptions... options); + AddInternetServiceOptions... options); void deleteInternetService(URI internetServiceId); @@ -105,10 +99,9 @@ public interface TerremarkVCloudClient extends VCloudExpressClient { /** * This call adds a node to an existing internet service. *

- * Every vDC is assigned a network of 60 IP addresses that can be used as - * nodes. Each node can associated with multiple internet service. You can - * get a list of the available IP addresses by calling Get IP Addresses for a - * Network. + * Every vDC is assigned a network of 60 IP addresses that can be used as nodes. Each node can + * associated with multiple internet service. You can get a list of the available IP addresses by + * calling Get IP Addresses for a Network. * * @param internetServiceId * @param ipAddress @@ -128,9 +121,8 @@ public interface TerremarkVCloudClient extends VCloudExpressClient { Set getNodes(URI internetServiceId); /** - * This call configures the settings of an existing vApp by passing the new - * configuration. The existing vApp must be in a powered off state (status = - * 2). + * This call configures the settings of an existing vApp by passing the new configuration. The + * existing vApp must be in a powered off state (status = 2). *

* You can change the following items for a vApp. *

    @@ -139,9 +131,8 @@ public interface TerremarkVCloudClient extends VCloudExpressClient { *
  1. Add a virtual disk
  2. *
  3. Delete a virtual disk
  4. *
- * You can make more than one change in a single request. For example, you - * can increase the number of virtual CPUs and the amount of virtual memory - * in the same request. + * You can make more than one change in a single request. For example, you can increase the + * number of virtual CPUs and the amount of virtual memory in the same request. * * @param VApp * vApp to change in power state off diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java index 2cf0f2859e..f93f751ee4 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClient.java @@ -38,7 +38,7 @@ import javax.inject.Singleton; import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.strategy.PopulateDefaultLoginCredentialsForImageStrategy; import org.jclouds.domain.Credentials; -import org.jclouds.vcloud.compute.BaseVCloudExpressComputeClient; +import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TaskStatus; import org.jclouds.vcloud.domain.TasksList; @@ -61,7 +61,7 @@ import com.google.common.collect.Sets; * @author Adrian Cole */ @Singleton -public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient { +public class TerremarkVCloudComputeClient extends VCloudExpressComputeClientImpl { private final TerremarkVCloudExpressClient client; private final PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider; @@ -69,9 +69,9 @@ public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient @Inject protected TerremarkVCloudComputeClient(TerremarkVCloudExpressClient client, - PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, - @Named("PASSWORD") Provider passwordGenerator, Predicate successTester, - Map vAppStatusToNodeState) { + PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, + @Named("PASSWORD") Provider passwordGenerator, Predicate successTester, + Map vAppStatusToNodeState) { super(client, successTester, vAppStatusToNodeState); this.client = client; this.credentialsProvider = credentialsProvider; @@ -89,7 +89,7 @@ public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient @Override public Map start(@Nullable URI VDC, URI templateId, String name, - InstantiateVAppTemplateOptions options, int... portsToOpen) { + InstantiateVAppTemplateOptions options, int... portsToOpen) { if (options.getDiskSizeKilobytes() != null) { logger.warn("trmk does not support resizing the primary disk; unsetting disk size"); } @@ -120,47 +120,47 @@ public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient InternetService is = null; Protocol protocol; switch (port) { - case 22: - protocol = Protocol.TCP; - break; - case 80: - case 8080: - protocol = Protocol.HTTP; - break; - case 443: - protocol = Protocol.HTTPS; - break; - default: - protocol = Protocol.HTTP; - break; + case 22: + protocol = Protocol.TCP; + break; + case 80: + case 8080: + protocol = Protocol.HTTP; + break; + case 443: + protocol = Protocol.HTTPS; + break; + default: + protocol = Protocol.HTTP; + break; } if (ip == null) { if (client instanceof TerremarkVCloudExpressClient) { is = TerremarkVCloudExpressClient.class.cast(client).addInternetServiceToVDC( - vApp.getVDC().getId(), - vApp.getName() + "-" + port, - protocol, - port, - withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), - vApp.getName()))); + vApp.getVDC().getId(), + vApp.getName() + "-" + port, + protocol, + port, + withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), + vApp.getName()))); ip = is.getPublicIpAddress(); } else { logger.debug(">> creating InternetService in vDC %s:%s:%d", vApp.getVDC().getName(), protocol, port); ip = TerremarkECloudClient.class.cast(client).activatePublicIpInVDC(vApp.getVDC().getId()); - is = client.addInternetServiceToExistingIp(ip.getId(), vApp.getName() + "-" + port, protocol, - port, withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp - .getName(), vApp.getName()))); + is = client.addInternetServiceToExistingIp(ip.getId(), vApp.getName() + "-" + port, protocol, port, + withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), + vApp.getName()))); } } else { logger.debug(">> adding InternetService %s:%s:%d", ip.getAddress(), protocol, port); is = client.addInternetServiceToExistingIp(ip.getId(), vApp.getName() + "-" + port, protocol, port, - withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), vApp - .getName()))); + withDescription(String.format("port %d access to serverId: %s name: %s", port, vApp.getName(), + vApp.getName()))); } logger.debug("<< created InternetService(%s) %s:%s:%d", is.getName(), is.getPublicIpAddress().getAddress(), is - .getProtocol(), is.getPort()); + .getProtocol(), is.getPort()); logger.debug(">> adding Node %s:%d -> %s:%d", is.getPublicIpAddress().getAddress(), is.getPort(), - privateAddress, port); + privateAddress, port); Node node = client.addNode(is.getId(), privateAddress, vApp.getName() + "-" + port, port); logger.debug("<< added Node(%s)", node.getName()); } @@ -174,13 +174,13 @@ public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient if (vApp.getNetworkToAddresses().containsValue(node.getIpAddress())) { ipAddresses.add(service.getPublicIpAddress()); logger.debug(">> deleting Node(%s) %s:%d -> %s:%d", node.getName(), service.getPublicIpAddress() - .getAddress(), service.getPort(), node.getIpAddress(), node.getPort()); + .getAddress(), service.getPort(), node.getIpAddress(), node.getPort()); client.deleteNode(node.getId()); logger.debug("<< deleted Node(%s)", node.getName()); Set nodes = client.getNodes(service.getId()); if (nodes.size() == 0) { logger.debug(">> deleting InternetService(%s) %s:%d", service.getName(), service.getPublicIpAddress() - .getAddress(), service.getPort()); + .getAddress(), service.getPort()); client.deleteInternetService(service.getId()); logger.debug("<< deleted InternetService(%s)", service.getName()); continue SERVICE; @@ -204,10 +204,9 @@ public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient } /** - * deletes the internet service and nodes associated with the vapp. Deletes - * the IP address, if there are no others using it. Finally, it powers off - * and deletes the vapp. Note that we do not call undeploy, as terremark does - * not support the command. + * deletes the internet service and nodes associated with the vapp. Deletes the IP address, if + * there are no others using it. Finally, it powers off and deletes the vapp. Note that we do not + * call undeploy, as terremark does not support the command. */ @Override public void stop(URI id) { @@ -238,7 +237,7 @@ public class TerremarkVCloudComputeClient extends BaseVCloudExpressComputeClient } void blockOnLastTask(VApp vApp) { - TasksList list = client.findTasksListInOrgNamed(null, null); + TasksList list = client.findTasksListInOrgNamed(null); try { Task lastTask = getLast(filter(list.getTasks(), new Predicate() { diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java index 0262264685..5360db058d 100755 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/config/TerremarkVCloudComputeServiceContextModule.java @@ -19,7 +19,6 @@ package org.jclouds.vcloud.terremark.compute.config; - import java.security.SecureRandom; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -46,9 +45,9 @@ import org.jclouds.vcloud.VCloudExpressAsyncClient; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; -import org.jclouds.vcloud.compute.strategy.VCloudExpressDestroyNodeStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressListNodesStrategy; -import org.jclouds.vcloud.compute.strategy.VCloudExpressRebootNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudDestroyNodeStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudListNodesStrategy; +import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeClient; import org.jclouds.vcloud.terremark.compute.TerremarkVCloudComputeService; import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials; @@ -98,11 +97,11 @@ public class TerremarkVCloudComputeServiceContextModule extends VCloudExpressCom }).in(Scopes.SINGLETON); // NOTE bind(RunNodesAndAddToSetStrategy.class).to(TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy.class); - bind(ListNodesStrategy.class).to(VCloudExpressListNodesStrategy.class); + bind(ListNodesStrategy.class).to(VCloudListNodesStrategy.class); // NOTE bind(GetNodeMetadataStrategy.class).to(TerremarkVCloudGetNodeMetadataStrategy.class); - bind(RebootNodeStrategy.class).to(VCloudExpressRebootNodeStrategy.class); - bind(DestroyNodeStrategy.class).to(VCloudExpressDestroyNodeStrategy.class); + bind(RebootNodeStrategy.class).to(VCloudRebootNodeStrategy.class); + bind(DestroyNodeStrategy.class).to(VCloudDestroyNodeStrategy.class); bindLoadBalancer(); // MORE specifics... bind(new TypeLiteral>() { diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java index 0e8be44799..9fae544875 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/functions/NodeMetadataToOrgAndName.java @@ -30,7 +30,7 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.logging.Logger; import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.endpoints.VDC; import org.jclouds.vcloud.terremark.compute.domain.OrgAndName; @@ -62,7 +62,7 @@ public class NodeMetadataToOrgAndName implements Function credentialsMap; @Inject - protected TerremarkVCloudGetNodeMetadataStrategy(VCloudExpressClient client, - VCloudExpressComputeClient computeClient, Map vAppStatusToNodeState, - GetExtra getExtra, FindLocationForResource findLocationForResourceInVDC, - Supplier> images, ConcurrentMap credentialsMap) { + protected TerremarkVCloudGetNodeMetadataStrategy(CommonVCloudClient client, CommonVCloudComputeClient computeClient, + Map vAppStatusToNodeState, GetExtra getExtra, + FindLocationForResource findLocationForResourceInVDC, Supplier> images, + ConcurrentMap credentialsMap) { super(client, computeClient, vAppStatusToNodeState, getExtra, findLocationForResourceInVDC, images); this.credentialsMap = credentialsMap; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java index 5aa536fecc..3ddffc7b75 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgs.java @@ -32,8 +32,8 @@ import org.jclouds.compute.domain.Image; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.domain.Location; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.compute.functions.ImagesInOrganization; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.compute.functions.ImagesInOrg; +import org.jclouds.vcloud.domain.Org; import com.google.common.base.Function; import com.google.common.base.Supplier; @@ -50,16 +50,16 @@ public class VAppTemplatesInOrgs implements Supplier> { public Logger logger = Logger.NULL; private final Supplier> locations; - private final Function, Iterable> organizatonsForLocations; - private final ImagesInOrganization imagesInOrganization; + private final Function, Iterable> organizatonsForLocations; + private final ImagesInOrg imagesInOrg; @Inject VAppTemplatesInOrgs(Supplier> locations, - Function, Iterable> organizatonsForLocations, - ImagesInOrganization imagesInOrganization) { + Function, Iterable> organizatonsForLocations, + ImagesInOrg imagesInOrg) { this.locations = locations; this.organizatonsForLocations = organizatonsForLocations; - this.imagesInOrganization = imagesInOrganization; + this.imagesInOrg = imagesInOrg; } /** @@ -70,6 +70,6 @@ public class VAppTemplatesInOrgs implements Supplier> { public Set get() { logger.debug(">> providing vAppTemplates"); return newLinkedHashSet(Iterables.concat(Iterables.transform(organizatonsForLocations.apply(locations.get()), - imagesInOrganization))); + imagesInOrg))); } } \ No newline at end of file diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java index f8290e5be6..93c3df0c01 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkVCloudExpressRestClientModule.java @@ -102,7 +102,7 @@ public class TerremarkVCloudExpressRestClientModule extends @Override public NamedResource apply(NamedResource from) { - return client.findOrganizationNamed(from.getName()).getKeysList(); + return client.findOrgNamed(from.getName()).getKeysList(); } }); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrganization.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrg.java similarity index 83% rename from vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrganization.java rename to vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrg.java index 3392bb22cb..cb4f49d1e5 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrganization.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrg.java @@ -20,9 +20,8 @@ package org.jclouds.vcloud.terremark.domain; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrganizationImpl; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl; import org.jclouds.vcloud.terremark.endpoints.KeysList; import com.google.inject.ImplementedBy; @@ -30,9 +29,9 @@ import com.google.inject.ImplementedBy; /** * @author Adrian Cole */ -@Org -@ImplementedBy(TerremarkOrganizationImpl.class) -public interface TerremarkOrganization extends Organization { +@org.jclouds.vcloud.endpoints.Org +@ImplementedBy(TerremarkOrgImpl.class) +public interface TerremarkOrg extends Org { @KeysList NamedResource getKeysList(); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrganizationImpl.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java similarity index 67% rename from vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrganizationImpl.java rename to vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java index 47066b653f..75f8d02494 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrganizationImpl.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java @@ -22,9 +22,11 @@ package org.jclouds.vcloud.terremark.domain.internal; import java.net.URI; import java.util.Map; +import javax.annotation.Nullable; + import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.internal.OrganizationImpl; -import org.jclouds.vcloud.terremark.domain.TerremarkOrganization; +import org.jclouds.vcloud.domain.internal.OrgImpl; +import org.jclouds.vcloud.terremark.domain.TerremarkOrg; /** * Locations of resources in a Terremark vCloud @@ -32,13 +34,14 @@ import org.jclouds.vcloud.terremark.domain.TerremarkOrganization; * @author Adrian Cole * */ -public class TerremarkOrganizationImpl extends OrganizationImpl implements TerremarkOrganization { +public class TerremarkOrgImpl extends OrgImpl implements TerremarkOrg { private final NamedResource keysList; - public TerremarkOrganizationImpl(String name, URI id, Map catalogs, - Map vdcs, Map tasksLists, NamedResource keysList) { - super(name, id, catalogs, vdcs, tasksLists); + public TerremarkOrgImpl(String name, String type, URI id, String description, Map catalogs, + Map vdcs, Map networks, @Nullable NamedResource tasksList, + NamedResource keysList) { + super(name, type, id, description, catalogs, vdcs, networks, tasksList); this.keysList = keysList; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java index 91977d0152..893548934f 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java @@ -24,9 +24,13 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Map; +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.AllocationModel; import org.jclouds.vcloud.domain.Capacity; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Quota; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.VDCStatus; import org.jclouds.vcloud.domain.internal.VDCImpl; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; @@ -45,12 +49,14 @@ public class TerremarkVDCImpl extends VDCImpl implements TerremarkVDC { /** The serialVersionUID */ private static final long serialVersionUID = 8464716396538298809L; - public TerremarkVDCImpl(String name, URI id, String description, Capacity storageCapacity, - Capacity cpuCapacity, Capacity memoryCapacity, Quota instantiatedVmsQuota, Quota deployedVmsQuota, - Map availableNetworks, Map resourceEntities, - NamedResource catalog, NamedResource publicIps, NamedResource internetServices) { - super(name, id, description, storageCapacity, cpuCapacity, memoryCapacity, instantiatedVmsQuota, - deployedVmsQuota, availableNetworks, resourceEntities); + public TerremarkVDCImpl(String name, String type, URI id, VDCStatus status, NamedResource org, + @Nullable String description, Iterable tasks, AllocationModel allocationModel, + @Nullable Capacity storageCapacity, @Nullable Capacity cpuCapacity, @Nullable Capacity memoryCapacity, + Map resourceEntities, Map availableNetworks, int nicQuota, + int networkQuota, int vmQuota, boolean isEnabled, NamedResource catalog, NamedResource publicIps, + NamedResource internetServices) { + super(name, type, id, status, org, description, tasks, allocationModel, storageCapacity, cpuCapacity, + memoryCapacity, resourceEntities, availableNetworks, nicQuota, networkQuota, vmQuota, isEnabled); this.catalog = checkNotNull(catalog, "catalog"); this.publicIps = checkNotNull(publicIps, "publicIps"); this.internetServices = checkNotNull(internetServices, "internetServices"); diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java index 08b7becd85..a8607667c6 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java @@ -26,9 +26,8 @@ import javax.inject.Inject; import javax.inject.Singleton; import org.jclouds.rest.ResourceNotFoundException; -import org.jclouds.vcloud.domain.Organization; -import org.jclouds.vcloud.endpoints.Org; -import org.jclouds.vcloud.terremark.domain.TerremarkOrganization; +import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import com.google.common.base.Function; import com.google.common.base.Supplier; @@ -40,28 +39,27 @@ import com.google.common.collect.Maps; */ @Singleton public class OrgURIToKeysListEndpoint implements Function { - private final Supplier> orgMap; + private final Supplier> orgMap; private final URI defaultOrg; @Inject - public OrgURIToKeysListEndpoint(Supplier> orgMap, @Org URI defaultUri) { + public OrgURIToKeysListEndpoint(Supplier> orgMap, + @org.jclouds.vcloud.endpoints.Org URI defaultUri) { this.orgMap = orgMap; this.defaultOrg = defaultUri; } public URI apply(Object from) { - Map uriToOrg = Maps.uniqueIndex(orgMap.get().values(), - new Function() { + Map uriToOrg = Maps.uniqueIndex(orgMap.get().values(), new Function() { - @Override - public URI apply(Organization from) { - return from.getId(); - } + @Override + public URI apply(Org from) { + return from.getId(); + } - }); + }); try { - return TerremarkOrganization.class.cast(uriToOrg.get(from == null ? defaultOrg : from)).getKeysList() - .getId(); + return TerremarkOrg.class.cast(uriToOrg.get(from == null ? defaultOrg : from)).getKeysList().getId(); } catch (NullPointerException e) { throw new ResourceNotFoundException("org " + from + " not found in " + uriToOrg); } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java index d42a63f195..9dc7d1870d 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java @@ -23,21 +23,22 @@ import static org.jclouds.vcloud.terremark.TerremarkVCloudExpressMediaType.KEYSL import static org.jclouds.vcloud.util.Utils.newNamedResource; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.terremark.domain.TerremarkOrganization; -import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrganizationImpl; -import org.jclouds.vcloud.xml.OrganizationHandler; +import org.jclouds.vcloud.terremark.domain.TerremarkOrg; +import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl; +import org.jclouds.vcloud.xml.OrgHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; /** * @author Adrian Cole */ -public class TerremarkOrgHandler extends OrganizationHandler { +public class TerremarkOrgHandler extends OrgHandler { private NamedResource keysList; - public TerremarkOrganization getResult() { - return new TerremarkOrganizationImpl(org.getName(), org.getId(), catalogs, vdcs, tasksLists, keysList); + public TerremarkOrg getResult() { + return new TerremarkOrgImpl(org.getName(), org.getType(), org.getId(), description, catalogs, vdcs, networks, + tasksList, keysList); } @Override diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java index cd9871e836..1da3d42d76 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkVDCHandler.java @@ -19,12 +19,15 @@ package org.jclouds.vcloud.terremark.xml; +import javax.inject.Inject; + import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.terremark.domain.TerremarkVDC; import org.jclouds.vcloud.terremark.domain.internal.TerremarkVDCImpl; import org.jclouds.vcloud.util.Utils; +import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.VDCHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -34,15 +37,20 @@ import org.xml.sax.SAXException; */ public class TerremarkVDCHandler extends VDCHandler { + @Inject + public TerremarkVDCHandler(TaskHandler taskHandler) { + super(taskHandler); + } + private NamedResource catalog; private NamedResource publicIps; private NamedResource internetServices; public TerremarkVDC getResult() { VDC vDC = super.getResult(); - return new TerremarkVDCImpl(vDC.getName(), vDC.getId(), vDC.getDescription(), vDC.getStorageCapacity(), vDC - .getCpuCapacity(), vDC.getMemoryCapacity(), vDC.getInstantiatedVmsQuota(), vDC.getDeployedVmsQuota(), vDC - .getResourceEntities(), vDC.getAvailableNetworks(), catalog, publicIps, internetServices); + return new TerremarkVDCImpl(vDC.getName(), vDC.getType(), vDC.getId(), status, org, description, tasks, + allocationModel, storageCapacity, cpuCapacity, memoryCapacity, resourceEntities, availableNetworks, + nicQuota, networkQuota, vmQuota, isEnabled, catalog, publicIps, internetServices); } @Override diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java index 14f1ae0d90..c35bf9a469 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java @@ -59,7 +59,7 @@ import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.options.CloneVAppOptions; -import org.jclouds.vcloud.predicates.VCloudExpressTaskSuccess; +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.Node; @@ -444,7 +444,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes // then // default internet // service timeout - successTester = new RetryablePredicate(injector.getInstance(VCloudExpressTaskSuccess.class), 650, 10, TimeUnit.SECONDS); + successTester = new RetryablePredicate(injector.getInstance(TaskSuccess.class), 650, 10, TimeUnit.SECONDS); } protected abstract void setupCredentials(); diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java index 1e9061e857..bf30736e1a 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java @@ -44,18 +44,17 @@ import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.rest.internal.RestAnnotationProcessor; import org.jclouds.util.Utils; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrganizationCatalogItemSupplier; -import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrganizationCatalogSupplier; +import org.jclouds.vcloud.CommonVCloudClient; +import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogItemSupplier; +import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogSupplier; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Organization; +import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.VCloudSession; -import org.jclouds.vcloud.endpoints.Org; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestOrgNameToKeysListSupplier; -import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestTerremarkOrganizationMapSupplier; -import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestTerremarkOrganizationVDCSupplier; +import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestTerremarkOrgMapSupplier; +import org.jclouds.vcloud.terremark.TerremarkVCloudExpressAsyncClientTest.TerremarkVCloudRestClientModuleExtension.TestTerremarkOrgVDCSupplier; import org.jclouds.vcloud.terremark.config.TerremarkVCloudExpressRestClientModule; import org.jclouds.vcloud.terremark.domain.Protocol; import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions; @@ -103,21 +102,6 @@ public class TerremarkECloudAsyncClientTest extends RestClientTestnametrueeggs", - "application/vnd.tmrk.vCloud.nodeService+xml", false); + request, + "nametrueeggs", + "application/vnd.tmrk.vCloud.nodeService+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, NodeHandler.class); assertExceptionParserClassEquals(method, null); @@ -332,16 +316,16 @@ public class TerremarkECloudAsyncClientTest extends RestClientTestnametrue", - "application/vnd.tmrk.vCloud.nodeService+xml", false); + request, + "nametrue", + "application/vnd.tmrk.vCloud.nodeService+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, NodeHandler.class); assertExceptionParserClassEquals(method, null); @@ -385,7 +369,7 @@ public class TerremarkECloudAsyncClientTest extends RestClientTest createContextSpec() { return new RestContextFactory().createContextSpec("trmk-vcloudexpress", "identity", "credential", - new Properties()); + new Properties()); } @RequiresHttp @@ -438,7 +422,7 @@ public class TerremarkECloudAsyncClientTest extends RestClientTest orgs) { + protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return URI.create("https://org"); } @Override - protected String provideOrgName(@Org Iterable orgs) { + protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return "org"; } @Override - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { + protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user) { return URI.create("https://catalog"); } @Override - protected Organization provideOrganization(VCloudExpressClient discovery) { + protected Org provideOrg(CommonVCloudClient discovery) { return null; } @@ -478,17 +462,17 @@ public class TerremarkECloudAsyncClientTest extends RestClientTestnametrueeggs", - "application/vnd.tmrk.vCloud.nodeService+xml", false); + request, + "nametrueeggs", + "application/vnd.tmrk.vCloud.nodeService+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, NodeHandler.class); assertExceptionParserClassEquals(method, null); @@ -413,16 +402,16 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTestnametrue", - "application/vnd.tmrk.vCloud.nodeService+xml", false); + request, + "nametrue", + "application/vnd.tmrk.vCloud.nodeService+xml", false); assertResponseParserClassEquals(method, request, ParseSax.class); assertSaxResponseParserClassEquals(method, NodeHandler.class); assertExceptionParserClassEquals(method, null); @@ -463,11 +452,11 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest createContextSpec() { return new RestContextFactory().createContextSpec("trmk-vcloudexpress", "identity", "credential", - new Properties()); + new Properties()); } @RequiresHttp @@ -613,7 +602,7 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest orgs) { + 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 Iterable orgs) { + protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable orgs) { return "org"; } @Override - protected URI provideCatalog(Organization org, @Named(PROPERTY_IDENTITY) String user) { + protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user) { return URI.create("https://catalog"); } @Override - protected Organization provideOrganization(VCloudExpressClient discovery) { + protected Org provideOrg(CommonVCloudClient discovery) { return null; } @@ -667,7 +656,7 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest get() { - return ImmutableMap. of("org", new TerremarkOrganizationImpl("org", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), ImmutableMap. of( - "catalog", new NamedResourceImpl("catalog", TerremarkVCloudExpressMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap - . of("vdc", new NamedResourceImpl("vdc", - TerremarkVCloudExpressMediaType.VDC_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap - . of("tasksList", new NamedResourceImpl("tasksList", - TerremarkVCloudExpressMediaType.TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))), - new NamedResourceImpl("keysList", TerremarkVCloudExpressMediaType.KEYSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")))); + 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 NamedResourceImpl("catalog", + TerremarkVCloudExpressMediaType.CATALOG_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap + . of("vdc", new NamedResourceImpl("vdc", + TerremarkVCloudExpressMediaType.VDC_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), null, + new NamedResourceImpl("tasksList", TerremarkVCloudExpressMediaType.TASKSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")), new NamedResourceImpl( + "keysList", TerremarkVCloudExpressMediaType.KEYSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")))); } } @Singleton - public static class TestTerremarkOrganizationVDCSupplier extends OrganizationVDCSupplier { + public static class TestTerremarkOrgVDCSupplier extends OrgVDCSupplier { @Inject - protected TestTerremarkOrganizationVDCSupplier() { + protected TestTerremarkOrgVDCSupplier() { super(null, null); } @@ -711,30 +700,32 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest> get() { return ImmutableMap.> of("org", - ImmutableMap. of("vdc", new TerremarkVDCImpl("vdc", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"), "description", null, null, null, null, - null, ImmutableMap. of("vapp", new NamedResourceImpl("vapp", - "application/vnd.vmware.vcloud.vApp+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), "network", - new NamedResourceImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), ImmutableMap - . of(), new NamedResourceImpl("catalog", - TerremarkVCloudExpressMediaType.CATALOG_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")), new NamedResourceImpl( - "publicIps", TerremarkVCloudExpressMediaType.PUBLICIPSLIST_XML, URI + 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_MODEL, 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 NamedResourceImpl("vapp", + "application/vnd.vmware.vcloud.vApp+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")), "network", + new NamedResourceImpl("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 NamedResourceImpl("catalog", + TerremarkVCloudExpressMediaType.CATALOG_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")), + new NamedResourceImpl("publicIps", TerremarkVCloudExpressMediaType.PUBLICIPSLIST_XML, URI .create("https://vcloud.safesecureweb.com/api/v0.8/publicIps/1")), new NamedResourceImpl( - "internetServices", TerremarkVCloudExpressMediaType.INTERNETSERVICESLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/internetServices/1"))))); + "internetServices", TerremarkVCloudExpressMediaType.INTERNETSERVICESLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/internetServices/1"))))); } } @Override - protected URI provideDefaultTasksList(Organization org) { + protected URI provideDefaultTasksList(Org org) { return URI.create("https://taskslist"); } @Override - protected URI provideDefaultVDC(Organization org) { + protected URI provideDefaultVDC(Org org) { return URI.create("https://vdc/1"); } @@ -744,7 +735,7 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest response = vCloudExpressClient.listKeyPairsInOrg(null); assertNotNull(response); System.err.println(response); @@ -65,7 +65,7 @@ public class TerremarkVCloudExpressClientLiveTest extends TerremarkClientLiveTes protected void prepare() { TerremarkVCloudExpressClient vCloudExpressClient = TerremarkVCloudExpressClient.class.cast(tmClient); - TerremarkOrganization org = vCloudExpressClient.findOrganizationNamed(null); + TerremarkOrg org = vCloudExpressClient.findOrgNamed(null); try { key = vCloudExpressClient.generateKeyPairInOrg(org.getId(), "livetest", false); } catch (IllegalStateException e) { diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgsLiveTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgsLiveTest.java index 89f3856ec8..75ef572061 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgsLiveTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/suppliers/VAppTemplatesInOrgsLiveTest.java @@ -30,7 +30,7 @@ import org.jclouds.lifecycle.Closer; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContextFactory; import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.functions.AllCatalogItemsInOrganization; +import org.jclouds.vcloud.functions.AllCatalogItemsInOrg; import org.jclouds.vcloud.terremark.TerremarkVCloudClient; import org.testng.annotations.AfterGroups; import org.testng.annotations.BeforeGroups; @@ -52,7 +52,7 @@ public class VAppTemplatesInOrgsLiveTest { private TerremarkVCloudClient tmClient; private VAppTemplatesInOrgs parser; private Closer closer; - private AllCatalogItemsInOrganization allCatalogItemsInOrganization; + private AllCatalogItemsInOrg allCatalogItemsInOrg; @BeforeGroups(groups = { "live" }) public void setupClient() { @@ -64,7 +64,7 @@ public class VAppTemplatesInOrgsLiveTest { ImmutableSet. of(new Log4JLoggingModule())).buildInjector(); tmClient = injector.getInstance(TerremarkVCloudClient.class); - allCatalogItemsInOrganization = injector.getInstance(AllCatalogItemsInOrganization.class); + allCatalogItemsInOrg = injector.getInstance(AllCatalogItemsInOrg.class); parser = injector.getInstance(VAppTemplatesInOrgs.class); closer = injector.getInstance(Closer.class); } @@ -74,8 +74,8 @@ public class VAppTemplatesInOrgsLiveTest { Set images = parser.get(); - Iterable templates = allCatalogItemsInOrganization.apply(tmClient - .findOrganizationNamed(null)); + Iterable templates = allCatalogItemsInOrg.apply(tmClient + .findOrgNamed(null)); assertEquals(images.size(), Iterables.size(templates)); assert images.size() > 0; diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java index 478bffa0cc..b074547df4 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java @@ -20,8 +20,8 @@ package org.jclouds.vcloud.terremark.xml; import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOG_XML; -import static org.jclouds.vcloud.VCloudExpressMediaType.TASKSLIST_XML; +import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML; +import static org.jclouds.vcloud.VCloudMediaType.TASKSLIST_XML; import static org.testng.Assert.assertEquals; import java.io.InputStream; @@ -35,7 +35,7 @@ import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressMediaType; import org.jclouds.vcloud.terremark.TerremarkVCloudPropertiesBuilder; -import org.jclouds.vcloud.terremark.domain.TerremarkOrganization; +import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; @@ -59,7 +59,7 @@ public class TerremarkOrgHandlerTest extends BaseHandlerTest { super.configure(); Properties props = new Properties(); Names.bindProperties(binder(), checkNotNull(new TerremarkVCloudPropertiesBuilder(props).build(), - "properties")); + "properties")); } }); factory = injector.getInstance(ParseSax.Factory.class); @@ -70,23 +70,19 @@ public class TerremarkOrgHandlerTest extends BaseHandlerTest { InputStream is = getClass().getResourceAsStream("/terremark/org.xml"); - TerremarkOrganization result = (TerremarkOrganization) factory.create( - injector.getInstance(TerremarkOrgHandler.class)).parse(is); + TerremarkOrg result = (TerremarkOrg) factory.create(injector.getInstance(TerremarkOrgHandler.class)).parse(is); assertEquals(result.getName(), "adrian@jclouds.org"); - assertEquals(result.getId(), URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/org/48")); + assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/org/48")); assertEquals(result.getCatalogs(), ImmutableMap.of("Miami Environment 1 Catalog", new NamedResourceImpl( - "Miami Environment 1 Catalog", CATALOG_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32/catalog")))); - + "Miami Environment 1 Catalog", CATALOG_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32/catalog")))); assertEquals(result.getVDCs(), ImmutableMap.of("Miami Environment 1", new NamedResourceImpl( - "Miami Environment 1", VCloudExpressMediaType.VDC_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32")))); - assertEquals(result.getTasksLists(), ImmutableMap.of("Miami Environment 1 Tasks List", new NamedResourceImpl( - "Miami Environment 1 Tasks List", TASKSLIST_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32/tasksList")))); + "Miami Environment 1", VCloudExpressMediaType.VDC_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32")))); + assertEquals(result.getTasksList(), new NamedResourceImpl("Miami Environment 1 Tasks List", TASKSLIST_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32/tasksList"))); assertEquals(result.getKeysList(), new NamedResourceImpl("Keys", TerremarkVCloudExpressMediaType.KEYSLIST_XML, - URI.create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/extensions/org/48/keys"))); + URI.create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/extensions/org/48/keys"))); } } diff --git a/vcloud/terremark/src/test/resources/terremark/vdc.xml b/vcloud/terremark/src/test/resources/terremark/vdc.xml index 9e4cdcd286..d5df92fb9f 100644 --- a/vcloud/terremark/src/test/resources/terremark/vdc.xml +++ b/vcloud/terremark/src/test/resources/terremark/vdc.xml @@ -3,6 +3,29 @@ + + bytes * 10^9 + 100 + 8 + + + + hz * 10^6 + 5000 + + + bytes * 2^20 + 10240 + + + -1 + -1 + + + -1 + -1 + + From 13c982834565deaf02a680d22a2e7d542e896ea6 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 22 Aug 2010 14:35:13 -0700 Subject: [PATCH 10/16] Issue 280: converged vcloud 0.8 and 1.0 OrgNetwork objects --- .../vcloud/CommonVCloudAsyncClient.java | 12 +- .../jclouds/vcloud/CommonVCloudClient.java | 46 +-- .../vcloud/VCloudExpressAsyncClient.java | 30 ++ .../VCloudExpressPropertiesBuilder.java | 4 +- .../vcloud/VCloudPropertiesBuilder.java | 8 +- ...antiateVAppTemplateParamsToXmlPayload.java | 158 ++++----- .../jclouds/vcloud/domain/FirewallRule.java | 107 ------ .../jclouds/vcloud/domain/MappingMode.java | 53 +++ .../org/jclouds/vcloud/domain/NatRule.java | 119 ------- .../jclouds/vcloud/domain/VirtualSystem.java | 76 ++-- .../vcloud/domain/network/DhcpService.java | 128 +++++++ .../vcloud/domain/network/Features.java | 115 +++++++ .../vcloud/domain/network/FenceMode.java | 69 ++++ .../domain/network/FirewallService.java | 98 ++++++ .../vcloud/domain/network/IpRange.java | 90 +++++ .../vcloud/domain/network/IpScope.java | 192 +++++++++++ .../vcloud/domain/network/NatService.java | 137 ++++++++ .../vcloud/domain/network/OrgNetwork.java | 125 +++++++ .../VCloudExpressNetwork.java} | 12 +- .../network/firewall/FirewallPolicy.java | 57 +++ .../network/firewall/FirewallProtocols.java | 63 ++++ .../domain/network/firewall/FirewallRule.java | 156 +++++++++ .../network/internal/OrgNetworkImpl.java | 281 +++++++++++++++ .../internal/VCloudExpressNetworkImpl.java} | 36 +- .../VCloudExpressOrgNetworkAdapter.java | 66 ++++ .../vcloud/domain/network/nat/NatPolicy.java | 57 +++ .../nat/NatProtocol.java} | 29 +- .../vcloud/domain/network/nat/NatRule.java | 38 ++ .../vcloud/domain/network/nat/NatType.java | 60 ++++ .../network/nat/rules/OneToOneVmRule.java | 90 +++++ .../network/nat/rules/PortForwardingRule.java | 137 ++++++++ .../domain/network/nat/rules/VmRule.java | 157 +++++++++ .../InstantiateVAppTemplateOptions.java | 12 +- ...etworkFromVCloudExpressNetworkHandler.java | 59 ++++ .../jclouds/vcloud/xml/OrgNetworkHandler.java | 325 ++++++++++++++++++ ....java => VCloudExpressNetworkHandler.java} | 49 +-- .../vcloud/CommonVCloudClientLiveTest.java | 4 +- .../jclouds/vcloud/VCloudAsyncClientTest.java | 4 +- .../vcloud/VCloudExpressAsyncClientTest.java | 7 +- ...ateVAppTemplateParamsToXmlPayloadTest.java | 4 +- ...ateVAppTemplateParamsToXmlPayloadTest.java | 4 +- .../VCloudExpressOrgNetworkAdapterTest.java | 110 ++++++ .../InstantiateVAppTemplateOptionsTest.java | 6 +- .../vcloud/xml/NetworkHandlerTest.java | 76 ---- .../vcloud/xml/OrgNetworkHandlerTest.java | 107 ++++++ .../xml/VCloudExpressNetworkHandlerTest.java | 91 +++++ .../jclouds/vcloud/xml/VDCHandlerTest.java | 2 + .../resources/express/network-bluelock.xml | 13 + .../{ => express}/network-hosting.xml | 0 .../{ => express}/network-terremark.xml | 0 .../src/test/resources/orgnetwork-bridged.xml | 20 ++ .../test/resources/orgnetwork-isolated.xml | 31 ++ ...antiateVAppTemplateParamsToXmlPayload.java | 34 +- 53 files changed, 3192 insertions(+), 572 deletions(-) delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/FirewallRule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/MappingMode.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/NatRule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/DhcpService.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/Features.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FenceMode.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FirewallService.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpRange.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpScope.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/NatService.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/OrgNetwork.java rename vcloud/core/src/main/java/org/jclouds/vcloud/domain/{Network.java => network/VCloudExpressNetwork.java} (82%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallPolicy.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallProtocols.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallRule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/OrgNetworkImpl.java rename vcloud/core/src/main/java/org/jclouds/vcloud/domain/{internal/NetworkImpl.java => network/internal/VCloudExpressNetworkImpl.java} (79%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressOrgNetworkAdapter.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatPolicy.java rename vcloud/core/src/main/java/org/jclouds/vcloud/domain/{FenceMode.java => network/nat/NatProtocol.java} (62%) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatRule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatType.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/OneToOneVmRule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/PortForwardingRule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/VmRule.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkFromVCloudExpressNetworkHandler.java create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkHandler.java rename vcloud/core/src/main/java/org/jclouds/vcloud/xml/{NetworkHandler.java => VCloudExpressNetworkHandler.java} (70%) create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressOrgNetworkAdapterTest.java delete mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/xml/NetworkHandlerTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgNetworkHandlerTest.java create mode 100644 vcloud/core/src/test/java/org/jclouds/vcloud/xml/VCloudExpressNetworkHandlerTest.java create mode 100644 vcloud/core/src/test/resources/express/network-bluelock.xml rename vcloud/core/src/test/resources/{ => express}/network-hosting.xml (100%) rename vcloud/core/src/test/resources/{ => express}/network-terremark.xml (100%) create mode 100644 vcloud/core/src/test/resources/orgnetwork-bridged.xml create mode 100644 vcloud/core/src/test/resources/orgnetwork-isolated.xml diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java index dd8b1a11eb..85fce4fd50 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudAsyncClient.java @@ -46,13 +46,13 @@ import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Network; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.domain.network.OrgNetwork; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.functions.OrgNameAndCatalogNameToEndpoint; import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; @@ -63,8 +63,8 @@ import org.jclouds.vcloud.functions.OrgNameToTasksListEndpoint; import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.CatalogItemHandler; -import org.jclouds.vcloud.xml.NetworkHandler; import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.OrgNetworkHandler; import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.TasksListHandler; import org.jclouds.vcloud.xml.VAppHandler; @@ -169,9 +169,9 @@ public interface CommonVCloudAsyncClient { */ @GET @Consumes(NETWORK_XML) - @XMLResponseParser(NetworkHandler.class) + @XMLResponseParser(OrgNetworkHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture findNetworkInOrgVDCNamed( + ListenableFuture findNetworkInOrgVDCNamed( @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); @@ -181,9 +181,9 @@ public interface CommonVCloudAsyncClient { */ @GET @Consumes(NETWORK_XML) - @XMLResponseParser(NetworkHandler.class) + @XMLResponseParser(OrgNetworkHandler.class) @ExceptionParser(ReturnNullOnNotFoundOr404.class) - ListenableFuture getNetwork(@EndpointParam URI network); + ListenableFuture getNetwork(@EndpointParam URI network); /** * @see VCloudClient#getVDC(URI) diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java index 752194cfc2..c64eafc70d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/CommonVCloudClient.java @@ -28,21 +28,19 @@ import javax.annotation.Nullable; import org.jclouds.concurrent.Timeout; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.Network; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.TasksList; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.domain.network.OrgNetwork; /** * Provides access to VCloud resources via their REST API. *

* - * @see + * @see * @author Adrian Cole */ @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS) @@ -51,8 +49,8 @@ public interface CommonVCloudClient { Org getOrg(URI orgId); /** - * This call returns a list of all vCloud Data Centers (vdcs), catalogs, and - * task lists within the organization. + * This call returns a list of all vCloud Data Centers (vdcs), catalogs, and task lists within + * the organization. * * @param name * organization name, or null for the default @@ -64,8 +62,8 @@ public interface CommonVCloudClient { Catalog getCatalog(URI catalogId); /** - * returns the catalog in the organization associated with the specified - * name. Note that both parameters can be null to choose default. + * returns the catalog in the organization associated with the specified name. Note that both + * parameters can be null to choose default. * * @param orgName * organization name, or null for the default @@ -79,9 +77,8 @@ public interface CommonVCloudClient { CatalogItem getCatalogItem(URI catalogItem); /** - * returns the catalog item in the catalog associated with the specified - * name. Note that the org and catalog parameters can be null to choose - * default. + * returns the catalog item in the catalog associated with the specified name. Note that the org + * and catalog parameters can be null to choose default. * * @param orgName * organization name, or null for the default @@ -91,17 +88,15 @@ public interface CommonVCloudClient { * item you wish to lookup * * @throws NoSuchElementException - * if you specified an org, catalog, or catalog item name that - * isn't present + * if you specified an org, catalog, or catalog item name that isn't present */ CatalogItem findCatalogItemInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, String itemName); VAppTemplate getVAppTemplate(URI vAppTemplate); /** - * returns the vapp template corresponding to a catalog item in the catalog - * associated with the specified name. Note that the org and catalog - * parameters can be null to choose default. + * returns the vapp template corresponding to a catalog item in the catalog associated with the + * specified name. Note that the org and catalog parameters can be null to choose default. * * @param orgName * organization name, or null for the default @@ -111,21 +106,20 @@ public interface CommonVCloudClient { * item you wish to lookup * * @throws NoSuchElementException - * if you specified an org, catalog, or catalog item name that - * isn't present + * if you specified an org, catalog, or catalog item name that isn't present */ VAppTemplate findVAppTemplateInOrgCatalogNamed(@Nullable String orgName, @Nullable String catalogName, - String itemName); + String itemName); - Network findNetworkInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String networkName); + OrgNetwork findNetworkInOrgVDCNamed(@Nullable String orgName, @Nullable String catalogName, String networkName); - Network getNetwork(URI network); + OrgNetwork getNetwork(URI network); VDC getVDC(URI vdc); /** - * returns the VDC in the organization associated with the specified name. - * Note that both parameters can be null to choose default. + * returns the VDC in the organization associated with the specified name. Note that both + * parameters can be null to choose default. * * @param orgName * organization name, or null for the default @@ -147,14 +141,12 @@ public interface CommonVCloudClient { Task undeployVApp(URI vAppId); /** - * This call powers on the vApp, as specified in the vApp's ovf:Startup - * element. + * This call powers on the vApp, as specified in the vApp's ovf:Startup element. */ Task powerOnVApp(URI vAppId); /** - * This call powers off the vApp, as specified in the vApp's ovf:Startup - * element. + * This call powers off the vApp, as specified in the vApp's ovf:Startup element. */ Task powerOffVApp(URI vAppId); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java index 3849c9fca1..68413d4266 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressAsyncClient.java @@ -19,30 +19,38 @@ package org.jclouds.vcloud; +import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML; import static org.jclouds.vcloud.VCloudMediaType.TASK_XML; import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; import java.net.URI; +import javax.annotation.Nullable; import javax.ws.rs.Consumes; +import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import org.jclouds.predicates.validators.DnsNameValidator; import org.jclouds.rest.annotations.EndpointParam; +import org.jclouds.rest.annotations.ExceptionParser; import org.jclouds.rest.annotations.MapBinder; import org.jclouds.rest.annotations.MapPayloadParam; import org.jclouds.rest.annotations.ParamValidators; import org.jclouds.rest.annotations.RequestFilters; import org.jclouds.rest.annotations.XMLResponseParser; +import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; import org.jclouds.vcloud.binders.BindCloneVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; +import org.jclouds.vcloud.domain.network.OrgNetwork; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; +import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; +import org.jclouds.vcloud.xml.OrgNetworkFromVCloudExpressNetworkHandler; import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.VAppHandler; @@ -57,6 +65,28 @@ import com.google.common.util.concurrent.ListenableFuture; */ @RequestFilters(SetVCloudTokenCookie.class) public interface VCloudExpressAsyncClient extends CommonVCloudAsyncClient { + /** + * @see VCloudClient#findNetworkInOrgVDCNamed + */ + @Override + @GET + @Consumes(NETWORK_XML) + @XMLResponseParser(OrgNetworkFromVCloudExpressNetworkHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture findNetworkInOrgVDCNamed( + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); + + /** + * @see VCloudClient#getNetwork + */ + @Override + @GET + @Consumes(NETWORK_XML) + @XMLResponseParser(OrgNetworkFromVCloudExpressNetworkHandler.class) + @ExceptionParser(ReturnNullOnNotFoundOr404.class) + ListenableFuture getNetwork(@EndpointParam URI network); /** * @see VCloudExpressClient#instantiateVAppTemplateInVDC diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java index d964e99bb8..81af12ab81 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudExpressPropertiesBuilder.java @@ -30,7 +30,7 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_S import java.util.Properties; import org.jclouds.PropertiesBuilder; -import org.jclouds.vcloud.domain.FenceMode; +import org.jclouds.vcloud.domain.network.FenceMode; /** * Builds properties used in VCloud Clients @@ -67,7 +67,7 @@ public class VCloudExpressPropertiesBuilder extends PropertiesBuilder { if (properties.getProperty(PROPERTY_VCLOUD_VERSION_SCHEMA).startsWith("0.8")) properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, "allowInOut"); else - properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, FenceMode.BRIDGED); + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, FenceMode.BRIDGED.toString()); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java index a357ab9bc8..10e71ee79d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/VCloudPropertiesBuilder.java @@ -30,7 +30,7 @@ import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_S import java.util.Properties; import org.jclouds.PropertiesBuilder; -import org.jclouds.vcloud.domain.FenceMode; +import org.jclouds.vcloud.domain.network.FenceMode; /** * Builds properties used in VCloud Clients @@ -44,11 +44,10 @@ public class VCloudPropertiesBuilder extends PropertiesBuilder { properties.setProperty(PROPERTY_API_VERSION, "1.0"); properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "1.0"); properties.setProperty(PROPERTY_SESSION_INTERVAL, 8 * 60 + ""); - properties.setProperty(PROPERTY_VCLOUD_XML_SCHEMA, - "http://vcloud.safesecureweb.com/ns/vcloud.xsd"); + properties.setProperty(PROPERTY_VCLOUD_XML_SCHEMA, "http://vcloud.safesecureweb.com/ns/vcloud.xsd"); properties.setProperty("jclouds.dns_name_length_min", "1"); properties.setProperty("jclouds.dns_name_length_max", "80"); - properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, FenceMode.BRIDGED); + properties.setProperty(PROPERTY_VCLOUD_DEFAULT_FENCEMODE, FenceMode.BRIDGED.toString()); properties.setProperty(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED, 180l * 1000l + ""); return properties; } @@ -63,7 +62,6 @@ public class VCloudPropertiesBuilder extends PropertiesBuilder { + properties.getProperty(PROPERTY_VCLOUD_VERSION_SCHEMA)); } - public VCloudPropertiesBuilder withApiVersion(String version) { properties.setProperty(PROPERTY_API_VERSION, "1.0"); return this; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java b/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java index 73cffaa522..b4309ac4a1 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/binders/BindInstantiateVAppTemplateParamsToXmlPayload.java @@ -22,6 +22,7 @@ package org.jclouds.vcloud.binders; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; +import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_FENCEMODE; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_NETWORK; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE; @@ -63,21 +64,19 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder protected final String ns; protected final String schema; private final BindToStringPayload stringBinder; - protected final Map virtualHardwareToInstanceId = ImmutableMap - .of(ResourceType.PROCESSOR, "1", ResourceType.MEMORY, "2", - ResourceType.DISK_DRIVE, "9"); + protected final Map virtualHardwareToInstanceId = ImmutableMap.of(ResourceType.PROCESSOR, "1", + ResourceType.MEMORY, "2", ResourceType.DISK_DRIVE, "9"); private final URI defaultNetwork; private final String defaultFenceMode; + private final String apiVersion; @Inject - public BindInstantiateVAppTemplateParamsToXmlPayload( - BindToStringPayload stringBinder, - @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, - @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, - @Named(PROPERTY_VCLOUD_DEFAULT_NETWORK) String network, - @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode - ) { + public BindInstantiateVAppTemplateParamsToXmlPayload(BindToStringPayload stringBinder, + @Named(PROPERTY_API_VERSION) String apiVersion, @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, + @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Named(PROPERTY_VCLOUD_DEFAULT_NETWORK) String network, + @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) { this.ns = ns; + this.apiVersion = apiVersion; this.schema = schema; this.stringBinder = stringBinder; this.defaultNetwork = URI.create(network); @@ -86,17 +85,14 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder @SuppressWarnings("unchecked") public void bindToRequest(HttpRequest request, Map postParams) { - checkArgument( - checkNotNull(request, "request") instanceof GeneratedHttpRequest, - "this binder is only valid for GeneratedHttpRequests!"); + checkArgument(checkNotNull(request, "request") instanceof GeneratedHttpRequest, + "this binder is only valid for GeneratedHttpRequests!"); GeneratedHttpRequest gRequest = (GeneratedHttpRequest) request; - checkState(gRequest.getArgs() != null, - "args should be initialized at this point"); + checkState(gRequest.getArgs() != null, "args should be initialized at this point"); String name = checkNotNull(postParams.remove("name"), "name"); String template = checkNotNull(postParams.remove("template"), "template"); - SortedMap virtualHardwareQuantity = Maps - .newTreeMap(); + SortedMap virtualHardwareQuantity = Maps.newTreeMap(); InstantiateVAppTemplateOptions options = findOptionsInArgsOrNull(gRequest); Map properties = Maps.newTreeMap(); @@ -106,14 +102,15 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder if (options != null) { network = ifNullDefaultTo(options.getNetwork(), network); fenceMode = ifNullDefaultTo(options.getFenceMode(), defaultFenceMode); + if (apiVersion.indexOf("0.8") != -1 && fenceMode.equals("bridged")) + fenceMode = "allowInOut"; networkName = ifNullDefaultTo(options.getNetworkName(), networkName); addQuantity(options, virtualHardwareQuantity); properties.putAll(options.getProperties()); } try { - stringBinder.bindToRequest(request, generateXml(name, template, - properties, virtualHardwareQuantity, networkName, fenceMode, URI - .create(network))); + stringBinder.bindToRequest(request, generateXml(name, template, properties, virtualHardwareQuantity, + networkName, fenceMode, URI.create(network))); } catch (ParserConfigurationException e) { throw new RuntimeException(e); } catch (FactoryConfigurationError e) { @@ -124,99 +121,73 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder } - protected String generateXml(String name, String template, - Map properties, - SortedMap virtualHardwareQuantity, - String networkName, @Nullable String fenceMode, URI network) - throws ParserConfigurationException, FactoryConfigurationError, - TransformerException { + protected String generateXml(String name, String template, Map properties, + SortedMap virtualHardwareQuantity, String networkName, @Nullable String fenceMode, + URI network) throws ParserConfigurationException, FactoryConfigurationError, TransformerException { XMLBuilder rootBuilder = buildRoot(name); rootBuilder.e("VAppTemplate").a("href", template); - XMLBuilder instantiationParamsBuilder = rootBuilder - .e("InstantiationParams"); + XMLBuilder instantiationParamsBuilder = rootBuilder.e("InstantiationParams"); addPropertiesifPresent(instantiationParamsBuilder, properties); - addVirtualQuantityIfPresent(instantiationParamsBuilder, - virtualHardwareQuantity); - addNetworkConfig(instantiationParamsBuilder, networkName, fenceMode, - network); + addVirtualQuantityIfPresent(instantiationParamsBuilder, virtualHardwareQuantity); + addNetworkConfig(instantiationParamsBuilder, networkName, fenceMode, network); Properties outputProperties = new Properties(); - outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, - "yes"); + outputProperties.put(javax.xml.transform.OutputKeys.OMIT_XML_DECLARATION, "yes"); return rootBuilder.asString(outputProperties); } - protected void addPropertiesifPresent(XMLBuilder instantiationParamsBuilder, - Map properties) { + protected void addPropertiesifPresent(XMLBuilder instantiationParamsBuilder, Map properties) { if (properties.size() > 0) { - XMLBuilder productSectionBuilder = instantiationParamsBuilder.e( - "ProductSection").a("xmlns:q1", ns).a("xmlns:ovf", - "http://schemas.dmtf.org/ovf/envelope/1"); + XMLBuilder productSectionBuilder = instantiationParamsBuilder.e("ProductSection").a("xmlns:q1", ns).a( + "xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1"); for (Entry entry : properties.entrySet()) { - productSectionBuilder.e("Property").a("xmlns", - "http://schemas.dmtf.org/ovf/envelope/1").a("ovf:key", - entry.getKey()).a("ovf:value", entry.getValue()); + productSectionBuilder.e("Property").a("xmlns", "http://schemas.dmtf.org/ovf/envelope/1").a("ovf:key", + entry.getKey()).a("ovf:value", entry.getValue()); } } } - protected void addNetworkConfig(XMLBuilder instantiationParamsBuilder, - String name, @Nullable String fenceMode, URI network) { - XMLBuilder networkConfigBuilder = instantiationParamsBuilder.e( - "NetworkConfigSection").e("NetworkConfig").a("name", name); + protected void addNetworkConfig(XMLBuilder instantiationParamsBuilder, String name, @Nullable String fenceMode, + URI network) { + XMLBuilder networkConfigBuilder = instantiationParamsBuilder.e("NetworkConfigSection").e("NetworkConfig").a( + "name", name); if (fenceMode != null) { XMLBuilder featuresBuilder = networkConfigBuilder.e("Features"); featuresBuilder.e("FenceMode").t(fenceMode); } - networkConfigBuilder.e("NetworkAssociation").a("href", - network.toASCIIString()); + networkConfigBuilder.e("NetworkAssociation").a("href", network.toASCIIString()); } - protected void addVirtualQuantityIfPresent( - XMLBuilder instantiationParamsBuilder, - SortedMap virtualHardwareQuantity) { + protected void addVirtualQuantityIfPresent(XMLBuilder instantiationParamsBuilder, + SortedMap virtualHardwareQuantity) { if (virtualHardwareQuantity.size() > 0) { - XMLBuilder virtualHardwareSectionBuilder = instantiationParamsBuilder - .e("VirtualHardwareSection").a("xmlns:q1", ns); - for (Entry entry : virtualHardwareQuantity - .entrySet()) { - XMLBuilder itemBuilder = virtualHardwareSectionBuilder.e("Item").a( - "xmlns", "http://schemas.dmtf.org/ovf/envelope/1"); - itemBuilder - .e("InstanceID") - .a( - "xmlns", - "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData") - .t(virtualHardwareToInstanceId.get(entry.getKey())); - itemBuilder - .e("ResourceType") - .a( - "xmlns", - "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData") - .t(entry.getKey().value()); - itemBuilder - .e("VirtualQuantity") - .a( - "xmlns", - "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData") - .t(entry.getValue()); + XMLBuilder virtualHardwareSectionBuilder = instantiationParamsBuilder.e("VirtualHardwareSection").a( + "xmlns:q1", ns); + for (Entry entry : virtualHardwareQuantity.entrySet()) { + XMLBuilder itemBuilder = virtualHardwareSectionBuilder.e("Item").a("xmlns", + "http://schemas.dmtf.org/ovf/envelope/1"); + itemBuilder.e("InstanceID").a("xmlns", + "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData").t( + virtualHardwareToInstanceId.get(entry.getKey())); + itemBuilder.e("ResourceType").a("xmlns", + "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData").t( + entry.getKey().value()); + itemBuilder.e("VirtualQuantity").a("xmlns", + "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/CIM_ResourceAllocationSettingData").t( + entry.getValue()); } } } - protected XMLBuilder buildRoot(String name) - throws ParserConfigurationException, FactoryConfigurationError { - XMLBuilder rootBuilder = XMLBuilder.create( - "InstantiateVAppTemplateParams").a("name", name).a("xmlns", ns).a( - "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance").a( - "xsi:schemaLocation", ns + " " + schema).a("xmlns:ovf", - "http://schemas.dmtf.org/ovf/envelope/1"); + protected XMLBuilder buildRoot(String name) throws ParserConfigurationException, FactoryConfigurationError { + XMLBuilder rootBuilder = XMLBuilder.create("InstantiateVAppTemplateParams").a("name", name).a("xmlns", ns).a( + "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance").a("xsi:schemaLocation", ns + " " + schema).a( + "xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1"); return rootBuilder; } - protected InstantiateVAppTemplateOptions findOptionsInArgsOrNull( - GeneratedHttpRequest gRequest) { + protected InstantiateVAppTemplateOptions findOptionsInArgsOrNull(GeneratedHttpRequest gRequest) { for (Object arg : gRequest.getArgs()) { if (arg instanceof InstantiateVAppTemplateOptions) { return (InstantiateVAppTemplateOptions) arg; @@ -228,28 +199,23 @@ public class BindInstantiateVAppTemplateParamsToXmlPayload implements MapBinder return null; } - private void addQuantity(InstantiateVAppTemplateOptions options, - Map virtualHardwareQuantity) { + private void addQuantity(InstantiateVAppTemplateOptions options, Map virtualHardwareQuantity) { if (options.getCpuCount() != null) { - virtualHardwareQuantity.put(ResourceType.PROCESSOR, options - .getCpuCount()); + virtualHardwareQuantity.put(ResourceType.PROCESSOR, options.getCpuCount()); } if (options.getMemorySizeMegabytes() != null) { - virtualHardwareQuantity.put(ResourceType.MEMORY, options - .getMemorySizeMegabytes()); + virtualHardwareQuantity.put(ResourceType.MEMORY, options.getMemorySizeMegabytes()); } if (options.getDiskSizeKilobytes() != null) { - virtualHardwareQuantity.put(ResourceType.DISK_DRIVE, options - .getDiskSizeKilobytes()); + virtualHardwareQuantity.put(ResourceType.DISK_DRIVE, options.getDiskSizeKilobytes()); } } public void bindToRequest(HttpRequest request, Object input) { - throw new IllegalStateException( - "InstantiateVAppTemplateParams is needs parameters"); + throw new IllegalStateException("InstantiateVAppTemplateParams is needs parameters"); } - protected String ifNullDefaultTo(String value, String defaultValue) { - return value != null ? value : checkNotNull(defaultValue, "defaultValue"); + protected String ifNullDefaultTo(Object value, String defaultValue) { + return value != null ? value.toString() : checkNotNull(defaultValue, "defaultValue"); } } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/FirewallRule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/FirewallRule.java deleted file mode 100644 index 714030a6ad..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/FirewallRule.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * - * Copyright (C) 2010 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.domain; - -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.common.base.CaseFormat; - -/** - * @author Adrian Cole - */ -public class FirewallRule { - public static enum Policy { - DENY, ALLOW; - - public String value() { - return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); - } - - @Override - public String toString() { - return value(); - } - - public static Policy fromValue(String policy) { - return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(policy, - "policy"))); - } - - } - - public static enum Protocol { - TCP, UDP, ICMP; - - public String value() { - return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); - } - - @Override - public String toString() { - return value(); - } - - public static Protocol fromValue(String protocol) { - return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull( - protocol, "protocol"))); - } - - } - - private final Policy policy; - private final Protocol protocol; - private final String sourceIP; - private final String sourcePort; - - public FirewallRule(Policy policy, Protocol protocol, String sourceIP, String sourcePort) { - this.policy = policy; - this.protocol = protocol; - this.sourceIP = sourceIP; - this.sourcePort = sourcePort; - } - - /** - * One of deny, allow - */ - public Policy getPolicy() { - return policy; - } - - /** - * An attribute that specifies the protocol to which the rule applies. One of tcp, udp, icmp - */ - public Protocol getProtocol() { - return protocol; - } - - /** - * An IP address to which this rule applies - */ - public String getSourceIP() { - return sourceIP; - } - - /** - * An IP port or port range to which this rule applies. A value of * specifies all ports. - */ - public String getSourcePort() { - return sourcePort; - } -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/MappingMode.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/MappingMode.java new file mode 100644 index 0000000000..85616e3936 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/MappingMode.java @@ -0,0 +1,53 @@ +/** + * + * Copyright (C) 2010 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.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * The MappingMode element specifies how IP address mapping is implemented by the NAT service. + * + */ +public enum MappingMode { + /** + * the external IP address is specified in the ExternalIP element + */ + MANUAL, + /** + * the external IP address is assigned automatically + */ + AUTOMATIC; + + public String value() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); + } + + @Override + public String toString() { + return value(); + } + + public static MappingMode fromValue(String mode) { + return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(mode, "mode"))); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/NatRule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/NatRule.java deleted file mode 100644 index ca649ae7d2..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/NatRule.java +++ /dev/null @@ -1,119 +0,0 @@ -/** - * - * Copyright (C) 2010 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.domain; - -/** - * Specifies a set of Network Address Translation rules using a pair of IP addresses and a pair of - * IP port numbers. - * - * @author Adrian Cole - */ -public class NatRule { - private final String externalIP; - private final Integer externalPort; - private final String internalIP; - private final Integer internalPort; - - public NatRule(String externalIP, Integer externalPort, String IntegerernalIP, - Integer IntegerernalPort) { - this.externalIP = externalIP; - this.externalPort = externalPort; - this.internalIP = IntegerernalIP; - this.internalPort = IntegerernalPort; - } - - /** - * The externally‐visible IP address. - */ - public String getExternalIP() { - return externalIP; - } - - /** - * The externally‐visible IP port. - */ - public Integer getExternalPort() { - return externalPort; - } - - /** - * The Integerernally‐visible (non‐routable) IP address. - */ - public String getInternalIP() { - return internalIP; - } - - /** - * The Integerernally‐visible IP port. - */ - public Integer getInternalPort() { - return internalPort; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((externalIP == null) ? 0 : externalIP.hashCode()); - result = prime * result + ((externalPort == null) ? 0 : externalPort.hashCode()); - result = prime * result + ((internalIP == null) ? 0 : internalIP.hashCode()); - result = prime * result + ((internalPort == null) ? 0 : internalPort.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - NatRule other = (NatRule) obj; - if (externalIP == null) { - if (other.externalIP != null) - return false; - } else if (!externalIP.equals(other.externalIP)) - return false; - if (externalPort == null) { - if (other.externalPort != null) - return false; - } else if (!externalPort.equals(other.externalPort)) - return false; - if (internalIP == null) { - if (other.internalIP != null) - return false; - } else if (!internalIP.equals(other.internalIP)) - return false; - if (internalPort == null) { - if (other.internalPort != null) - return false; - } else if (!internalPort.equals(other.internalPort)) - return false; - return true; - } - - @Override - public String toString() { - return "NatRule [externalIP=" + externalIP + ", externalPort=" + externalPort - + ", internalIP=" + internalIP + ", internalPort=" + internalPort + "]"; - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VirtualSystem.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VirtualSystem.java index 7413e4d04b..4a748be3b0 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VirtualSystem.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VirtualSystem.java @@ -51,50 +51,48 @@ public class VirtualSystem { } @Override -public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + id; - result = prime * result - + ((identifier == null) ? 0 : identifier.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((type == null) ? 0 : type.hashCode()); - return result; -} + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + id; + result = prime * result + ((identifier == null) ? 0 : identifier.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); + return result; + } @Override -public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - VirtualSystem other = (VirtualSystem) obj; - if (id != other.id) - return false; - if (identifier == null) { - if (other.identifier != null) - return false; - } else if (!identifier.equals(other.identifier)) - return false; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - if (type == null) { - if (other.type != null) - return false; - } else if (!type.equals(other.type)) - return false; - return true; -} + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + VirtualSystem other = (VirtualSystem) obj; + if (id != other.id) + return false; + if (identifier == null) { + if (other.identifier != null) + return false; + } else if (!identifier.equals(other.identifier)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; + return true; + } @Override public String toString() { - return "VirtualSystem [id=" + id + ", identifier=" + identifier + ", name=" + name - + ", type=" + type + "]"; + return "VirtualSystem [id=" + id + ", identifier=" + identifier + ", name=" + name + ", type=" + type + "]"; } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/DhcpService.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/DhcpService.java new file mode 100644 index 0000000000..5dab5ac037 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/DhcpService.java @@ -0,0 +1,128 @@ +/** + * + * Copyright (C) 2010 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.domain.network; + +import javax.annotation.Nullable; + +/** + * specifies the properties of the network’s DHCP service + */ +public class DhcpService { + private final boolean enabled; + @Nullable + private final Integer defaultLeaseTime; + @Nullable + private final Integer maxLeaseTime; + @Nullable + private final IpRange ipRange; + + public DhcpService(boolean enabled, @Nullable Integer defaultLeaseTime, @Nullable Integer maxLeaseTime, + @Nullable IpRange ipRange) { + this.enabled = enabled; + this.defaultLeaseTime = defaultLeaseTime; + this.maxLeaseTime = maxLeaseTime; + this.ipRange = ipRange; + } + + /** + * @return true if the service is enabled + * + * @since vcloud api 0.8 + */ + public boolean isEnabled() { + return enabled; + } + + /** + * default duration of a DCHP address lease + * + * @since vcloud api 0.9 + */ + @Nullable + public Integer getDefaultLeaseTime() { + return defaultLeaseTime; + } + + /** + * maximum duration of a DCHP address lease. + * + * @since vcloud api 0.9 + */ + @Nullable + public Integer getMaxLeaseTime() { + return maxLeaseTime; + } + + /** + * @return range of IP addresses available to DHCP clients + * + * @since vcloud api 0.9 + */ + @Nullable + public IpRange getIpRange() { + return ipRange; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((defaultLeaseTime == null) ? 0 : defaultLeaseTime.hashCode()); + result = prime * result + (enabled ? 1231 : 1237); + result = prime * result + ((ipRange == null) ? 0 : ipRange.hashCode()); + result = prime * result + ((maxLeaseTime == null) ? 0 : maxLeaseTime.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DhcpService other = (DhcpService) obj; + if (defaultLeaseTime == null) { + if (other.defaultLeaseTime != null) + return false; + } else if (!defaultLeaseTime.equals(other.defaultLeaseTime)) + return false; + if (enabled != other.enabled) + return false; + if (ipRange == null) { + if (other.ipRange != null) + return false; + } else if (!ipRange.equals(other.ipRange)) + return false; + if (maxLeaseTime == null) { + if (other.maxLeaseTime != null) + return false; + } else if (!maxLeaseTime.equals(other.maxLeaseTime)) + return false; + return true; + } + + @Override + public String toString() { + return "[defaultLeaseTime=" + defaultLeaseTime + ", enabled=" + enabled + ", ipRange=" + ipRange + + ", maxLeaseTime=" + maxLeaseTime + "]"; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/Features.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/Features.java new file mode 100644 index 0000000000..21cf6f754b --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/Features.java @@ -0,0 +1,115 @@ +/** + * + * Copyright (C) 2010 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.domain.network; + +import javax.annotation.Nullable; + +/** + * The Features element defines the DHCP and firewall features of a network. + */ +public class Features { + @Nullable + private final DhcpService dhcpService; + @Nullable + private final FirewallService firewallService; + @Nullable + private final NatService natService; + + public Features(@Nullable DhcpService dhcpService, @Nullable FirewallService firewallService, + @Nullable NatService natService) { + this.dhcpService = dhcpService; + this.firewallService = firewallService; + this.natService = natService; + } + + /** + * specifies the properties of the network’s DHCP service + * + * @since vcloud api 0.9, but emulated for 0.8 + */ + @Nullable + public DhcpService getDhcpService() { + return dhcpService; + } + + /** + * defines the firewall service capabilities of the network + * + * @since vcloud api 0.8 + */ + @Nullable + public FirewallService getFirewallService() { + return firewallService; + } + + /** + * defines the NAT service capabilities of the network + * + * @since vcloud api 0.8 + */ + @Nullable + public NatService getNatService() { + return natService; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((dhcpService == null) ? 0 : dhcpService.hashCode()); + result = prime * result + ((firewallService == null) ? 0 : firewallService.hashCode()); + result = prime * result + ((natService == null) ? 0 : natService.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Features other = (Features) obj; + if (dhcpService == null) { + if (other.dhcpService != null) + return false; + } else if (!dhcpService.equals(other.dhcpService)) + return false; + if (firewallService == null) { + if (other.firewallService != null) + return false; + } else if (!firewallService.equals(other.firewallService)) + return false; + if (natService == null) { + if (other.natService != null) + return false; + } else if (!natService.equals(other.natService)) + return false; + return true; + } + + @Override + public String toString() { + return "[dhcpService=" + dhcpService + ", firewallService=" + firewallService + ", natService=" + natService + + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FenceMode.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FenceMode.java new file mode 100644 index 0000000000..720ea65452 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FenceMode.java @@ -0,0 +1,69 @@ +/** + * + * Copyright (C) 2010 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.domain.network; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * + * The FenceMode element contains one of the following strings that specify how a network is + * connected to its parent network. + * + * @author Adrian Cole + */ +public enum FenceMode { + /** + * The two networks are bridged. + *

+ * Note that in vcloud 0.8 this was called ALLOW_IN_OUT, and so our implementation automatically + * converts this for you. Use bridged instead of allowInOut. + * + * @since vcloud api 0.9 + */ + BRIDGED, + /** + * The two networks are not connected. + * + * @since vcloud api 0.8 + */ + ISOLATED, + /** + * The two networks are connected as specified in their NatService elements. + * + * @since vcloud api 0.8 + */ + NAT_ROUTED; + + public String value() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); + } + + @Override + public String toString() { + return value(); + } + + public static FenceMode fromValue(String fenceMode) { + return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(fenceMode, "fenceMode"))); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FirewallService.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FirewallService.java new file mode 100644 index 0000000000..8ecf8d946d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/FirewallService.java @@ -0,0 +1,98 @@ +/** + * + * Copyright (C) 2010 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.domain.network; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.List; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.network.firewall.FirewallRule; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +/** + * The FirewallService element defines the firewall service capabilities of a network. + */ +public class FirewallService { + private final boolean enabled; + + List firewallRules = Lists.newArrayList(); + + public FirewallService(boolean enabled, Iterable firewallRules) { + this.enabled = enabled; + Iterables.addAll(this.firewallRules, checkNotNull(firewallRules, "firewallRules")); + } + + /** + * @return Firewall rules for the network + * + * @since vcloud api 0.8 + */ + public List getFirewallRules() { + return firewallRules; + } + + /** + * @return true if the service is enabled + * + * @since vcloud api 0.9 + */ + @Nullable + public boolean isEnabled() { + return enabled; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (enabled ? 1231 : 1237); + result = prime * result + ((firewallRules == null) ? 0 : firewallRules.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + FirewallService other = (FirewallService) obj; + if (enabled != other.enabled) + return false; + if (firewallRules == null) { + if (other.firewallRules != null) + return false; + } else if (!firewallRules.equals(other.firewallRules)) + return false; + return true; + } + + @Override + public String toString() { + return "[enabled=" + enabled + ", firewallRules=" + firewallRules + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpRange.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpRange.java new file mode 100644 index 0000000000..3c7d853968 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpRange.java @@ -0,0 +1,90 @@ +/** + * + * Copyright (C) 2010 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.domain.network; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * The IpRange element defines a range of IP addresses available on a network. + * + */ +public class IpRange { + private final String startAddress; + private final String endAddress; + + public IpRange(String startAddress, String endAddress) { + this.startAddress = checkNotNull(startAddress, "startAddress"); + this.endAddress = checkNotNull(endAddress, "endAddress"); + } + + /** + * @return lowest IP address in the range + * + * @since vcloud api 0.9 + */ + public String getStartAddress() { + return startAddress; + } + + /** + * @return highest IP address in the range + * + * @since vcloud api 0.9 + */ + public String getEndAddress() { + return endAddress; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((endAddress == null) ? 0 : endAddress.hashCode()); + result = prime * result + ((startAddress == null) ? 0 : startAddress.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + IpRange other = (IpRange) obj; + if (endAddress == null) { + if (other.endAddress != null) + return false; + } else if (!endAddress.equals(other.endAddress)) + return false; + if (startAddress == null) { + if (other.startAddress != null) + return false; + } else if (!startAddress.equals(other.startAddress)) + return false; + return true; + } + + @Override + public String toString() { + return "[startAddress=" + startAddress + ", endAddress=" + endAddress + "]"; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpScope.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpScope.java new file mode 100644 index 0000000000..7efc2d3848 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/IpScope.java @@ -0,0 +1,192 @@ +package org.jclouds.vcloud.domain.network; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.Set; + +import javax.annotation.Nullable; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; + +/** + * The IpScope element defines the address range, gateway, netmask, and other properties of the + * network. + * + */ +public class IpScope { + private final boolean inherited; + @Nullable + private final String gateway; + @Nullable + private final String netmask; + @Nullable + private final String dns1; + @Nullable + private final String dns2; + @Nullable + private final String dnsSuffix; + private final Set ipRanges = Sets.newLinkedHashSet(); + private final Set allocatedIpAddresses = Sets.newLinkedHashSet(); + + public IpScope(boolean inherited, @Nullable String gateway, @Nullable String netmask, @Nullable String dns1, + @Nullable String dns2, @Nullable String dnsSuffix, Iterable ipRanges, + Iterable allocatedIpAddresses) { + this.inherited = inherited; + this.gateway = gateway; + this.netmask = netmask; + this.dns1 = dns1; + this.dns2 = dns2; + this.dnsSuffix = dnsSuffix; + Iterables.addAll(this.ipRanges, checkNotNull(ipRanges, "ipRanges")); + Iterables.addAll(this.allocatedIpAddresses, checkNotNull(allocatedIpAddresses, "allocatedIpAddresses")); + } + + /** + * @return true of the values in this IpScope element are inherited from the ParentNetwork of the + * containing Configuration + * @since vcloud api 0.9 + */ + public boolean isInherited() { + return inherited; + } + + /** + * @return IP address of the network gateway + * + * @since vcloud api 0.8 + */ + @Nullable + public String getGateway() { + return gateway; + } + + /** + * @return netmask to apply to addresses on the network + * + * @since vcloud api 0.8 + */ + @Nullable + public String getNetmask() { + return netmask; + } + + /** + * @return IP address of the primary DNS server for this network + * + * @since vcloud api 0.9 + */ + @Nullable + public String getDns1() { + return dns1; + } + + /** + * @return IP address of the secondary DNS server for this network + * + * @since vcloud api 0.9 + */ + @Nullable + public String getDns2() { + return dns2; + } + + /** + * @return suffix to be applied when resolving hostnames that are not fully‐qualified. + * + * @since vcloud api 0.9 + */ + @Nullable + public String getDnsSuffix() { + return dnsSuffix; + } + + /** + * @return A container for IpRange elements. + * + * @since vcloud api 0.9 + */ + public Set getIpRanges() { + return ipRanges; + } + + /** + * @return A list of addresses allocated from any of the specified IpRanges + * + * @since vcloud api 0.9 + */ + public Set getAllocatedIpAddresses() { + return allocatedIpAddresses; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((allocatedIpAddresses == null) ? 0 : allocatedIpAddresses.hashCode()); + result = prime * result + ((dns1 == null) ? 0 : dns1.hashCode()); + result = prime * result + ((dns2 == null) ? 0 : dns2.hashCode()); + result = prime * result + ((dnsSuffix == null) ? 0 : dnsSuffix.hashCode()); + result = prime * result + ((gateway == null) ? 0 : gateway.hashCode()); + result = prime * result + (inherited ? 1231 : 1237); + result = prime * result + ((ipRanges == null) ? 0 : ipRanges.hashCode()); + result = prime * result + ((netmask == null) ? 0 : netmask.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + IpScope other = (IpScope) obj; + if (allocatedIpAddresses == null) { + if (other.allocatedIpAddresses != null) + return false; + } else if (!allocatedIpAddresses.equals(other.allocatedIpAddresses)) + return false; + if (dns1 == null) { + if (other.dns1 != null) + return false; + } else if (!dns1.equals(other.dns1)) + return false; + if (dns2 == null) { + if (other.dns2 != null) + return false; + } else if (!dns2.equals(other.dns2)) + return false; + if (dnsSuffix == null) { + if (other.dnsSuffix != null) + return false; + } else if (!dnsSuffix.equals(other.dnsSuffix)) + return false; + if (gateway == null) { + if (other.gateway != null) + return false; + } else if (!gateway.equals(other.gateway)) + return false; + if (inherited != other.inherited) + return false; + if (ipRanges == null) { + if (other.ipRanges != null) + return false; + } else if (!ipRanges.equals(other.ipRanges)) + return false; + if (netmask == null) { + if (other.netmask != null) + return false; + } else if (!netmask.equals(other.netmask)) + return false; + return true; + } + + @Override + public String toString() { + return "[allocatedIpAddresses=" + allocatedIpAddresses + ", dns1=" + dns1 + ", dns2=" + dns2 + ", dnsSuffix=" + + dnsSuffix + ", gateway=" + gateway + ", inherited=" + inherited + ", ipRanges=" + ipRanges + + ", netmask=" + netmask + "]"; + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/NatService.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/NatService.java new file mode 100644 index 0000000000..01dc9132c4 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/NatService.java @@ -0,0 +1,137 @@ +/** + * + * Copyright (C) 2010 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.domain.network; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.util.List; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.network.nat.NatPolicy; +import org.jclouds.vcloud.domain.network.nat.NatRule; +import org.jclouds.vcloud.domain.network.nat.NatType; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; + +/** + * The NatService element defines the network address translation capabilities of a network. + */ +public class NatService { + private final boolean enabled; + @Nullable + private final NatType type; + @Nullable + private final NatPolicy policy; + private final List natRules = Lists.newArrayList(); + + public NatService(boolean enabled, @Nullable NatType type, @Nullable NatPolicy policy, + Iterable natRules) { + this.enabled = enabled; + this.type = type; + this.policy = policy; + Iterables.addAll(this.natRules, checkNotNull(natRules, "natRules")); + } + + /** + * @return Nat rules for the network + * + * @since vcloud api 0.8 + */ + public List getNatRules() { + return natRules; + } + + /** + * @return true if the service is enabled + * + * @since vcloud api 0.9 + */ + public boolean isEnabled() { + return enabled; + } + + /** + * @return specifies how Network Address Translation is implemented by the NAT service + * + * @since vcloud api 0.9 + */ + @Nullable + public NatType getType() { + return type; + } + + /** + * @return specifies how packets are handled by the NAT service. + * + * @since vcloud api 0.9 + */ + @Nullable + public NatPolicy getPolicy() { + return policy; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (enabled ? 1231 : 1237); + result = prime * result + ((natRules == null) ? 0 : natRules.hashCode()); + result = prime * result + ((policy == null) ? 0 : policy.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NatService other = (NatService) obj; + if (enabled != other.enabled) + return false; + if (natRules == null) { + if (other.natRules != null) + return false; + } else if (!natRules.equals(other.natRules)) + return false; + if (policy == null) { + if (other.policy != null) + return false; + } else if (!policy.equals(other.policy)) + return false; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; + return true; + } + + @Override + public String toString() { + return "[enabled=" + enabled + ", natRules=" + natRules + ", policy=" + policy + ", type=" + type + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/OrgNetwork.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/OrgNetwork.java new file mode 100644 index 0000000000..0fed5f7fda --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/OrgNetwork.java @@ -0,0 +1,125 @@ +/** + * + * Copyright (C) 2010 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.domain.network; + +import java.util.List; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.internal.VDCImpl; + +import com.google.inject.ImplementedBy; + +/** + * A vDC is a deployment environment for vApps. A Vdc element provides a user view of a vDC. + * + * @author Adrian Cole + */ +@org.jclouds.vcloud.endpoints.Network +@ImplementedBy(VDCImpl.class) +public interface OrgNetwork extends NamedResource { + /** + * The org this network belongs to. + * + * @since vcloud api 0.9 + */ + @Nullable + NamedResource getOrg(); + + /** + * optional description + * + * @since vcloud api 0.8 + */ + @Nullable + String getDescription(); + + /** + * read‐only container for Task elements. Each element in the container represents a queued, + * running, or failed task owned by this object. + * + * @since vcloud api 0.9 + */ + List getTasks(); + + /** + * + * @return properties of the network + * + * @since vcloud api 0.9, but emulated for 0.8 + */ + Configuration getConfiguration(); + + /** + * A reference the network pool from which this network is provisioned. This element, which is + * required when creating a NatRouted or Isolated network, is returned in response to a creation + * request but not shown in subsequent GET requests. + * + * @since vcloud api 0.9 + */ + @Nullable + NamedResource getNetworkPool(); + + /** + * list of external IP addresses that this network can use for NAT. + * + * @since vcloud api 0.9 + */ + Set getAllowedExternalIpAddresses(); + + /** + * The Configuration element specifies properties of a network. + */ + interface Configuration { + /** + * defines the address range, gateway, netmask, and other properties of the network. + * + * @since vcloud api 0.9, but emulated for 0.8 + */ + @Nullable + IpScope getIpScope(); + + /** + * reference to a network to which this network connects + * + * @since vcloud api 0.9 + */ + @Nullable + NamedResource getParentNetwork(); + + /** + * defines how this network is connected to its ParentNetwork + * + * @since vcloud api 0.8 + */ + FenceMode getFenceMode(); + + /** + * defines a set of network features. + * + * @since vcloud api 0.9, but emulated for 0.8 + */ + @Nullable Features getFeatures(); + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Network.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/VCloudExpressNetwork.java similarity index 82% rename from vcloud/core/src/main/java/org/jclouds/vcloud/domain/Network.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/VCloudExpressNetwork.java index cb26b8c391..830b37f4dd 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Network.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/VCloudExpressNetwork.java @@ -17,19 +17,23 @@ * ==================================================================== */ -package org.jclouds.vcloud.domain; +package org.jclouds.vcloud.domain.network; import java.util.Set; import javax.annotation.Nullable; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.network.firewall.FirewallRule; +import org.jclouds.vcloud.domain.network.nat.rules.PortForwardingRule; + /** * * A network that is available in a vDC. * * @author Adrian Cole */ -public interface Network extends NamedResource { +public interface VCloudExpressNetwork extends NamedResource { /** * * @return Description of the network @@ -58,7 +62,7 @@ public interface Network extends NamedResource { /** * return the network’s fence modes. */ - Set getFenceModes(); + Set getFenceModes(); /** * return True if the network provides DHCP services @@ -70,7 +74,7 @@ public interface Network extends NamedResource { * * @return Network Address Translation rules for the network */ - Set getNatRules(); + Set getNatRules(); /** * @return Firewall rules for the network diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallPolicy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallPolicy.java new file mode 100644 index 0000000000..6686d8f4fa --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallPolicy.java @@ -0,0 +1,57 @@ +/** + * + * Copyright (C) 2010 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.domain.network.firewall; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * specifies how packets are handled by the firewall + * + */ +public enum FirewallPolicy { + /** + * drop packets of this type + */ + DROP, + /** + * allow packets of this type to pass through the firewall + */ + ALLOW; + + public String value() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); + } + + @Override + public String toString() { + return value(); + } + + public static FirewallPolicy fromValue(String policy) { + try { + return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(policy, "policy"))); + } catch (IllegalArgumentException e) { + return DROP; + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallProtocols.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallProtocols.java new file mode 100644 index 0000000000..b1d38dffa9 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallProtocols.java @@ -0,0 +1,63 @@ +package org.jclouds.vcloud.domain.network.firewall; + +/** + * The Protocols element specifies the protocols to which firewall rules apply. + * + * @since vcloud api 0.9 emulated for 0.8 + * + * + */ +public class FirewallProtocols { + private final boolean tcp; + private final boolean udp; + + public FirewallProtocols(boolean tcp, boolean udp) { + this.tcp = tcp; + this.udp = udp; + } + + /** + * @return true if the firewall rules apply to the TCP protocol + */ + public boolean isTcp() { + return tcp; + } + + /** + * @return true if the firewall rules apply to the UDP protocol + */ + public boolean isUdp() { + return udp; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (tcp ? 1231 : 1237); + result = prime * result + (udp ? 1231 : 1237); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + FirewallProtocols other = (FirewallProtocols) obj; + if (tcp != other.tcp) + return false; + if (udp != other.udp) + return false; + return true; + } + + @Override + public String toString() { + return "Protocols [tcp=" + tcp + ", udp=" + udp + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallRule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallRule.java new file mode 100644 index 0000000000..75965301e4 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/firewall/FirewallRule.java @@ -0,0 +1,156 @@ +/** + * + * Copyright (C) 2010 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.domain.network.firewall; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Nullable; + +/** + * The FirewallRule element defines a single firewall rule. + * + * @author Adrian Cole + * @since vcloud api 0.8 + */ +public class FirewallRule { + + private final boolean enabled; + @Nullable + private final String description; + @Nullable + private final FirewallPolicy policy; + @Nullable + private final FirewallProtocols protocols; + private final int port; + private final String destinationIp; + + public FirewallRule(boolean enabled, @Nullable String description, @Nullable FirewallPolicy policy, + @Nullable FirewallProtocols protocols, int port, String destinationIp) { + this.enabled = enabled; + this.description = description; + this.policy = policy; + this.protocols = protocols; + this.port = port; + this.destinationIp = checkNotNull(destinationIp, "destinationIp"); + } + + /** + * @return true if the rule is enabled + */ + public boolean isEnabled() { + return enabled; + } + + /** + * @return description of the rule + */ + @Nullable + public String getDescription() { + return description; + } + + /** + * @return specifies how packets are handled by the firewall + */ + @Nullable + public FirewallPolicy getPolicy() { + return policy; + } + + /** + * @return specifies the protocols to which this firewall rule applies + */ + @Nullable + public FirewallProtocols getProtocols() { + return protocols; + } + + /** + * @return specifies the network port to which this firewall rule applies. A value of ‐1 matches + * any port. + */ + public int getPort() { + return port; + } + + /** + * @return specifies the destination IP address, inside the firewall, to which this firewall rule + * applies + */ + public String getDestinationIp() { + return destinationIp; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((destinationIp == null) ? 0 : destinationIp.hashCode()); + result = prime * result + (enabled ? 1231 : 1237); + result = prime * result + ((policy == null) ? 0 : policy.hashCode()); + result = prime * result + port; + result = prime * result + ((protocols == null) ? 0 : protocols.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + FirewallRule other = (FirewallRule) obj; + if (description == null) { + if (other.description != null) + return false; + } else if (!description.equals(other.description)) + return false; + if (destinationIp == null) { + if (other.destinationIp != null) + return false; + } else if (!destinationIp.equals(other.destinationIp)) + return false; + if (enabled != other.enabled) + return false; + if (policy == null) { + if (other.policy != null) + return false; + } else if (!policy.equals(other.policy)) + return false; + if (port != other.port) + return false; + if (protocols == null) { + if (other.protocols != null) + return false; + } else if (!protocols.equals(other.protocols)) + return false; + return true; + } + + @Override + public String toString() { + return "[description=" + description + ", destinationIp=" + destinationIp + ", enabled=" + enabled + ", policy=" + + policy + ", port=" + port + ", protocols=" + protocols + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/OrgNetworkImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/OrgNetworkImpl.java new file mode 100644 index 0000000000..022d25b900 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/OrgNetworkImpl.java @@ -0,0 +1,281 @@ +/** + * + * Copyright (C) 2010 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.domain.network.internal; + +import static com.google.common.base.Preconditions.checkNotNull; + +import java.net.URI; +import java.util.List; +import java.util.Set; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.internal.NamedResourceImpl; +import org.jclouds.vcloud.domain.network.Features; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.IpScope; +import org.jclouds.vcloud.domain.network.OrgNetwork; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +/** + * + * @author Adrian Cole + */ +public class OrgNetworkImpl extends NamedResourceImpl implements OrgNetwork { + @Nullable + private final NamedResource org; + @Nullable + private final String description; + private final List tasks = Lists.newArrayList(); + private final Configuration configuration; + @Nullable + private final NamedResource networkPool; + private final Set allowedExternalIpAddresses = Sets.newLinkedHashSet(); + + public OrgNetworkImpl(String name, String type, URI id, @Nullable NamedResource org, @Nullable String description, + Iterable tasks, Configuration configuration, @Nullable NamedResource networkPool, + Iterable allowedExternalIpAddresses) { + super(name, type, id); + this.org = org; + this.description = description; + Iterables.addAll(this.tasks, checkNotNull(tasks, "tasks")); + this.configuration = checkNotNull(configuration, "configuration"); + this.networkPool = networkPool; + Iterables.addAll(this.allowedExternalIpAddresses, checkNotNull(allowedExternalIpAddresses, + "allowedExternalIpAddresses")); + } + + public static class ConfigurationImpl implements Configuration { + + @Nullable + private final IpScope ipScope; + @Nullable + private final NamedResource parentNetwork; + private final FenceMode fenceMode; + private final Features features; + + public ConfigurationImpl(@Nullable IpScope ipScope, @Nullable NamedResource parentNetwork, FenceMode fenceMode, + @Nullable Features features) { + this.ipScope = ipScope; + this.parentNetwork = parentNetwork; + this.fenceMode = checkNotNull(fenceMode, "fenceMode"); + this.features = features; + } + + /** + * {@inheritDoc} + */ + @Override + public IpScope getIpScope() { + return ipScope; + } + + /** + * {@inheritDoc} + */ + @Override + public NamedResource getParentNetwork() { + return parentNetwork; + } + + /** + * {@inheritDoc} + */ + @Override + public FenceMode getFenceMode() { + return fenceMode; + } + + /** + * {@inheritDoc} + */ + @Override + @Nullable + public Features getFeatures() { + return features; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((features == null) ? 0 : features.hashCode()); + result = prime * result + ((fenceMode == null) ? 0 : fenceMode.hashCode()); + result = prime * result + ((ipScope == null) ? 0 : ipScope.hashCode()); + result = prime * result + ((parentNetwork == null) ? 0 : parentNetwork.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + ConfigurationImpl other = (ConfigurationImpl) obj; + if (features == null) { + if (other.features != null) + return false; + } else if (!features.equals(other.features)) + return false; + if (fenceMode == null) { + if (other.fenceMode != null) + return false; + } else if (!fenceMode.equals(other.fenceMode)) + return false; + if (ipScope == null) { + if (other.ipScope != null) + return false; + } else if (!ipScope.equals(other.ipScope)) + return false; + if (parentNetwork == null) { + if (other.parentNetwork != null) + return false; + } else if (!parentNetwork.equals(other.parentNetwork)) + return false; + return true; + } + + @Override + public String toString() { + return "[features=" + features + ", fenceMode=" + fenceMode + ", ipScope=" + ipScope + ", parentNetwork=" + + parentNetwork + "]"; + } + + } + + /** + * {@inheritDoc} + */ + @Override + public NamedResource getOrg() { + return org; + } + + /** + * {@inheritDoc} + */ + @Override + public String getDescription() { + return description; + } + + /** + * {@inheritDoc} + */ + @Override + public List getTasks() { + return tasks; + } + + /** + * {@inheritDoc} + */ + @Override + public Configuration getConfiguration() { + return configuration; + } + + /** + * {@inheritDoc} + */ + @Override + public NamedResource getNetworkPool() { + return networkPool; + } + + /** + * {@inheritDoc} + */ + @Override + public Set getAllowedExternalIpAddresses() { + return allowedExternalIpAddresses; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = super.hashCode(); + result = prime * result + ((allowedExternalIpAddresses == null) ? 0 : allowedExternalIpAddresses.hashCode()); + result = prime * result + ((configuration == null) ? 0 : configuration.hashCode()); + result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((networkPool == null) ? 0 : networkPool.hashCode()); + result = prime * result + ((org == null) ? 0 : org.hashCode()); + result = prime * result + ((tasks == null) ? 0 : tasks.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (!super.equals(obj)) + return false; + if (getClass() != obj.getClass()) + return false; + OrgNetworkImpl other = (OrgNetworkImpl) obj; + if (allowedExternalIpAddresses == null) { + if (other.allowedExternalIpAddresses != null) + return false; + } else if (!allowedExternalIpAddresses.equals(other.allowedExternalIpAddresses)) + return false; + if (configuration == null) { + if (other.configuration != null) + return false; + } else if (!configuration.equals(other.configuration)) + return false; + if (description == null) { + if (other.description != null) + return false; + } else if (!description.equals(other.description)) + return false; + if (networkPool == null) { + if (other.networkPool != null) + return false; + } else if (!networkPool.equals(other.networkPool)) + return false; + if (org == null) { + if (other.org != null) + return false; + } else if (!org.equals(other.org)) + return false; + if (tasks == null) { + if (other.tasks != null) + return false; + } else if (!tasks.equals(other.tasks)) + return false; + return true; + } + + @Override + public String toString() { + return "[allowedExternalIpAddresses=" + allowedExternalIpAddresses + ", configuration=" + configuration + + ", description=" + description + ", networkPool=" + networkPool + ", org=" + org + ", tasks=" + tasks + + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/NetworkImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressNetworkImpl.java similarity index 79% rename from vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/NetworkImpl.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressNetworkImpl.java index dd98c835f6..bb2724171c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/NetworkImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressNetworkImpl.java @@ -17,16 +17,17 @@ * ==================================================================== */ -package org.jclouds.vcloud.domain.internal; +package org.jclouds.vcloud.domain.network.internal; import java.net.URI; import java.util.Set; -import org.jclouds.vcloud.VCloudExpressMediaType; -import org.jclouds.vcloud.domain.FirewallRule; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.NatRule; -import org.jclouds.vcloud.domain.Network; +import org.jclouds.vcloud.domain.internal.NamedResourceImpl; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.VCloudExpressNetwork; +import org.jclouds.vcloud.domain.network.firewall.FirewallRule; +import org.jclouds.vcloud.domain.network.nat.rules.PortForwardingRule; import com.google.common.collect.Sets; import com.google.inject.internal.Nullable; @@ -37,7 +38,7 @@ import com.google.inject.internal.Nullable; * @author Adrian Cole * */ -public class NetworkImpl extends NamedResourceImpl implements Network { +public class VCloudExpressNetworkImpl extends NamedResourceImpl implements VCloudExpressNetwork { /** The serialVersionUID */ private static final long serialVersionUID = 8464716396538298809L; @@ -45,15 +46,16 @@ public class NetworkImpl extends NamedResourceImpl implements Network { private final Set dnsServers = Sets.newHashSet(); private final String gateway; private final String netmask; - private final Set fenceModes = Sets.newHashSet(); + private final Set fenceModes = Sets.newHashSet(); @Nullable private final Boolean dhcp; - private final Set natRules = Sets.newHashSet(); + private final Set natRules = Sets.newHashSet(); private final Set firewallRules = Sets.newHashSet(); - public NetworkImpl(String name, URI id, String description, Set dnsServers, String gateway, - String netmask, Set fenceModes, Boolean dhcp, Set natRules, Set firewallRules) { - super(name, VCloudExpressMediaType.NETWORK_XML, id); + public VCloudExpressNetworkImpl(String name, String type, URI id, String description, Set dnsServers, + String gateway, String netmask, Set fenceModes, Boolean dhcp, Set natRules, + Set firewallRules) { + super(name, type, id); this.description = description; this.dnsServers.addAll(dnsServers); this.gateway = gateway; @@ -95,7 +97,7 @@ public class NetworkImpl extends NamedResourceImpl implements Network { /** * {@inheritDoc} */ - public Set getFenceModes() { + public Set getFenceModes() { return fenceModes; } @@ -109,7 +111,7 @@ public class NetworkImpl extends NamedResourceImpl implements Network { /** * {@inheritDoc} */ - public Set getNatRules() { + public Set getNatRules() { return natRules; } @@ -148,7 +150,7 @@ public class NetworkImpl extends NamedResourceImpl implements Network { return false; if (getClass() != obj.getClass()) return false; - NetworkImpl other = (NetworkImpl) obj; + VCloudExpressNetworkImpl other = (VCloudExpressNetworkImpl) obj; if (description == null) { if (other.description != null) return false; @@ -195,9 +197,9 @@ public class NetworkImpl extends NamedResourceImpl implements Network { @Override public String toString() { return "NetworkImpl [id=" + getId() + ", name=" + getName() + ", type=" + getType() + ", description=" - + description + ", dhcp=" + dhcp + ", dnsServers=" + dnsServers + ", fenceModes=" + fenceModes - + ", firewallRules=" + firewallRules + ", gateway=" + gateway + ", natRules=" + natRules + ", netmask=" - + netmask + "]"; + + description + ", dhcp=" + dhcp + ", dnsServers=" + dnsServers + ", fenceModes=" + fenceModes + + ", firewallRules=" + firewallRules + ", gateway=" + gateway + ", natRules=" + natRules + ", netmask=" + + netmask + "]"; } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressOrgNetworkAdapter.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressOrgNetworkAdapter.java new file mode 100644 index 0000000000..ca494c5d33 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/internal/VCloudExpressOrgNetworkAdapter.java @@ -0,0 +1,66 @@ +/** + * + * Copyright (C) 2010 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.domain.network.internal; + +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.network.DhcpService; +import org.jclouds.vcloud.domain.network.Features; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.FirewallService; +import org.jclouds.vcloud.domain.network.IpRange; +import org.jclouds.vcloud.domain.network.IpScope; +import org.jclouds.vcloud.domain.network.NatService; +import org.jclouds.vcloud.domain.network.VCloudExpressNetwork; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; + +/** + * + * @author Adrian Cole + */ +public class VCloudExpressOrgNetworkAdapter extends OrgNetworkImpl { + + public VCloudExpressOrgNetworkAdapter(VCloudExpressNetwork in) { + super(in.getName(), in.getType(), in.getId(), null, in.getDescription(), ImmutableSet. of(), + parseConfiguration(in), null, ImmutableSet. of()); + } + + static Configuration parseConfiguration(VCloudExpressNetwork in) { + + String dns1 = (in.getDnsServers().size() > 0) ? Iterables.get(in.getDnsServers(), 0) : null; + String dns2 = (in.getDnsServers().size() > 1) ? Iterables.get(in.getDnsServers(), 1) : null; + + String gateway = in.getGateway(); + + String netmask = in.getNetmask(); + + FenceMode mode = in.getFenceModes().size() > 0 ? Iterables.get(in.getFenceModes(), 0) : FenceMode.BRIDGED; + + DhcpService dhcp = in.isDhcp() != null && in.isDhcp() ? new DhcpService(true, null, null, null) : null; + + NatService nat = in.getNatRules().size() > 0 ? new NatService(true, null, null, in.getNatRules()) : null; + + FirewallService firewall = in.getFirewallRules().size() > 0 ? new FirewallService(true, in.getFirewallRules()) + : null; + return new OrgNetworkImpl.ConfigurationImpl(new IpScope(true, gateway, netmask, dns1, dns2, null, ImmutableSet + . of(), ImmutableSet. of()), null, mode, new Features(dhcp, firewall, nat)); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatPolicy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatPolicy.java new file mode 100644 index 0000000000..aa0e091989 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatPolicy.java @@ -0,0 +1,57 @@ +/** + * + * Copyright (C) 2010 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.domain.network.nat; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * The Policy element of a NatService element specifies how packets are handled by the NAT service. + * + */ +public enum NatPolicy { + /** + * packets of this type pass through the firewall in both directions + */ + ALLOW_TRAFFIC, + /** + * only inbound packets of this type pass through the firewall + */ + ALLOW_TRAFFIC_IN; + + public String value() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); + } + + @Override + public String toString() { + return value(); + } + + public static NatPolicy fromValue(String policy) { + try { + return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(policy, "policy"))); + } catch (IllegalArgumentException e) { + return ALLOW_TRAFFIC_IN; + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/FenceMode.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatProtocol.java similarity index 62% rename from vcloud/core/src/main/java/org/jclouds/vcloud/domain/FenceMode.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatProtocol.java index f925706f32..c721328164 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/FenceMode.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatProtocol.java @@ -17,26 +17,35 @@ * ==================================================================== */ -package org.jclouds.vcloud.domain; +package org.jclouds.vcloud.domain.network.nat; + /** * - * The FenceMode element contains one of the following strings that specify how - * a network is connected to its parent network. + * The Protocol specifies the network protocol to which this rule applies + * + * @since vcloud api 0.9 * * @author Adrian Cole */ -public interface FenceMode { +public enum NatProtocol { /** - * The two networks are bridged. + * the rule applies to the TCP protocol + * + * @since vcloud api 0.9 */ - public static final String BRIDGED = "bridged"; + TCP, /** - * The two networks are not connected. + * the rule applies to the UDP protocol + * + * @since vcloud api 0.9 */ - public static final String ISOLATED = "isolated"; + UDP, /** - * The two networks are connected as specified in their NatService elements. + * the rule applies to the TCP and UDP protocols. + * + * @since vcloud api 0.9 */ - public static final String NAT_ROUTED = "natRouted"; + TCP_UDP; + } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatRule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatRule.java new file mode 100644 index 0000000000..3191e0466a --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatRule.java @@ -0,0 +1,38 @@ +/** + * + * Copyright (C) 2010 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.domain.network.nat; + +import javax.annotation.Nullable; + +/** + * + * Defines a rule associated with Nat + * + * @since vcloud api 0.9 + * + * @author Adrian Cole + */ +public interface NatRule { + /** + * IP address to which this NAT rule maps the IP address specified in the InternalIp element. + */ + @Nullable + String getExternalIP(); +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatType.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatType.java new file mode 100644 index 0000000000..bf7f6b7122 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/NatType.java @@ -0,0 +1,60 @@ +/** + * + * Copyright (C) 2010 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.domain.network.nat; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.common.base.CaseFormat; + +/** + * + * The NatType element specifies how network address translation is implemented by the NAT service. + * + * @since vcloud api 0.9 + * + * @author Adrian Cole + */ +public enum NatType { + /** + * NAT service implemented by IP address translation + * + * @since vcloud api 0.9 + */ + IP_TRANSLATION, + /** + * NAT service implemented by network port forwarding + * + * @since vcloud api 0.9 + */ + PORT_FORWARDING; + + public String value() { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, name()); + } + + @Override + public String toString() { + return value(); + } + + public static NatType fromValue(String natType) { + return valueOf(CaseFormat.LOWER_CAMEL.to(CaseFormat.UPPER_UNDERSCORE, checkNotNull(natType, "natType"))); + } +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/OneToOneVmRule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/OneToOneVmRule.java new file mode 100644 index 0000000000..7f229bc955 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/OneToOneVmRule.java @@ -0,0 +1,90 @@ +/** + * + * Copyright (C) 2010 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.domain.network.nat.rules; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.MappingMode; +import org.jclouds.vcloud.domain.network.nat.NatRule; + +/** + * The OneToOneVmRule element describes a NAT rule that specifies network address translation + * details for a single virtual machine. The external IP address can be specified manually or + * assigned automatically at deployment time. The internal IP address is discovered by looking up + * the specified VmReference and NIC ID. + * + * @since vcloud 0.9 + * @author Adrian Cole + */ +public class OneToOneVmRule implements NatRule { + private final MappingMode mappingMode; + @Nullable + private final String externalIP; + @Nullable + private final String vAppScopedVmId; + private final int vmNicId; + + public OneToOneVmRule(MappingMode mappingMode, @Nullable String externalIp, @Nullable String vAppScopedVmId, + int vmNicId) { + this.mappingMode = checkNotNull(mappingMode, "mappingMode"); + this.externalIP = externalIp; + this.vAppScopedVmId = vAppScopedVmId; + this.vmNicId = vmNicId; + } + + /** + * @return how IP address mapping is implemented by the NAT service + * @since vcloud 0.9 + */ + public MappingMode getMappingMode() { + return mappingMode; + } + + /** + * @return if MappingMode is manual, specifies the external IP address of this Vm, otherwise + * null. + * @since vcloud 0.9 + */ + @Nullable + @Override + public String getExternalIP() { + return externalIP; + } + + /** + * @return read‐only identifier created on import + * @since vcloud 0.9 + */ + @Nullable + public String getVAppScopedVmId() { + return vAppScopedVmId; + } + + /** + * @return device number of the NIC on the referenced virtual machine + * @since vcloud 0.9 + */ + public int getVmNicId() { + return vmNicId; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/PortForwardingRule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/PortForwardingRule.java new file mode 100644 index 0000000000..08d4e4611d --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/PortForwardingRule.java @@ -0,0 +1,137 @@ +/** + * + * Copyright (C) 2010 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.domain.network.nat.rules; + +import static com.google.common.base.Preconditions.checkNotNull; + +import org.jclouds.vcloud.domain.network.nat.NatProtocol; +import org.jclouds.vcloud.domain.network.nat.NatRule; + +/** + * The PortForwardingRule element describes a NAT rule that maps an IP address and port in an + * organization network to an external IP address and port. + * + * @since vcloud 0.8 + * @author Adrian Cole + */ +public class PortForwardingRule implements NatRule { + private final String externalIP; + private final int externalPort; + private final String internalIP; + private final int internalPort; + private final NatProtocol protocol; + + public PortForwardingRule(String externalIP, int externalPort, String internalIP, int internalPort, + NatProtocol protocol) { + this.externalIP = checkNotNull(externalIP, "externalIP"); + this.externalPort = externalPort; + this.internalIP = checkNotNull(internalIP, "internalIP"); + this.internalPort = internalPort; + this.protocol = checkNotNull(protocol, "protocol"); + + } + + /** + * IP address to which this NAT rule maps the IP address specified in the InternalIp element. + */ + @Override + public String getExternalIP() { + return externalIP; + } + + /** + * network port to which this NAT rule maps the port number specified in the InternalPort element + */ + public int getExternalPort() { + return externalPort; + } + + /** + * IP address to which this NAT rule maps the IP address specified in the ExternalIp element. + */ + public String getInternalIP() { + return internalIP; + } + + /** + * network port to which this NAT rule maps the port number specified in the ExternalPort + * element. + */ + public int getInternalPort() { + return internalPort; + } + + /** + * specifies the network protocol to which this rule applies + */ + public NatProtocol getProtocol() { + return protocol; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((externalIP == null) ? 0 : externalIP.hashCode()); + result = prime * result + externalPort; + result = prime * result + ((internalIP == null) ? 0 : internalIP.hashCode()); + result = prime * result + internalPort; + result = prime * result + ((protocol == null) ? 0 : protocol.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + PortForwardingRule other = (PortForwardingRule) obj; + if (externalIP == null) { + if (other.externalIP != null) + return false; + } else if (!externalIP.equals(other.externalIP)) + return false; + if (externalPort != other.externalPort) + return false; + if (internalIP == null) { + if (other.internalIP != null) + return false; + } else if (!internalIP.equals(other.internalIP)) + return false; + if (internalPort != other.internalPort) + return false; + if (protocol == null) { + if (other.protocol != null) + return false; + } else if (!protocol.equals(other.protocol)) + return false; + return true; + } + + @Override + public String toString() { + return "[externalIP=" + externalIP + ", externalPort=" + externalPort + ", internalIP=" + internalIP + + ", internalPort=" + internalPort + ", protocol=" + protocol + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/VmRule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/VmRule.java new file mode 100644 index 0000000000..7ea4b00485 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/network/nat/rules/VmRule.java @@ -0,0 +1,157 @@ +/** + * + * Copyright (C) 2010 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.domain.network.nat.rules; + +import static com.google.common.base.Preconditions.checkNotNull; + +import javax.annotation.Nullable; + +import org.jclouds.vcloud.domain.network.nat.NatProtocol; +import org.jclouds.vcloud.domain.network.nat.NatRule; + +/** + * The VmRule element describes a NAT rule that maps an IP address and port in a vApp network to an + * external IP address and port. The external IP address, external port, and internal port are + * specified in the element. The internal IP address is discovered by looking up the specified + * VmReference and VmNicId. + * + * @since vcloud 0.9 + * @author Adrian Cole + */ +public class VmRule implements NatRule { + @Nullable + private final String externalIP; + private final int externalPort; + @Nullable + private final String vAppScopedLocalId; + private final int vmNicId; + private final int internalPort; + private final NatProtocol protocol; + + public VmRule(@Nullable String externalIP, int externalPort, @Nullable String vAppScopedLocalId, int vmNicId, + int internalPort, NatProtocol protocol) { + this.externalIP = externalIP; + this.externalPort = externalPort; + this.vAppScopedLocalId = vAppScopedLocalId; + this.vmNicId = vmNicId; + this.internalPort = internalPort; + this.protocol = checkNotNull(protocol, "protocol"); + } + + /** + * IP address to which this NAT rule maps the IP address specified in the InternalIp element. + */ + @Nullable + public String getExternalIP() { + return externalIP; + } + + /** + * network port to which this NAT rule maps the port number specified in the InternalPort element + */ + public Integer getExternalPort() { + return externalPort; + } + + /** + * @return read‐only identifier created on import + * @since vcloud 0.9 + */ + @Nullable + public String getVAppScopedLocalId() { + return vAppScopedLocalId; + } + + /** + * @return device number of the NIC on the referenced virtual machine + * @since vcloud 0.9 + */ + public int getVmNicId() { + return vmNicId; + } + + /** + * network port to which this NAT rule maps the port number specified in the ExternalPort + * element. + */ + public Integer getInternalPort() { + return internalPort; + } + + /** + * specifies the network protocol to which this rule applies + */ + public NatProtocol getProtocol() { + return protocol; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((externalIP == null) ? 0 : externalIP.hashCode()); + result = prime * result + externalPort; + result = prime * result + internalPort; + result = prime * result + ((protocol == null) ? 0 : protocol.hashCode()); + result = prime * result + ((vAppScopedLocalId == null) ? 0 : vAppScopedLocalId.hashCode()); + result = prime * result + vmNicId; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + VmRule other = (VmRule) obj; + if (externalIP == null) { + if (other.externalIP != null) + return false; + } else if (!externalIP.equals(other.externalIP)) + return false; + if (externalPort != other.externalPort) + return false; + if (internalPort != other.internalPort) + return false; + if (protocol == null) { + if (other.protocol != null) + return false; + } else if (!protocol.equals(other.protocol)) + return false; + if (vAppScopedLocalId == null) { + if (other.vAppScopedLocalId != null) + return false; + } else if (!vAppScopedLocalId.equals(other.vAppScopedLocalId)) + return false; + if (vmNicId != other.vmNicId) + return false; + return true; + } + + @Override + public String toString() { + return "[externalIP=" + externalIP + ", externalPort=" + externalPort + ", internalPort=" + internalPort + + ", protocol=" + protocol + ", vAppScopedLocalId=" + vAppScopedLocalId + ", vmNicId=" + vmNicId + "]"; + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java b/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java index 88797e5f0f..0a79d6a6d9 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptions.java @@ -25,7 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.Map; -import org.jclouds.vcloud.domain.FenceMode; +import org.jclouds.vcloud.domain.network.FenceMode; import com.google.common.collect.Maps; @@ -40,7 +40,7 @@ public class InstantiateVAppTemplateOptions { private String memorySizeMegabytes; private String diskSizeKilobytes; private String network; - private String fenceMode; + private FenceMode fenceMode; private String networkName; private boolean blockOnDeploy = true; private Map properties = Maps.newTreeMap(); @@ -75,8 +75,8 @@ public class InstantiateVAppTemplateOptions { return this; } - public InstantiateVAppTemplateOptions fenceMode(String fenceMode) { - this.fenceMode = checkNotNull(fenceMode, "fenceMode").toString(); + public InstantiateVAppTemplateOptions fenceMode(FenceMode fenceMode) { + this.fenceMode = checkNotNull(fenceMode, "fenceMode"); return this; } @@ -117,7 +117,7 @@ public class InstantiateVAppTemplateOptions { return networkName; } - public String getFenceMode() { + public FenceMode getFenceMode() { return fenceMode; } @@ -170,7 +170,7 @@ public class InstantiateVAppTemplateOptions { /** * @see InstantiateVAppTemplateOptions#fenceMode(FenceMode) */ - public static InstantiateVAppTemplateOptions fenceMode(String fenceMode) { + public static InstantiateVAppTemplateOptions fenceMode(FenceMode fenceMode) { InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); return options.fenceMode(fenceMode); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkFromVCloudExpressNetworkHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkFromVCloudExpressNetworkHandler.java new file mode 100644 index 0000000000..8027279f56 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkFromVCloudExpressNetworkHandler.java @@ -0,0 +1,59 @@ +/** + * + * Copyright (C) 2010 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.xml; + +import javax.inject.Inject; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.vcloud.domain.network.OrgNetwork; +import org.jclouds.vcloud.domain.network.internal.VCloudExpressOrgNetworkAdapter; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +/** + * @author Adrian Cole + */ +public class OrgNetworkFromVCloudExpressNetworkHandler extends ParseSax.HandlerWithResult { + + protected final VCloudExpressNetworkHandler vcxHandler; + + @Inject + public OrgNetworkFromVCloudExpressNetworkHandler(VCloudExpressNetworkHandler vcxHandler) { + this.vcxHandler = vcxHandler; + } + + public OrgNetwork getResult() { + return new VCloudExpressOrgNetworkAdapter(vcxHandler.getResult()); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + vcxHandler.startElement(uri, localName, qName, attributes); + } + + public void endElement(String uri, String name, String qName) { + vcxHandler.endElement(uri, name, qName); + } + + public void characters(char ch[], int start, int length) { + vcxHandler.characters(ch, start, length); + } + +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkHandler.java new file mode 100644 index 0000000000..95c6da7d40 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgNetworkHandler.java @@ -0,0 +1,325 @@ +/** + * + * Copyright (C) 2010 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.xml; + +import static org.jclouds.vcloud.util.Utils.newNamedResource; + +import java.util.List; +import java.util.Set; + +import javax.inject.Inject; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.vcloud.domain.MappingMode; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.network.DhcpService; +import org.jclouds.vcloud.domain.network.Features; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.FirewallService; +import org.jclouds.vcloud.domain.network.IpRange; +import org.jclouds.vcloud.domain.network.IpScope; +import org.jclouds.vcloud.domain.network.NatService; +import org.jclouds.vcloud.domain.network.OrgNetwork; +import org.jclouds.vcloud.domain.network.firewall.FirewallPolicy; +import org.jclouds.vcloud.domain.network.firewall.FirewallProtocols; +import org.jclouds.vcloud.domain.network.firewall.FirewallRule; +import org.jclouds.vcloud.domain.network.internal.OrgNetworkImpl; +import org.jclouds.vcloud.domain.network.nat.NatPolicy; +import org.jclouds.vcloud.domain.network.nat.NatProtocol; +import org.jclouds.vcloud.domain.network.nat.NatRule; +import org.jclouds.vcloud.domain.network.nat.NatType; +import org.jclouds.vcloud.domain.network.nat.rules.OneToOneVmRule; +import org.jclouds.vcloud.domain.network.nat.rules.PortForwardingRule; +import org.jclouds.vcloud.domain.network.nat.rules.VmRule; +import org.jclouds.vcloud.util.Utils; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +/** + * @author Adrian Cole + */ +public class OrgNetworkHandler extends ParseSax.HandlerWithResult { + + protected final TaskHandler taskHandler; + + @Inject + public OrgNetworkHandler(TaskHandler taskHandler) { + this.taskHandler = taskHandler; + } + + protected StringBuilder currentText = new StringBuilder(); + + protected NamedResource network; + protected NamedResource org; + protected String orgDescription; + protected List tasks = Lists.newArrayList(); + + protected String startAddress; + protected String endAddress; + + protected boolean inherited; + protected String gateway; + protected String netmask; + protected String dns1; + protected String dns2; + protected String dnsSuffix; + protected Set ipRanges = Sets.newLinkedHashSet(); + protected Set allocatedIpAddresses = Sets.newLinkedHashSet(); + + protected IpScope ipScope; + protected NamedResource parentNetwork; + protected FenceMode fenceMode; + + protected boolean serviceEnabled; + protected Integer defaultLeaseTime; + protected Integer maxLeaseTime; + + protected DhcpService dhcpService; + + protected boolean inFirewallRule; + protected boolean firewallRuleEnabled; + protected String firewallRuleDescription; + protected FirewallPolicy firewallPolicy; + + protected boolean tcp; + protected boolean udp; + protected FirewallProtocols protocols; + protected int port; + protected String destinationIp; + + protected List firewallRules = Lists.newArrayList(); + protected FirewallService firewallService; + + protected NatType natType; + protected NatPolicy natPolicy; + + protected MappingMode mappingMode; + protected String externalIP; + protected String vAppScopedVmId; + protected int vmNicId; + + protected int externalPort; + protected String internalIP; + protected int internalPort; + protected NatProtocol natProtocol; + + protected String vAppScopedLocalId; + + protected List natRules = Lists.newArrayList(); + protected NatService natService; + + protected Features features; + protected OrgNetwork.Configuration configuration; + + protected NamedResource networkPool; + protected Set allowedExternalIpAddresses = Sets.newLinkedHashSet(); + + public OrgNetwork getResult() { + return new OrgNetworkImpl(network.getName(), network.getType(), network.getId(), org, orgDescription, tasks, + configuration, networkPool, allowedExternalIpAddresses); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + if (qName.equals("OrgNetwork")) { + network = newNamedResource(attributes); + } else if (qName.equals("FirewallRule")) { + this.inFirewallRule = true; + } else if (qName.equals("ParentNetwork")) { + parentNetwork = newNamedResource(attributes); + } else if (qName.equals("Link") && "up".equals(Utils.attrOrNull(attributes, "rel"))) { + org = newNamedResource(attributes); + } else { + taskHandler.startElement(uri, localName, qName, attributes); + } + int typeIndex = attributes.getIndex("type"); + if (typeIndex != -1) { + if (attributes.getValue(typeIndex).indexOf("networkPool+xml") != -1) { + networkPool = newNamedResource(attributes); + } + } + } + + public void endElement(String uri, String name, String qName) { + taskHandler.endElement(uri, name, qName); + if (qName.equals("Task")) { + this.tasks.add(taskHandler.getResult()); + } else if (qName.equals("Description")) { + if (inFirewallRule) + firewallRuleDescription = currentOrNull(); + else + orgDescription = currentOrNull(); + } else if (qName.equals("FenceMode")) { + fenceMode = FenceMode.fromValue(currentOrNull()); + } else if (qName.equals("StartAddress")) { + startAddress = currentOrNull(); + } else if (qName.equals("EndAddress")) { + endAddress = currentOrNull(); + } else if (qName.equals("AllocatedIpAddress")) { + allocatedIpAddresses.add(currentOrNull()); + } else if (qName.equals("IpRange")) { + ipRanges.add(new IpRange(startAddress, endAddress)); + this.startAddress = null; + this.endAddress = null; + } else if (qName.equals("IsInherited")) { + inherited = Boolean.parseBoolean(currentOrNull()); + } else if (qName.equals("Gateway")) { + gateway = currentOrNull(); + } else if (qName.equals("Netmask")) { + netmask = currentOrNull(); + } else if (qName.equals("Dns1")) { + dns1 = currentOrNull(); + } else if (qName.equals("Dns2")) { + dns2 = currentOrNull(); + } else if (qName.equals("DnsSuffix")) { + dnsSuffix = currentOrNull(); + } else if (qName.equals("IpScope")) { + ipScope = new IpScope(inherited, gateway, netmask, dns1, dns2, dnsSuffix, ipRanges, allocatedIpAddresses); + this.inherited = false; + this.gateway = null; + this.netmask = null; + this.dns1 = null; + this.dns2 = null; + this.dnsSuffix = null; + this.ipRanges = Sets.newLinkedHashSet(); + this.allocatedIpAddresses = Sets.newLinkedHashSet(); + } else if (qName.equals("IsEnabled")) { + if (inFirewallRule) + firewallRuleEnabled = Boolean.parseBoolean(currentOrNull()); + else + serviceEnabled = Boolean.parseBoolean(currentOrNull()); + } else if (qName.equals("DefaultLeaseTime")) { + defaultLeaseTime = Integer.parseInt(currentOrNull()); + } else if (qName.equals("MaxLeaseTime")) { + maxLeaseTime = Integer.parseInt(currentOrNull()); + } else if (qName.equals("DhcpService")) { + this.dhcpService = new DhcpService(serviceEnabled, defaultLeaseTime, maxLeaseTime, Iterables + .getOnlyElement(ipRanges)); + this.serviceEnabled = false; + this.defaultLeaseTime = null; + this.maxLeaseTime = null; + this.ipRanges = Sets.newLinkedHashSet(); + } else if (qName.equals("Policy")) { + if (inFirewallRule) + firewallPolicy = FirewallPolicy.fromValue(currentOrNull()); + else + natPolicy = NatPolicy.fromValue(currentOrNull()); + } else if (qName.equals("Tcp")) { + tcp = Boolean.parseBoolean(currentOrNull()); + } else if (qName.equals("Udp")) { + udp = Boolean.parseBoolean(currentOrNull()); + } else if (qName.equals("Protocols")) { + this.protocols = new FirewallProtocols(tcp, udp); + this.tcp = false; + this.udp = false; + } else if (qName.equals("DestinationIp")) { + this.destinationIp = currentOrNull(); + } else if (qName.equals("FirewallRule")) { + this.inFirewallRule = false; + this.firewallRules.add(new FirewallRule(firewallRuleEnabled, firewallRuleDescription, firewallPolicy, + protocols, port, destinationIp)); + this.firewallRuleEnabled = false; + this.firewallRuleDescription = null; + this.firewallPolicy = null; + this.protocols = null; + this.port = -1; + this.destinationIp = null; + } else if (qName.equals("FirewallService")) { + firewallService = new FirewallService(serviceEnabled, firewallRules); + this.serviceEnabled = false; + this.firewallRules = Lists.newArrayList(); + } else if (qName.equals("NatType")) { + natType = NatType.fromValue(currentOrNull()); + } else if (qName.equals("MappingMode")) { + mappingMode = MappingMode.fromValue(currentOrNull()); + } else if (qName.equalsIgnoreCase("ExternalIP")) { + externalIP = currentOrNull(); + } else if (qName.equalsIgnoreCase("VAppScopedVmId")) { + vAppScopedVmId = currentOrNull(); + } else if (qName.equalsIgnoreCase("VAppScopedLocalId")) { + vAppScopedLocalId = currentOrNull(); + } else if (qName.equalsIgnoreCase("vmNicId")) { + vmNicId = Integer.parseInt(currentOrNull()); + } else if (qName.equals("OneToOneVmRule")) { + natRules.add(new OneToOneVmRule(mappingMode, externalIP, vAppScopedVmId, vmNicId)); + this.mappingMode = null; + this.externalIP = null; + this.vAppScopedVmId = null; + this.vmNicId = -1; + } else if (qName.equalsIgnoreCase("ExternalPort")) { + externalPort = Integer.parseInt(currentOrNull()); + } else if (qName.equalsIgnoreCase("IxternalIP")) { + internalIP = currentOrNull(); + } else if (qName.equalsIgnoreCase("InternalPort")) { + internalPort = Integer.parseInt(currentOrNull()); + } else if (qName.equals("NatProtocol")) { + natProtocol = NatProtocol.valueOf(currentOrNull()); + } else if (qName.equals("PortForwardingRule")) { + natRules.add(new PortForwardingRule(externalIP, externalPort, internalIP, internalPort, natProtocol)); + this.externalIP = null; + this.externalPort = -1; + this.internalIP = null; + this.internalPort = -1; + this.natProtocol = null; + } else if (qName.equals("VmRule")) { + natRules.add(new VmRule(externalIP, externalPort, vAppScopedLocalId, vmNicId, internalPort, natProtocol)); + this.externalIP = null; + this.externalPort = -1; + this.vAppScopedLocalId = null; + this.vmNicId = -1; + this.internalPort = -1; + this.natProtocol = null; + } else if (qName.equals("NatService")) { + this.natService = new NatService(serviceEnabled, natType, natPolicy, natRules); + this.serviceEnabled = false; + this.natType = null; + this.natPolicy = null; + this.natRules = Lists.newArrayList(); + } else if (qName.equals("Features")) { + this.features = new Features(dhcpService, firewallService, natService); + this.dhcpService = null; + this.firewallService = null; + this.natService = null; + } else if (qName.equals("Configuration")) { + configuration = new OrgNetworkImpl.ConfigurationImpl(ipScope, parentNetwork, fenceMode, features); + this.ipScope = null; + this.parentNetwork = null; + this.fenceMode = null; + this.features = null; + } else if (qName.equals("AllowedExternalIpAddress")) { + allowedExternalIpAddresses.add(currentOrNull()); + } + currentText = new StringBuilder(); + } + + public void characters(char ch[], int start, int length) { + currentText.append(ch, start, length); + } + + protected String currentOrNull() { + String returnVal = currentText.toString().trim(); + return returnVal.equals("") ? null : returnVal; + } +} diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/NetworkHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VCloudExpressNetworkHandler.java similarity index 70% rename from vcloud/core/src/main/java/org/jclouds/vcloud/xml/NetworkHandler.java rename to vcloud/core/src/main/java/org/jclouds/vcloud/xml/VCloudExpressNetworkHandler.java index cb5c3ae253..74d2f5757f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/NetworkHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VCloudExpressNetworkHandler.java @@ -25,13 +25,14 @@ import javax.annotation.Resource; import org.jclouds.http.functions.ParseSax; import org.jclouds.logging.Logger; -import org.jclouds.vcloud.domain.FirewallRule; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.NatRule; -import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.FirewallRule.Policy; -import org.jclouds.vcloud.domain.FirewallRule.Protocol; -import org.jclouds.vcloud.domain.internal.NetworkImpl; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.VCloudExpressNetwork; +import org.jclouds.vcloud.domain.network.firewall.FirewallPolicy; +import org.jclouds.vcloud.domain.network.firewall.FirewallRule; +import org.jclouds.vcloud.domain.network.internal.VCloudExpressNetworkImpl; +import org.jclouds.vcloud.domain.network.nat.NatProtocol; +import org.jclouds.vcloud.domain.network.nat.rules.PortForwardingRule; import org.jclouds.vcloud.util.Utils; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -41,7 +42,7 @@ import com.google.common.collect.Sets; /** * @author Adrian Cole */ -public class NetworkHandler extends ParseSax.HandlerWithResult { +public class VCloudExpressNetworkHandler extends ParseSax.HandlerWithResult { @Resource protected Logger logger = Logger.NULL; @@ -55,9 +56,9 @@ public class NetworkHandler extends ParseSax.HandlerWithResult { private Set dnsServers = Sets.newLinkedHashSet(); private String gateway; private String netmask; - private Set fenceModes = Sets.newLinkedHashSet(); + private Set fenceModes = Sets.newLinkedHashSet(); private Boolean dhcp; - private Set natRules = Sets.newLinkedHashSet(); + private Set natRules = Sets.newLinkedHashSet(); private Set firewallRules = Sets.newLinkedHashSet(); private String externalIP; @@ -65,14 +66,13 @@ public class NetworkHandler extends ParseSax.HandlerWithResult { private String internalIP; private Integer internalPort; - private Policy policy; - private Protocol protocol; + private FirewallPolicy policy; private String sourceIP; - private String sourcePort; + private int sourcePort; - public Network getResult() { - return new NetworkImpl(network.getName(), network.getId(), description, dnsServers, gateway, netmask, - fenceModes, dhcp, natRules, firewallRules); + public VCloudExpressNetwork getResult() { + return new VCloudExpressNetworkImpl(network.getName(), network.getType(), network.getId(), description, + dnsServers, gateway, netmask, fenceModes, dhcp, natRules, firewallRules); } @Override @@ -92,11 +92,15 @@ public class NetworkHandler extends ParseSax.HandlerWithResult { } else if (qName.equals("Netmask")) { netmask = currentOrNull(); } else if (qName.equals("FenceMode")) { - fenceModes.add(currentOrNull()); + try { + fenceModes.add(FenceMode.fromValue(currentOrNull())); + } catch (IllegalArgumentException e) { + fenceModes.add(FenceMode.BRIDGED); + } } else if (qName.equals("Dhcp")) { dhcp = new Boolean(currentOrNull()); } else if (qName.equals("NatRule")) { - natRules.add(new NatRule(externalIP, externalPort, internalIP, internalPort)); + natRules.add(new PortForwardingRule(externalIP, externalPort, internalIP, internalPort, NatProtocol.TCP_UDP)); externalIP = null; externalPort = null; internalIP = null; @@ -110,19 +114,16 @@ public class NetworkHandler extends ParseSax.HandlerWithResult { } else if (qName.equals("InternalPort")) { internalPort = Integer.parseInt(currentOrNull()); } else if (qName.equals("FirewallRule")) { - firewallRules.add(new FirewallRule(policy, protocol, sourceIP, sourcePort)); + firewallRules.add(new FirewallRule(true, null, policy, null, sourcePort, sourceIP)); policy = null; - protocol = null; sourceIP = null; - sourcePort = null; + sourcePort = -1; } else if (qName.equals("Policy")) { - policy = Policy.fromValue(currentOrNull()); - } else if (qName.equals("Policy")) { - protocol = Protocol.fromValue(currentOrNull()); + policy = FirewallPolicy.fromValue(currentOrNull()); } else if (qName.equals("SourceIp")) { sourceIP = currentOrNull(); } else if (qName.equals("SourcePort")) { - sourcePort = currentOrNull(); + sourcePort = Integer.parseInt(currentOrNull()); } currentText = new StringBuilder(); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java index 9f8990905a..0ada9efc97 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java @@ -30,11 +30,11 @@ import org.jclouds.rest.RestContext; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.Network; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VDC; +import org.jclouds.vcloud.domain.network.OrgNetwork; import org.testng.annotations.BeforeGroups; import org.testng.annotations.Test; @@ -80,7 +80,7 @@ public abstract class CommonVCloudClientLiveTest { assertPayloadEquals(request, null, null, false); assertResponseParserClassEquals(method, request, ParseSax.class); - assertSaxResponseParserClassEquals(method, NetworkHandler.class); + assertSaxResponseParserClassEquals(method, OrgNetworkHandler.class); assertExceptionParserClassEquals(method, ReturnNullOnNotFoundOr404.class); checkFilters(request); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index b49ee08f2c..ef8250f6e8 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -57,13 +57,14 @@ import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.jclouds.vcloud.domain.internal.OrgImpl; import org.jclouds.vcloud.domain.internal.VDCImpl; +import org.jclouds.vcloud.domain.network.FenceMode; import org.jclouds.vcloud.filters.SetVCloudTokenCookie; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.CatalogItemHandler; -import org.jclouds.vcloud.xml.NetworkHandler; 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.VAppHandler; @@ -116,7 +117,7 @@ public class VCloudExpressAsyncClientTest extends RestClientTest + * + * ==================================================================== + * 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.domain.network.internal; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; +import java.net.URI; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ParseSax.Factory; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.IpRange; +import org.jclouds.vcloud.domain.network.IpScope; +import org.jclouds.vcloud.domain.network.OrgNetwork; +import org.jclouds.vcloud.domain.network.VCloudExpressNetwork; +import org.jclouds.vcloud.xml.VCloudExpressNetworkHandler; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Tests behavior of {@code VCloudExpressOrgNetworkAdapter} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.VCloudExpressOrgNetworkAdapterTest") +public class VCloudExpressOrgNetworkAdapterTest { + + public void testTerremark() { + InputStream is = getClass().getResourceAsStream("/express/network-terremark.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + VCloudExpressNetwork in = factory.create(injector.getInstance(VCloudExpressNetworkHandler.class)).parse(is); + OrgNetwork result = new VCloudExpressOrgNetworkAdapter(in); + assertEquals(result.getName(), "10.114.34.128/26"); + assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/network/1708")); + assertEquals(result.getType(), "application/vnd.vmware.vcloud.network+xml"); + assertEquals(result.getOrg(), null); + assertEquals(result.getDescription(), null); + assertEquals(result.getTasks(), ImmutableList.of()); + assert result.getConfiguration() != null; + + assertEquals(result.getConfiguration().getIpScope(), new IpScope(true, "10.114.34.129", "255.255.255.192", null, + null, null, ImmutableSet. of(), ImmutableSet. of())); + + assertEquals(result.getConfiguration().getParentNetwork(), null); + assertEquals(result.getConfiguration().getFenceMode(), FenceMode.ISOLATED); + assert result.getConfiguration().getFeatures() != null; + + assertEquals(result.getConfiguration().getFeatures().getDhcpService(), null); + assertEquals(result.getConfiguration().getFeatures().getFirewallService(), null); + assertEquals(result.getConfiguration().getFeatures().getNatService(), null); + + assertEquals(result.getNetworkPool(), null); + assertEquals(result.getAllowedExternalIpAddresses(), ImmutableSet. of()); + + } + + public void testBluelock() { + InputStream is = getClass().getResourceAsStream("/express/network-bluelock.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + VCloudExpressNetwork in = factory.create(injector.getInstance(VCloudExpressNetworkHandler.class)).parse(is); + OrgNetwork result = new VCloudExpressOrgNetworkAdapter(in); + assertEquals(result.getName(), "Pod03_Private"); + assertEquals(result.getId(), URI.create("https://express3.bluelock.com/api/v0.8/network/1")); + assertEquals(result.getType(), null); + assertEquals(result.getOrg(), null); + assertEquals(result.getDescription(), "Pod 03 Private Network"); + assertEquals(result.getTasks(), ImmutableList.of()); + assert result.getConfiguration() != null; + + assertEquals(result.getConfiguration().getIpScope(), new IpScope(true, "172.18.8.1", "255.255.248.0", + "66.133.112.131", "24.172.173.113", null, ImmutableSet. of(), ImmutableSet. of())); + + assertEquals(result.getConfiguration().getParentNetwork(), null); + assertEquals(result.getConfiguration().getFenceMode(), FenceMode.BRIDGED); + assert result.getConfiguration().getFeatures() != null; + + assertEquals(result.getConfiguration().getFeatures().getDhcpService(), null); + assertEquals(result.getConfiguration().getFeatures().getFirewallService(), null); + assertEquals(result.getConfiguration().getFeatures().getNatService(), null); + + assertEquals(result.getNetworkPool(), null); + assertEquals(result.getAllowedExternalIpAddresses(), ImmutableSet. of()); + + } +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptionsTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptionsTest.java index 3a8b0eac85..e2776a331c 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptionsTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/options/InstantiateVAppTemplateOptionsTest.java @@ -30,7 +30,7 @@ import static org.testng.Assert.assertEquals; import java.net.URI; import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.domain.FenceMode; +import org.jclouds.vcloud.domain.network.FenceMode; import org.testng.annotations.Test; import com.google.inject.Guice; @@ -121,13 +121,13 @@ public class InstantiateVAppTemplateOptionsTest { public void testFenceMode() { InstantiateVAppTemplateOptions options = new InstantiateVAppTemplateOptions(); options.fenceMode(FenceMode.BRIDGED); - assertEquals(options.getFenceMode(), "bridged"); + assertEquals(options.getFenceMode(), FenceMode.BRIDGED); } @Test public void testFenceModeStatic() { InstantiateVAppTemplateOptions options = fenceMode(FenceMode.BRIDGED); - assertEquals(options.getFenceMode(), "bridged"); + assertEquals(options.getFenceMode(), FenceMode.BRIDGED); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/NetworkHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/NetworkHandlerTest.java deleted file mode 100644 index 51b94a3912..0000000000 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/NetworkHandlerTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/** - * - * Copyright (C) 2010 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.xml; - -import static org.testng.Assert.assertEquals; - -import java.io.InputStream; -import java.net.URI; -import java.net.UnknownHostException; - -import org.jclouds.http.functions.ParseSax; -import org.jclouds.http.functions.ParseSax.Factory; -import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.domain.FenceMode; -import org.jclouds.vcloud.domain.FirewallRule; -import org.jclouds.vcloud.domain.NatRule; -import org.jclouds.vcloud.domain.Network; -import org.jclouds.vcloud.domain.internal.NetworkImpl; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableSet; -import com.google.inject.Guice; -import com.google.inject.Injector; - -/** - * Tests behavior of {@code NetworkHandler} - * - * @author Adrian Cole - */ -@Test(groups = "unit", testName = "vcloud.NetworkHandlerTest") -public class NetworkHandlerTest { - - private Injector injector; - - private Factory factory; - - public void testTerremark() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/network-terremark.xml"); - injector = Guice.createInjector(new SaxParserModule()); - factory = injector.getInstance(ParseSax.Factory.class); - Network result = factory.create(injector.getInstance(NetworkHandler.class)).parse(is); - assertEquals(result, new NetworkImpl("10.114.34.128/26", URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/network/1708"), null, ImmutableSet - . of(), "10.114.34.129", "255.255.255.192", ImmutableSet. of(FenceMode.ISOLATED), null, - ImmutableSet. of(), ImmutableSet. of())); - } - - public void testHosting() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/network-hosting.xml"); - injector = Guice.createInjector(new SaxParserModule()); - factory = injector.getInstance(ParseSax.Factory.class); - Network result = (Network) factory.create(injector.getInstance(NetworkHandler.class)).parse(is); - assertEquals(result, new NetworkImpl("188849 trust", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/network/1183"), "188849 trust", ImmutableSet - . of("76.12.32.110", "208.112.89.187"), "204.12.53.89", "255.255.255.248", ImmutableSet - . of(), null, ImmutableSet. of(), ImmutableSet. of())); - } - -} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgNetworkHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgNetworkHandlerTest.java new file mode 100644 index 0000000000..339d538c4e --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgNetworkHandlerTest.java @@ -0,0 +1,107 @@ +/** + * + * Copyright (C) 2010 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.xml; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; +import java.net.URI; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ParseSax.Factory; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.vcloud.VCloudMediaType; +import org.jclouds.vcloud.domain.internal.NamedResourceImpl; +import org.jclouds.vcloud.domain.network.DhcpService; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.IpRange; +import org.jclouds.vcloud.domain.network.IpScope; +import org.jclouds.vcloud.domain.network.OrgNetwork; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Tests behavior of {@code OrgNetworkHandler} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.OrgNetworkHandlerTest") +public class OrgNetworkHandlerTest { + public void testIsolated() { + InputStream is = getClass().getResourceAsStream("/orgnetwork-isolated.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + OrgNetwork result = factory.create(injector.getInstance(OrgNetworkHandler.class)).parse(is); + assertEquals(result.getName(), "isolation01"); + assertEquals(result.getId(), URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/990419644")); + assertEquals(result.getType(), "application/vnd.vmware.vcloud.network+xml"); + assertEquals(result.getOrg(), new NamedResourceImpl(null, VCloudMediaType.ORG_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/org/9566014"))); + assertEquals(result.getDescription(), null); + assertEquals(result.getTasks(), ImmutableList.of()); + assert result.getConfiguration() != null; + + assertEquals(result.getConfiguration().getIpScope(), new IpScope(false, "192.168.15.1", "255.255.255.0", + "23.172.173.113", null, null, + ImmutableSet. of(new IpRange("192.168.15.100", "192.168.15.199")), ImmutableSet. of())); + assertEquals(result.getConfiguration().getParentNetwork(), null); + assertEquals(result.getConfiguration().getFenceMode(), FenceMode.ISOLATED); + assert result.getConfiguration().getFeatures() != null; + + assertEquals(result.getConfiguration().getFeatures().getDhcpService(), new DhcpService(false, 3600, 7200, + new IpRange("192.168.15.2", "192.168.15.99"))); + assertEquals(result.getConfiguration().getFeatures().getFirewallService(), null); + assertEquals(result.getConfiguration().getFeatures().getNatService(), null); + + assertEquals(result.getNetworkPool(), null); + assertEquals(result.getAllowedExternalIpAddresses(), ImmutableSet. of()); + + } + + public void testBridged() { + InputStream is = getClass().getResourceAsStream("/orgnetwork-bridged.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + OrgNetwork result = factory.create(injector.getInstance(OrgNetworkHandler.class)).parse(is); + assertEquals(result.getName(), "internet01"); + assertEquals(result.getId(), URI.create("https://vcenterprise.bluelock.com/api/v1.0/network/758634723")); + assertEquals(result.getType(), "application/vnd.vmware.vcloud.network+xml"); + assertEquals(result.getOrg(), new NamedResourceImpl(null, VCloudMediaType.ORG_XML, URI + .create("https://vcenterprise.bluelock.com/api/v1.0/org/9566014"))); + assertEquals(result.getDescription(), null); + assertEquals(result.getTasks(), ImmutableList.of()); + assert result.getConfiguration() != null; + + assertEquals(result.getConfiguration().getIpScope(), new IpScope(true, "174.47.101.161", "255.255.255.224", + "24.172.173.113", null, null, + ImmutableSet. of(new IpRange("174.47.101.164", "174.47.101.190")), ImmutableSet. of())); + assertEquals(result.getConfiguration().getParentNetwork(), null); + assertEquals(result.getConfiguration().getFenceMode(), FenceMode.BRIDGED); + assert result.getConfiguration().getFeatures() == null; + assertEquals(result.getNetworkPool(), null); + assertEquals(result.getAllowedExternalIpAddresses(), ImmutableSet. of()); + + } + +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VCloudExpressNetworkHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VCloudExpressNetworkHandlerTest.java new file mode 100644 index 0000000000..19ee37b9e3 --- /dev/null +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VCloudExpressNetworkHandlerTest.java @@ -0,0 +1,91 @@ +/** + * + * Copyright (C) 2010 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.xml; + +import static org.testng.Assert.assertEquals; + +import java.io.InputStream; +import java.net.URI; +import java.net.UnknownHostException; + +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.ParseSax.Factory; +import org.jclouds.http.functions.config.SaxParserModule; +import org.jclouds.vcloud.domain.network.FenceMode; +import org.jclouds.vcloud.domain.network.VCloudExpressNetwork; +import org.jclouds.vcloud.domain.network.firewall.FirewallRule; +import org.jclouds.vcloud.domain.network.internal.VCloudExpressNetworkImpl; +import org.jclouds.vcloud.domain.network.nat.rules.PortForwardingRule; +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableSet; +import com.google.inject.Guice; +import com.google.inject.Injector; + +/** + * Tests behavior of {@code VCloudExpressNetworkHandler} + * + * @author Adrian Cole + */ +@Test(groups = "unit", testName = "vcloud.VCloudExpressNetworkHandlerTest") +public class VCloudExpressNetworkHandlerTest { + + private Injector injector; + + private Factory factory; + + public void testTerremark() throws UnknownHostException { + InputStream is = getClass().getResourceAsStream("/express/network-terremark.xml"); + injector = Guice.createInjector(new SaxParserModule()); + factory = injector.getInstance(ParseSax.Factory.class); + VCloudExpressNetwork result = factory.create(injector.getInstance(VCloudExpressNetworkHandler.class)).parse(is); + assertEquals(result, new VCloudExpressNetworkImpl("10.114.34.128/26", + "application/vnd.vmware.vcloud.network+xml", URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/network/1708"), null, + ImmutableSet. of(), "10.114.34.129", "255.255.255.192", ImmutableSet + . of(FenceMode.ISOLATED), null, ImmutableSet. of(), ImmutableSet + . of())); + } + + public void testHosting() throws UnknownHostException { + InputStream is = getClass().getResourceAsStream("/express/network-hosting.xml"); + injector = Guice.createInjector(new SaxParserModule()); + factory = injector.getInstance(ParseSax.Factory.class); + VCloudExpressNetwork result = (VCloudExpressNetwork) factory.create( + injector.getInstance(VCloudExpressNetworkHandler.class)).parse(is); + assertEquals(result, new VCloudExpressNetworkImpl("188849 trust", null, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/network/1183"), "188849 trust", ImmutableSet + . of("76.12.32.110", "208.112.89.187"), "204.12.53.89", "255.255.255.248", ImmutableSet + . of(), null, ImmutableSet. of(), ImmutableSet. of())); + } + + public void testBluelock() throws UnknownHostException { + InputStream is = getClass().getResourceAsStream("/express/network-bluelock.xml"); + injector = Guice.createInjector(new SaxParserModule()); + factory = injector.getInstance(ParseSax.Factory.class); + VCloudExpressNetwork result = (VCloudExpressNetwork) factory.create( + injector.getInstance(VCloudExpressNetworkHandler.class)).parse(is); + assertEquals(result, new VCloudExpressNetworkImpl("Pod03_Private", null, URI + .create("https://express3.bluelock.com/api/v0.8/network/1"), "Pod 03 Private Network", ImmutableSet + . of("24.172.173.113", "66.133.112.131"), "172.18.8.1", "255.255.248.0", ImmutableSet + . of(), null, ImmutableSet. of(), ImmutableSet. of())); + } + +} diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java index 4e90f1870f..1646c97631 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VDCHandlerTest.java @@ -37,6 +37,7 @@ import org.jclouds.vcloud.domain.VDCStatus; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.inject.Guice; import com.google.inject.Injector; @@ -60,6 +61,7 @@ public class VDCHandlerTest { assertEquals(result.getOrg(), new NamedResourceImpl(null, VCloudMediaType.ORG_XML, URI .create("https://vcenterprise.bluelock.com/api/v1.0/org/9566014"))); assertEquals(result.getDescription(), null); + assertEquals(result.getTasks(), ImmutableList.of()); assertEquals(result.getAllocationModel(), AllocationModel.ALLOCATION_POOL); assertEquals(result.getStorageCapacity(), new Capacity("MB", 1024000, 1024000, 0, 0)); assertEquals(result.getCpuCapacity(), new Capacity("MHz", 20000, 20000, 0, 0)); diff --git a/vcloud/core/src/test/resources/express/network-bluelock.xml b/vcloud/core/src/test/resources/express/network-bluelock.xml new file mode 100644 index 0000000000..834f53b3bd --- /dev/null +++ b/vcloud/core/src/test/resources/express/network-bluelock.xml @@ -0,0 +1,13 @@ + + + Pod 03 Private Network + + 24.172.173.113 + 66.133.112.131 + 172.18.8.1 + 255.255.248.0 + + diff --git a/vcloud/core/src/test/resources/network-hosting.xml b/vcloud/core/src/test/resources/express/network-hosting.xml similarity index 100% rename from vcloud/core/src/test/resources/network-hosting.xml rename to vcloud/core/src/test/resources/express/network-hosting.xml diff --git a/vcloud/core/src/test/resources/network-terremark.xml b/vcloud/core/src/test/resources/express/network-terremark.xml similarity index 100% rename from vcloud/core/src/test/resources/network-terremark.xml rename to vcloud/core/src/test/resources/express/network-terremark.xml diff --git a/vcloud/core/src/test/resources/orgnetwork-bridged.xml b/vcloud/core/src/test/resources/orgnetwork-bridged.xml new file mode 100644 index 0000000000..cb2a0d3c23 --- /dev/null +++ b/vcloud/core/src/test/resources/orgnetwork-bridged.xml @@ -0,0 +1,20 @@ + + + + + + + true + 174.47.101.161 + 255.255.255.224 + 24.172.173.113 + + + 174.47.101.164 + 174.47.101.190 + + + + bridged + + \ No newline at end of file diff --git a/vcloud/core/src/test/resources/orgnetwork-isolated.xml b/vcloud/core/src/test/resources/orgnetwork-isolated.xml new file mode 100644 index 0000000000..ac3a66a2d3 --- /dev/null +++ b/vcloud/core/src/test/resources/orgnetwork-isolated.xml @@ -0,0 +1,31 @@ + + + + + + + false + 192.168.15.1 + 255.255.255.0 + 23.172.173.113 + + + 192.168.15.100 + 192.168.15.199 + + + + isolated + + + false + 3600 + 7200 + + 192.168.15.2 + 192.168.15.99 + + + + + diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java index 4fd62974a0..4e58de9697 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.terremark.binders; +import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_FENCEMODE; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_NETWORK; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE; @@ -49,35 +50,28 @@ import com.jamesmurty.utils.XMLBuilder; */ @Singleton public class TerremarkBindInstantiateVAppTemplateParamsToXmlPayload extends - BindInstantiateVAppTemplateParamsToXmlPayload { + BindInstantiateVAppTemplateParamsToXmlPayload { @Inject - public TerremarkBindInstantiateVAppTemplateParamsToXmlPayload( - BindToStringPayload stringBinder, - @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, - @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, - @Named(PROPERTY_VCLOUD_DEFAULT_NETWORK) String network, - @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) { - super(stringBinder, ns, schema, network, fenceMode); + public TerremarkBindInstantiateVAppTemplateParamsToXmlPayload(BindToStringPayload stringBinder, + @Named(PROPERTY_API_VERSION) String apiVersion, @Named(PROPERTY_VCLOUD_XML_NAMESPACE) String ns, + @Named(PROPERTY_VCLOUD_XML_SCHEMA) String schema, @Named(PROPERTY_VCLOUD_DEFAULT_NETWORK) String network, + @Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) { + super(stringBinder, apiVersion, ns, schema, network, fenceMode); } @Override - protected String generateXml(String name, String template, - Map properties, - SortedMap virtualHardwareQuantity, - String networkName, @Nullable String fenceMode, URI network) - throws ParserConfigurationException, FactoryConfigurationError, - TransformerException { - return super.generateXml(name, template, properties, - virtualHardwareQuantity, networkName, fenceMode, network); + protected String generateXml(String name, String template, Map properties, + SortedMap virtualHardwareQuantity, String networkName, @Nullable String fenceMode, + URI network) throws ParserConfigurationException, FactoryConfigurationError, TransformerException { + return super.generateXml(name, template, properties, virtualHardwareQuantity, networkName, fenceMode, network); } @Override - protected void addPropertiesifPresent(XMLBuilder instantiationParamsBuilder, - Map properties) { + protected void addPropertiesifPresent(XMLBuilder instantiationParamsBuilder, Map properties) { if (properties.size() == 0) { // terremark requires the product section. - instantiationParamsBuilder.e("ProductSection").a("xmlns:q1", ns).a( - "xmlns:ovf", "http://schemas.dmtf.org/ovf/envelope/1"); + instantiationParamsBuilder.e("ProductSection").a("xmlns:q1", ns).a("xmlns:ovf", + "http://schemas.dmtf.org/ovf/envelope/1"); } else { super.addPropertiesifPresent(instantiationParamsBuilder, properties); } From 3bce2e0d94ae6ac3a52d68883316b0fd91a252ef Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 22 Aug 2010 14:59:32 -0700 Subject: [PATCH 11/16] commented out code that references missing classes --- .../internal/BaseLoadBalancerService.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java b/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java index e12028d669..d76fb6b704 100644 --- a/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java +++ b/compute/src/main/java/org/jclouds/compute/internal/BaseLoadBalancerService.java @@ -35,7 +35,6 @@ import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.predicates.NodePredicates; import org.jclouds.compute.reference.ComputeServiceConstants; import org.jclouds.compute.strategy.DestroyLoadBalancerStrategy; -import org.jclouds.compute.strategy.ListLoadBalancersStrategy; import org.jclouds.compute.strategy.LoadBalanceNodesStrategy; import org.jclouds.domain.Location; import org.jclouds.http.handlers.BackoffLimitedRetryHandler; @@ -44,6 +43,7 @@ import org.jclouds.logging.Logger; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Sets; @@ -69,23 +69,20 @@ public class BaseLoadBalancerService implements LoadBalancerService { protected final ComputeServiceContext context; protected final LoadBalanceNodesStrategy loadBalancerStrategy; protected final DestroyLoadBalancerStrategy destroyLoadBalancerStrategy; - protected final ListLoadBalancersStrategy listLoadBalancersStrategy; + // protected final ListLoadBalancersStrategy listLoadBalancersStrategy; protected final BackoffLimitedRetryHandler backoffLimitedRetryHandler; @Inject - protected BaseLoadBalancerService(ComputeServiceContext context, - LoadBalanceNodesStrategy loadBalancerStrategy, + protected BaseLoadBalancerService(ComputeServiceContext context, LoadBalanceNodesStrategy loadBalancerStrategy, DestroyLoadBalancerStrategy destroyLoadBalancerStrategy, - ListLoadBalancersStrategy listLoadBalancersStrategy, + // ListLoadBalancersStrategy listLoadBalancersStrategy, BackoffLimitedRetryHandler backoffLimitedRetryHandler) { this.context = checkNotNull(context, "context"); this.loadBalancerStrategy = checkNotNull(loadBalancerStrategy, "loadBalancerStrategy"); - this.destroyLoadBalancerStrategy = checkNotNull(destroyLoadBalancerStrategy, - "destroyLoadBalancerStrategy"); - this.listLoadBalancersStrategy = checkNotNull(listLoadBalancersStrategy, - "listLoadBalancersStrategy"); - this.backoffLimitedRetryHandler = checkNotNull(backoffLimitedRetryHandler, - "backoffLimitedRetryHandler"); + this.destroyLoadBalancerStrategy = checkNotNull(destroyLoadBalancerStrategy, "destroyLoadBalancerStrategy"); + // this.listLoadBalancersStrategy = checkNotNull(listLoadBalancersStrategy, + // "listLoadBalancersStrategy"); + this.backoffLimitedRetryHandler = checkNotNull(backoffLimitedRetryHandler, "backoffLimitedRetryHandler"); } /** @@ -97,17 +94,16 @@ public class BaseLoadBalancerService implements LoadBalancerService { } @Override - public Set loadBalanceNodesMatching(Predicate filter, - String loadBalancerName, String protocol, int loadBalancerPort, int instancePort) { + public Set loadBalanceNodesMatching(Predicate filter, String loadBalancerName, + String protocol, int loadBalancerPort, int instancePort) { checkNotNull(loadBalancerName, "loadBalancerName"); checkNotNull(protocol, "protocol"); checkArgument(protocol.toUpperCase().equals("HTTP") || protocol.toUpperCase().equals("TCP"), "Acceptable values for protocol are HTTP or TCP"); Map> locationMap = Maps.newHashMap(); - for (NodeMetadata node : Iterables.filter(context.getComputeService() - .listNodesDetailsMatching(NodePredicates.all()), Predicates.and(filter, Predicates - .not(NodePredicates.TERMINATED)))) { + for (NodeMetadata node : Iterables.filter(context.getComputeService().listNodesDetailsMatching( + NodePredicates.all()), Predicates.and(filter, Predicates.not(NodePredicates.TERMINATED)))) { Set ids = locationMap.get(node.getLocation()); if (ids == null) ids = Sets.newHashSet(); @@ -117,8 +113,8 @@ public class BaseLoadBalancerService implements LoadBalancerService { Set dnsNames = Sets.newHashSet(); for (Location location : locationMap.keySet()) { logger.debug(">> creating load balancer (%s)", loadBalancerName); - String dnsName = loadBalancerStrategy.execute(location, loadBalancerName, protocol, - loadBalancerPort, instancePort, locationMap.get(location)); + String dnsName = loadBalancerStrategy.execute(location, loadBalancerName, protocol, loadBalancerPort, + instancePort, locationMap.get(location)); dnsNames.add(dnsName); logger.debug("<< created load balancer (%s) DNS (%s)", loadBalancerName, dnsName); } @@ -135,11 +131,12 @@ public class BaseLoadBalancerService implements LoadBalancerService { boolean successful = destroyLoadBalancerStrategy.execute(loadBalancer); logger.debug("<< destroyed load balancer(%s) success(%s)", loadBalancer, successful); } - - public Set listLoadBalancers() - { - Set loadBalancerSet = listLoadBalancersStrategy.execute(); - return loadBalancerSet; + + public Set listLoadBalancers() { + return ImmutableSet.of(); + // TODO + // Set loadBalancerSet = listLoadBalancersStrategy.execute(); + // return loadBalancerSet; } } \ No newline at end of file From 5015c169e4123cf5e91b16b8413b33a4de94e6a0 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 22 Aug 2010 21:25:18 -0700 Subject: [PATCH 12/16] moved io out of injector and into supplier code --- ...vaUrlHttpCommandExecutorServiceModule.java | 40 ++++++++++++++----- .../JavaUrlHttpCommandExecutorService.java | 6 +-- .../BackoffLimitedRetryHandlerTest.java | 3 +- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java b/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java index ff1facf787..9925585cf3 100644 --- a/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java +++ b/core/src/main/java/org/jclouds/http/config/JavaUrlHttpCommandExecutorServiceModule.java @@ -19,14 +19,12 @@ package org.jclouds.http.config; -import java.security.KeyManagementException; -import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.cert.X509Certificate; import java.util.Map; import javax.annotation.Resource; -import javax.inject.Named; +import javax.inject.Inject; import javax.inject.Singleton; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; @@ -40,10 +38,13 @@ import org.jclouds.http.TransformingHttpCommandExecutorServiceImpl; import org.jclouds.http.internal.JavaUrlHttpCommandExecutorService; import org.jclouds.logging.Logger; +import com.google.common.base.Supplier; +import com.google.common.base.Throwables; import com.google.common.collect.Maps; import com.google.inject.AbstractModule; -import com.google.inject.Provides; import com.google.inject.Scopes; +import com.google.inject.TypeLiteral; +import com.google.inject.name.Names; /** * Configures {@link JavaUrlHttpCommandExecutorService}. @@ -65,6 +66,9 @@ public class JavaUrlHttpCommandExecutorServiceModule extends AbstractModule { bind(HostnameVerifier.class).to(LogToMapHostnameVerifier.class); bind(TransformingHttpCommandExecutorService.class).to(TransformingHttpCommandExecutorServiceImpl.class).in( Scopes.SINGLETON); + bind(new TypeLiteral>() { + }).annotatedWith(Names.named("untrusted")).to(new TypeLiteral() { + }); } /** @@ -86,14 +90,28 @@ public class JavaUrlHttpCommandExecutorServiceModule extends AbstractModule { } } - @Provides @Singleton - @Named("untrusted") - SSLContext provideUntrustedSSLContext(TrustAllCerts trustAllCerts) throws NoSuchAlgorithmException, - KeyManagementException { - SSLContext sc = SSLContext.getInstance("SSL"); - sc.init(null, new TrustManager[] { trustAllCerts }, new SecureRandom()); - return sc; + public static class UntrustedSSLContextSupplier implements Supplier { + private final TrustAllCerts trustAllCerts; + + @Inject + UntrustedSSLContextSupplier(TrustAllCerts trustAllCerts) { + this.trustAllCerts = trustAllCerts; + } + + @Override + public SSLContext get() { + try { + SSLContext sc; + sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[] { trustAllCerts }, new SecureRandom()); + return sc; + } catch (Exception e) { + Throwables.propagate(e); + return null; + } + + } } /** diff --git a/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java b/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java index 4eb68d199c..6b1f228a48 100644 --- a/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java +++ b/core/src/main/java/org/jclouds/http/internal/JavaUrlHttpCommandExecutorService.java @@ -44,7 +44,6 @@ import java.util.concurrent.ExecutorService; import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Named; -import javax.inject.Provider; import javax.inject.Singleton; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; @@ -64,6 +63,7 @@ import org.jclouds.io.Payload; import org.jclouds.io.Payloads; import org.jclouds.logging.Logger; +import com.google.common.base.Supplier; import com.google.common.base.Throwables; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; @@ -79,7 +79,7 @@ public class JavaUrlHttpCommandExecutorService extends BaseHttpCommandExecutorSe public static final String USER_AGENT = "jclouds/1.0 java/" + System.getProperty("java.version"); @Resource protected Logger logger = Logger.NULL; - private final Provider untrustedSSLContextProvider; + private final Supplier untrustedSSLContextProvider; private final HostnameVerifier verifier; private final Field methodField; @@ -88,7 +88,7 @@ public class JavaUrlHttpCommandExecutorService extends BaseHttpCommandExecutorSe @Named(Constants.PROPERTY_IO_WORKER_THREADS) ExecutorService ioWorkerExecutor, DelegatingRetryHandler retryHandler, IOExceptionRetryHandler ioRetryHandler, DelegatingErrorHandler errorHandler, HttpWire wire, HostnameVerifier verifier, - @Named("untrusted") Provider untrustedSSLContextProvider) throws SecurityException, + @Named("untrusted") Supplier untrustedSSLContextProvider) throws SecurityException, NoSuchFieldException { super(utils, ioWorkerExecutor, retryHandler, ioRetryHandler, errorHandler, wire); if (utils.getMaxConnections() > 0) diff --git a/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java b/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java index 9dd25c8f92..26d9186bbd 100644 --- a/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java +++ b/core/src/test/java/org/jclouds/http/handlers/BackoffLimitedRetryHandlerTest.java @@ -51,6 +51,7 @@ import org.jclouds.rest.internal.RestAnnotationProcessor; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import com.google.common.base.Supplier; import com.google.inject.Key; import com.google.inject.TypeLiteral; @@ -119,7 +120,7 @@ public class BackoffLimitedRetryHandlerTest { public boolean verify(String hostname, SSLSession session) { return false; } - }, new Provider() { + }, new Supplier() { @Override public SSLContext get() { From ae5381d2bd4c2eba6e318a64e138eb65e5e22e39 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 22 Aug 2010 21:25:53 -0700 Subject: [PATCH 13/16] Issue 280: updated catalog and org to 0.9+ spec --- .../org/jclouds/vcloud/domain/Catalog.java | 31 +++++ .../java/org/jclouds/vcloud/domain/Org.java | 17 +++ .../vcloud/domain/internal/CatalogImpl.java | 91 ++++++++++++-- .../vcloud/domain/internal/OrgImpl.java | 72 ++++++++--- .../jclouds/vcloud/xml/CatalogHandler.java | 34 ++++- .../org/jclouds/vcloud/xml/OrgHandler.java | 28 ++++- .../vcloud/CommonVCloudClientLiveTest.java | 102 +++++++++------ .../jclouds/vcloud/VCloudAsyncClientTest.java | 49 +++----- .../vcloud/VCloudExpressAsyncClientTest.java | 16 ++- .../vcloud/xml/CatalogHandlerTest.java | 104 +++++++++++++--- .../vcloud/xml/CatalogItemHandlerTest.java | 117 +++--------------- .../jclouds/vcloud/xml/OrgHandlerTest.java | 3 + .../core/src/test/resources/catalog-blank.xml | 7 ++ .../test/resources/{ => express}/catalog.xml | 0 .../domain/internal/TerremarkOrgImpl.java | 5 +- .../terremark/xml/TerremarkOrgHandler.java | 7 ++ 16 files changed, 462 insertions(+), 221 deletions(-) create mode 100644 vcloud/core/src/test/resources/catalog-blank.xml rename vcloud/core/src/test/resources/{ => express}/catalog.xml (100%) diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Catalog.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Catalog.java index 1f0a28e48c..c563440f96 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Catalog.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Catalog.java @@ -19,8 +19,11 @@ package org.jclouds.vcloud.domain; +import java.util.List; import java.util.Map; +import javax.annotation.Nullable; + import org.jclouds.vcloud.domain.internal.CatalogImpl; import com.google.inject.ImplementedBy; @@ -31,7 +34,35 @@ import com.google.inject.ImplementedBy; @org.jclouds.vcloud.endpoints.Catalog @ImplementedBy(CatalogImpl.class) public interface Catalog extends NamedResource, Map { + /** + * Reference to the org containing this vDC. + * + * @since vcloud api 1.0 + * @return org, or null if this is a version before 1.0 where the org isn't present + */ + NamedResource getOrg(); + /** + * optional description + * + * @since vcloud api 0.8 + */ + @Nullable String getDescription(); + /** + * read‐only element, true if the catalog is published + * + * @since vcloud api 1.0 + */ + @Nullable + boolean isPublished(); + + /** + * read‐only container for Task elements. Each element in the container represents a queued, + * running, or failed task owned by this object. + * + * @since vcloud api 1.0 + */ + List getTasks(); } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java index 2d7bf6885b..be3371764c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Org.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.domain; +import java.util.List; import java.util.Map; import javax.annotation.Nullable; @@ -46,6 +47,14 @@ public interface Org extends NamedResource { @Nullable String getDescription(); + /** + * full name of the organization + * + * @since vcloud api 1.0 + */ + @Nullable + String getFullName(); + /** * @since vcloud api 0.8 */ @@ -70,4 +79,12 @@ public interface Org extends NamedResource { */ Map getNetworks(); + /** + * read‐only container for Task elements. Each element in the container represents a queued, + * running, or failed task owned by this object. + * + * @since vcloud api 1.0 + */ + List getTasks(); + } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java index 44f4a97696..0616895544 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/CatalogImpl.java @@ -23,12 +23,15 @@ import static com.google.common.base.Preconditions.checkNotNull; import java.net.URI; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; -import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Task; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.inject.internal.Nullable; /** @@ -42,26 +45,81 @@ public class CatalogImpl extends LinkedHashMap implements /** The serialVersionUID */ private static final long serialVersionUID = 8464716396538298809L; private final String name; - private final String description; + private final String type; private final URI id; + private final NamedResource org; + @Nullable + private final String description; + private final List tasks = Lists.newArrayList(); + private final boolean published; - public CatalogImpl(String name, URI id, @Nullable String description, Map contents) { + public CatalogImpl(String name, String type, URI id, NamedResource org, @Nullable String description, + Map contents, Iterable tasks, boolean published) { this.name = checkNotNull(name, "name"); + this.type = checkNotNull(type, "type"); + this.org = org;// TODO: once <1.0 is killed check not null this.description = description; this.id = checkNotNull(id, "id"); putAll(checkNotNull(contents, "contents")); + Iterables.addAll(this.tasks, checkNotNull(tasks, "tasks")); + this.published = published; } + /** + * {@inheritDoc} + */ @Override public URI getId() { return id; } + /** + * {@inheritDoc} + */ @Override public String getName() { return name; } + /** + * {@inheritDoc} + */ + @Override + public NamedResource getOrg() { + return org; + } + + /** + * {@inheritDoc} + */ + public String getDescription() { + return description; + } + + /** + * {@inheritDoc} + */ + @Override + public String getType() { + return type; + } + + /** + * {@inheritDoc} + */ + @Override + public List getTasks() { + return tasks; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isPublished() { + return published; + } + @Override public int hashCode() { final int prime = 31; @@ -69,6 +127,9 @@ public class CatalogImpl extends LinkedHashMap implements result = prime * result + ((description == null) ? 0 : description.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((org == null) ? 0 : org.hashCode()); + result = prime * result + ((tasks == null) ? 0 : tasks.hashCode()); + result = prime * result + ((type == null) ? 0 : type.hashCode()); return result; } @@ -96,18 +157,24 @@ public class CatalogImpl extends LinkedHashMap implements return false; } else if (!name.equals(other.name)) return false; + if (org == null) { + if (other.org != null) + return false; + } else if (!org.equals(other.org)) + return false; + if (tasks == null) { + if (other.tasks != null) + return false; + } else if (!tasks.equals(other.tasks)) + return false; + if (type == null) { + if (other.type != null) + return false; + } else if (!type.equals(other.type)) + return false; return true; } - public String getDescription() { - return description; - } - - @Override - public String getType() { - return VCloudExpressMediaType.CATALOG_XML; - } - @Override public int compareTo(NamedResource o) { return (this == o) ? 0 : getId().compareTo(o.getId()); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java index 0612385387..c0e72faf8c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/OrgImpl.java @@ -19,13 +19,21 @@ package org.jclouds.vcloud.domain.internal; +import static com.google.common.base.Preconditions.checkNotNull; + import java.net.URI; +import java.util.List; import java.util.Map; import javax.annotation.Nullable; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.Task; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; /** * Locations of resources in vCloud @@ -34,21 +42,36 @@ import org.jclouds.vcloud.domain.Org; * */ public class OrgImpl extends NamedResourceImpl implements Org { - + private final String fullName; + @Nullable private final String description; - private final Map catalogs; - private final Map vdcs; - private final Map networks; + private final Map catalogs = Maps.newLinkedHashMap(); + private final Map vdcs = Maps.newLinkedHashMap(); + private final Map networks = Maps.newLinkedHashMap(); private final NamedResource tasksList; + private final List tasks = Lists.newArrayList(); - public OrgImpl(String name, String type, URI id, String description, Map catalogs, - Map vdcs, Map networks, @Nullable NamedResource tasksList) { + public OrgImpl(String name, String type, URI id, String fullName, String description, + Map catalogs, Map vdcs, Map networks, + @Nullable NamedResource tasksList, Iterable tasks) { super(name, type, id); + this.fullName = checkNotNull(fullName, "fullName"); this.description = description; - this.catalogs = catalogs; - this.vdcs = vdcs; - this.networks = networks; + this.catalogs.putAll(checkNotNull(catalogs, "catalogs")); + this.vdcs.putAll(checkNotNull(vdcs, "vdcs")); + this.networks.putAll(checkNotNull(networks, "networks")); this.tasksList = tasksList; + Iterables.addAll(this.tasks, checkNotNull(tasks, "tasks")); + } + + @Override + public String getFullName() { + return fullName; + } + + @Override + public String getDescription() { + return description; } @Override @@ -61,18 +84,30 @@ public class OrgImpl extends NamedResourceImpl implements Org { return vdcs; } + @Override + public Map getNetworks() { + return networks; + } + @Override public NamedResource getTasksList() { return tasksList; } + @Override + public List getTasks() { + return tasks; + } + @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((catalogs == null) ? 0 : catalogs.hashCode()); result = prime * result + ((description == null) ? 0 : description.hashCode()); + result = prime * result + ((fullName == null) ? 0 : fullName.hashCode()); result = prime * result + ((networks == null) ? 0 : networks.hashCode()); + result = prime * result + ((tasks == null) ? 0 : tasks.hashCode()); result = prime * result + ((tasksList == null) ? 0 : tasksList.hashCode()); result = prime * result + ((vdcs == null) ? 0 : vdcs.hashCode()); return result; @@ -97,11 +132,21 @@ public class OrgImpl extends NamedResourceImpl implements Org { return false; } else if (!description.equals(other.description)) return false; + if (fullName == null) { + if (other.fullName != null) + return false; + } else if (!fullName.equals(other.fullName)) + return false; if (networks == null) { if (other.networks != null) return false; } else if (!networks.equals(other.networks)) return false; + if (tasks == null) { + if (other.tasks != null) + return false; + } else if (!tasks.equals(other.tasks)) + return false; if (tasksList == null) { if (other.tasksList != null) return false; @@ -125,13 +170,4 @@ public class OrgImpl extends NamedResourceImpl implements Org { return "[id=" + getId() + ", name=" + getName() + ", type=" + getType() + "]"; } - @Override - public Map getNetworks() { - return networks; - } - - @Override - public String getDescription() { - return description; - } } \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java index 517720b224..579edec340 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/CatalogHandler.java @@ -19,31 +19,50 @@ package org.jclouds.vcloud.xml; +import static org.jclouds.vcloud.util.Utils.newNamedResource; + +import java.util.List; import java.util.SortedMap; +import javax.inject.Inject; + import org.jclouds.http.functions.ParseSax; import org.jclouds.vcloud.domain.Catalog; import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.util.Utils; import org.xml.sax.Attributes; import org.xml.sax.SAXException; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * @author Adrian Cole */ public class CatalogHandler extends ParseSax.HandlerWithResult { + + protected final TaskHandler taskHandler; + + @Inject + public CatalogHandler(TaskHandler taskHandler) { + this.taskHandler = taskHandler; + } + private StringBuilder currentText = new StringBuilder(); private NamedResource catalog; private SortedMap contents = Maps.newTreeMap(); - + protected List tasks = Lists.newArrayList(); private String description; + private NamedResource org; + + private boolean published = true; public Catalog getResult() { - return new CatalogImpl(catalog.getName(), catalog.getId(), description, contents); + return new CatalogImpl(catalog.getName(), catalog.getType(), catalog.getId(), org, description, contents, tasks, + published); } @Override @@ -52,12 +71,21 @@ public class CatalogHandler extends ParseSax.HandlerWithResult { catalog = Utils.newNamedResource(attributes); } else if (qName.equals("CatalogItem")) { Utils.putNamedResource(contents, attributes); + } else if (qName.equals("Link") && "up".equals(Utils.attrOrNull(attributes, "rel"))) { + org = newNamedResource(attributes); + } else { + taskHandler.startElement(uri, localName, qName, attributes); } } public void endElement(String uri, String name, String qName) { - if (qName.equals("Description")) { + taskHandler.endElement(uri, name, qName); + if (qName.equals("Task")) { + this.tasks.add(taskHandler.getResult()); + } else if (qName.equals("Description")) { description = currentOrNull(); + } else if (qName.equals("IsPublished")) { + published = Boolean.parseBoolean(currentOrNull()); } currentText = new StringBuilder(); } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java index d2ddc4288b..ab8b6d098d 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/OrgHandler.java @@ -22,21 +22,34 @@ package org.jclouds.vcloud.xml; import static org.jclouds.vcloud.util.Utils.newNamedResource; import static org.jclouds.vcloud.util.Utils.putNamedResource; +import java.util.List; import java.util.Map; +import javax.inject.Inject; + import org.jclouds.http.functions.ParseSax; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.internal.OrgImpl; import org.xml.sax.Attributes; import org.xml.sax.SAXException; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; /** * @author Adrian Cole */ public class OrgHandler extends ParseSax.HandlerWithResult { + + protected final TaskHandler taskHandler; + + @Inject + public OrgHandler(TaskHandler taskHandler) { + this.taskHandler = taskHandler; + } + private StringBuilder currentText = new StringBuilder(); protected NamedResource org; @@ -44,11 +57,14 @@ public class OrgHandler extends ParseSax.HandlerWithResult { protected NamedResource tasksList; protected Map catalogs = Maps.newLinkedHashMap(); protected Map networks = Maps.newLinkedHashMap(); + protected List tasks = Lists.newArrayList(); protected String description; + protected String fullName; public Org getResult() { - return new OrgImpl(org.getName(), org.getType(), org.getId(), description, catalogs, vdcs, networks, tasksList); + return new OrgImpl(org.getName(), org.getType(), org.getId(), fullName != null ? fullName : org.getName(), + description, catalogs, vdcs, networks, tasksList, tasks); } @Override @@ -68,12 +84,20 @@ public class OrgHandler extends ParseSax.HandlerWithResult { putNamedResource(networks, attributes); } } + } else { + taskHandler.startElement(uri, localName, qName, attributes); } + } public void endElement(String uri, String name, String qName) { - if (qName.equals("Description")) { + taskHandler.endElement(uri, name, qName); + if (qName.equals("Task")) { + this.tasks.add(taskHandler.getResult()); + } else if (qName.equals("Description")) { description = currentOrNull(); + } else if (qName.equals("FullName")) { + fullName = currentOrNull(); } currentText = new StringBuilder(); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java index 0ada9efc97..1683322d97 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/CommonVCloudClientLiveTest.java @@ -24,6 +24,7 @@ import static org.testng.Assert.assertNotNull; import java.util.Properties; +import org.jclouds.Constants; import org.jclouds.compute.ComputeServiceContextFactory; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.rest.RestContext; @@ -68,17 +69,20 @@ public abstract class CommonVCloudClientLiveTest of(new Log4JLoggingModule()), props).getProviderSpecificContext(); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java index 8b2d876382..c33e59bbc5 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java @@ -51,6 +51,7 @@ import org.jclouds.util.Utils; import org.jclouds.vcloud.config.VCloudRestClientModule; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; @@ -73,6 +74,7 @@ import org.testng.annotations.Test; 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.Module; import com.google.inject.TypeLiteral; @@ -721,9 +723,12 @@ public class VCloudAsyncClientTest extends RestClientTest { "vdc", new VDCImpl( "vdc", - null, URI + null, + URI .create("https://vcenterprise.bluelock.com/api/v1.0/vdc/1"), - null, null, "description", + null, + null, + "description", null, null, null, @@ -757,7 +762,7 @@ public class VCloudAsyncClientTest 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"), "description", ImmutableMap + .create("https://vcenterprise.bluelock.com/api/v1.0/org/1"), "org", "description", ImmutableMap . of("catalog", new NamedResourceImpl("catalog", VCloudMediaType.CATALOG_XML, URI .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"))), ImmutableMap @@ -767,7 +772,8 @@ public class VCloudAsyncClientTest extends RestClientTest { VCloudMediaType.NETWORK_XML, URI .create("https://vcenterprise.bluelock.com/api/v1.0/network/1"))), new NamedResourceImpl("tasksList", VCloudMediaType.TASKSLIST_XML, URI - .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")))); + .create("https://vcenterprise.bluelock.com/api/v1.0/tasksList/1")), ImmutableList + . of())); } } @@ -780,32 +786,17 @@ public class VCloudAsyncClientTest extends RestClientTest { @Override public Map> get() { - return ImmutableMap - .> of( - "org", + return ImmutableMap.> of("org", - ImmutableMap - . of( - "catalog", - new CatalogImpl( - "catalog", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), - "description", - ImmutableMap - . of( - "item", - new NamedResourceImpl( - "item", - "application/vnd.vmware.vcloud.catalogItem+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), - "template", - new NamedResourceImpl( - "template", - "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI - .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2")))))); + ImmutableMap. of("catalog", new CatalogImpl("catalog", "type", + URI.create("https://vcenterprise.bluelock.com/api/v1.0/catalog/1"), null, "description", + ImmutableMap. of("item", new NamedResourceImpl("item", + "application/vnd.vmware.vcloud.catalogItem+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/1")), + "template", new NamedResourceImpl("template", + "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalogItem/2"))), + ImmutableList. of(), true))); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index ef8250f6e8..90f4c33afa 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -51,6 +51,7 @@ import org.jclouds.util.Utils; import org.jclouds.vcloud.config.VCloudExpressRestClientModule; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.Org; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VCloudSession; import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.CatalogItemImpl; @@ -74,6 +75,7 @@ import org.testng.annotations.Test; 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.Module; import com.google.inject.TypeLiteral; @@ -741,14 +743,15 @@ 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"), null, ImmutableMap + .create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), "org", null, ImmutableMap . of("catalog", new NamedResourceImpl("catalog", VCloudExpressMediaType.CATALOG_XML, URI .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap . of("vdc", new NamedResourceImpl("vdc", VCloudExpressMediaType.VDC_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), null, new NamedResourceImpl("tasksList", VCloudExpressMediaType.TASKSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")))); + .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")), ImmutableList + . of())); } } @@ -763,13 +766,14 @@ public class VCloudExpressAsyncClientTest extends RestClientTest> get() { return ImmutableMap.> of("org", - ImmutableMap. of("catalog", new CatalogImpl("catalog", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"), "description", ImmutableMap - . of("item", new NamedResourceImpl("item", + ImmutableMap. of("catalog", new CatalogImpl("catalog", "type", + URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"), null, "description", + ImmutableMap. of("item", new NamedResourceImpl("item", "application/vnd.vmware.vcloud.catalogItem+xml", URI .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1")), "template", new NamedResourceImpl("template", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2")))))); + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"))), + ImmutableList. of(), true))); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogHandlerTest.java index 0596bf44f8..8af0b871d6 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogHandlerTest.java @@ -19,6 +19,7 @@ package org.jclouds.vcloud.xml; +import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML; import static org.testng.Assert.assertEquals; import java.io.InputStream; @@ -27,12 +28,15 @@ import java.net.URI; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.Factory; import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.domain.CatalogItem; -import org.jclouds.vcloud.domain.internal.CatalogItemImpl; +import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Task; +import org.jclouds.vcloud.domain.internal.CatalogImpl; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.testng.annotations.Test; -import com.google.common.collect.ImmutableSortedMap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import com.google.inject.Guice; import com.google.inject.Injector; @@ -44,19 +48,91 @@ import com.google.inject.Injector; @Test(groups = "unit", testName = "vcloud.CatalogHandlerTest") public class CatalogHandlerTest { - public void testApplyInputStream() { - InputStream is = getClass().getResourceAsStream("/catalogItem-hosting.xml"); - Injector injector = Guice.createInjector(new SaxParserModule()); - Factory factory = injector.getInstance(ParseSax.Factory.class); - CatalogItem result = factory.create(injector.getInstance(CatalogItemHandler.class)).parse(is); + private Injector injector; - assertEquals(result, new CatalogItemImpl("Windows 2008 Datacenter 64 Bit", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"), "Windows 2008 Datacenter 64 Bit", - new NamedResourceImpl("Windows 2008 Datacenter 64 Bit", "application/vnd.vmware.vcloud.vAppTemplate+xml", - URI.create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")), ImmutableSortedMap.of("Foo", - "Bar", "Hello", "World" + private Factory factory; - ))); + public void testVCloud1_0() { + InputStream is = getClass().getResourceAsStream("/catalog-blank.xml"); + injector = Guice.createInjector(new SaxParserModule()); + factory = injector.getInstance(ParseSax.Factory.class); + Catalog result = (Catalog) factory.create(injector.getInstance(CatalogHandler.class)).parse(is); + assertEquals(result, new CatalogImpl("Jclouds-private", "application/vnd.vmware.vcloud.catalog+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/catalog/921222081"), new NamedResourceImpl(null, + "application/vnd.vmware.vcloud.org+xml", URI + .create("https://vcenterprise.bluelock.com/api/v1.0/org/9566014")), null, ImmutableMap + . of(), ImmutableList. of(), false)); + } + public void testTerremark() { + InputStream is = getClass().getResourceAsStream("/express/catalog.xml"); + injector = Guice.createInjector(new SaxParserModule()); + factory = injector.getInstance(ParseSax.Factory.class); + Catalog result = (Catalog) factory.create(injector.getInstance(CatalogHandler.class)).parse(is); + assertEquals(result.getName(), "Miami Environment 1"); + assert result.getDescription() == null; + + assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32/catalog")); + assertEquals(result.get("CentOS 5.3 (32-bit)"), new NamedResourceImpl("CentOS 5.3 (32-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/5"))); + assertEquals(result.get("CentOS 5.3 (64-bit)"), new NamedResourceImpl("CentOS 5.3 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/6"))); + assertEquals(result.get("RHEL 5.3 (32-bit)"), new NamedResourceImpl("RHEL 5.3 (32-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/7"))); + assertEquals(result.get("RHEL 5.3 (64-bit)"), new NamedResourceImpl("RHEL 5.3 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/8"))); + assertEquals(result.get("Ubuntu JeOS 9.04 (32-bit)"), new NamedResourceImpl("Ubuntu JeOS 9.04 (32-bit)", + CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/11"))); + assertEquals(result.get("Ubuntu JeOS 9.04 (64-bit)"), new NamedResourceImpl("Ubuntu JeOS 9.04 (64-bit)", + CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/12"))); + assertEquals(result.get("Ubuntu Server 9.04 (32-bit)"), new NamedResourceImpl("Ubuntu Server 9.04 (32-bit)", + CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/9"))); + assertEquals(result.get("Ubuntu Server 9.04 (64-bit)"), new NamedResourceImpl("Ubuntu Server 9.04 (64-bit)", + CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/10"))); + assertEquals(result.get("Windows 2003 Enterprise R2 (32-bit)"), new NamedResourceImpl( + "Windows 2003 Enterprise R2 (32-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/1"))); + assertEquals(result.get("Windows 2003 Enterprise R2 (64-bit)"), new NamedResourceImpl( + "Windows 2003 Enterprise R2 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/2"))); + assertEquals(result.get("Windows 2003 Standard R2 (32-bit)"), new NamedResourceImpl( + "Windows 2003 Standard R2 (32-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/3"))); + assertEquals(result.get("Windows 2003 Standard R2 (64-bit)"), new NamedResourceImpl( + "Windows 2003 Standard R2 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/4"))); + assertEquals(result.get("Windows 2003 Standard R2 w.SQL 2008 Web (64-bit)"), new NamedResourceImpl( + "Windows 2003 Standard R2 w.SQL 2008 Web (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/23"))); + assertEquals(result.get("Windows Server 2008 Enterprise (32-bit)"), new NamedResourceImpl( + "Windows Server 2008 Enterprise (32-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/13"))); + assertEquals(result.get("Windows Server 2008 Enterprise (64-bit)"), new NamedResourceImpl( + "Windows Server 2008 Enterprise (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/15"))); + assertEquals(result.get("Windows Server 2008 Enterprise R2 (64-bit)"), new NamedResourceImpl( + "Windows Server 2008 Enterprise R2 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/16"))); + assertEquals(result.get("Windows Server 2008 Standard (32-bit)"), new NamedResourceImpl( + "Windows Server 2008 Standard (32-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/17"))); + assertEquals(result.get("Windows Server 2008 Standard (64-bit)"), new NamedResourceImpl( + "Windows Server 2008 Standard (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/18"))); + assertEquals(result.get("Windows Server 2008 Standard R2 (64-bit)"), new NamedResourceImpl( + "Windows Server 2008 Standard R2 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/19"))); + assertEquals(result.get("Windows Server 2008 Standard w.SQL 2008 Web (64-bit)"), new NamedResourceImpl( + "Windows Server 2008 Standard w.SQL 2008 Web (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/14"))); + assertEquals(result.get("Windows Web Server 2008 (32-bit)"), new NamedResourceImpl( + "Windows Web Server 2008 (32-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/20"))); + assertEquals(result.get("Windows Web Server 2008 (64-bit)"), new NamedResourceImpl( + "Windows Web Server 2008 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/21"))); + assertEquals(result.get("Windows Web Server 2008 R2 (64-bit)"), new NamedResourceImpl( + "Windows Web Server 2008 R2 (64-bit)", CATALOGITEM_XML, URI + .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/22"))); } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java index 6704615c75..757838a8fc 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/CatalogItemHandlerTest.java @@ -19,7 +19,6 @@ package org.jclouds.vcloud.xml; -import static org.jclouds.vcloud.VCloudExpressMediaType.CATALOGITEM_XML; import static org.testng.Assert.assertEquals; import java.io.InputStream; @@ -28,121 +27,37 @@ import java.net.URI; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.Factory; import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.domain.Catalog; +import org.jclouds.vcloud.domain.CatalogItem; +import org.jclouds.vcloud.domain.internal.CatalogItemImpl; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableSortedMap; import com.google.inject.Guice; import com.google.inject.Injector; /** - * Tests behavior of {@code CatalogHandler} + * Tests behavior of {@code CatalogItemHandler} * * @author Adrian Cole */ -@Test(groups = "unit", testName = "vcloud.CatalogHandlerTest") +@Test(groups = "unit", testName = "vcloud.CatalogItemHandlerTest") public class CatalogItemHandlerTest { - private Injector injector; - - private Factory factory; - public void testApplyInputStream() { - InputStream is = getClass().getResourceAsStream("/catalog.xml"); - injector = Guice.createInjector(new SaxParserModule()); - factory = injector.getInstance(ParseSax.Factory.class); - Catalog result = (Catalog) factory.create(injector.getInstance(CatalogHandler.class)).parse(is); - assertEquals(result.getName(), "Miami Environment 1"); - assert result.getDescription() == null; + InputStream is = getClass().getResourceAsStream("/catalogItem-hosting.xml"); + Injector injector = Guice.createInjector(new SaxParserModule()); + Factory factory = injector.getInstance(ParseSax.Factory.class); + CatalogItem result = factory.create(injector.getInstance(CatalogItemHandler.class)).parse(is); - assertEquals(result.getId(), URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32/catalog")); + assertEquals(result, new CatalogItemImpl("Windows 2008 Datacenter 64 Bit", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"), "Windows 2008 Datacenter 64 Bit", + new NamedResourceImpl("Windows 2008 Datacenter 64 Bit", + "application/vnd.vmware.vcloud.vAppTemplate+xml", URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vAppTemplate/2")), + ImmutableSortedMap.of("Foo", "Bar", "Hello", "World" - assertEquals(result.get("CentOS 5.3 (32-bit)"), new NamedResourceImpl("CentOS 5.3 (32-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/5"))); - assertEquals(result.get("CentOS 5.3 (64-bit)"), new NamedResourceImpl("CentOS 5.3 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/6"))); - assertEquals(result.get("RHEL 5.3 (32-bit)"), new NamedResourceImpl("RHEL 5.3 (32-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/7"))); - assertEquals(result.get("RHEL 5.3 (64-bit)"), new NamedResourceImpl("RHEL 5.3 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/8"))); - assertEquals(result.get("Ubuntu JeOS 9.04 (32-bit)"), new NamedResourceImpl("Ubuntu JeOS 9.04 (32-bit)", - CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/11"))); - assertEquals(result.get("Ubuntu JeOS 9.04 (64-bit)"), new NamedResourceImpl("Ubuntu JeOS 9.04 (64-bit)", - CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/12"))); - assertEquals(result.get("Ubuntu Server 9.04 (32-bit)"), new NamedResourceImpl("Ubuntu Server 9.04 (32-bit)", - CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/9"))); - assertEquals(result.get("Ubuntu Server 9.04 (64-bit)"), new NamedResourceImpl("Ubuntu Server 9.04 (64-bit)", - CATALOGITEM_XML, URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/10"))); - assertEquals(result.get("Windows 2003 Enterprise R2 (32-bit)"), new NamedResourceImpl( - "Windows 2003 Enterprise R2 (32-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/1"))); - assertEquals(result.get("Windows 2003 Enterprise R2 (64-bit)"), new NamedResourceImpl( - "Windows 2003 Enterprise R2 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/2"))); - assertEquals(result.get("Windows 2003 Standard R2 (32-bit)"), new NamedResourceImpl( - "Windows 2003 Standard R2 (32-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/3"))); - assertEquals(result.get("Windows 2003 Standard R2 (64-bit)"), new NamedResourceImpl( - "Windows 2003 Standard R2 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/4"))); - assertEquals(result.get("Windows 2003 Standard R2 w.SQL 2008 Web (64-bit)"), new NamedResourceImpl( - "Windows 2003 Standard R2 w.SQL 2008 Web (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/23"))); - assertEquals(result.get("Windows Server 2008 Enterprise (32-bit)"), new NamedResourceImpl( - "Windows Server 2008 Enterprise (32-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/13"))); - assertEquals(result.get("Windows Server 2008 Enterprise (64-bit)"), new NamedResourceImpl( - "Windows Server 2008 Enterprise (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/15"))); - assertEquals(result.get("Windows Server 2008 Enterprise R2 (64-bit)"), new NamedResourceImpl( - "Windows Server 2008 Enterprise R2 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/16"))); - assertEquals(result.get("Windows Server 2008 Standard (32-bit)"), new NamedResourceImpl( - "Windows Server 2008 Standard (32-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/17"))); - assertEquals(result.get("Windows Server 2008 Standard (64-bit)"), new NamedResourceImpl( - "Windows Server 2008 Standard (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/18"))); - assertEquals(result.get("Windows Server 2008 Standard R2 (64-bit)"), new NamedResourceImpl( - "Windows Server 2008 Standard R2 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/19"))); - assertEquals(result.get("Windows Server 2008 Standard w.SQL 2008 Web (64-bit)"), new NamedResourceImpl( - "Windows Server 2008 Standard w.SQL 2008 Web (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/14"))); - assertEquals(result.get("Windows Web Server 2008 (32-bit)"), new NamedResourceImpl( - "Windows Web Server 2008 (32-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/20"))); - assertEquals(result.get("Windows Web Server 2008 (64-bit)"), new NamedResourceImpl( - "Windows Web Server 2008 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/21"))); - assertEquals(result.get("Windows Web Server 2008 R2 (64-bit)"), new NamedResourceImpl( - "Windows Web Server 2008 R2 (64-bit)", CATALOGITEM_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/catalogItem/22"))); + ))); } - - public void testHosting() { - InputStream is = getClass().getResourceAsStream("/catalog-hosting.xml"); - injector = Guice.createInjector(new SaxParserModule()); - factory = injector.getInstance(ParseSax.Factory.class); - Catalog result = (Catalog) factory.create(injector.getInstance(CatalogHandler.class)).parse(is); - assertEquals(result.getName(), "HMSCatalog"); - assertEquals(result.getDescription(), "HMS Shared Catalog"); - assertEquals(result.getId(), URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")); - - assertEquals(result.get("Plesk (Linux) 64-bit Template"), new NamedResourceImpl("Plesk (Linux) 64-bit Template", - CATALOGITEM_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/1"))); - - assertEquals(result.get("Windows 2008 Datacenter 64 Bit Template"), new NamedResourceImpl( - "Windows 2008 Datacenter 64 Bit Template", CATALOGITEM_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/2"))); - - assertEquals(result.get("Cent OS 64 Bit Template"), new NamedResourceImpl("Cent OS 64 Bit Template", - CATALOGITEM_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/3"))); - - assertEquals(result.get("cPanel (Linux) 64 Bit Template"), new NamedResourceImpl( - "cPanel (Linux) 64 Bit Template", CATALOGITEM_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/4"))); - } } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java index d1ed080206..474a31c426 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/OrgHandlerTest.java @@ -55,6 +55,7 @@ public class OrgHandlerTest { Org result = (Org) factory.create(injector.getInstance(OrgHandler.class)).parse(is); assertEquals(result.getName(), "ExampleOrg"); + assertEquals(result.getFullName(), "ExampleOrg"); assertEquals(result.getDescription(), "Example Corp's Primary Organization."); assertEquals(result.getId(), URI.create("http://vcloud.example.com/api/v1.0/org/5")); assertEquals(result.getCatalogs(), ImmutableMap.of("Main Catalog", new NamedResourceImpl("Main Catalog", @@ -79,6 +80,7 @@ public class OrgHandlerTest { Org result = (Org) factory.create(injector.getInstance(OrgHandler.class)).parse(is); assertEquals(result.getName(), "adrian@jclouds.org"); + assertEquals(result.getFullName(), "adrian@jclouds.org"); assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/org/48")); assertEquals(result.getCatalogs(), ImmutableMap.of("Miami Environment 1 Catalog", new NamedResourceImpl( "Miami Environment 1 Catalog", CATALOG_XML, URI @@ -96,6 +98,7 @@ public class OrgHandlerTest { Factory factory = injector.getInstance(ParseSax.Factory.class); Org result = (Org) factory.create(injector.getInstance(OrgHandler.class)).parse(is); assertEquals(result.getName(), "Customer 188849"); + assertEquals(result.getFullName(), "Customer 188849"); assertEquals(result.getId(), URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/188849")); assertEquals(result.getCatalogs(), ImmutableMap.of("HMS Shared Catalog", new NamedResourceImpl( "HMS Shared Catalog", CATALOG_XML, URI.create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")))); diff --git a/vcloud/core/src/test/resources/catalog-blank.xml b/vcloud/core/src/test/resources/catalog-blank.xml new file mode 100644 index 0000000000..6bc4038083 --- /dev/null +++ b/vcloud/core/src/test/resources/catalog-blank.xml @@ -0,0 +1,7 @@ + + + + + + false + diff --git a/vcloud/core/src/test/resources/catalog.xml b/vcloud/core/src/test/resources/express/catalog.xml similarity index 100% rename from vcloud/core/src/test/resources/catalog.xml rename to vcloud/core/src/test/resources/express/catalog.xml diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java index 75f8d02494..e880fd33bc 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java @@ -25,9 +25,12 @@ import java.util.Map; import javax.annotation.Nullable; import org.jclouds.vcloud.domain.NamedResource; +import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.internal.OrgImpl; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; +import com.google.common.collect.ImmutableList; + /** * Locations of resources in a Terremark vCloud * @@ -41,7 +44,7 @@ public class TerremarkOrgImpl extends OrgImpl implements TerremarkOrg { public TerremarkOrgImpl(String name, String type, URI id, String description, Map catalogs, Map vdcs, Map networks, @Nullable NamedResource tasksList, NamedResource keysList) { - super(name, type, id, description, catalogs, vdcs, networks, tasksList); + super(name, type, id, name, description, catalogs, vdcs, networks, tasksList, ImmutableList. of()); this.keysList = keysList; } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java index 9dc7d1870d..6916f5db02 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java @@ -22,10 +22,13 @@ package org.jclouds.vcloud.terremark.xml; import static org.jclouds.vcloud.terremark.TerremarkVCloudExpressMediaType.KEYSLIST_XML; import static org.jclouds.vcloud.util.Utils.newNamedResource; +import javax.inject.Inject; + import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.terremark.domain.TerremarkOrg; import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl; import org.jclouds.vcloud.xml.OrgHandler; +import org.jclouds.vcloud.xml.TaskHandler; import org.xml.sax.Attributes; import org.xml.sax.SAXException; @@ -33,6 +36,10 @@ import org.xml.sax.SAXException; * @author Adrian Cole */ public class TerremarkOrgHandler extends OrgHandler { + @Inject + public TerremarkOrgHandler(TaskHandler taskHandler) { + super(taskHandler); + } private NamedResource keysList; From a87747a6b2c5f6eae0fd6431f75a2de2de19c35e Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 22 Aug 2010 21:47:36 -0700 Subject: [PATCH 14/16] Issue 343 removed buggy hosting.com vcloudexpress --- README.txt | 5 +- .../assemblies/package-descriptor.xml | 27 --- .../src/main/clojure/org/jclouds/compute.clj | 2 +- .../compute/BaseComputeServiceLiveTest.java | 3 - core/src/main/resources/rest.properties | 3 - .../org/jclouds/domain/CredentialsTest.java | 2 +- .../java/org/jclouds/util/HttpUtilsTest.java | 6 +- .../antcontrib/samples/cargooverssh/build.xml | 6 +- tools/antcontrib/samples/compute/build.xml | 6 +- .../vcloud/domain/internal/VAppImpl.java | 2 +- .../vcloud/VCloudExpressAsyncClientTest.java | 3 +- vcloud/hostingdotcom/README.txt | 25 --- vcloud/hostingdotcom/pom.xml | 60 ------- .../HostingDotComVCloudAsyncClient.java | 80 --------- .../HostingDotComVCloudClient.java | 50 ------ .../HostingDotComVCloudContextBuilder.java | 63 ------- .../HostingDotComVCloudPropertiesBuilder.java | 47 ----- .../HostingDotComVCloudComputeClient.java | 58 ------ ...tComVCloudComputeServiceContextModule.java | 50 ------ .../HostingDotComVCloudRestClientModule.java | 68 ------- .../domain/HostingDotComVApp.java | 36 ---- .../internal/HostingDotComVAppImpl.java | 96 ---------- .../xml/HostingDotComVAppHandler.java | 63 ------- .../HostingDotComVCloudClientLiveTest.java | 54 ------ .../ProvidersInPropertiesTest.java | 48 ----- ...tingDotComVCloudComputeClientLiveTest.java | 69 ------- ...ingDotComVCloudComputeServiceLiveTest.java | 52 ------ .../xml/HostingDotComVAppHandlerTest.java | 62 ------- .../hostingdotcom/instantiatevapp.xml | 16 -- .../src/test/resources/log4j.xml | 170 ------------------ vcloud/pom.xml | 1 - ...TerremarkVCloudExpressAsyncClientTest.java | 9 +- 32 files changed, 22 insertions(+), 1220 deletions(-) delete mode 100644 vcloud/hostingdotcom/README.txt delete mode 100644 vcloud/hostingdotcom/pom.xml delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java delete mode 100755 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/HostingDotComVApp.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/internal/HostingDotComVAppImpl.java delete mode 100644 vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandler.java delete mode 100644 vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java delete mode 100644 vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/ProvidersInPropertiesTest.java delete mode 100644 vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClientLiveTest.java delete mode 100644 vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeServiceLiveTest.java delete mode 100644 vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandlerTest.java delete mode 100644 vcloud/hostingdotcom/src/test/resources/hostingdotcom/instantiatevapp.xml delete mode 100755 vcloud/hostingdotcom/src/test/resources/log4j.xml diff --git a/README.txt b/README.txt index a2e1cd7264..20b8a9e591 100644 --- a/README.txt +++ b/README.txt @@ -26,8 +26,9 @@ freedom to use portable abstractions or cloud-specific features. our current version is 1.0-beta-6 our dev version is 1.0-SNAPSHOT -our compute api supports: ec2, gogrid, rackspace, rimuhosting, vcloud, terremark, - eucalyptus, hosting.com, bluelock, ibmdev, slicehost +our compute api supports: ec2, gogrid, rackspace, rimuhosting, vcloud, trmk-ecloud, + trmk-vcloudexpress, eucalyptus, bluelock-vclouddirector, + bluelock-vcloudexpress, ibmdev, slicehost * note * the pom dependency org.jclouds/jclouds-allcompute gives you access to to all of these providers diff --git a/assemblies/src/main/resources/assemblies/package-descriptor.xml b/assemblies/src/main/resources/assemblies/package-descriptor.xml index e4df2f5385..9afba8c97c 100644 --- a/assemblies/src/main/resources/assemblies/package-descriptor.xml +++ b/assemblies/src/main/resources/assemblies/package-descriptor.xml @@ -243,33 +243,6 @@ providers/azure - - - vcloud/hostingdotcom/target - - jclouds-hostingdotcom-${project.version}.jar - - providers/hostingdotcom/lib - - - vcloud/hostingdotcom/target - - jclouds-hostingdotcom-${project.version}-sources.jar - - providers/hostingdotcom/src - - - vcloud/hostingdotcom/target/apidocs - providers/hostingdotcom/docs - - - vcloud/hostingdotcom - - README.txt - - providers/hostingdotcom - - mezeo/pcs2/target diff --git a/compute/src/main/clojure/org/jclouds/compute.clj b/compute/src/main/clojure/org/jclouds/compute.clj index 0583635680..bfc99fb758 100644 --- a/compute/src/main/clojure/org/jclouds/compute.clj +++ b/compute/src/main/clojure/org/jclouds/compute.clj @@ -22,7 +22,7 @@ Current supported services are: [ec2, rimuhosting, cloudservers, trmk-ecloud, trmk-vcloudexpress, vcloud, bluelock, - ibmdev, eucalyptus, hostingdotcom, slicehost] + ibmdev, eucalyptus, slicehost] Here's an example of getting some compute configuration from rackspace: diff --git a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java index 4500537cae..133243b8df 100755 --- a/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java +++ b/compute/src/test/java/org/jclouds/compute/BaseComputeServiceLiveTest.java @@ -64,7 +64,6 @@ import org.jclouds.compute.predicates.OperatingSystemPredicates; import org.jclouds.domain.Credentials; import org.jclouds.domain.Location; import org.jclouds.domain.LocationScope; -import org.jclouds.http.HttpResponseException; import org.jclouds.logging.log4j.config.Log4JLoggingModule; import org.jclouds.net.IPSocket; import org.jclouds.predicates.RetryablePredicate; @@ -266,8 +265,6 @@ public abstract class BaseComputeServiceLiveTest { public void testCreateTwoNodesWithRunScript() throws Exception { try { client.destroyNodesMatching(withTag(tag)); - } catch (HttpResponseException e) { - // TODO hosting.com throws 400 when we try to delete a vApp } catch (NoSuchElementException e) { } diff --git a/core/src/main/resources/rest.properties b/core/src/main/resources/rest.properties index a3d20f6e5f..520c44adc7 100644 --- a/core/src/main/resources/rest.properties +++ b/core/src/main/resources/rest.properties @@ -59,9 +59,6 @@ trmk-vcloudexpress.propertiesbuilder=org.jclouds.vcloud.terremark.TerremarkVClou trmk-ecloud.contextbuilder=org.jclouds.vcloud.terremark.TerremarkECloudContextBuilder trmk-ecloud.propertiesbuilder=org.jclouds.vcloud.terremark.TerremarkECloudPropertiesBuilder -hostingdotcom.contextbuilder=org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudContextBuilder -hostingdotcom.propertiesbuilder=org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudPropertiesBuilder - chef.contextbuilder=org.jclouds.chef.ChefContextBuilder chef.propertiesbuilder=org.jclouds.chef.ChefPropertiesBuilder diff --git a/core/src/test/java/org/jclouds/domain/CredentialsTest.java b/core/src/test/java/org/jclouds/domain/CredentialsTest.java index bc0af26ddb..767889bdfd 100644 --- a/core/src/test/java/org/jclouds/domain/CredentialsTest.java +++ b/core/src/test/java/org/jclouds/domain/CredentialsTest.java @@ -45,7 +45,7 @@ public class CredentialsTest { assertEquals(creds.credential, "Base64=="); } - public void testHosting() { + public void testDollar() { Credentials creds = Credentials.parse(URI .create("compute://user%40domain:pa%24sword@hostingdotcom")); assertEquals(creds.identity, "user@domain"); diff --git a/core/src/test/java/org/jclouds/util/HttpUtilsTest.java b/core/src/test/java/org/jclouds/util/HttpUtilsTest.java index 6e1282ebec..9d1b49b41f 100644 --- a/core/src/test/java/org/jclouds/util/HttpUtilsTest.java +++ b/core/src/test/java/org/jclouds/util/HttpUtilsTest.java @@ -136,10 +136,10 @@ public class HttpUtilsTest extends PerformanceTest { assertEquals(creds, URI.create("compute://identity:Base64==@azureblob/container-hyphen/prefix")); } - public void testHosting() { - URI creds = HttpUtils.createUri("compute://user@domain:pa$sword@hostingdotcom"); + public void testDollar() { + URI creds = HttpUtils.createUri("compute://user@domain:pa$sword@host"); assertEquals(creds.getUserInfo(), "user@domain:pa$sword"); - assertEquals(creds, URI.create("compute://user%40domain:pa%24sword@hostingdotcom")); + assertEquals(creds, URI.create("compute://user%40domain:pa%24sword@host")); } public void testTerremark() { diff --git a/tools/antcontrib/samples/cargooverssh/build.xml b/tools/antcontrib/samples/cargooverssh/build.xml index fa4302117a..409ea99620 100644 --- a/tools/antcontrib/samples/cargooverssh/build.xml +++ b/tools/antcontrib/samples/cargooverssh/build.xml @@ -39,14 +39,14 @@ --> diff --git a/tools/antcontrib/samples/compute/build.xml b/tools/antcontrib/samples/compute/build.xml index aa75b99227..043f0ad227 100644 --- a/tools/antcontrib/samples/compute/build.xml +++ b/tools/antcontrib/samples/compute/build.xml @@ -30,14 +30,14 @@ diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java index 6f642ff1b8..8757d0fc4e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java @@ -59,7 +59,7 @@ public class VAppImpl implements VApp { this.name = checkNotNull(name, "name"); this.id = checkNotNull(id, "id"); this.status = checkNotNull(status, "status"); - this.size = size;// hostingdotcom + this.size = size; this.vDC = vDC; this.networkToAddresses = checkNotNull(networkToAddresses, "networkToAddresses"); this.osType = osType; diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java index 90f4c33afa..4b336537cf 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/VCloudExpressAsyncClientTest.java @@ -748,7 +748,8 @@ public class VCloudExpressAsyncClientTest extends RestClientTest of("vdc", new NamedResourceImpl("vdc", VCloudExpressMediaType.VDC_XML, - URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), null, + URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap + . of(), new NamedResourceImpl("tasksList", VCloudExpressMediaType.TASKSLIST_XML, URI .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")), ImmutableList . of())); diff --git a/vcloud/hostingdotcom/README.txt b/vcloud/hostingdotcom/README.txt deleted file mode 100644 index e19e1d06cb..0000000000 --- a/vcloud/hostingdotcom/README.txt +++ /dev/null @@ -1,25 +0,0 @@ -==== - - Copyright (C) 2010 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. - ==================================================================== -==== - -# -# The jclouds provider for Hosting.com's vCloud Express (http://www.hosting.com/vcloudexpress/) platform. -# -# TODO: Implementation status. -# TODO: Supported features. -# TODO: Usage example. \ No newline at end of file diff --git a/vcloud/hostingdotcom/pom.xml b/vcloud/hostingdotcom/pom.xml deleted file mode 100644 index e582079c2f..0000000000 --- a/vcloud/hostingdotcom/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - 4.0.0 - - org.jclouds - jclouds-vcloud-project - 1.0-SNAPSHOT - - org.jclouds - jclouds-hostingdotcom - jclouds hostingdotcom Components Core - jclouds core components to access hostingdotcom - - ${jclouds.hostingdotcom.user} - ${jclouds.hostingdotcom.password} - - - - scm:svn:http://jclouds.googlecode.com/svn/trunk/vcloud/hostingdotcom - scm:svn:https://jclouds.googlecode.com/svn/trunk/vcloud/hostingdotcom - http://jclouds.googlecode.com/svn/trunk/vcloud/hostingdotcom - - - - - ${project.groupId} - jclouds-vcloud - ${project.version} - - - ${project.groupId} - jclouds-vcloud - ${project.version} - test-jar - test - - - - diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java deleted file mode 100644 index f5f1d3ae0b..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudAsyncClient.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom; - -import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML; - -import java.net.URI; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; - -import org.jclouds.predicates.validators.DnsNameValidator; -import org.jclouds.rest.annotations.EndpointParam; -import org.jclouds.rest.annotations.ExceptionParser; -import org.jclouds.rest.annotations.MapBinder; -import org.jclouds.rest.annotations.MapPayloadParam; -import org.jclouds.rest.annotations.ParamValidators; -import org.jclouds.rest.annotations.RequestFilters; -import org.jclouds.rest.annotations.XMLResponseParser; -import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404; -import org.jclouds.vcloud.VCloudExpressAsyncClient; -import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; -import org.jclouds.vcloud.filters.SetVCloudTokenCookie; -import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; -import org.jclouds.vcloud.hostingdotcom.xml.HostingDotComVAppHandler; -import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; - -import com.google.common.util.concurrent.ListenableFuture; - -/** - * Provides access to VCloud resources via their REST API. - *

- * - * @see - * @author Adrian Cole - */ -@RequestFilters(SetVCloudTokenCookie.class) -public interface HostingDotComVCloudAsyncClient extends VCloudExpressAsyncClient { - - @GET - @Consumes(VAPP_XML) - @XMLResponseParser(HostingDotComVAppHandler.class) - @ExceptionParser(ReturnNullOnNotFoundOr404.class) - @Override - ListenableFuture getVApp(@EndpointParam URI appId); - - @POST - @Path("/action/instantiateVAppTemplate") - @Produces("application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml") - @Consumes(VAPP_XML) - // required for hosting.com to operate - @XMLResponseParser(HostingDotComVAppHandler.class) - @MapBinder(BindInstantiateVAppTemplateParamsToXmlPayload.class) - @Override - ListenableFuture instantiateVAppTemplateInVDC(@EndpointParam URI vdc, - @MapPayloadParam("template") URI template, - @MapPayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName, - InstantiateVAppTemplateOptions... options); - -} diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java deleted file mode 100644 index 91cab53760..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClient.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom; - -import java.net.URI; -import java.util.concurrent.TimeUnit; - -import org.jclouds.concurrent.Timeout; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; -import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; - -/** - * Provides access to VCloud resources via their REST API. - *

- * - * @see - * @author Adrian Cole - */ -@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) -public interface HostingDotComVCloudClient extends VCloudExpressClient { - - @Override - @Timeout(duration = 600, timeUnit = TimeUnit.SECONDS) - HostingDotComVApp instantiateVAppTemplateInVDC(URI vDC, URI template, String appName, - InstantiateVAppTemplateOptions... options); - - @Override - @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS) - HostingDotComVApp getVApp(URI vAppId); - -} diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java deleted file mode 100644 index 24300385eb..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudContextBuilder.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom; - -import java.util.List; -import java.util.Properties; - -import org.jclouds.http.config.JavaUrlHttpCommandExecutorServiceModule; -import org.jclouds.logging.jdk.config.JDKLoggingModule; -import org.jclouds.vcloud.VCloudExpressContextBuilder; -import org.jclouds.vcloud.hostingdotcom.compute.config.HostingDotComVCloudComputeServiceContextModule; -import org.jclouds.vcloud.hostingdotcom.config.HostingDotComVCloudRestClientModule; - -import com.google.inject.Injector; -import com.google.inject.Module; - -/** - * Creates {@link HostingDotComVCloudComputeServiceContext} or {@link Injector} instances based on - * the most commonly requested arguments. - *

- * Note that Threadsafe objects will be bound as singletons to the Injector or Context provided. - *

- *

- * If no Modules are specified, the default {@link JDKLoggingModule logging} and - * {@link JavaUrlHttpCommandExecutorServiceModule http transports} will be installed. - * - * @author Adrian Cole - * @see HostingDotComVCloudComputeServiceContext - */ -public class HostingDotComVCloudContextBuilder extends VCloudExpressContextBuilder { - - public HostingDotComVCloudContextBuilder(Properties props) { - super(props); - } - - @Override - protected void addContextModule(List modules) { - modules.add(new HostingDotComVCloudComputeServiceContextModule()); - } - - @Override - protected void addClientModule(List modules) { - modules.add(new HostingDotComVCloudRestClientModule()); - } - -} diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java deleted file mode 100644 index 79ea4dec00..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudPropertiesBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom; - -import static org.jclouds.Constants.PROPERTY_ENDPOINT; -import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED; - -import java.util.Properties; - -import org.jclouds.vcloud.VCloudExpressPropertiesBuilder; - -/** - * Builds properties used in hosting.com VCloud Clients - * - * @author Adrian Cole - */ -public class HostingDotComVCloudPropertiesBuilder extends VCloudExpressPropertiesBuilder { - @Override - protected Properties defaultProperties() { - Properties properties = super.defaultProperties(); - properties.setProperty(PROPERTY_ENDPOINT, "https://vcloud.safesecureweb.com/api"); - properties.setProperty(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED, 45 * 60 * 1000l + ""); - return properties; - } - - public HostingDotComVCloudPropertiesBuilder(Properties properties) { - super(properties); - } - -} diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java deleted file mode 100644 index f07ea462af..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClient.java +++ /dev/null @@ -1,58 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.compute; - -import java.net.URI; -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.compute.domain.NodeState; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; -import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; -import org.jclouds.vcloud.domain.VAppTemplate; -import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableMap; - -/** - * @author Adrian Cole - */ -@Singleton -public class HostingDotComVCloudComputeClient extends VCloudExpressComputeClientImpl { - - @Inject - protected HostingDotComVCloudComputeClient(VCloudExpressClient client, Predicate successTester, - Map vAppStatusToNodeState) { - super(client, successTester, vAppStatusToNodeState); - } - - @Override - protected Map parseResponse(VAppTemplate template, VApp vAppResponse) { - HostingDotComVApp hVApp = HostingDotComVApp.class.cast(vAppResponse); - return ImmutableMap. of("id", vAppResponse.getId().toASCIIString(), "username", hVApp - .getUsername(), "password", hVApp.getPassword()); - } - -} \ No newline at end of file diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java deleted file mode 100755 index 68cab3a3da..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/compute/config/HostingDotComVCloudComputeServiceContextModule.java +++ /dev/null @@ -1,50 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.compute.config; - -import static org.jclouds.compute.domain.OsFamily.CENTOS; - -import org.jclouds.compute.domain.TemplateBuilder; -import org.jclouds.vcloud.compute.VCloudExpressComputeClient; -import org.jclouds.vcloud.compute.config.VCloudExpressComputeServiceContextModule; -import org.jclouds.vcloud.hostingdotcom.compute.HostingDotComVCloudComputeClient; - -import com.google.inject.Injector; - -/** - * Configures the {@link HostingDotComVCloudComputeServiceContext}; requires - * {@link HostingDotComVCloudComputeClient} bound. - * - * @author Adrian Cole - */ -public class HostingDotComVCloudComputeServiceContextModule extends VCloudExpressComputeServiceContextModule { - - @Override - protected void configure() { - super.configure(); - bind(VCloudExpressComputeClient.class).to(HostingDotComVCloudComputeClient.class); - } - - @Override - protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { - return template.osFamily(CENTOS); - } - -} diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java deleted file mode 100644 index 6523ee1228..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/config/HostingDotComVCloudRestClientModule.java +++ /dev/null @@ -1,68 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.config; - -import java.net.URI; - -import javax.inject.Singleton; - -import org.jclouds.http.RequiresHttp; -import org.jclouds.rest.ConfiguresRestClient; -import org.jclouds.vcloud.CommonVCloudClient; -import org.jclouds.vcloud.VCloudExpressAsyncClient; -import org.jclouds.vcloud.VCloudExpressClient; -import org.jclouds.vcloud.config.BaseVCloudExpressRestClientModule; -import org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudAsyncClient; -import org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudClient; - -import com.google.inject.Provides; - -/** - * Configures the VCloud authentication service connection, including logging and http transport. - * - * @author Adrian Cole - */ -@RequiresHttp -@ConfiguresRestClient -public class HostingDotComVCloudRestClientModule extends - BaseVCloudExpressRestClientModule { - - public HostingDotComVCloudRestClientModule() { - super(HostingDotComVCloudClient.class, HostingDotComVCloudAsyncClient.class); - } - - @Provides - @Singleton - protected VCloudExpressAsyncClient provideVCloudAsyncClient(HostingDotComVCloudAsyncClient in) { - return in; - } - - @Provides - @Singleton - protected VCloudExpressClient provideVCloudClient(HostingDotComVCloudClient in) { - return in; - } - - @Override - protected URI provideDefaultNetwork(CommonVCloudClient client) { - return URI.create("https://vcloud.safesecureweb.com/network/1990"); - } - -} diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/HostingDotComVApp.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/HostingDotComVApp.java deleted file mode 100644 index b3981a6784..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/HostingDotComVApp.java +++ /dev/null @@ -1,36 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.domain; - -import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.hostingdotcom.domain.internal.HostingDotComVAppImpl; - -import com.google.inject.ImplementedBy; - -/** - * @author Adrian Cole - */ -@ImplementedBy(HostingDotComVAppImpl.class) -public interface HostingDotComVApp extends VApp { - - String getUsername(); - - String getPassword(); -} \ No newline at end of file diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/internal/HostingDotComVAppImpl.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/internal/HostingDotComVAppImpl.java deleted file mode 100644 index 6e362d0daa..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/domain/internal/HostingDotComVAppImpl.java +++ /dev/null @@ -1,96 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.domain.internal; - -import java.net.URI; -import java.util.Set; - -import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.ResourceAllocation; -import org.jclouds.vcloud.domain.VAppStatus; -import org.jclouds.vcloud.domain.VirtualSystem; -import org.jclouds.vcloud.domain.internal.VAppImpl; -import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; - -import com.google.common.collect.ListMultimap; - -/** - * Locations of resources in vCloud - * - * @author Adrian Cole - * - */ -public class HostingDotComVAppImpl extends VAppImpl implements HostingDotComVApp { - - private final String username; - private final String password;; - - /** The serialVersionUID */ - private static final long serialVersionUID = 8464716396538298809L; - - public HostingDotComVAppImpl(String name, URI location, VAppStatus status, Long size, NamedResource vDC, - ListMultimap networkToAddresses, Integer osType, String operatingSystemDescription, - VirtualSystem system, Set resourceAllocations, String username, String password) { - super(name, location, status, size, vDC, networkToAddresses, osType, operatingSystemDescription, system, - resourceAllocations); - this.username = username; - this.password = password; - - } - - public String getUsername() { - return username; - } - - public String getPassword() { - return password; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + ((password == null) ? 0 : password.hashCode()); - result = prime * result + ((username == null) ? 0 : username.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (!super.equals(obj)) - return false; - if (getClass() != obj.getClass()) - return false; - HostingDotComVAppImpl other = (HostingDotComVAppImpl) obj; - if (password == null) { - if (other.password != null) - return false; - } else if (!password.equals(other.password)) - return false; - if (username == null) { - if (other.username != null) - return false; - } else if (!username.equals(other.username)) - return false; - return true; - } -} \ No newline at end of file diff --git a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandler.java b/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandler.java deleted file mode 100644 index 6a3af72d82..0000000000 --- a/vcloud/hostingdotcom/src/main/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandler.java +++ /dev/null @@ -1,63 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.xml; - -import javax.inject.Inject; - -import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; -import org.jclouds.vcloud.hostingdotcom.domain.internal.HostingDotComVAppImpl; -import org.jclouds.vcloud.xml.ResourceAllocationHandler; -import org.jclouds.vcloud.xml.VAppHandler; -import org.jclouds.vcloud.xml.VirtualSystemHandler; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; - -/** - * @author Adrian Cole - */ -public class HostingDotComVAppHandler extends VAppHandler { - - private String username; - private String password; - - @Inject - public HostingDotComVAppHandler(VirtualSystemHandler systemHandler, ResourceAllocationHandler allocationHandler) { - super(systemHandler, allocationHandler); - } - - public HostingDotComVApp getResult() { - return new HostingDotComVAppImpl(name, location, status, size, vDC, networkToAddresses, osType, - operatingSystemDescription, system, allocations, username, password); - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - super.startElement(uri, localName, qName, attributes); - if (attributes.getIndex("key") != -1) { - String key = attributes.getValue(attributes.getIndex("key")); - if ("username".equals(key)) { - username = attributes.getValue(attributes.getIndex("value")); - } else if ("password".equals(key)) { - password = attributes.getValue(attributes.getIndex("value")); - } - } - } - -} diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java deleted file mode 100644 index 063f4a1a45..0000000000 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/HostingDotComVCloudClientLiveTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.Properties; - -import org.jclouds.compute.ComputeServiceContextFactory; -import org.jclouds.logging.log4j.config.Log4JLoggingModule; -import org.jclouds.vcloud.VCloudExpressClientLiveTest; -import org.testng.annotations.BeforeGroups; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableSet; -import com.google.inject.Module; - -/** - * Tests behavior of {@code HostingDotComVCloudClient} - * - * @author Adrian Cole - */ -@Test(groups = "live", sequential = true, testName = "vcloud.HostingDotComVCloudClientLiveTest") -public class HostingDotComVCloudClientLiveTest extends VCloudExpressClientLiveTest { - - @BeforeGroups(groups = { "live" }) - @Override - public void setupClient() { - identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); - String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - - context = new ComputeServiceContextFactory().createContext("hostingdotcom", identity, credential, - ImmutableSet. of(new Log4JLoggingModule()), new Properties()).getProviderSpecificContext(); - connection = context.getApi(); - } - -} diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/ProvidersInPropertiesTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/ProvidersInPropertiesTest.java deleted file mode 100644 index de9c578282..0000000000 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/ProvidersInPropertiesTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom; - -import org.jclouds.compute.util.ComputeServiceUtils; -import org.jclouds.util.Utils; -import org.testng.annotations.Test; - -import com.google.common.collect.Iterables; - -/** - * - * @author Adrian Cole - * - */ -@Test(groups = "unit") -public class ProvidersInPropertiesTest { - - @Test - public void testSupportedProviders() { - Iterable providers = Utils.getSupportedProviders(); - assert Iterables.contains(providers, "hostingdotcom") : providers; - } - - @Test - public void testSupportedComputeServiceProviders() { - Iterable providers = ComputeServiceUtils.getSupportedProviders(); - assert Iterables.contains(providers, "hostingdotcom") : providers; - } - -} diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClientLiveTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClientLiveTest.java deleted file mode 100644 index e52ed626ed..0000000000 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeClientLiveTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.compute; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.util.Properties; - -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.logging.log4j.config.Log4JLoggingModule; -import org.jclouds.rest.RestContextFactory; -import org.jclouds.vcloud.compute.VCloudExpressComputeClientLiveTest; -import org.jclouds.vcloud.hostingdotcom.HostingDotComVCloudClient; -import org.testng.annotations.BeforeGroups; -import org.testng.annotations.Test; - -import com.google.common.base.Predicate; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.Module; -import com.google.inject.TypeLiteral; - -/** - * Tests behavior of {@code HostingDotComVCloudComputeClient} - * - * @author Adrian Cole - */ -@Test(groups = "live", enabled = true, sequential = true, testName = "vcloud.HostingDotComVCloudComputeClientLiveTest") -public class HostingDotComVCloudComputeClientLiveTest extends VCloudExpressComputeClientLiveTest { - - @BeforeGroups(groups = { "live" }) - @Override - public void setupClient() { - String identity = checkNotNull(System.getProperty("jclouds.test.identity"), "jclouds.test.identity"); - String credential = checkNotNull(System.getProperty("jclouds.test.credential"), "jclouds.test.credential"); - Injector injector = new RestContextFactory().createContextBuilder("hostingdotcom", identity, - credential, ImmutableSet. of(new Log4JLoggingModule()), new Properties()) - .buildInjector(); - - computeClient = injector.getInstance(HostingDotComVCloudComputeClient.class); - client = injector.getInstance(HostingDotComVCloudClient.class); - addressTester = injector.getInstance(Key.get(new TypeLiteral>() { - })); - expectationMap = ImmutableMap. builder().put(OsFamily.CENTOS, - new Expectation(4194304 / 2 * 10, "Red Hat Enterprise Linux 5 (64-bit)")).build(); - provider = "vcloudtest"; - templateName = "3"; - } - -} diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeServiceLiveTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeServiceLiveTest.java deleted file mode 100644 index d459deeccf..0000000000 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/compute/HostingDotComVCloudComputeServiceLiveTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.compute; - -import static org.testng.Assert.assertEquals; - -import org.jclouds.compute.domain.OsFamily; -import org.jclouds.compute.domain.Template; -import org.jclouds.vcloud.compute.VCloudExpressComputeServiceLiveTest; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -/** - * - * - * @author Adrian Cole - */ -@Test(groups = "live", enabled = true, sequential = true, testName = "compute.HostingDotComVCloudComputeServiceLiveTest") -public class HostingDotComVCloudComputeServiceLiveTest extends VCloudExpressComputeServiceLiveTest { - @BeforeClass - @Override - public void setServiceDefaults() { - provider = "hostingdotcom"; - } - - @Test - public void testTemplateBuilder() { - Template defaultTemplate = client.templateBuilder().build(); - assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true); - assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.CENTOS); - assertEquals(defaultTemplate.getLocation().getId(), "188849"); - assertEquals(defaultTemplate.getSize().getCores(), 1.0d); - } - -} \ No newline at end of file diff --git a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandlerTest.java b/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandlerTest.java deleted file mode 100644 index 5ab80b14ea..0000000000 --- a/vcloud/hostingdotcom/src/test/java/org/jclouds/vcloud/hostingdotcom/xml/HostingDotComVAppHandlerTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/** - * - * Copyright (C) 2010 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.hostingdotcom.xml; - -import static org.testng.Assert.assertEquals; - -import java.io.InputStream; -import java.net.URI; -import java.net.UnknownHostException; - -import org.jclouds.http.functions.BaseHandlerTest; -import org.jclouds.vcloud.domain.ResourceAllocation; -import org.jclouds.vcloud.domain.VAppStatus; -import org.jclouds.vcloud.domain.internal.NamedResourceImpl; -import org.jclouds.vcloud.hostingdotcom.domain.HostingDotComVApp; -import org.jclouds.vcloud.hostingdotcom.domain.internal.HostingDotComVAppImpl; -import org.testng.annotations.Test; - -import com.google.common.collect.ImmutableListMultimap; -import com.google.common.collect.ImmutableSortedSet; - -/** - * Tests behavior of {@code HostingDotComVAppHandler} - * - * @author Adrian Cole - */ -@Test(groups = "unit", testName = "vcloud.HostingDotComVAppHandlerTest") -public class HostingDotComVAppHandlerTest extends BaseHandlerTest { - - public void testApplyInputStream() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/hostingdotcom/instantiatevapp.xml"); - - HostingDotComVApp result = (HostingDotComVApp) factory.create( - injector.getInstance(HostingDotComVAppHandler.class)).parse(is); - - HostingDotComVApp expects = new HostingDotComVAppImpl("188849-33", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/188849-33"), VAppStatus.RESOLVED, null, - new NamedResourceImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/188849")), ImmutableListMultimap - . of(), null, null, null, ImmutableSortedSet. of(), "root", - "meatisyummy"); - - assertEquals(result, expects); - } -} diff --git a/vcloud/hostingdotcom/src/test/resources/hostingdotcom/instantiatevapp.xml b/vcloud/hostingdotcom/src/test/resources/hostingdotcom/instantiatevapp.xml deleted file mode 100644 index 32f73c3f40..0000000000 --- a/vcloud/hostingdotcom/src/test/resources/hostingdotcom/instantiatevapp.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Product Section Details - - - - diff --git a/vcloud/hostingdotcom/src/test/resources/log4j.xml b/vcloud/hostingdotcom/src/test/resources/log4j.xml deleted file mode 100755 index 7343ec00e2..0000000000 --- a/vcloud/hostingdotcom/src/test/resources/log4j.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/vcloud/pom.xml b/vcloud/pom.xml index e535b76cb7..04d09dff86 100644 --- a/vcloud/pom.xml +++ b/vcloud/pom.xml @@ -34,7 +34,6 @@ core terremark - hostingdotcom bluelock diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java index c9975760f4..07d0d2ef4e 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java @@ -681,11 +681,12 @@ public class TerremarkVCloudExpressAsyncClientTest extends RestClientTest of("vdc", new NamedResourceImpl("vdc", TerremarkVCloudExpressMediaType.VDC_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), null, - new NamedResourceImpl("tasksList", TerremarkVCloudExpressMediaType.TASKSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap + . of(), new NamedResourceImpl("tasksList", + TerremarkVCloudExpressMediaType.TASKSLIST_XML, URI .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")), new NamedResourceImpl( - "keysList", TerremarkVCloudExpressMediaType.KEYSLIST_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")))); + "keysList", TerremarkVCloudExpressMediaType.KEYSLIST_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")))); } } From 250f2f67cbfda793d23070d844dbead342477624 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 22 Aug 2010 22:45:42 -0700 Subject: [PATCH 15/16] refactored to use new vcloud 1.0 status type --- .../BlueLockVCloudDirectorComputeClient.java | 4 +- .../BlueLockVCloudExpressComputeClient.java | 4 +- ...mmonVCloudComputeServiceContextModule.java | 15 +- .../CommonVCloudComputeClientImpl.java | 6 +- .../internal/VCloudComputeClientImpl.java | 6 +- .../VCloudExpressComputeClientImpl.java | 6 +- .../VCloudAddNodeWithTagStrategy.java | 6 +- .../VCloudExpressAddNodeWithTagStrategy.java | 6 +- .../VCloudGetNodeMetadataStrategy.java | 6 +- .../org/jclouds/vcloud/domain/Status.java | 225 ++++++++++++++++++ .../java/org/jclouds/vcloud/domain/VApp.java | 2 +- .../org/jclouds/vcloud/domain/VAppStatus.java | 89 ------- .../jclouds/vcloud/domain/VAppTemplate.java | 2 +- .../vcloud/domain/internal/VAppImpl.java | 8 +- .../domain/internal/VAppTemplateImpl.java | 8 +- .../org/jclouds/vcloud/xml/VAppHandler.java | 19 +- .../vcloud/xml/VAppTemplateHandler.java | 6 +- .../compute/VCloudComputeClientLiveTest.java | 4 +- .../VCloudExpressComputeClientLiveTest.java | 4 +- ...VCloudComputeServiceContextModuleTest.java | 11 +- ...xpressComputeServiceContextModuleTest.java | 9 +- .../jclouds/vcloud/xml/TaskHandlerTest.java | 44 ++-- .../jclouds/vcloud/xml/VAppHandlerTest.java | 59 +++-- .../vcloud/xml/VAppTemplateHandlerTest.java | 4 +- .../BindVAppConfigurationToXmlPayload.java | 35 +-- .../compute/TerremarkVCloudComputeClient.java | 6 +- ...erremarkVCloudGetNodeMetadataStrategy.java | 4 +- .../terremark/TerremarkClientLiveTest.java | 16 +- ...BindVAppConfigurationToXmlPayloadTest.java | 10 +- .../TerremarkVCloudComputeClientTest.java | 4 +- .../vcloud/terremark/xml/VAppHandlerTest.java | 57 +++-- 31 files changed, 426 insertions(+), 259 deletions(-) create mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/Status.java delete mode 100644 vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppStatus.java diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java index 4409d1c3e5..58411a6e40 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudDirectorComputeClient.java @@ -31,7 +31,7 @@ import org.jclouds.domain.Credentials; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.compute.internal.VCloudComputeClientImpl; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import com.google.common.base.Predicate; @@ -45,7 +45,7 @@ public class BlueLockVCloudDirectorComputeClient extends VCloudComputeClientImpl @Inject protected BlueLockVCloudDirectorComputeClient(PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, - VCloudClient client, Predicate successTester, Map vAppStatusToNodeState) { + VCloudClient client, Predicate successTester, Map vAppStatusToNodeState) { super(client, successTester, vAppStatusToNodeState); this.credentialsProvider = credentialsProvider; } diff --git a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java index 0cef4655d6..cfda41e4ba 100644 --- a/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java +++ b/vcloud/bluelock/src/main/java/org/jclouds/vcloud/bluelock/compute/BlueLockVCloudExpressComputeClient.java @@ -31,7 +31,7 @@ import org.jclouds.domain.Credentials; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.internal.VCloudExpressComputeClientImpl; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import com.google.common.base.Predicate; @@ -45,7 +45,7 @@ public class BlueLockVCloudExpressComputeClient extends VCloudExpressComputeClie @Inject protected BlueLockVCloudExpressComputeClient(PopulateDefaultLoginCredentialsForImageStrategy credentialsProvider, - VCloudExpressClient client, Predicate successTester, Map vAppStatusToNodeState) { + VCloudExpressClient client, Predicate successTester, Map vAppStatusToNodeState) { super(client, successTester, vAppStatusToNodeState); this.credentialsProvider = credentialsProvider; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java index 4e9239c94d..c1b926d71a 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/config/CommonVCloudComputeServiceContextModule.java @@ -45,7 +45,7 @@ import org.jclouds.vcloud.compute.strategy.VCloudRebootNodeStrategy; import org.jclouds.vcloud.compute.suppliers.OrgAndVDCToLocationSupplier; import org.jclouds.vcloud.compute.suppliers.StaticSizeSupplier; import org.jclouds.vcloud.compute.suppliers.VCloudImageSupplier; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Supplier; @@ -63,14 +63,17 @@ import com.google.inject.util.Providers; public abstract class CommonVCloudComputeServiceContextModule extends BaseComputeServiceContextModule { @VisibleForTesting - static final Map vAppStatusToNodeState = ImmutableMap. builder().put( - VAppStatus.OFF, NodeState.SUSPENDED).put(VAppStatus.ON, NodeState.RUNNING).put(VAppStatus.RESOLVED, - NodeState.PENDING).put(VAppStatus.SUSPENDED, NodeState.SUSPENDED).put(VAppStatus.UNRESOLVED, - NodeState.PENDING).build(); + static final Map vAppStatusToNodeState = ImmutableMap. builder().put( + Status.OFF, NodeState.SUSPENDED).put(Status.ON, NodeState.RUNNING).put(Status.RESOLVED, NodeState.PENDING) + .put(Status.ERROR, NodeState.ERROR).put(Status.UNRECOGNIZED, NodeState.UNKNOWN).put(Status.DEPLOYED, + NodeState.PENDING).put(Status.INCONSISTENT, NodeState.PENDING).put(Status.UNKNOWN, + NodeState.UNKNOWN).put(Status.MIXED, NodeState.PENDING).put(Status.WAITING_FOR_INPUT, + NodeState.PENDING).put(Status.SUSPENDED, NodeState.SUSPENDED).put(Status.UNRESOLVED, + NodeState.PENDING).build(); @Singleton @Provides - Map provideVAppStatusToNodeState() { + Map provideVAppStatusToNodeState() { return vAppStatusToNodeState; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java index a42241b275..9f34d2c50c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/CommonVCloudComputeClientImpl.java @@ -35,7 +35,7 @@ import org.jclouds.vcloud.CommonVCloudClient; import org.jclouds.vcloud.compute.CommonVCloudComputeClient; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import com.google.common.base.Predicate; @@ -104,7 +104,7 @@ public class CommonVCloudComputeClientImpl implements CommonVCloudComputeClient } private VApp undeployVAppIfDeployed(VApp vApp) { - if (vApp.getStatus().compareTo(VAppStatus.RESOLVED) > 0) { + if (vApp.getStatus().compareTo(Status.RESOLVED) > 0) { logger.debug(">> undeploying vApp(%s), current status: %s", vApp.getName(), vApp.getStatus()); Task task = client.undeployVApp(vApp.getId()); if (!taskTester.apply(task.getLocation())) { @@ -117,7 +117,7 @@ public class CommonVCloudComputeClientImpl implements CommonVCloudComputeClient } private VApp powerOffVAppIfDeployed(VApp vApp) { - if (vApp.getStatus().compareTo(VAppStatus.OFF) > 0) { + if (vApp.getStatus().compareTo(Status.OFF) > 0) { logger.debug(">> powering off vApp(%s), current status: %s", vApp.getName(), vApp.getStatus()); Task task = client.powerOffVApp(vApp.getId()); if (!taskTester.apply(task.getLocation())) { diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java index da79879ebc..452af905f3 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudComputeClientImpl.java @@ -32,7 +32,7 @@ import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.compute.VCloudComputeClient; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -46,11 +46,11 @@ import com.google.inject.Inject; @Singleton public class VCloudComputeClientImpl extends CommonVCloudComputeClientImpl implements VCloudComputeClient { - protected final Map vAppStatusToNodeState; + protected final Map vAppStatusToNodeState; @Inject public VCloudComputeClientImpl(VCloudClient client, Predicate successTester, - Map vAppStatusToNodeState) { + Map vAppStatusToNodeState) { super(client, successTester); this.vAppStatusToNodeState = vAppStatusToNodeState; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java index cd13619818..5809b77c91 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/internal/VCloudExpressComputeClientImpl.java @@ -32,7 +32,7 @@ import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -46,11 +46,11 @@ import com.google.inject.Inject; @Singleton public class VCloudExpressComputeClientImpl extends CommonVCloudComputeClientImpl implements VCloudExpressComputeClient { - protected final Map vAppStatusToNodeState; + protected final Map vAppStatusToNodeState; @Inject public VCloudExpressComputeClientImpl(VCloudExpressClient client, Predicate successTester, - Map vAppStatusToNodeState) { + Map vAppStatusToNodeState) { super(client, successTester); this.vAppStatusToNodeState = vAppStatusToNodeState; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java index d33ad7dfb5..b496ce1d7c 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudAddNodeWithTagStrategy.java @@ -38,7 +38,7 @@ import org.jclouds.domain.Credentials; import org.jclouds.vcloud.VCloudClient; import org.jclouds.vcloud.compute.VCloudComputeClient; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import com.google.common.collect.ImmutableMap; @@ -50,11 +50,11 @@ import com.google.common.collect.ImmutableMap; public class VCloudAddNodeWithTagStrategy implements AddNodeWithTagStrategy { protected final VCloudClient client; protected final VCloudComputeClient computeClient; - protected final Map vAppStatusToNodeState; + protected final Map vAppStatusToNodeState; @Inject protected VCloudAddNodeWithTagStrategy(VCloudClient client, VCloudComputeClient computeClient, - Map vAppStatusToNodeState) { + Map vAppStatusToNodeState) { this.client = client; this.computeClient = computeClient; this.vAppStatusToNodeState = vAppStatusToNodeState; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java index b62872f063..154a7a33ff 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudExpressAddNodeWithTagStrategy.java @@ -38,7 +38,7 @@ import org.jclouds.domain.Credentials; import org.jclouds.vcloud.VCloudExpressClient; import org.jclouds.vcloud.compute.VCloudExpressComputeClient; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; import com.google.common.collect.ImmutableMap; @@ -50,11 +50,11 @@ import com.google.common.collect.ImmutableMap; public class VCloudExpressAddNodeWithTagStrategy implements AddNodeWithTagStrategy { protected final VCloudExpressClient client; protected final VCloudExpressComputeClient computeClient; - protected final Map vAppStatusToNodeState; + protected final Map vAppStatusToNodeState; @Inject protected VCloudExpressAddNodeWithTagStrategy(VCloudExpressClient client, VCloudExpressComputeClient computeClient, - Map vAppStatusToNodeState) { + Map vAppStatusToNodeState) { this.client = client; this.computeClient = computeClient; this.vAppStatusToNodeState = vAppStatusToNodeState; diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java index e561d02be5..28f9d0ad4f 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudGetNodeMetadataStrategy.java @@ -45,7 +45,7 @@ import org.jclouds.vcloud.compute.CommonVCloudComputeClient; import org.jclouds.vcloud.compute.functions.FindLocationForResource; import org.jclouds.vcloud.compute.functions.GetExtra; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableMap; @@ -63,11 +63,11 @@ public class VCloudGetNodeMetadataStrategy implements GetNodeMetadataStrategy { protected final Supplier> images; protected final FindLocationForResource findLocationForResourceInVDC; protected final GetExtra getExtra; - protected final Map vAppStatusToNodeState; + protected final Map vAppStatusToNodeState; @Inject protected VCloudGetNodeMetadataStrategy(CommonVCloudClient client, CommonVCloudComputeClient computeClient, - Map vAppStatusToNodeState, GetExtra getExtra, + Map vAppStatusToNodeState, GetExtra getExtra, FindLocationForResource findLocationForResourceInVDC, Supplier> images) { this.client = checkNotNull(client, "client"); this.images = checkNotNull(images, "images"); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Status.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Status.java new file mode 100644 index 0000000000..fdd2dc4de6 --- /dev/null +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/Status.java @@ -0,0 +1,225 @@ +/** + * + * Copyright (C) 2010 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.domain; + +import static com.google.common.base.Preconditions.checkNotNull; + +/** + * Objects such as vAppTemplate, vApp, and Vm have a status attribute whose value indicates the + * state of the object. Status for an object, such as a vAppTemplate or vApp, whose Children (Vm + * objects) each have a status of their own, is computed from the status of the Children. + * + *

NOTE

+ *

+ * The deployment status of an object is indicated by the value of its deployed attribute. + * + * @since vcloud api 0.8 + * + * @author Adrian Cole + */ +public enum Status { + /** + * The {@link VAppTemplate}, {@link VApp}, or {@link Vm} could not be created. + * + * @since vcloud api 1.0 + */ + ERROR, + /** + * The {@link VAppTemplate}, {@link VApp}, or {@link Vm} is unresolved. + * + * @since vcloud api 0.8 + */ + UNRESOLVED, + /** + * The {@link VAppTemplate}, {@link VApp}, or {@link Vm} is resolved. + * + * @since vcloud api 0.8 + */ + RESOLVED, + /** + * The object is deployed. + *

+ * note that the documentation does not reference use of this. + * + * @since vcloud api 1.0 + */ + DEPLOYED, + /** + * The {@link VApp} or {@link Vm} is suspended. + * + * @since vcloud api 0.8 + */ + SUSPENDED, + /** + * The {@link VApp} or {@link Vm} is powered on + * + * @since vcloud api 0.8 + */ + ON, + /** + * The {@link VApp} or {@link Vm} waiting for user input. + * + * @since vcloud api 1.0 + */ + WAITING_FOR_INPUT, + /** + * The {@link VAppTemplate}, {@link VApp}, or {@link Vm} is in an unknown state. + * + * @since vcloud api 1.0 + */ + UNKNOWN, + /** + * The {@link VAppTemplate}, {@link VApp}, or {@link Vm} is in an unrecognized state. + * + * @since vcloud api 1.0 + */ + UNRECOGNIZED, + /** + * The {@link VAppTemplate}, {@link VApp}, or {@link Vm} is off. + * + * @since vcloud api 0.8 + */ + OFF, + /** + * The {@link VApp} or {@link Vm} is in an inconsistent state. + * + * @since vcloud api 1.0 + */ + INCONSISTENT, + /** + * The {@link VAppTemplate} or {@link VApp} have children do not all have the same status. + * + * @since vcloud api 1.0 + */ + MIXED, + /** + * The {@link VAppTemplate} Upload initiated, OVF descriptor pending + * + * @since vcloud api 1.0 + */ + PENDING_DESCRIPTOR, + /** + * The {@link VAppTemplate} Upload initiated, copying contents + * + * @since vcloud api 1.0 + */ + COPYING, + /** + * The {@link VAppTemplate} Upload initiated, disk contents pending + * + * @since vcloud api 1.0 + */ + PENDING_CONTENTS, + /** + * The {@link VAppTemplate} Upload has been quarantined + * + * @since vcloud api 1.0 + */ + QUARANTINED, + /** + * The {@link VAppTemplate} Upload quarantine period has expired + * + * @since vcloud api 1.0 + */ + QUARANTINE_EXPIRED; + + public String value() { + switch (this) { + case UNRESOLVED: + return "0"; + case RESOLVED: + return "1"; + case DEPLOYED: + return "2"; + case SUSPENDED: + return "3"; + case ON: + return "4"; + case WAITING_FOR_INPUT: + return "5"; + case UNKNOWN: + return "6"; + case UNRECOGNIZED: + return "7"; + case OFF: + return "8"; + case INCONSISTENT: + return "9"; + case MIXED: + return "10"; + case PENDING_DESCRIPTOR: + return "11"; + case COPYING: + return "12"; + case PENDING_CONTENTS: + return "13"; + case QUARANTINED: + return "14"; + case QUARANTINE_EXPIRED: + return "15"; + default: + throw new IllegalArgumentException("invalid status:" + this); + } + } + + public static Status fromValue(String status) { + return fromValue(Integer.parseInt(checkNotNull(status, "status"))); + } + + public static Status fromValue(int v) { + switch (v) { + case 0: + return UNRESOLVED; + case 1: + return RESOLVED; + case 2: + return DEPLOYED; + case 3: + return SUSPENDED; + case 4: + return ON; + case 5: + return WAITING_FOR_INPUT; + case 6: + return UNKNOWN; + case 7: + return UNRECOGNIZED; + case 8: + return OFF; + case 9: + return INCONSISTENT; + case 10: + return MIXED; + case 11: + return PENDING_DESCRIPTOR; + case 12: + return COPYING; + case 13: + return PENDING_CONTENTS; + case 14: + return QUARANTINED; + case 15: + return QUARANTINE_EXPIRED; + default: + throw new IllegalArgumentException("invalid status:" + v); + } + } + +} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VApp.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VApp.java index 90c599eff9..035538f177 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VApp.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VApp.java @@ -39,7 +39,7 @@ import com.google.inject.ImplementedBy; public interface VApp extends NamedResource { NamedResource getVDC(); - VAppStatus getStatus(); + Status getStatus(); Long getSize(); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppStatus.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppStatus.java deleted file mode 100644 index 62eab9e304..0000000000 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppStatus.java +++ /dev/null @@ -1,89 +0,0 @@ -/** - * - * Copyright (C) 2010 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.domain; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Indicates the status of the VApp. - * - * @author Adrian Cole - */ -public enum VAppStatus { - /** - * The vApp is unresolved (one or more file references are unavailable in the cloud) - */ - UNRESOLVED, - /** - * The vApp is resolved (all file references are available in the cloud) but not deployed - */ - RESOLVED, - /** - * The vApp is deployed and powered off - */ - OFF, - /** - * The vApp is deployed and suspended - */ - SUSPENDED, - /** - * The vApp is deployed and powered on - */ - ON; - - public String value() { - switch (this) { - case UNRESOLVED: - return "0"; - case RESOLVED: - return "1"; - case OFF: - return "2"; - case SUSPENDED: - return "3"; - case ON: - return "4"; - default: - throw new IllegalArgumentException("invalid status:" + this); - } - } - - public static VAppStatus fromValue(String status) { - return fromValue(Integer.parseInt(checkNotNull(status, "status"))); - } - - public static VAppStatus fromValue(int v) { - switch (v) { - case 0: - return UNRESOLVED; - case 1: - return RESOLVED; - case 2: - return OFF; - case 3: - return SUSPENDED; - case 4: - return ON; - default: - throw new IllegalArgumentException("invalid status:" + v); - } - } - -} \ No newline at end of file diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppTemplate.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppTemplate.java index 31f3b16e77..5145754b33 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppTemplate.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/VAppTemplate.java @@ -25,7 +25,7 @@ package org.jclouds.vcloud.domain; */ public interface VAppTemplate extends NamedResource { - VAppStatus getStatus(); + Status getStatus(); String getDescription(); diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java index 8757d0fc4e..97f1497e7e 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppImpl.java @@ -28,7 +28,7 @@ import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VirtualSystem; import com.google.common.collect.ListMultimap; @@ -42,7 +42,7 @@ public class VAppImpl implements VApp { private final String name; private final URI id; private final NamedResource vDC; - private final VAppStatus status; + private final Status status; private final Long size; private final ListMultimap networkToAddresses; private final String operatingSystemDescription; @@ -53,7 +53,7 @@ public class VAppImpl implements VApp { /** The serialVersionUID */ private static final long serialVersionUID = 8464716396538298809L; - public VAppImpl(String name, URI id, VAppStatus status, Long size, NamedResource vDC, + public VAppImpl(String name, URI id, Status status, Long size, NamedResource vDC, ListMultimap networkToAddresses, Integer osType, String operatingSystemDescription, VirtualSystem system, Set resourceAllocations) { this.name = checkNotNull(name, "name"); @@ -69,7 +69,7 @@ public class VAppImpl implements VApp { } @Override - public VAppStatus getStatus() { + public Status getStatus() { return status; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java index b79e252111..b385c35dd6 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/domain/internal/VAppTemplateImpl.java @@ -24,7 +24,7 @@ import java.net.URI; import javax.annotation.Nullable; import org.jclouds.vcloud.VCloudExpressMediaType; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; /** @@ -37,9 +37,9 @@ public class VAppTemplateImpl extends NamedResourceImpl implements VAppTemplate /** The serialVersionUID */ private static final long serialVersionUID = 8464716396538298809L; private final String description; - private final VAppStatus status; + private final Status status; - public VAppTemplateImpl(String name, URI id, @Nullable String description, @Nullable VAppStatus status) { + public VAppTemplateImpl(String name, URI id, @Nullable String description, @Nullable Status status) { super(name, VCloudExpressMediaType.VAPPTEMPLATE_XML, id); this.description = description; this.status = status; @@ -50,7 +50,7 @@ public class VAppTemplateImpl extends NamedResourceImpl implements VAppTemplate return description; } - public VAppStatus getStatus() { + public Status getStatus() { return status; } diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java index 7c1e5aad0e..e3d08ee1b7 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppHandler.java @@ -19,11 +19,14 @@ package org.jclouds.vcloud.xml; +import static org.jclouds.Constants.PROPERTY_API_VERSION; + import java.net.URI; import java.util.Set; import javax.annotation.Resource; import javax.inject.Inject; +import javax.inject.Named; import org.jclouds.http.functions.ParseSax; import org.jclouds.logging.Logger; @@ -31,7 +34,7 @@ import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.NamedResource; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VirtualSystem; import org.jclouds.vcloud.domain.internal.VAppImpl; import org.jclouds.vcloud.util.Utils; @@ -46,21 +49,23 @@ import com.google.common.collect.Sets; * @author Adrian Cole */ public class VAppHandler extends ParseSax.HandlerWithResult { - + private final String apiVersion; private final VirtualSystemHandler systemHandler; private final ResourceAllocationHandler allocationHandler; @Resource protected Logger logger = Logger.NULL; @Inject - public VAppHandler(VirtualSystemHandler systemHandler, ResourceAllocationHandler allocationHandler) { + public VAppHandler(@Named(PROPERTY_API_VERSION) String apiVersion, VirtualSystemHandler systemHandler, + ResourceAllocationHandler allocationHandler) { + this.apiVersion = apiVersion; this.systemHandler = systemHandler; this.allocationHandler = allocationHandler; } protected VirtualSystem system; protected Set allocations = Sets.newLinkedHashSet(); - protected VAppStatus status; + protected Status status; protected final ListMultimap networkToAddresses = ArrayListMultimap.create(); protected StringBuilder currentText = new StringBuilder(); protected String operatingSystemDescription; @@ -82,7 +87,11 @@ public class VAppHandler extends ParseSax.HandlerWithResult { NamedResource resource = Utils.newNamedResource(attributes); name = resource.getName(); location = resource.getId(); - status = VAppStatus.fromValue(attributes.getValue(attributes.getIndex("status"))); + String statusString = attributes.getValue(attributes.getIndex("status")); + if (apiVersion.indexOf("0.8") != -1 && "2".equals(statusString)) + status = Status.OFF; + else + status = Status.fromValue(statusString); if (attributes.getIndex("size") != -1) size = new Long(attributes.getValue(attributes.getIndex("size"))); } else if (qName.equals("Link")) { // type should never be missing diff --git a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppTemplateHandler.java b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppTemplateHandler.java index bbe0d048c0..a5a3a895aa 100644 --- a/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppTemplateHandler.java +++ b/vcloud/core/src/main/java/org/jclouds/vcloud/xml/VAppTemplateHandler.java @@ -21,7 +21,7 @@ package org.jclouds.vcloud.xml; import org.jclouds.http.functions.ParseSax; import org.jclouds.vcloud.domain.NamedResource; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.internal.VAppTemplateImpl; import org.jclouds.vcloud.util.Utils; @@ -36,7 +36,7 @@ public class VAppTemplateHandler extends ParseSax.HandlerWithResult 0; - assert VAppStatus.SUSPENDED.compareTo(VAppStatus.OFF) > 0; - assert VAppStatus.OFF.compareTo(VAppStatus.OFF) == 0; - } - public void testSelf() { InputStream is = getClass().getResourceAsStream("/task-self.xml"); Task result = factory.create(injector.getInstance(TaskHandler.class)).parse(is); Task expects = new TaskImpl(URI.create("https://vcloud.safesecureweb.com/api/v0.8/task/d188849-78"), - TaskStatus.QUEUED, null, null, null, null, null, null); + TaskStatus.QUEUED, null, null, null, null, null, null); assertEquals(result, expects); } @@ -94,12 +88,12 @@ public class TaskHandlerTest extends BaseHandlerTest { Task result = factory.create(injector.getInstance(TaskHandler.class)).parse(is); Task expects = new TaskImpl(URI.create("https://vcloud.safesecureweb.com/api/v0.8/task/97806"), - TaskStatus.SUCCESS, dateService.iso8601SecondsDateParse("2010-01-14T20:04:51Z"), dateService - .iso8601SecondsDateParse("2010-01-14T20:05:02Z"), dateService - .iso8601SecondsDateParse("2010-01-15T20:05:02Z"), + TaskStatus.SUCCESS, dateService.iso8601SecondsDateParse("2010-01-14T20:04:51Z"), dateService + .iso8601SecondsDateParse("2010-01-14T20:05:02Z"), dateService + .iso8601SecondsDateParse("2010-01-15T20:05:02Z"), - new NamedResourceImpl("188849-96", VCloudExpressMediaType.VAPP_XML, URI - .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/188849-96")), null, null); + new NamedResourceImpl("188849-96", VCloudExpressMediaType.VAPP_XML, URI + .create("https://vcloud.safesecureweb.com/api/v0.8/vapp/188849-96")), null, null); assertEquals(result, expects); } @@ -109,12 +103,12 @@ public class TaskHandlerTest extends BaseHandlerTest { Task result = factory.create(injector.getInstance(TaskHandler.class)).parse(is); Task expects = new TaskImpl(URI.create("http://10.150.4.49/api/v0.8/task/23"), TaskStatus.ERROR, dateService - .iso8601SecondsDateParse("2009-12-07T19:05:02Z"), dateService - .iso8601SecondsDateParse("2009-12-10T14:40:32Z"), null, new NamedResourceImpl("APIOrg", - VCloudExpressMediaType.ORG_XML, URI.create("http://10.150.4.49/api/v0.8/org/1")), new NamedResourceImpl( - "testapp1", VCloudExpressMediaType.VAPP_XML, URI.create("http://10.150.4.49/api/v0.8/vapp/1")), - new TaskImpl.ErrorImpl("Error processing job", "500", - " Error in runDailySummaries date used:2009-12-09 19:40:30.577326+00:00")); + .iso8601SecondsDateParse("2009-12-07T19:05:02Z"), dateService + .iso8601SecondsDateParse("2009-12-10T14:40:32Z"), null, new NamedResourceImpl("APIOrg", + VCloudExpressMediaType.ORG_XML, URI.create("http://10.150.4.49/api/v0.8/org/1")), new NamedResourceImpl( + "testapp1", VCloudExpressMediaType.VAPP_XML, URI.create("http://10.150.4.49/api/v0.8/vapp/1")), + new TaskImpl.ErrorImpl("Error processing job", "500", + " Error in runDailySummaries date used:2009-12-09 19:40:30.577326+00:00")); assertEquals(result, expects); } diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppHandlerTest.java index db1181542d..bbaa05717d 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppHandlerTest.java @@ -24,22 +24,30 @@ import static org.testng.Assert.assertEquals; import java.io.InputStream; import java.net.URI; import java.net.UnknownHostException; +import java.util.Properties; import java.util.SortedSet; +import org.jclouds.Constants; import org.jclouds.http.functions.BaseHandlerTest; +import org.jclouds.http.functions.ParseSax; +import org.jclouds.http.functions.config.SaxParserModule; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VirtualSystem; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.jclouds.vcloud.domain.internal.VAppImpl; +import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.ListMultimap; +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.name.Names; /** * Tests behavior of {@code VAppHandler} @@ -48,33 +56,20 @@ import com.google.common.collect.ListMultimap; */ @Test(groups = "unit", testName = "vcloud.VAppHandlerTest") public class VAppHandlerTest extends BaseHandlerTest { - @Test(enabled = false) - public void testHosting() throws UnknownHostException { - InputStream is = getClass().getResourceAsStream("/vapp-hosting.xml"); + @BeforeTest + @Override + protected void setUpInjector() { + injector = Guice.createInjector(new SaxParserModule(), new AbstractModule() { - VApp result = factory.create(injector.getInstance(VAppHandler.class)).parse(is); + @Override + protected void configure() { + Properties toBind = new Properties(); + toBind.setProperty(Constants.PROPERTY_API_VERSION, "0.8"); + Names.bindProperties(binder(), toBind); + } - ListMultimap networkToAddresses = ImmutableListMultimap. of("Network 1", - "204.12.11.167"); - - VirtualSystem system = new VirtualSystem(0, "Virtual Hardware Family", "SimpleVM", "vmx-07"); - - SortedSet resourceAllocations = ImmutableSortedSet. naturalOrder().add( - new ResourceAllocation(1, "1 virtual CPU(s)", "Number of Virtual CPUs", ResourceType.PROCESSOR, null, - null, null, null, null, null, 1, "hertz * 10^6"), - new ResourceAllocation(2, "512MB of memory", "Memory Size", ResourceType.MEMORY, null, null, null, null, - null, null, 512, "byte * 2^20")).add( - - new ResourceAllocation(3, "SCSI Controller 0", "SCSI Controller", ResourceType.SCSI_CONTROLLER, - "lsilogic", null, 0, null, null, null, 1, null)).add( - - new ResourceAllocation(9, "Hard Disk 1", null, ResourceType.DISK_DRIVE, null, "20971520", null, 0, 3, - null, 20971520, "byte * 2^20")).build(); - - VApp expects = new VAppImpl("188849-96", URI.create("https://vcloud.safesecureweb.com/api/v0.8/vapp/188849-96"), - VAppStatus.OFF, new Long(20971520), null, networkToAddresses, null, null, system, resourceAllocations); - - assertEquals(result, expects); + }); + factory = injector.getInstance(ParseSax.Factory.class); } public void testInstantiated() throws UnknownHostException { @@ -82,7 +77,7 @@ public class VAppHandlerTest extends BaseHandlerTest { VApp result = factory.create(injector.getInstance(VAppHandler.class)).parse(is); - VApp expects = new VAppImpl("centos53", URI.create("http://10.150.4.49/api/v0.8/vApp/10"), VAppStatus.RESOLVED, + VApp expects = new VAppImpl("centos53", URI.create("http://10.150.4.49/api/v0.8/vApp/10"), Status.RESOLVED, 123456789l, new NamedResourceImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI .create("http://10.150.4.49/api/v0.8/vdc/4")), ImmutableListMultimap. of(), null, null, null, ImmutableSet. of()); @@ -110,10 +105,10 @@ public class VAppHandlerTest extends BaseHandlerTest { new ResourceAllocation(9, "Hard Disk 1", null, ResourceType.DISK_DRIVE, null, "104857", null, 0, 3, null, 104857, "byte * 2^20")).build(); - VApp expects = new VAppImpl("centos53", URI.create("http://10.150.4.49/api/v0.8/vApp/10"), VAppStatus.ON, - new Long(104857), new NamedResourceImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI - .create("http://10.150.4.49/api/v0.8/vdc/4")), networkToAddresses, null, - "Other Linux (32-bit)", system, resourceAllocations); + VApp expects = new VAppImpl("centos53", URI.create("http://10.150.4.49/api/v0.8/vApp/10"), Status.ON, new Long( + 104857), new NamedResourceImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI + .create("http://10.150.4.49/api/v0.8/vdc/4")), networkToAddresses, null, "Other Linux (32-bit)", system, + resourceAllocations); assertEquals(result.getId(), expects.getId()); assertEquals(result.getName(), expects.getName()); assertEquals(result.getNetworkToAddresses(), expects.getNetworkToAddresses()); @@ -147,7 +142,7 @@ public class VAppHandlerTest extends BaseHandlerTest { new ResourceAllocation(9, "Hard Disk 1", null, ResourceType.DISK_DRIVE, null, "10485760", null, 0, 3, null, 10485760, "byte * 2^20")).build(); - VApp expects = new VAppImpl("m1", URI.create("http://localhost:8000/api/v0.8/vApp/80"), VAppStatus.ON, new Long( + VApp expects = new VAppImpl("m1", URI.create("http://localhost:8000/api/v0.8/vApp/80"), Status.ON, new Long( 10485760), new NamedResourceImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI .create("http://localhost:8000/api/v0.8/vdc/28")), networkToAddresses, null, "Microsoft Windows XP Professional (32-bit)", system, resourceAllocations); diff --git a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java index c5045151e4..2bc57d1499 100644 --- a/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java +++ b/vcloud/core/src/test/java/org/jclouds/vcloud/xml/VAppTemplateHandlerTest.java @@ -27,7 +27,7 @@ import java.net.URI; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.ParseSax.Factory; import org.jclouds.http.functions.config.SaxParserModule; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.internal.VAppTemplateImpl; import org.testng.annotations.Test; @@ -64,6 +64,6 @@ public class VAppTemplateHandlerTest { VAppTemplate result = (VAppTemplate) factory.create(injector.getInstance(VAppTemplateHandler.class)).parse(is); assertEquals(result, new VAppTemplateImpl("cPanel (Linux) 64 Bit", URI .create("https://vcloud.safesecureweb.com/api/v0.8/catalogItem/4"), "cPanel (Linux) 64 Bit", - VAppStatus.RESOLVED)); + Status.RESOLVED)); } } diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayload.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayload.java index 163f8defc7..ec272129f4 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayload.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayload.java @@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.find; +import static org.jclouds.Constants.PROPERTY_API_VERSION; import static org.jclouds.vcloud.predicates.VCloudPredicates.resourceType; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_NAMESPACE; import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_XML_SCHEMA; @@ -44,8 +45,8 @@ import org.jclouds.rest.binders.BindToStringPayload; import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.terremark.domain.VAppConfiguration; import com.google.common.base.Function; @@ -64,11 +65,14 @@ public class BindVAppConfigurationToXmlPayload implements MapBinder, Function postParams) { checkArgument(checkNotNull(request, "request") instanceof GeneratedHttpRequest, - "this binder is only valid for GeneratedHttpRequests!"); + "this binder is only valid for GeneratedHttpRequests!"); GeneratedHttpRequest gRequest = (GeneratedHttpRequest) request; checkState(gRequest.getArgs() != null, "args should be initialized at this point"); VApp vApp = checkNotNull(findVAppInArgsOrNull(gRequest), "vApp"); - checkArgument(vApp.getStatus() == VAppStatus.OFF, "vApp must be off!"); + checkArgument(vApp.getStatus() == Status.OFF, "vApp must be off!"); VAppConfiguration configuration = checkNotNull(findConfigInArgsOrNull(gRequest), "config"); try { @@ -98,13 +102,13 @@ public class BindVAppConfigurationToXmlPayload implements MapBinder, Function passwordGenerator, Predicate successTester, - Map vAppStatusToNodeState) { + Map vAppStatusToNodeState) { super(client, successTester, vAppStatusToNodeState); this.client = client; this.credentialsProvider = credentialsProvider; @@ -213,7 +213,7 @@ public class TerremarkVCloudComputeClient extends VCloudExpressComputeClientImpl VApp vApp = client.getVApp(id); Set ipAddresses = deleteInternetServicesAndNodesAssociatedWithVApp(vApp); deletePublicIpAddressesWithNoServicesAttached(ipAddresses); - if (vApp.getStatus() != VAppStatus.OFF) { + if (vApp.getStatus() != Status.OFF) { try { powerOffAndWait(vApp); } catch (IllegalStateException e) { diff --git a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java index 18882f444b..cd440a673a 100644 --- a/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java +++ b/vcloud/terremark/src/main/java/org/jclouds/vcloud/terremark/compute/strategy/TerremarkVCloudGetNodeMetadataStrategy.java @@ -44,7 +44,7 @@ import org.jclouds.vcloud.compute.domain.VCloudLocation; import org.jclouds.vcloud.compute.functions.FindLocationForResource; import org.jclouds.vcloud.compute.functions.GetExtra; import org.jclouds.vcloud.compute.strategy.VCloudGetNodeMetadataStrategy; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.terremark.compute.domain.KeyPairCredentials; import org.jclouds.vcloud.terremark.compute.domain.OrgAndName; @@ -63,7 +63,7 @@ public class TerremarkVCloudGetNodeMetadataStrategy extends VCloudGetNodeMetadat @Inject protected TerremarkVCloudGetNodeMetadataStrategy(CommonVCloudClient client, CommonVCloudComputeClient computeClient, - Map vAppStatusToNodeState, GetExtra getExtra, + Map vAppStatusToNodeState, GetExtra getExtra, FindLocationForResource findLocationForResourceInVDC, Supplier> images, ConcurrentMap credentialsMap) { super(client, computeClient, vAppStatusToNodeState, getExtra, findLocationForResourceInVDC, images); diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java index c35bf9a469..f64c556f33 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java @@ -55,7 +55,7 @@ import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.options.CloneVAppOptions; @@ -176,7 +176,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes // instantiate, noting vApp returned has minimal details vApp = tmClient.instantiateVAppTemplateInVDC(vdc.getId(), vAppTemplate.getId(), serverName, instantiateOptions); - assertEquals(vApp.getStatus(), VAppStatus.RESOLVED); + assertEquals(vApp.getStatus(), Status.RESOLVED); // in terremark, this should be a no-op, as it should simply return the // above task, which is @@ -189,7 +189,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes vApp = tmClient.getVApp(vApp.getId()); - assertEquals(vApp.getStatus(), VAppStatus.RESOLVED); + assertEquals(vApp.getStatus(), Status.RESOLVED); try {// per docs, this is not supported tmClient.cancelTask(deployTask.getLocation()); @@ -208,13 +208,13 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes int processorCount = 1; long memory = 512; verifyConfigurationOfVApp(vApp, serverName, expectedOs, processorCount, memory, hardDisk); - assertEquals(vApp.getStatus(), VAppStatus.OFF); + assertEquals(vApp.getStatus(), Status.OFF); assert successTester.apply(tmClient.powerOnVApp(vApp.getId()).getLocation()); System.out.printf("%d: done powering on vApp%n", System.currentTimeMillis()); vApp = tmClient.getVApp(vApp.getId()); - assertEquals(vApp.getStatus(), VAppStatus.ON); + assertEquals(vApp.getStatus(), Status.ON); } protected void prepare() { @@ -264,7 +264,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes task = tmClient.getTask(task.getLocation()); clone = tmClient.getVApp(task.getResult().getId()); - assertEquals(clone.getStatus(), VAppStatus.ON); + assertEquals(clone.getStatus(), Status.ON); assertEquals(clone.getName(), newName); assertEquals(clone.getNetworkToAddresses().values().size(), 1); @@ -316,7 +316,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes vApp = tmClient.getVApp(vApp.getId()); - assertEquals(vApp.getStatus(), VAppStatus.ON); + assertEquals(vApp.getStatus(), Status.ON); // TODO we need to determine whether shutdown is supported before invoking // it. @@ -327,7 +327,7 @@ public abstract class TerremarkClientLiveTest extends VCloudExpressClientLiveTes assert successTester.apply(tmClient.powerOffVApp(vApp.getId()).getLocation()); vApp = tmClient.getVApp(vApp.getId()); - assertEquals(vApp.getStatus(), VAppStatus.OFF); + assertEquals(vApp.getStatus(), Status.OFF); } @Test(enabled = true, dependsOnMethods = "testLifeCycle") diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayloadTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayloadTest.java index 77ff6d22ed..9c030fefab 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayloadTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/binders/BindVAppConfigurationToXmlPayloadTest.java @@ -34,7 +34,7 @@ import org.jclouds.rest.internal.GeneratedHttpRequest; import org.jclouds.util.Utils; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.internal.VAppImpl; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressPropertiesBuilder; import org.jclouds.vcloud.terremark.domain.VAppConfiguration; @@ -66,7 +66,7 @@ public class BindVAppConfigurationToXmlPayloadTest { public void testChangeName() throws IOException { VAppImpl vApp = new VAppImpl("MyAppServer6", URI - .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), VAppStatus.OFF, 4194304l, + .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), Status.OFF, 4194304l, null, ImmutableListMultimap. of(), null, null, null, ImmutableSet.of( new ResourceAllocation(1, "n/a", null, ResourceType.PROCESSOR, null, null, null, null, null, null, 2, null), new ResourceAllocation(2, "n/a", null, ResourceType.MEMORY, null, @@ -93,7 +93,7 @@ public class BindVAppConfigurationToXmlPayloadTest { public void testRemoveDisk() throws IOException { VAppImpl vApp = new VAppImpl("MyAppServer6", URI - .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), VAppStatus.OFF, 4194304l, + .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), Status.OFF, 4194304l, null, ImmutableListMultimap. of(), null, null, null, ImmutableSet.of( new ResourceAllocation(1, "n/a", null, ResourceType.PROCESSOR, null, null, null, null, null, null, 2, null), new ResourceAllocation(2, "n/a", null, ResourceType.MEMORY, null, @@ -122,7 +122,7 @@ public class BindVAppConfigurationToXmlPayloadTest { public void testChangeCPUCountTo4() throws IOException { VAppImpl vApp = new VAppImpl("eduardo", URI - .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), VAppStatus.OFF, 4194304l, + .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), Status.OFF, 4194304l, null, ImmutableListMultimap. of(), null, null, null, ImmutableSet.of( new ResourceAllocation(1, "n/a", null, ResourceType.PROCESSOR, null, null, null, null, null, null, 4, null), new ResourceAllocation(2, "n/a", null, ResourceType.MEMORY, null, @@ -147,7 +147,7 @@ public class BindVAppConfigurationToXmlPayloadTest { public void testChangeMemoryTo1536() throws IOException { VAppImpl vApp = new VAppImpl("MyAppServer6", URI - .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), VAppStatus.OFF, 4194304l, + .create("https://services.vcloudexpress/terremark.com/api/v0.8/vapp/4213"), Status.OFF, 4194304l, null, ImmutableListMultimap. of(), null, null, null, ImmutableSet.of( new ResourceAllocation(1, "n/a", null, ResourceType.PROCESSOR, null, null, null, null, null, null, 2, null), new ResourceAllocation(2, "n/a", null, ResourceType.MEMORY, null, diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java index 8602cc4857..5f23e4f5ca 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/compute/TerremarkVCloudComputeClientTest.java @@ -35,7 +35,7 @@ import javax.inject.Provider; import org.jclouds.compute.domain.NodeState; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.terremark.TerremarkVCloudExpressClient; import org.jclouds.vcloud.terremark.compute.strategy.ParseVAppTemplateDescriptionToGetDefaultLoginCredentials; @@ -89,7 +89,7 @@ public class TerremarkVCloudComputeClientTest { expect(client.powerOnVApp(vappLocation)).andReturn(task); Predicate notFoundTester = createMock(Predicate.class); - Map vAppStatusToNodeState = createMock(Map.class); + Map vAppStatusToNodeState = createMock(Map.class); TerremarkVCloudComputeClient computeClient = new TerremarkVCloudComputeClient(client, new ParseVAppTemplateDescriptionToGetDefaultLoginCredentials(), new Provider() { diff --git a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java index 93b814603c..cbfb98ddaf 100644 --- a/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java +++ b/vcloud/terremark/src/test/java/org/jclouds/vcloud/terremark/xml/VAppHandlerTest.java @@ -28,15 +28,17 @@ import java.io.InputStream; import java.net.URI; import java.net.UnknownHostException; import java.util.List; +import java.util.Properties; +import org.jclouds.Constants; import org.jclouds.http.functions.BaseHandlerTest; import org.jclouds.http.functions.ParseSax; import org.jclouds.http.functions.config.SaxParserModule; import org.jclouds.vcloud.VCloudExpressMediaType; import org.jclouds.vcloud.domain.ResourceAllocation; import org.jclouds.vcloud.domain.ResourceType; +import org.jclouds.vcloud.domain.Status; import org.jclouds.vcloud.domain.VApp; -import org.jclouds.vcloud.domain.VAppStatus; import org.jclouds.vcloud.domain.VirtualSystem; import org.jclouds.vcloud.domain.internal.NamedResourceImpl; import org.jclouds.vcloud.xml.VAppHandler; @@ -46,7 +48,9 @@ import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; +import com.google.inject.AbstractModule; import com.google.inject.Guice; +import com.google.inject.name.Names; /** * Tests behavior of {@code VAppHandler} @@ -59,7 +63,16 @@ public class VAppHandlerTest extends BaseHandlerTest { @BeforeTest @Override protected void setUpInjector() { - injector = Guice.createInjector(new SaxParserModule()); + injector = Guice.createInjector(new SaxParserModule(), new AbstractModule() { + + @Override + protected void configure() { + Properties toBind = new Properties(); + toBind.setProperty(Constants.PROPERTY_API_VERSION, "0.8"); + Names.bindProperties(binder(), toBind); + } + + }); factory = injector.getInstance(ParseSax.Factory.class); } @@ -69,13 +82,13 @@ public class VAppHandlerTest extends BaseHandlerTest { VApp result = (VApp) factory.create(injector.getInstance(VAppHandler.class)).parse(is); assertEquals(result.getName(), "adriantest"); - assertEquals(result.getStatus(), VAppStatus.UNRESOLVED); + assertEquals(result.getStatus(), Status.UNRESOLVED); assertEquals(result.getSize().longValue(), 4l); assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/13775")); assertEquals(result.getVDC(), new NamedResourceImpl(null, "application/vnd.vmware.vcloud.vdc+xml", URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); } @@ -85,36 +98,36 @@ public class VAppHandlerTest extends BaseHandlerTest { VApp result = (VApp) factory.create(injector.getInstance(VAppHandler.class)).parse(is); assertEquals(result.getName(), "centos-53"); - assertEquals(result.getStatus(), VAppStatus.OFF); + assertEquals(result.getStatus(), Status.OFF); assertEquals(result.getSize().longValue(), 10485760); assertEquals(result.getOperatingSystemDescription(), "Red Hat Enterprise Linux 5 (64-bit)"); assertEquals(result.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/16238")); assertEquals(result.getVDC(), new NamedResourceImpl(null, VCloudExpressMediaType.VDC_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); assertEquals(result.getSystem(), new VirtualSystem(0, "Virtual Hardware Family", "centos-53", "vmx-07")); assertEquals(result.getNetworkToAddresses().get("Internal"), ImmutableList. of("10.114.34.132")); ResourceAllocation cpu = new ResourceAllocation(1, "1 virtual CPU(s)", "Number of Virtual CPUs", - ResourceType.PROCESSOR, null, null, null, null, null, null, 1, "hertz * 10^6"); + ResourceType.PROCESSOR, null, null, null, null, null, null, 1, "hertz * 10^6"); ResourceAllocation controller = new ResourceAllocation(3, "SCSI Controller 0", "SCSI Controller", - ResourceType.SCSI_CONTROLLER, "lsilogic", null, 0, null, null, null, 1, null); + ResourceType.SCSI_CONTROLLER, "lsilogic", null, 0, null, null, null, 1, null); ResourceAllocation memory = new ResourceAllocation(2, "512MB of memory", "Memory Size", ResourceType.MEMORY, - null, null, null, null, null, null, 512, "byte * 2^20"); + null, null, null, null, null, null, 512, "byte * 2^20"); ResourceAllocation disk = new ResourceAllocation(9, "Hard Disk 1", null, ResourceType.DISK_DRIVE, null, - "10485760", null, 0, 3, null, 10485760, "byte * 2^20"); + "10485760", null, 0, 3, null, 10485760, "byte * 2^20"); assertEquals(result.getResourceAllocations(), ImmutableSet.of(cpu, memory, controller, disk)); assertEquals(find(result.getResourceAllocations(), resourceType(ResourceType.PROCESSOR)).getVirtualQuantity(), 1); assertEquals(find(result.getResourceAllocations(), resourceType(ResourceType.SCSI_CONTROLLER)) - .getVirtualQuantity(), 1); + .getVirtualQuantity(), 1); assertEquals(find(result.getResourceAllocations(), resourceType(ResourceType.MEMORY)).getVirtualQuantity(), 512); assertEquals(find(result.getResourceAllocations(), resourceType(ResourceType.DISK_DRIVE)).getVirtualQuantity(), - 10485760); + 10485760); assertEquals(result.getSize().longValue(), find(result.getResourceAllocations(), - resourceType(ResourceType.DISK_DRIVE)).getVirtualQuantity()); + resourceType(ResourceType.DISK_DRIVE)).getVirtualQuantity()); } public void testGetVApp2disks() throws UnknownHostException { @@ -123,39 +136,39 @@ public class VAppHandlerTest extends BaseHandlerTest { VApp vApp = factory.create(injector.getInstance(VAppHandler.class)).parse(is); assertEquals(vApp.getName(), "eduardo"); - assertEquals(vApp.getStatus(), VAppStatus.OFF); + assertEquals(vApp.getStatus(), Status.OFF); assertEquals(vApp.getSize().longValue(), 30408704); assertEquals(vApp.getOperatingSystemDescription(), "Ubuntu Linux (32-bit)"); assertEquals(vApp.getId(), URI.create("https://services.vcloudexpress.terremark.com/api/v0.8/vapp/15639")); assertEquals(vApp.getVDC(), new NamedResourceImpl(null, VCloudExpressMediaType.VDC_XML, URI - .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); + .create("https://services.vcloudexpress.terremark.com/api/v0.8/vdc/32"))); assertEquals(vApp.getSystem(), new VirtualSystem(0, "Virtual Hardware Family", "eduardo", "vmx-07")); assertEquals(vApp.getNetworkToAddresses().get("Internal"), ImmutableList.of("10.114.34.131")); ResourceAllocation cpu = new ResourceAllocation(1, "2 virtual CPU(s)", "Number of Virtual CPUs", - ResourceType.PROCESSOR, null, null, null, null, null, null, 2, "hertz * 10^6"); + ResourceType.PROCESSOR, null, null, null, null, null, null, 2, "hertz * 10^6"); ResourceAllocation controller = new ResourceAllocation(3, "SCSI Controller 0", "SCSI Controller", - ResourceType.SCSI_CONTROLLER, "lsilogic", null, 0, null, null, null, 1, null); + ResourceType.SCSI_CONTROLLER, "lsilogic", null, 0, null, null, null, 1, null); ResourceAllocation memory = new ResourceAllocation(2, "1024MB of memory", "Memory Size", ResourceType.MEMORY, - null, null, null, null, null, null, 1024, "byte * 2^20"); + null, null, null, null, null, null, 1024, "byte * 2^20"); ResourceAllocation disk = new ResourceAllocation(9, "Hard Disk 1", null, ResourceType.DISK_DRIVE, null, - "4194304", null, 0, 3, null, 4194304, "byte * 2^20"); + "4194304", null, 0, 3, null, 4194304, "byte * 2^20"); ResourceAllocation disk2 = new ResourceAllocation(9, "Hard Disk 2", null, ResourceType.DISK_DRIVE, null, - "26214400", null, 1, 3, null, 26214400, "byte * 2^20"); + "26214400", null, 1, 3, null, 26214400, "byte * 2^20"); assertEquals(vApp.getResourceAllocations(), ImmutableSet.of(cpu, memory, controller, disk, disk2)); assertEquals(find(vApp.getResourceAllocations(), resourceType(ResourceType.PROCESSOR)).getVirtualQuantity(), 2); assertEquals( - find(vApp.getResourceAllocations(), resourceType(ResourceType.SCSI_CONTROLLER)).getVirtualQuantity(), 1); + find(vApp.getResourceAllocations(), resourceType(ResourceType.SCSI_CONTROLLER)).getVirtualQuantity(), 1); assertEquals(find(vApp.getResourceAllocations(), resourceType(ResourceType.MEMORY)).getVirtualQuantity(), 1024); // extract the disks on the vApp sorted by addressOnParent List disks = Lists.newArrayList(filter(vApp.getResourceAllocations(), - resourceType(ResourceType.DISK_DRIVE))); + resourceType(ResourceType.DISK_DRIVE))); assertEquals(disks.get(0).getVirtualQuantity(), 4194304); assertEquals(disks.get(1).getVirtualQuantity(), 26214400); From fd7aacf17659d20f608cf357bea790c14d45e62a Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Sun, 22 Aug 2010 23:27:07 -0700 Subject: [PATCH 16/16] Issue 290: corrected CIM type ids --- .../compute/domain/os/CIMOperatingSystem.java | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/compute/src/main/java/org/jclouds/compute/domain/os/CIMOperatingSystem.java b/compute/src/main/java/org/jclouds/compute/domain/os/CIMOperatingSystem.java index 2ac10eb05e..8921bf039c 100644 --- a/compute/src/main/java/org/jclouds/compute/domain/os/CIMOperatingSystem.java +++ b/compute/src/main/java/org/jclouds/compute/domain/os/CIMOperatingSystem.java @@ -38,171 +38,171 @@ public class CIMOperatingSystem extends OperatingSystem { /** * Other */ - OTHER(0, "Other", OsFamily.UNKNOWN, false), + OTHER(1, "Other", OsFamily.UNKNOWN, false), /** * MACOS */ - MACOS(1, "MACOS", OsFamily.DARWIN, false), + MACOS(2, "MACOS", OsFamily.DARWIN, false), /** * Solaris */ - SOLARIS(28, "Solaris", OsFamily.SOLARIS, false), + SOLARIS(29, "Solaris", OsFamily.SOLARIS, false), /** * LINUX */ - LINUX(35, "LINUX", OsFamily.LINUX, false), + LINUX(36, "LINUX", OsFamily.LINUX, false), /** * FreeBSD */ - FREEBSD(41, "FreeBSD", OsFamily.FREEBSD, false), + FREEBSD(42, "FreeBSD", OsFamily.FREEBSD, false), /** * NetBSD */ - NETBSD(42, "NetBSD", OsFamily.NETBSD, false), + NETBSD(43, "NetBSD", OsFamily.NETBSD, false), /** * OpenBSD */ - OPENBSD(64, "OpenBSD", OsFamily.OPENBSD, false), + OPENBSD(65, "OpenBSD", OsFamily.OPENBSD, false), /** * Not Applicable */ - NOT_APPLICABLE(65, "Not Applicable", OsFamily.UNKNOWN, false), + NOT_APPLICABLE(66, "Not Applicable", OsFamily.UNKNOWN, false), /** * Microsoft Windows Server 2003 */ - WINDOWS_SERVER_2003(68, "Microsoft Windows Server 2003", OsFamily.WINDOWS, false), + WINDOWS_SERVER_2003(69, "Microsoft Windows Server 2003", OsFamily.WINDOWS, false), /** * Microsoft Windows Server 2003 64-Bit */ - WINDOWS_SERVER_2003_64(69, "Microsoft Windows Server 2003 64-Bit", OsFamily.WINDOWS, true), + WINDOWS_SERVER_2003_64(70, "Microsoft Windows Server 2003 64-Bit", OsFamily.WINDOWS, true), /** * Microsoft Windows Server 2008 */ - WINDOWS_SERVER_2008(75, "Microsoft Windows Server 2008", OsFamily.WINDOWS, false), + WINDOWS_SERVER_2008(76, "Microsoft Windows Server 2008", OsFamily.WINDOWS, false), /** * Microsoft Windows Server 2008 64-Bit */ - WINDOWS_SERVER_2008_64(76, "Microsoft Windows Server 2008 64-Bit", OsFamily.WINDOWS, true), + WINDOWS_SERVER_2008_64(77, "Microsoft Windows Server 2008 64-Bit", OsFamily.WINDOWS, true), /** * FreeBSD 64-Bit */ - FREEBSD_64(77, "FreeBSD 64-Bit", OsFamily.FREEBSD, true), + FREEBSD_64(78, "FreeBSD 64-Bit", OsFamily.FREEBSD, true), /** * RedHat Enterprise Linux */ - RHEL(78, "RedHat Enterprise Linux", OsFamily.RHEL, false), + RHEL(79, "RedHat Enterprise Linux", OsFamily.RHEL, false), /** * RedHat Enterprise Linux 64-Bit */ - RHEL_64(79, "RedHat Enterprise Linux 64-Bit", OsFamily.RHEL, true), + RHEL_64(80, "RedHat Enterprise Linux 64-Bit", OsFamily.RHEL, true), /** * Solaris 64-Bit */ - SOLARIS_64(80, "Solaris 64-Bit", OsFamily.SOLARIS, true), + SOLARIS_64(81, "Solaris 64-Bit", OsFamily.SOLARIS, true), /** * SUSE */ - SUSE(81, "SUSE", OsFamily.SUSE, false), + SUSE(82, "SUSE", OsFamily.SUSE, false), /** * SUSE 64-Bit */ - SUSE_64(82, "SUSE 64-Bit", OsFamily.SUSE, true), + SUSE_64(83, "SUSE 64-Bit", OsFamily.SUSE, true), /** * SLES */ - SLES(83, "SLES", OsFamily.SUSE, false), + SLES(84, "SLES", OsFamily.SUSE, false), /** * SLES 64-Bit */ - SLES_64(84, "SLES 64-Bit", OsFamily.SUSE, true), + SLES_64(85, "SLES 64-Bit", OsFamily.SUSE, true), /** * Novell OES */ - NOVELL_OES(85, "Novell OES", OsFamily.SUSE, true), + NOVELL_OES(86, "Novell OES", OsFamily.SUSE, true), /** * Mandriva */ - MANDRIVA(88, "Mandriva", OsFamily.MANDRIVA, false), + MANDRIVA(89, "Mandriva", OsFamily.MANDRIVA, false), /** * Mandriva 64-Bit */ - MANDRIVA_64(89, "Mandriva 64-Bit", OsFamily.MANDRIVA, true), + MANDRIVA_64(90, "Mandriva 64-Bit", OsFamily.MANDRIVA, true), /** * TurboLinux */ - TURBOLINUX(90, "TurboLinux", OsFamily.TURBOLINUX, false), + TURBOLINUX(91, "TurboLinux", OsFamily.TURBOLINUX, false), /** * TurboLinux 64-Bit */ - TURBOLINUX_64(91, "TurboLinux 64-Bit", OsFamily.TURBOLINUX, true), + TURBOLINUX_64(92, "TurboLinux 64-Bit", OsFamily.TURBOLINUX, true), /** * Ubuntu */ - UBUNTU(92, "Ubuntu", OsFamily.UBUNTU, false), + UBUNTU(93, "Ubuntu", OsFamily.UBUNTU, false), /** * Ubuntu 64-Bit */ - UBUNTU_64(93, "Ubuntu 64-Bit", OsFamily.UBUNTU, true), + UBUNTU_64(94, "Ubuntu 64-Bit", OsFamily.UBUNTU, true), /** * Debian */ - DEBIAN(94, "Debian", OsFamily.DEBIAN, false), + DEBIAN(95, "Debian", OsFamily.DEBIAN, false), /** * Debian 64-Bit */ - DEBIAN_64(95, "Debian 64-Bit", OsFamily.DEBIAN, false), + DEBIAN_64(96, "Debian 64-Bit", OsFamily.DEBIAN, false), /** * Linux 2.4.x */ - LINUX_2_4(96, "Linux 2.4.x", OsFamily.LINUX, false), + LINUX_2_4(97, "Linux 2.4.x", OsFamily.LINUX, false), /** * Linux 2.4.x 64-Bi */ - LINUX_2_4_64(97, "Linux 2.4.x 64-Bit", OsFamily.LINUX, true), + LINUX_2_4_64(98, "Linux 2.4.x 64-Bit", OsFamily.LINUX, true), /** * Linux 2.6.x */ - LINUX_2_6(98, "Linux 2.6.x", OsFamily.LINUX, false), + LINUX_2_6(99, "Linux 2.6.x", OsFamily.LINUX, false), /** * Linux 2.6.x 64-Bit */ - LINUX_2_6_64(99, "Linux 2.6.x 64-Bit", OsFamily.LINUX, true), + LINUX_2_6_64(100, "Linux 2.6.x 64-Bit", OsFamily.LINUX, true), /** * Linux 64-Bit */ - LINUX_64(100, "Linux 64-Bit", OsFamily.LINUX, true), + LINUX_64(101, "Linux 64-Bit", OsFamily.LINUX, true), /** * Other 64-Bit */ - OTHER_64(101, "Other 64-Bit", OsFamily.UNKNOWN, true), + OTHER_64(102, "Other 64-Bit", OsFamily.UNKNOWN, true), /** * Microsoft Windows Server 2008 R2 */ - WINDOWS_SERVER_2008_R2(102, "Microsoft Windows Server 2008 R2", OsFamily.WINDOWS, true), + WINDOWS_SERVER_2008_R2(103, "Microsoft Windows Server 2008 R2", OsFamily.WINDOWS, true), /** * VMware ESXi */ - ESXI(103, "VMware ESXi", OsFamily.ESX, true), + ESXI(104, "VMware ESXi", OsFamily.ESX, true), /** * Microsoft Windows 7 */ - WINDOWS_7(104, "Microsoft Windows 7", OsFamily.WINDOWS, false), + WINDOWS_7(105, "Microsoft Windows 7", OsFamily.WINDOWS, false), /** * CentOS 32-bit */ - CENTOS(105, "CentOS 32-bit", OsFamily.CENTOS, false), + CENTOS(106, "CentOS 32-bit", OsFamily.CENTOS, false), /** * CentOS 64-bit */ - CENTOS_64(106, "CentOS 64-bit", OsFamily.CENTOS, true), + CENTOS_64(107, "CentOS 64-bit", OsFamily.CENTOS, true), /** * Oracle Enterprise Linux 32-bit */ - ORACLE_ENTERPRISE_LINUX(107, "Oracle Enterprise Linux 32-bit", OsFamily.OEL, false), + ORACLE_ENTERPRISE_LINUX(108, "Oracle Enterprise Linux 32-bit", OsFamily.OEL, false), /** * Oracle Enterprise Linux 64-bit */ - ORACLE_ENTERPRISE_LINUX_64(108, "Oracle Enterprise Linux 64-bit", OsFamily.OEL, true); + ORACLE_ENTERPRISE_LINUX_64(109, "Oracle Enterprise Linux 64-bit", OsFamily.OEL, true); private final int code;