You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2015/03/24 00:58:33 UTC
[1/2] jclouds git commit: Fixes OpenStack extension namespace
configuration
Repository: jclouds
Updated Branches:
refs/heads/master 821724857 -> fcb7dfcb8
Fixes OpenStack extension namespace configuration
* Improves extension namespace configuration to use Guice multibindings
so each provider can cleanly provide their own namespaces.
* Fixes the HPCloud Compute volume attachment namespace and adds the
corresponding live tests.
* Fixes the Rackspace CloudServers UK volume attachment namespace.
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/4db2b75a
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/4db2b75a
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/4db2b75a
Branch: refs/heads/master
Commit: 4db2b75addf9730d66ddde166a5d0e464434478f
Parents: 8217248
Author: Ignasi Barrera <na...@apache.org>
Authored: Mon Mar 23 22:40:43 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Mon Mar 23 22:40:43 2015 +0100
----------------------------------------------------------------------
apis/chef/pom.xml | 5 +-
apis/openstack-keystone/pom.xml | 5 +
.../openstack/keystone/v2_0/config/Aliases.java | 31 +++++++
.../v2_0/config/KeystoneHttpApiModule.java | 17 ++--
...espaceEqualsAnyNamespaceInExtensionsSet.java | 21 +++--
...ceEqualsAnyNamespaceInExtensionsSetTest.java | 13 ++-
apis/openstack-nova/pom.xml | 5 +
.../nova/v2_0/config/NovaHttpApiModule.java | 80 ++++++++--------
.../extensions/VolumeAttachmentApiLiveTest.java | 5 +
core/pom.xml | 2 -
project/pom.xml | 16 ++++
providers/hpcloud-compute/pom.xml | 11 +++
.../compute/HPCloudComputeProviderMetadata.java | 4 +-
.../config/HPCloudComputeHttpApiModule.java | 40 ++++++++
...omputeVolumeAttachmentExtensionLiveTest.java | 45 +++++++++
providers/rackspace-cloudservers-uk/pom.xml | 11 +++
.../uk/CloudServersUKProviderMetadata.java | 4 +-
.../uk/config/CloudServersUKHttpApiModule.java | 43 +++++++++
...versUKVolumeAttachmentExtensionLiveTest.java | 42 +++++++++
providers/rackspace-cloudservers-us/pom.xml | 5 +
.../us/config/CloudServersUSHttpApiModule.java | 96 ++------------------
21 files changed, 342 insertions(+), 159 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/chef/pom.xml
----------------------------------------------------------------------
diff --git a/apis/chef/pom.xml b/apis/chef/pom.xml
index e935b3e..94acd56 100644
--- a/apis/chef/pom.xml
+++ b/apis/chef/pom.xml
@@ -75,9 +75,8 @@
</dependency>
<!-- for ohai -->
<dependency>
- <groupId>com.google.inject.extensions</groupId>
- <artifactId>guice-multibindings</artifactId>
- <version>3.0</version>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-multibindings</artifactId>
</dependency>
<!-- for transient chef provider -->
<dependency>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-keystone/pom.xml
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/pom.xml b/apis/openstack-keystone/pom.xml
index 27881d7..77952e0 100644
--- a/apis/openstack-keystone/pom.xml
+++ b/apis/openstack-keystone/pom.xml
@@ -51,6 +51,11 @@
<artifactId>jclouds-core</artifactId>
<version>${project.version}</version>
</dependency>
+ <!-- for the extension namespaces -->
+ <dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-multibindings</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/Aliases.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/Aliases.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/Aliases.java
new file mode 100644
index 0000000..c589cf5
--- /dev/null
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/Aliases.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.openstack.keystone.v2_0.config;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.inject.Qualifier;
+
+@Retention(value = RetentionPolicy.RUNTIME)
+@Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
+@Qualifier
+public @interface Aliases {
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
index 691d044..03b4c17 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneHttpApiModule.java
@@ -49,11 +49,11 @@ import com.google.common.base.Suppliers;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Multimap;
import com.google.inject.AbstractModule;
+import com.google.inject.Binder;
import com.google.inject.Provides;
import com.google.inject.assistedinject.FactoryModuleBuilder;
+import com.google.inject.multibindings.MapBinder;
/**
* Configures the Keystone API.
@@ -91,17 +91,16 @@ public class KeystoneHttpApiModule extends HttpApiModule<KeystoneApi> {
}
}
+ // Allow providers to cleanly contribute their own aliases
+ public static MapBinder<URI, URI> aliasBinder(Binder binder) {
+ return MapBinder.newMapBinder(binder, URI.class, URI.class, Aliases.class).permitDuplicates();
+ }
+
@Override
protected void configure() {
bind(ImplicitOptionalConverter.class).to(PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.class);
super.configure();
- }
-
- @Provides
- @Singleton
- public Multimap<URI, URI> aliases() {
- return ImmutableMultimap.<URI, URI>builder()
- .build();
+ aliasBinder(binder());
}
@Provides
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.java
index 5b6a8e9..584b24f 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.java
@@ -23,18 +23,20 @@ import static org.jclouds.util.Optionals2.unwrapIfOptional;
import java.net.URI;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
+import org.jclouds.openstack.keystone.v2_0.config.Aliases;
import org.jclouds.openstack.v2_0.domain.Extension;
import org.jclouds.reflect.InvocationSuccess;
import org.jclouds.rest.functions.ImplicitOptionalConverter;
import com.google.common.base.Optional;
import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Multimap;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
/**
* We use the annotation {@link org.jclouds.openstack.services.Extension} to bind a class that implements an extension
@@ -43,13 +45,13 @@ import com.google.common.collect.Multimap;
public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet implements
ImplicitOptionalConverter {
private final LoadingCache<String, Set<? extends Extension>> extensions;
- private final Multimap<URI, URI> aliases;
+ private final Map<URI, Set<URI>> aliases;
@Inject
- public PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet(
- LoadingCache<String, Set<? extends Extension>> extensions, Multimap<URI, URI> aliases) {
- this.extensions = checkNotNull(extensions, "extensions");
- this.aliases = aliases == null ? ImmutableMultimap.<URI, URI> of() : ImmutableMultimap.copyOf(aliases);
+ PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet(
+ LoadingCache<String, Set<? extends Extension>> extensions, @Aliases Map<URI, Set<URI>> aliases) {
+ this.extensions = extensions;
+ this.aliases = aliases == null ? ImmutableMap.<URI, Set<URI>> of() : ImmutableMap.copyOf(aliases);
}
@Override
@@ -60,12 +62,13 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
if (ext.isPresent()) {
URI namespace = URI.create(ext.get().namespace());
List<Object> args = input.getInvocation().getArgs();
+ Set<URI> aliasesForNamespace = aliases.containsKey(namespace) ? aliases.get(namespace) : Sets.<URI> newHashSet();
if (args.isEmpty()) {
- if (any(extensions.getUnchecked(""), namespaceOrAliasEquals(namespace, aliases.get(namespace))))
+ if (any(extensions.getUnchecked(""), namespaceOrAliasEquals(namespace, aliasesForNamespace)))
return input.getResult();
} else if (args.size() == 1) {
String arg0 = checkNotNull(args.get(0), "arg[0] in %s", input).toString();
- if (any(extensions.getUnchecked(arg0), namespaceOrAliasEquals(namespace, aliases.get(namespace))))
+ if (any(extensions.getUnchecked(arg0), namespaceOrAliasEquals(namespace, aliasesForNamespace)))
return input.getResult();
} else {
throw new RuntimeException(String.format("expecting zero or one args %s", input));
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
index 624a0bd..9a698a1 100644
--- a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/v2_0/functions/PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest.java
@@ -24,6 +24,7 @@ import java.util.List;
import java.util.Set;
import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.openstack.keystone.v2_0.config.Aliases;
import org.jclouds.openstack.v2_0.ServiceType;
import org.jclouds.openstack.v2_0.domain.Extension;
import org.jclouds.reflect.Invocation;
@@ -44,6 +45,7 @@ import com.google.common.collect.Multimap;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Provides;
+import com.google.inject.multibindings.MapBinder;
@Test(groups = "unit", testName = "PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest")
public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSetTest {
@@ -138,6 +140,13 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
new AbstractModule() {
@Override
protected void configure() {
+ MapBinder<URI, URI> aliasBindings = MapBinder.newMapBinder(binder(),
+ URI.class, URI.class, Aliases.class).permitDuplicates();
+ for (URI key : aliases.keySet()) {
+ for (URI value : aliases.get(key)) {
+ aliasBindings.addBinding(key).toInstance(value);
+ }
+ }
}
@Provides
@@ -145,10 +154,6 @@ public class PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensio
return extensionsForRegion;
}
- @Provides
- Multimap<URI, URI> getAliases() {
- return aliases;
- }
}).getInstance(PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.class);
return fn;
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-nova/pom.xml
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/pom.xml b/apis/openstack-nova/pom.xml
index 3e9f6bf..1122592 100644
--- a/apis/openstack-nova/pom.xml
+++ b/apis/openstack-nova/pom.xml
@@ -53,6 +53,11 @@
<artifactId>openstack-keystone</artifactId>
<version>${project.version}</version>
</dependency>
+ <!-- for the extension namespaces -->
+ <dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-multibindings</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.jclouds</groupId>
<artifactId>jclouds-compute</artifactId>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java
index 885591f..830c7b8 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/config/NovaHttpApiModule.java
@@ -16,6 +16,8 @@
*/
package org.jclouds.openstack.nova.v2_0.config;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneHttpApiModule.aliasBinder;
+
import java.net.URI;
import java.util.Set;
import java.util.concurrent.TimeUnit;
@@ -39,9 +41,8 @@ import org.jclouds.rest.functions.ImplicitOptionalConverter;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Multimap;
import com.google.inject.Provides;
+import com.google.inject.multibindings.MapBinder;
/**
* Configures the Nova connection.
@@ -57,45 +58,44 @@ public class NovaHttpApiModule extends HttpApiModule<NovaApi> {
protected void configure() {
bind(ImplicitOptionalConverter.class).to(PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.class);
super.configure();
+ bindDefaultAliases();
}
- @Provides
- @Singleton
- public Multimap<URI, URI> aliases() {
- return ImmutableMultimap.<URI, URI>builder()
- .put(URI.create(ExtensionNamespaces.SECURITY_GROUPS),
- URI.create("http://docs.openstack.org/compute/ext/securitygroups/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.FLOATING_IPS),
- URI.create("http://docs.openstack.org/compute/ext/floating_ips/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.KEYPAIRS),
- URI.create("http://docs.openstack.org/compute/ext/keypairs/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.SIMPLE_TENANT_USAGE),
- URI.create("http://docs.openstack.org/compute/ext/os-simple-tenant-usage/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.HOSTS),
- URI.create("http://docs.openstack.org/compute/ext/hosts/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.VOLUMES),
- URI.create("http://docs.openstack.org/compute/ext/volumes/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.VIRTUAL_INTERFACES),
- URI.create("http://docs.openstack.org/compute/ext/virtual_interfaces/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.CREATESERVEREXT),
- URI.create("http://docs.openstack.org/compute/ext/createserverext/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.ADMIN_ACTIONS),
- URI.create("http://docs.openstack.org/compute/ext/admin-actions/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.AGGREGATES),
- URI.create("http://docs.openstack.org/compute/ext/aggregates/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.FLAVOR_EXTRA_SPECS),
- URI.create("http://docs.openstack.org/compute/ext/flavor_extra_specs/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.QUOTAS),
- URI.create("http://docs.openstack.org/compute/ext/quotas-sets/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.VOLUME_TYPES),
- URI.create("http://docs.openstack.org/compute/ext/volume_types/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.AVAILABILITY_ZONE),
- URI.create("http://docs.openstack.org/compute/ext/availabilityzone/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.VOLUME_ATTACHMENTS),
- URI.create("http://docs.openstack.org/compute/ext/os-volume-attachment-update/api/v2"))
- .put(URI.create(ExtensionNamespaces.ATTACH_INTERFACES),
- URI.create("http://docs.openstack.org/compute/ext/interfaces/api/v1.1"))
- .build();
+ // Intentionally private so subclasses use the Guice multibindings to contribute their aliases
+ private void bindDefaultAliases() {
+ MapBinder<URI, URI> aliases = aliasBinder(binder());
+ aliases.addBinding(URI.create(ExtensionNamespaces.SECURITY_GROUPS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/securitygroups/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.FLOATING_IPS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/floating_ips/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.KEYPAIRS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/keypairs/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.SIMPLE_TENANT_USAGE)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/os-simple-tenant-usage/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.HOSTS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/hosts/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.VOLUMES)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/volumes/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.VIRTUAL_INTERFACES)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/virtual_interfaces/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.CREATESERVEREXT)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/createserverext/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.ADMIN_ACTIONS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/admin-actions/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.AGGREGATES)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/aggregates/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.FLAVOR_EXTRA_SPECS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/flavor_extra_specs/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.QUOTAS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/quotas-sets/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.VOLUME_TYPES)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/volume_types/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.AVAILABILITY_ZONE)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/availabilityzone/api/v1.1"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.VOLUME_ATTACHMENTS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/os-volume-attachment-update/api/v2"));
+ aliases.addBinding(URI.create(ExtensionNamespaces.ATTACH_INTERFACES)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/interfaces/api/v1.1"));
}
@Provides
@@ -104,7 +104,7 @@ public class NovaHttpApiModule extends HttpApiModule<NovaApi> {
return CacheBuilder.newBuilder().expireAfterWrite(23, TimeUnit.HOURS)
.build(new CacheLoader<String, Set<? extends Extension>>() {
@Override
- public Set<? extends Extension> load(String key) throws Exception {
+ public Set<? extends Extension> load(final String key) throws Exception {
return novaApi.get().getExtensionApi(key).list();
}
});
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApiLiveTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApiLiveTest.java
index 02dd35b..53ddda9 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApiLiveTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApiLiveTest.java
@@ -24,6 +24,7 @@ import java.util.concurrent.TimeoutException;
import org.jclouds.ContextBuilder;
import org.jclouds.openstack.cinder.v1.CinderApi;
+import org.jclouds.openstack.cinder.v1.CinderApiMetadata;
import org.jclouds.openstack.cinder.v1.domain.Volume;
import org.jclouds.openstack.cinder.v1.features.VolumeApi;
import org.jclouds.openstack.cinder.v1.options.CreateVolumeOptions;
@@ -49,6 +50,7 @@ public class VolumeAttachmentApiLiveTest extends BaseNovaApiLiveTest {
private Server server;
protected String volumeProvider;
+ protected String volumeProviderVersion;
protected int volumeSizeGB;
protected String deviceId = "/dev/wtf";
@@ -56,6 +58,8 @@ public class VolumeAttachmentApiLiveTest extends BaseNovaApiLiveTest {
protected Properties setupProperties() {
Properties props = super.setupProperties();
volumeProvider = setIfTestSystemPropertyPresent(props, provider + ".volume-provider", "openstack-cinder");
+ volumeProviderVersion = setIfTestSystemPropertyPresent(props, provider + ".volume-provider-version",
+ new CinderApiMetadata().getVersion());
volumeSizeGB = Integer.parseInt(setIfTestSystemPropertyPresent(props, provider + ".volume-size-gb", "1"));
singleRegion = setIfTestSystemPropertyPresent(props, provider + ".region", "RegionOne");
return props;
@@ -71,6 +75,7 @@ public class VolumeAttachmentApiLiveTest extends BaseNovaApiLiveTest {
if ("openstack-cinder".equals(volumeProvider)) {
cinderApi = ContextBuilder.newBuilder(volumeProvider)
.endpoint(endpoint)
+ .apiVersion(volumeProviderVersion)
.credentials(identity, credential)
.buildApi(CinderApi.class);
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/core/pom.xml
----------------------------------------------------------------------
diff --git a/core/pom.xml b/core/pom.xml
index 1366fd6..10123f6 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -55,12 +55,10 @@
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-assistedinject</artifactId>
- <version>3.0</version>
</dependency>
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
- <version>3.0</version>
</dependency>
<dependency>
<groupId>org.99soft.guice</groupId>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/project/pom.xml
----------------------------------------------------------------------
diff --git a/project/pom.xml b/project/pom.xml
index c10c6b5..04dada7 100644
--- a/project/pom.xml
+++ b/project/pom.xml
@@ -206,6 +206,7 @@
<maven.site.url.base>gitsite:git@github.com/jclouds/jclouds-maven-site.git</maven.site.url.base>
<clojure.version>1.3.0</clojure.version>
<guava.version>16.0.1</guava.version>
+ <guice.version>3.0</guice.version>
<okhttp.version>2.2.0</okhttp.version>
<surefire.version>2.17</surefire.version>
<assertj-core.version>1.7.0</assertj-core.version>
@@ -247,6 +248,21 @@
<version>${guava.version}</version>
</dependency>
<dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-assistedinject</artifactId>
+ <version>${guice.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.inject</groupId>
+ <artifactId>guice</artifactId>
+ <version>${guice.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-multibindings</artifactId>
+ <version>${guice.version}</version>
+ </dependency>
+ <dependency>
<groupId>org.easymock</groupId>
<artifactId>easymockclassextension</artifactId>
<version>3.1</version>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/hpcloud-compute/pom.xml
----------------------------------------------------------------------
diff --git a/providers/hpcloud-compute/pom.xml b/providers/hpcloud-compute/pom.xml
index bdbb8c5..6f49f63 100644
--- a/providers/hpcloud-compute/pom.xml
+++ b/providers/hpcloud-compute/pom.xml
@@ -55,6 +55,11 @@
<artifactId>openstack-nova</artifactId>
<version>${project.version}</version>
</dependency>
+ <!-- for the extension namespaces -->
+ <dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-multibindings</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
@@ -96,6 +101,12 @@
<scope>test</scope>
</dependency>
<dependency>
+ <groupId>org.apache.jclouds.api</groupId>
+ <artifactId>openstack-cinder</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>test</scope>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java
----------------------------------------------------------------------
diff --git a/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java b/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java
index 320fb7e..1f2f1d2 100644
--- a/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java
+++ b/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/HPCloudComputeProviderMetadata.java
@@ -26,13 +26,13 @@ import static org.jclouds.openstack.nova.v2_0.config.NovaProperties.AUTO_GENERAT
import java.net.URI;
import java.util.Properties;
+import org.jclouds.hpcloud.compute.config.HPCloudComputeHttpApiModule;
import org.jclouds.hpcloud.compute.config.HPCloudComputeServiceContextModule;
import org.jclouds.openstack.keystone.v2_0.config.AuthenticationApiModule;
import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.RegionModule;
import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
-import org.jclouds.openstack.nova.v2_0.config.NovaHttpApiModule;
import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.providers.internal.BaseProviderMetadata;
@@ -95,7 +95,7 @@ public class HPCloudComputeProviderMetadata extends BaseProviderMetadata {
.add(KeystoneAuthenticationModule.class)
.add(RegionModule.class)
.add(NovaParserModule.class)
- .add(NovaHttpApiModule.class)
+ .add(HPCloudComputeHttpApiModule.class)
.add(HPCloudComputeServiceContextModule.class).build())
.build())
.homepage(URI.create("http://hpcloud.com"))
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/config/HPCloudComputeHttpApiModule.java
----------------------------------------------------------------------
diff --git a/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/config/HPCloudComputeHttpApiModule.java b/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/config/HPCloudComputeHttpApiModule.java
new file mode 100644
index 0000000..74eec97
--- /dev/null
+++ b/providers/hpcloud-compute/src/main/java/org/jclouds/hpcloud/compute/config/HPCloudComputeHttpApiModule.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.hpcloud.compute.config;
+
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneHttpApiModule.aliasBinder;
+
+import java.net.URI;
+
+import org.jclouds.openstack.nova.v2_0.config.NovaHttpApiModule;
+import org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces;
+import org.jclouds.rest.ConfiguresHttpApi;
+
+import com.google.inject.multibindings.MapBinder;
+
+@ConfiguresHttpApi
+public class HPCloudComputeHttpApiModule extends NovaHttpApiModule {
+
+ @Override
+ protected void configure() {
+ super.configure();
+ MapBinder<URI, URI> aliases = aliasBinder(binder());
+ aliases.addBinding(URI.create(ExtensionNamespaces.VOLUME_ATTACHMENTS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/volumes/api/v1.1"));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/extensions/HPCloudComputeVolumeAttachmentExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/extensions/HPCloudComputeVolumeAttachmentExtensionLiveTest.java b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/extensions/HPCloudComputeVolumeAttachmentExtensionLiveTest.java
new file mode 100644
index 0000000..bb3a77e
--- /dev/null
+++ b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/extensions/HPCloudComputeVolumeAttachmentExtensionLiveTest.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.hpcloud.compute.extensions;
+
+import java.util.Properties;
+
+import org.jclouds.hpcloud.compute.HPCloudComputeProviderMetadata;
+import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
+import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
+import org.jclouds.openstack.nova.v2_0.extensions.VolumeAttachmentApiLiveTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", testName = "HPCloudComputeVolumeAttachmentExtensionLiveTest", singleThreaded = true)
+public class HPCloudComputeVolumeAttachmentExtensionLiveTest extends VolumeAttachmentApiLiveTest {
+
+ public HPCloudComputeVolumeAttachmentExtensionLiveTest() {
+ HPCloudComputeProviderMetadata metadata = new HPCloudComputeProviderMetadata();
+ provider = metadata.getId();
+ System.setProperty("test." + provider + ".endpoint", metadata.getEndpoint());
+ System.setProperty(KeystoneProperties.CREDENTIAL_TYPE, CredentialTypes.API_ACCESS_KEY_CREDENTIALS);
+ }
+
+ @Override
+ protected Properties setupProperties() {
+ Properties props = super.setupProperties();
+ volumeProviderVersion = setIfTestSystemPropertyPresent(props, provider + ".volume-provider-version", "1.0");
+ singleRegion = setIfTestSystemPropertyPresent(props, provider + ".region", "region-a.geo-1");
+ return props;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/rackspace-cloudservers-uk/pom.xml
----------------------------------------------------------------------
diff --git a/providers/rackspace-cloudservers-uk/pom.xml b/providers/rackspace-cloudservers-uk/pom.xml
index c65a5be..6f4d2ac 100644
--- a/providers/rackspace-cloudservers-uk/pom.xml
+++ b/providers/rackspace-cloudservers-uk/pom.xml
@@ -53,6 +53,11 @@
<artifactId>openstack-nova</artifactId>
<version>${project.version}</version>
</dependency>
+ <!-- for the extension namespaces -->
+ <dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-multibindings</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
@@ -110,6 +115,12 @@
<artifactId>auto-service</artifactId>
<optional>true</optional>
</dependency>
+ <dependency>
+ <groupId>org.apache.jclouds.provider</groupId>
+ <artifactId>rackspace-cloudblockstorage-uk</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<profiles>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java
----------------------------------------------------------------------
diff --git a/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java b/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java
index 25cc4dc..df61efc 100644
--- a/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java
+++ b/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/CloudServersUKProviderMetadata.java
@@ -27,7 +27,6 @@ import java.util.Properties;
import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.RegionModule;
import org.jclouds.openstack.nova.v2_0.NovaApiMetadata;
-import org.jclouds.openstack.nova.v2_0.config.NovaHttpApiModule;
import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.providers.internal.BaseProviderMetadata;
@@ -35,6 +34,7 @@ import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityAuthenticati
import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityAuthenticationModule;
import org.jclouds.rackspace.cloudidentity.v2_0.config.CloudIdentityCredentialTypes;
import org.jclouds.rackspace.cloudservers.uk.config.CloudServersUKComputeServiceContextModule;
+import org.jclouds.rackspace.cloudservers.uk.config.CloudServersUKHttpApiModule;
import com.google.auto.service.AutoService;
import com.google.common.collect.ImmutableSet;
@@ -89,7 +89,7 @@ public class CloudServersUKProviderMetadata extends BaseProviderMetadata {
.add(CloudIdentityAuthenticationModule.class)
.add(RegionModule.class)
.add(NovaParserModule.class)
- .add(NovaHttpApiModule.class)
+ .add(CloudServersUKHttpApiModule.class)
.add(CloudServersUKComputeServiceContextModule.class).build())
.build())
.homepage(URI.create("http://www.rackspace.co.uk/opencloud"))
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/config/CloudServersUKHttpApiModule.java
----------------------------------------------------------------------
diff --git a/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/config/CloudServersUKHttpApiModule.java b/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/config/CloudServersUKHttpApiModule.java
new file mode 100644
index 0000000..adfdb32
--- /dev/null
+++ b/providers/rackspace-cloudservers-uk/src/main/java/org/jclouds/rackspace/cloudservers/uk/config/CloudServersUKHttpApiModule.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.rackspace.cloudservers.uk.config;
+
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneHttpApiModule.aliasBinder;
+
+import java.net.URI;
+
+import org.jclouds.openstack.nova.v2_0.config.NovaHttpApiModule;
+import org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces;
+import org.jclouds.rest.ConfiguresHttpApi;
+
+import com.google.inject.multibindings.MapBinder;
+
+/**
+ * Configures the Rackspace connection.
+ */
+@ConfiguresHttpApi
+public class CloudServersUKHttpApiModule extends NovaHttpApiModule {
+
+ @Override
+ protected void configure() {
+ super.configure();
+ MapBinder<URI, URI> aliases = aliasBinder(binder());
+ aliases.addBinding(URI.create(ExtensionNamespaces.VOLUME_ATTACHMENTS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/volumes/api/v1.1"));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/extensions/CloudServersUKVolumeAttachmentExtensionLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/extensions/CloudServersUKVolumeAttachmentExtensionLiveTest.java b/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/extensions/CloudServersUKVolumeAttachmentExtensionLiveTest.java
new file mode 100644
index 0000000..7ba84c6
--- /dev/null
+++ b/providers/rackspace-cloudservers-uk/src/test/java/org/jclouds/rackspace/cloudservers/uk/compute/extensions/CloudServersUKVolumeAttachmentExtensionLiveTest.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.rackspace.cloudservers.uk.compute.extensions;
+
+import java.util.Properties;
+
+import org.jclouds.openstack.nova.v2_0.extensions.VolumeAttachmentApiLiveTest;
+import org.testng.annotations.Test;
+
+@Test(groups = "live", singleThreaded = true, testName = "CloudServersUKVolumeAttachmentExtensionLiveTest")
+public class CloudServersUKVolumeAttachmentExtensionLiveTest extends VolumeAttachmentApiLiveTest {
+
+ public CloudServersUKVolumeAttachmentExtensionLiveTest() {
+ provider = "rackspace-cloudservers-uk";
+ // Specifying a device currently does not work for rackspace and causes issues
+ deviceId = "";
+ }
+
+ @Override
+ protected Properties setupProperties() {
+ Properties props = super.setupProperties();
+ volumeProvider = "rackspace-cloudblockstorage-uk";
+ volumeSizeGB = 80;
+ singleRegion = "LON";
+ return props;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/rackspace-cloudservers-us/pom.xml
----------------------------------------------------------------------
diff --git a/providers/rackspace-cloudservers-us/pom.xml b/providers/rackspace-cloudservers-us/pom.xml
index a7de793..bf7af04 100644
--- a/providers/rackspace-cloudservers-us/pom.xml
+++ b/providers/rackspace-cloudservers-us/pom.xml
@@ -53,6 +53,11 @@
<artifactId>openstack-nova</artifactId>
<version>${project.version}</version>
</dependency>
+ <!-- for the extension namespaces -->
+ <dependency>
+ <groupId>com.google.inject.extensions</groupId>
+ <artifactId>guice-multibindings</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.jclouds</groupId>
<artifactId>jclouds-core</artifactId>
http://git-wip-us.apache.org/repos/asf/jclouds/blob/4db2b75a/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/config/CloudServersUSHttpApiModule.java
----------------------------------------------------------------------
diff --git a/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/config/CloudServersUSHttpApiModule.java b/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/config/CloudServersUSHttpApiModule.java
index 382aced..723ccc3 100644
--- a/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/config/CloudServersUSHttpApiModule.java
+++ b/providers/rackspace-cloudservers-us/src/main/java/org/jclouds/rackspace/cloudservers/us/config/CloudServersUSHttpApiModule.java
@@ -16,109 +16,29 @@
*/
package org.jclouds.rackspace.cloudservers.us.config;
-import java.net.URI;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneHttpApiModule.aliasBinder;
-import javax.inject.Provider;
-import javax.inject.Singleton;
+import java.net.URI;
-import org.jclouds.http.HttpErrorHandler;
-import org.jclouds.http.annotation.ClientError;
-import org.jclouds.http.annotation.Redirection;
-import org.jclouds.http.annotation.ServerError;
-import org.jclouds.openstack.nova.v2_0.NovaApi;
+import org.jclouds.openstack.nova.v2_0.config.NovaHttpApiModule;
import org.jclouds.openstack.nova.v2_0.extensions.ExtensionNamespaces;
-import org.jclouds.openstack.nova.v2_0.handlers.NovaErrorHandler;
-import org.jclouds.openstack.v2_0.domain.Extension;
-import org.jclouds.openstack.v2_0.functions.PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet;
import org.jclouds.rest.ConfiguresHttpApi;
-import org.jclouds.rest.config.HttpApiModule;
-import org.jclouds.rest.functions.ImplicitOptionalConverter;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Multimap;
-import com.google.inject.Provides;
+import com.google.inject.multibindings.MapBinder;
/**
* Configures the Rackspace connection.
*
*/
@ConfiguresHttpApi
-public class CloudServersUSHttpApiModule extends HttpApiModule<NovaApi> {
-
- public CloudServersUSHttpApiModule() {
- }
+public class CloudServersUSHttpApiModule extends NovaHttpApiModule {
@Override
protected void configure() {
- bind(ImplicitOptionalConverter.class).to(PresentWhenExtensionAnnotationNamespaceEqualsAnyNamespaceInExtensionsSet.class);
super.configure();
+ MapBinder<URI, URI> aliases = aliasBinder(binder());
+ aliases.addBinding(URI.create(ExtensionNamespaces.VOLUME_ATTACHMENTS)).toInstance(
+ URI.create("http://docs.openstack.org/compute/ext/volumes/api/v1.1"));
}
- @Provides
- @Singleton
- public Multimap<URI, URI> aliases() {
- return ImmutableMultimap.<URI, URI>builder()
- .put(URI.create(ExtensionNamespaces.SECURITY_GROUPS),
- URI.create("http://docs.openstack.org/compute/ext/securitygroups/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.FLOATING_IPS),
- URI.create("http://docs.openstack.org/compute/ext/floating_ips/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.KEYPAIRS),
- URI.create("http://docs.openstack.org/compute/ext/keypairs/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.SIMPLE_TENANT_USAGE),
- URI.create("http://docs.openstack.org/compute/ext/os-simple-tenant-usage/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.HOSTS),
- URI.create("http://docs.openstack.org/compute/ext/hosts/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.VOLUMES),
- URI.create("http://docs.openstack.org/compute/ext/volumes/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.VIRTUAL_INTERFACES),
- URI.create("http://docs.openstack.org/compute/ext/virtual_interfaces/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.CREATESERVEREXT),
- URI.create("http://docs.openstack.org/compute/ext/createserverext/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.ADMIN_ACTIONS),
- URI.create("http://docs.openstack.org/compute/ext/admin-actions/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.AGGREGATES),
- URI.create("http://docs.openstack.org/compute/ext/aggregates/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.FLAVOR_EXTRA_SPECS),
- URI.create("http://docs.openstack.org/compute/ext/flavor_extra_specs/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.QUOTAS),
- URI.create("http://docs.openstack.org/compute/ext/quotas-sets/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.VOLUME_TYPES),
- URI.create("http://docs.openstack.org/compute/ext/volume_types/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.AVAILABILITY_ZONE),
- URI.create("http://docs.openstack.org/compute/ext/availabilityzone/api/v1.1"))
- /**
- * Only change - this is to ensure that for rackspace, the extension detection for
- * VOLUME_ATTACHMENTS is based on discovering this namespace (VOLUMES).
- */
- .put(URI.create(ExtensionNamespaces.VOLUME_ATTACHMENTS),
- //URI.create("http://docs.openstack.org/compute/ext/os-volume-attachment-update/api/v2"))
- URI.create("http://docs.openstack.org/compute/ext/volumes/api/v1.1"))
- .put(URI.create(ExtensionNamespaces.ATTACH_INTERFACES),
- URI.create("http://docs.openstack.org/compute/ext/interfaces/api/v1.1"))
- .build();
- }
-
- @Provides
- @Singleton
- public LoadingCache<String, Set<? extends Extension>> provideExtensionsByRegion(final Provider<NovaApi> novaApi) {
- return CacheBuilder.newBuilder().expireAfterWrite(23, TimeUnit.HOURS)
- .build(new CacheLoader<String, Set<? extends Extension>>() {
- @Override
- public Set<? extends Extension> load(String key) throws Exception {
- return novaApi.get().getExtensionApi(key).list();
- }
- });
- }
-
- @Override
- protected void bindErrorHandlers() {
- bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(NovaErrorHandler.class);
- bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(NovaErrorHandler.class);
- bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(NovaErrorHandler.class);
- }
}
[2/2] jclouds git commit: Fix HPCloudComputeTemplateBuilderLiveTest
Posted by na...@apache.org.
Fix HPCloudComputeTemplateBuilderLiveTest
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/fcb7dfcb
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/fcb7dfcb
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/fcb7dfcb
Branch: refs/heads/master
Commit: fcb7dfcb819ea7f0cf31b01bbdb4e131d918d085
Parents: 4db2b75
Author: Ignasi Barrera <na...@apache.org>
Authored: Tue Mar 24 00:40:43 2015 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Tue Mar 24 00:40:43 2015 +0100
----------------------------------------------------------------------
.../compute/compute/HPCloudComputeTemplateBuilderLiveTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/fcb7dfcb/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java
----------------------------------------------------------------------
diff --git a/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java
index 3c539e0..19cf05e 100644
--- a/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java
+++ b/providers/hpcloud-compute/src/test/java/org/jclouds/hpcloud/compute/compute/HPCloudComputeTemplateBuilderLiveTest.java
@@ -41,9 +41,9 @@ public class HPCloudComputeTemplateBuilderLiveTest extends BaseTemplateBuilderLi
public void testTemplateBuilder() {
Template defaultTemplate = this.view.getComputeService().templateBuilder().build();
assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
- assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "12.04");
+ assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "14.04");
assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
- assertTrue(defaultTemplate.getImage().getName().startsWith("Ubuntu Server 12.04"));
+ assertTrue(defaultTemplate.getImage().getName().startsWith("Ubuntu Server 14.04"));
assertEquals(defaultTemplate.getImage().getDefaultCredentials().getUser(), "ubuntu");
assertEquals(defaultTemplate.getLocation().getId(), "region-a.geo-1");
assertEquals(defaultTemplate.getImage().getLocation().getId(), "region-a.geo-1");