enum is not a sustainable way to refer to address blocks
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/functions/ServerInZoneToNodeMetadata.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/functions/ServerInZoneToNodeMetadata.java
index 2157cf7..591574e 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/functions/ServerInZoneToNodeMetadata.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/compute/functions/ServerInZoneToNodeMetadata.java
@@ -20,7 +20,6 @@
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.filter;
import static com.google.common.collect.Iterables.find;
import static com.google.common.collect.Iterables.transform;
@@ -51,9 +50,11 @@
import org.jclouds.openstack.nova.v1_1.domain.Server;
import org.jclouds.openstack.nova.v1_1.domain.zonescoped.ServerInZone;
import org.jclouds.openstack.nova.v1_1.domain.zonescoped.ZoneAndId;
+import org.jclouds.util.InetAddresses2;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
import com.google.common.base.Supplier;
import com.google.common.net.InetAddresses;
@@ -103,14 +104,20 @@
builder.hardware(findHardwareForServerOrNull(serverInZone));
builder.state(from.getStatus().getNodeState());
builder.publicAddresses(filter(
- transform(concat(from.getPublicAddresses(), from.getInternetAddresses()),
+ transform(filter(from.getAddresses().values(), Predicates.not(isPrivateAddress)),
AddressToStringTransformationFunction.INSTANCE), isInet4Address));
builder.privateAddresses(filter(
- transform(from.getPrivateAddresses(), AddressToStringTransformationFunction.INSTANCE), isInet4Address));
+ transform(filter(from.getAddresses().values(), isPrivateAddress), AddressToStringTransformationFunction.INSTANCE), isInet4Address));
return builder.build();
}
-
+
+ private static final Predicate<Address> isPrivateAddress = new Predicate<Address>() {
+ public boolean apply(Address in) {
+ return InetAddresses2.IsPrivateIPAddress.INSTANCE.apply(in.getAddr());
+ }
+ };
+
public static final Predicate<String> isInet4Address = new Predicate<String>() {
@Override
public boolean apply(String input) {
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Address.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Address.java
index 3053ccf..7faa0b4 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Address.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Address.java
@@ -30,42 +30,7 @@
* @author AdrianCole
*/
public class Address {
-
- /**
- * Relations associated with resources.
- */
- public static enum Type {
- /**
- * internet routable address
- */
- INTERNET,
- /**
- * publically routable address
- */
- PUBLIC,
- /**
- * address that is not publicly routable.
- */
- PRIVATE,
- /**
- * the value returned by the OpenStack service was not recognized.
- */
- UNRECOGNIZED;
-
- public String value() {
- return name().toLowerCase();
- }
-
- public static Type fromValue(String v) {
- try {
- return valueOf(v.toUpperCase());
- } catch (IllegalArgumentException e) {
- return UNRECOGNIZED;
- }
- }
-
- }
-
+
public static Builder builder() {
return new Builder();
}
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Server.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Server.java
index 9850663..576d2a3 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Server.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v1_1/domain/Server.java
@@ -20,7 +20,6 @@
import static com.google.common.base.Preconditions.checkNotNull;
-import java.util.Collection;
import java.util.Date;
import java.util.Map;
import java.util.Set;
@@ -29,20 +28,14 @@
import org.jclouds.javax.annotation.Nullable;
import org.jclouds.openstack.domain.Link;
import org.jclouds.openstack.domain.Resource;
-import org.jclouds.openstack.nova.v1_1.domain.Address.Type;
import org.jclouds.openstack.nova.v1_1.extensions.KeyPairClient;
-import org.jclouds.util.InetAddresses2;
import org.jclouds.util.Multimaps2;
-import com.google.common.base.Predicate;
+import com.google.common.base.Objects.ToStringHelper;
import com.google.common.base.Predicates;
import com.google.common.base.Strings;
-import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.ImmutableSetMultimap;
-import com.google.common.collect.Iterables;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
@@ -122,7 +115,7 @@
private Resource flavor;
private Map<String, String> metadata = Maps.newHashMap();
// TODO: get gson multimap ad
- private Multimap<Address.Type, Address> addresses = LinkedHashMultimap.create();
+ private Multimap<String, Address> addresses = LinkedHashMultimap.create();
private String adminPass;
private String keyName;
@@ -233,60 +226,12 @@
/**
* @see Server#getAddresses()
*/
- public Builder addresses(Multimap<Address.Type, Address> addresses) {
+ public Builder addresses(Multimap<String, Address> addresses) {
this.addresses = ImmutableMultimap.copyOf(checkNotNull(addresses, "addresses"));
return this;
}
-
- /**
- * @see Server#getPrivateAddresses()
- */
- public Builder privateAddresses(Address... privateAddresses) {
- return privateAddresses(ImmutableSet.copyOf(checkNotNull(privateAddresses, "privateAddresses")));
- }
-
- /**
- * @see Server#getPrivateAddresses()
- */
- public Builder privateAddresses(Set<Address> privateAddresses) {
- this.addresses.replaceValues(Address.Type.PRIVATE, ImmutableSet.copyOf(checkNotNull(privateAddresses,
- "privateAddresses")));
- return this;
- }
/**
- * @see Server#getInternetAddresses()
- */
- public Builder internetAddresses(Address... internetAddresses) {
- return internetAddresses(ImmutableSet.copyOf(checkNotNull(internetAddresses, "internetAddresses")));
- }
-
- /**
- * @see Server#getInternetAddresses()
- */
- public Builder internetAddresses(Set<Address> internetAddresses) {
- this.addresses.replaceValues(Address.Type.INTERNET, ImmutableSet.copyOf(checkNotNull(internetAddresses,
- "internetAddresses")));
- return this;
- }
-
- /**
- * @see Server#getPublicAddresses()
- */
- public Builder publicAddresses(Address... publicAddresses) {
- return publicAddresses(ImmutableSet.copyOf(checkNotNull(publicAddresses, "publicAddresses")));
- }
-
- /**
- * @see Server#getPublicAddresses()
- */
- public Builder publicAddresses(Set<Address> publicAddresses) {
- this.addresses.replaceValues(Address.Type.PUBLIC, ImmutableSet.copyOf(checkNotNull(publicAddresses,
- "publicAddresses")));
- return this;
- }
-
- /**
* @see Server#getAdminPass()
*/
public Builder adminPass(String adminPass) {
@@ -376,13 +321,13 @@
@SerializedName("config_drive")
protected final String configDrive;
// TODO: get gson multimap adapter!
- protected final Map<Address.Type, Set<Address>> addresses;
+ protected final Map<String, Set<Address>> addresses;
protected final Map<String, String> metadata;
protected Server(String id, String name, Set<Link> links, @Nullable String uuid, String tenantId, String userId,
Date updated, Date created, @Nullable String hostId, @Nullable String accessIPv4,
@Nullable String accessIPv6, Status status, @Nullable String configDrive, Resource image, Resource flavor,
- String adminPass, @Nullable String keyName, Multimap<Address.Type, Address> addresses,
+ String adminPass, @Nullable String keyName, Multimap<String, Address> addresses,
Map<String, String> metadata) {
super(id, name, links);
this.uuid = uuid; // TODO: see what version this came up in
@@ -471,74 +416,10 @@
}
/**
- * @return the private ip addresses assigned to the server
- */
- public Set<Address> getPrivateAddresses() {
- Collection<Address> privateAddresses = getAddresses().get(Address.Type.PRIVATE);
- if (privateAddresses == null) {
- return ImmutableSet.<Address> of();
- } else {
- return ImmutableSet.copyOf(privateAddresses);
- }
- }
-
- /**
- * @return the internet ip addresses assigned to the server
- * @since essex
- */
- public Set<Address> getInternetAddresses() {
- Collection<Address> internetAddrs = getAddresses().get(Address.Type.INTERNET);
- if (internetAddrs == null) {
- return ImmutableSet.<Address> of();
- } else {
- return ImmutableSet.copyOf(internetAddrs);
- }
- }
-
- /**
- * @return the public ip addresses assigned to the server
- */
- public Set<Address> getPublicAddresses() {
- Collection<Address> publicAddrs = getAddresses().get(Address.Type.PUBLIC);
- if (publicAddrs == null) {
- return ImmutableSet.<Address> of();
- } else {
- return ImmutableSet.copyOf(publicAddrs);
- }
- }
-
- /**
* @return the ip addresses assigned to the server
*/
- public Multimap<Type, Address> getAddresses() {
-
- Set<Address> privateAddresses = addresses.get(Address.Type.PRIVATE);
-
- if (privateAddresses != null && privateAddresses.size() > 1) {
- return hackNeededForFloatingIpsFixedInEssex(privateAddresses);
- } else {
- return Multimaps2.fromOldSchool(addresses);
- }
-
- }
-
- private Multimap<Type, Address> hackNeededForFloatingIpsFixedInEssex(Set<Address> privateAddresses) {
- Set<Address> publicAddresses = addresses.get(Address.Type.PUBLIC);
- ImmutableSetMultimap.Builder<Type, Address> returnMapBuilder = new ImmutableSetMultimap.Builder<Type, Address>();
- if (publicAddresses != null) {
- returnMapBuilder.putAll(Address.Type.PUBLIC, publicAddresses);
- }
- returnMapBuilder.putAll(Address.Type.PRIVATE, Iterables.filter(privateAddresses, IsPrivateAddress.INSTANCE));
- returnMapBuilder.putAll(Address.Type.PUBLIC, Iterables.filter(privateAddresses, Predicates
- .not(IsPrivateAddress.INSTANCE)));
- return returnMapBuilder.build();
- }
-
- private static enum IsPrivateAddress implements Predicate<Address> {
- INSTANCE;
- public boolean apply(Address in) {
- return InetAddresses2.IsPrivateIPAddress.INSTANCE.apply(in.getAddr());
- }
+ public Multimap<String, Address> getAddresses() {
+ return Multimaps2.fromOldSchool(addresses);
}
/**
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/extensions/FloatingIPClientLiveTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/extensions/FloatingIPClientLiveTest.java
index 1db2604..b3262d3 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/extensions/FloatingIPClientLiveTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/extensions/FloatingIPClientLiveTest.java
@@ -181,7 +181,7 @@
try {
Server server = client.getServer(serverId);
boolean ipInServerAddresses = false;
- Multimap<Address.Type, Address> addresses = server.getAddresses();
+ Multimap<String, Address> addresses = server.getAddresses();
for (Address address : addresses.values()) {
if (address.getAddr().equals(floatingIP)) {
ipInServerAddresses = true;
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/internal/BaseNovaComputeServiceContextExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/internal/BaseNovaComputeServiceContextExpectTest.java
index f7e3681..9105e3a 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/internal/BaseNovaComputeServiceContextExpectTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/internal/BaseNovaComputeServiceContextExpectTest.java
@@ -18,22 +18,17 @@
*/
package org.jclouds.openstack.nova.v1_1.internal;
-import java.io.InputStream;
import java.net.URI;
import java.util.Properties;
-import java.util.concurrent.ConcurrentHashMap;
import org.jclouds.apis.ApiMetadata;
import org.jclouds.compute.ComputeServiceContext;
import org.jclouds.http.HttpRequest;
import org.jclouds.http.HttpResponse;
-import org.jclouds.io.CopyInputStreamInputSupplierMap;
import org.jclouds.openstack.nova.v1_1.NovaApiMetadata;
-import org.jclouds.rest.config.CredentialStoreModule;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableMultimap;
-import com.google.common.io.InputSupplier;
import com.google.inject.Module;
/**
@@ -91,12 +86,4 @@
return new NovaApiMetadata();
}
- // isolate tests from eachother, as default credentialStore is static
- protected Module credentialStoreModule = new CredentialStoreModule(new CopyInputStreamInputSupplierMap(
- new ConcurrentHashMap<String, InputSupplier<InputStream>>()));
-
- @Override
- protected Module createModule() {
- return credentialStoreModule;
- }
}
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerDetailsEssexTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerDetailsEssexTest.java
new file mode 100644
index 0000000..a4e7f51
--- /dev/null
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerDetailsEssexTest.java
@@ -0,0 +1,164 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing)
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.openstack.nova.v1_1.parse;
+
+import java.net.URI;
+import java.util.Set;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.json.BaseSetParserTest;
+import org.jclouds.json.config.GsonModule;
+import org.jclouds.openstack.domain.Link;
+import org.jclouds.openstack.domain.Link.Relation;
+import org.jclouds.openstack.domain.Resource;
+import org.jclouds.openstack.nova.v1_1.config.NovaParserModule;
+import org.jclouds.openstack.nova.v1_1.domain.Address;
+import org.jclouds.openstack.nova.v1_1.domain.Server;
+import org.jclouds.rest.annotations.SelectJson;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "unit", testName = "ParseServerDetailsEssexTest")
+public class ParseServerDetailsEssexTest extends BaseSetParserTest<Server> {
+
+ @Override
+ public String resource() {
+ return "/server_list_details_essex.json";
+ }
+
+ @Override
+ @SelectJson("servers")
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Set<Server> expected() {
+ return ImmutableSet.<Server>of(
+ Server.builder()
+ .addresses(ImmutableMultimap.<String, Address>builder()
+ .putAll("Net TenantA Front-Middle", Address.createV4("172.16.11.5"))
+ .putAll("Public network", Address.createV4("172.16.1.13"), Address.createV4("10.193.112.119")).build())
+ .links(
+ Link.create(
+ Relation.SELF,
+ URI.create("http://nova:8774/v1.1/8d10e6646d5d4585937395b04839a353/servers/0c80b392-db30-4736-ae02-4480090f1207")),
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/servers/0c80b392-db30-4736-ae02-4480090f1207")))
+ .image(
+ Resource.builder()
+ .id("416af940-2d3c-4a7c-977c-a9030685ad5e")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/images/416af940-2d3c-4a7c-977c-a9030685ad5e"))).build())
+ .flavor(
+ Resource.builder()
+ .id("1")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/flavors/1"))).build())
+ .id("0c80b392-db30-4736-ae02-4480090f1207")
+ .userId("df13814f6c354d00a8acf66502836323")
+ .status(Server.Status.ACTIVE)
+ .updated(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-04-12T11:21:33Z"))
+ .hostId("03d796ebb52b1b555e5f6d9262f7dbd52b3f7c181e3aa89b34ca5408")
+ .name("VM proxy")
+ .created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-04-12T11:21:23Z"))
+ .tenantId("8d10e6646d5d4585937395b04839a353").build(),
+ Server.builder()
+ .addresses(ImmutableMultimap.<String, Address>builder()
+ .putAll("Net TenantA Front-Middle", Address.createV4("172.16.11.4"))
+ .putAll("Net TenantA Middle-Back", Address.createV4("172.16.12.5")).build())
+ .links(
+ Link.create(
+ Relation.SELF,
+ URI.create("http://nova:8774/v1.1/8d10e6646d5d4585937395b04839a353/servers/b332b5cd-535e-4677-b68e-fc8badc13236")),
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/servers/b332b5cd-535e-4677-b68e-fc8badc13236")))
+ .image(
+ Resource.builder()
+ .id("416af940-2d3c-4a7c-977c-a9030685ad5e")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/images/416af940-2d3c-4a7c-977c-a9030685ad5e"))).build())
+ .flavor(
+ Resource.builder()
+ .id("1")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/flavors/1"))).build())
+ .id("b332b5cd-535e-4677-b68e-fc8badc13236")
+ .userId("df13814f6c354d00a8acf66502836323")
+ .status(Server.Status.ACTIVE)
+ .updated(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-04-12T11:18:58Z"))
+ .hostId("e5bbff80bebacfe1db63951e787b5341427060a602d33abfefb6a1bc")
+ .name("VM blog")
+ .created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-04-12T11:18:48Z"))
+ .tenantId("8d10e6646d5d4585937395b04839a353").build(),
+ Server.builder()
+ .addresses(ImmutableMultimap.<String, Address>builder()
+ .putAll("Net TenantA Middle-Back", Address.createV4("172.16.12.4")).build())
+ .links(
+ Link.create(
+ Relation.SELF,
+ URI.create("http://nova:8774/v1.1/8d10e6646d5d4585937395b04839a353/servers/f9d43436-4572-4c9b-9b74-5fa6890a2f21")),
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/servers/f9d43436-4572-4c9b-9b74-5fa6890a2f21")))
+ .image(
+ Resource.builder()
+ .id("416af940-2d3c-4a7c-977c-a9030685ad5e")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/images/416af940-2d3c-4a7c-977c-a9030685ad5e"))).build())
+ .flavor(
+ Resource.builder()
+ .id("1")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://nova:8774/8d10e6646d5d4585937395b04839a353/flavors/1"))).build())
+ .id("f9d43436-4572-4c9b-9b74-5fa6890a2f21")
+ .userId("df13814f6c354d00a8acf66502836323")
+ .status(Server.Status.ACTIVE)
+ .updated(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-04-12T11:15:09Z"))
+ .hostId("03d796ebb52b1b555e5f6d9262f7dbd52b3f7c181e3aa89b34ca5408")
+ .name("VM MySQL")
+ .created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2012-04-12T11:14:56Z"))
+ .tenantId("8d10e6646d5d4585937395b04839a353").build());
+ }
+
+
+ protected Injector injector() {
+ return Guice.createInjector(new NovaParserModule(), new GsonModule());
+ }
+}
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerTest.java
index f249f3b..7e54bd0 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerTest.java
@@ -37,6 +37,7 @@
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
import com.google.inject.Guice;
import com.google.inject.Injector;
@@ -96,9 +97,11 @@
.metadata(
new ImmutableMap.Builder<String, String>().put("Server Label", "Web Head 1")
.put("Image Version", "2.1").build())
- .publicAddresses(Address.createV4("67.23.10.132"), Address.createV6("::babe:67.23.10.132"),
+ .addresses(ImmutableMultimap.<String, Address>builder()
+ .putAll("public", Address.createV4("67.23.10.132"), Address.createV6("::babe:67.23.10.132"),
Address.createV4("67.23.10.131"), Address.createV6("::babe:4317:0A83"))
- .privateAddresses(Address.createV4("10.176.42.16"), Address.createV6("::babe:10.176.42.16")).build();
+ .putAll("private", Address.createV4("10.176.42.16"), Address.createV6("::babe:10.176.42.16"))
+ .build()).build();
}
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerWithInternetAddressesTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerWithInternetAddressesTest.java
index b5272f2..15a0dae 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerWithInternetAddressesTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/ParseServerWithInternetAddressesTest.java
@@ -36,6 +36,7 @@
import org.jclouds.rest.annotations.SelectJson;
import org.testng.annotations.Test;
+import com.google.common.collect.ImmutableMultimap;
import com.google.inject.Guice;
import com.google.inject.Injector;
@@ -90,7 +91,7 @@
Link.create(
Relation.BOOKMARK,
URI.create("https://nova-api.trystack.org:9774/37/servers/1459")))
- .internetAddresses(Address.createV4("8.21.28.47")).build();
+ .addresses(ImmutableMultimap.of("internet", Address.createV4("8.21.28.47"))).build();
}
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/PublicIpsInPrivateAddressBlockShouldRerouteToPublicBlockExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/PublicIpsInPrivateAddressBlockExpectTest.java
similarity index 92%
rename from apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/PublicIpsInPrivateAddressBlockShouldRerouteToPublicBlockExpectTest.java
rename to apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/PublicIpsInPrivateAddressBlockExpectTest.java
index 7df750e..1d25130 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/PublicIpsInPrivateAddressBlockShouldRerouteToPublicBlockExpectTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v1_1/parse/PublicIpsInPrivateAddressBlockExpectTest.java
@@ -37,6 +37,7 @@
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
import com.google.inject.Guice;
import com.google.inject.Injector;
@@ -44,7 +45,7 @@
* @author Adrian Cole
*/
@Test(groups = "unit", testName = "ParseCreatedServerTest")
-public class PublicIpsInPrivateAddressBlockShouldRerouteToPublicBlockExpectTest extends BaseItemParserTest<Server> {
+public class PublicIpsInPrivateAddressBlockExpectTest extends BaseItemParserTest<Server> {
@Override
public String resource() {
@@ -86,8 +87,8 @@
URI.create("https://az-2.region-a.geo-1.compute.hpcloudsvc.com/37936628937291/flavors/100")))
.build())
.metadata(ImmutableMap.of("Name", "hpcloud-computes"))
- .privateAddresses(Address.createV4("10.6.39.189"))
- .publicAddresses(Address.createV4("15.185.181.94"))
+ .addresses(ImmutableMultimap.<String, Address>builder()
+ .putAll("private", Address.createV4("10.6.39.189"), Address.createV4("15.185.181.94")).build())
.links(
Link.create(Relation.SELF, URI.create("https://az-2.region-a.geo-1.compute.hpcloudsvc.com/v1.1/37936628937291/servers/59662")),
Link.create(Relation.BOOKMARK, URI.create("https://az-2.region-a.geo-1.compute.hpcloudsvc.com/37936628937291/servers/59662"))).build();
diff --git a/apis/openstack-nova/src/test/resources/server_list_details_essex.json b/apis/openstack-nova/src/test/resources/server_list_details_essex.json
new file mode 100644
index 0000000..9ca9445
--- /dev/null
+++ b/apis/openstack-nova/src/test/resources/server_list_details_essex.json
@@ -0,0 +1,152 @@
+{
+ "servers": [{
+ "OS-EXT-STS:task_state": null,
+ "addresses": {
+ "Net TenantA Front-Middle": [{
+ "version": 4,
+ "addr": "172.16.11.5"
+ }],
+ "Public network": [{
+ "version": 4,
+ "addr": "172.16.1.13"
+ }, {
+ "version": 4,
+ "addr": "10.193.112.119"
+ }]
+ },
+ "links": [{
+ "href": "http://nova:8774/v1.1/8d10e6646d5d4585937395b04839a353/servers/0c80b392-db30-4736-ae02-4480090f1207",
+ "rel": "self"
+ }, {
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/servers/0c80b392-db30-4736-ae02-4480090f1207",
+ "rel": "bookmark"
+ }],
+ "image": {
+ "id": "416af940-2d3c-4a7c-977c-a9030685ad5e",
+ "links": [{
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/images/416af940-2d3c-4a7c-977c-a9030685ad5e",
+ "rel": "bookmark"
+ }]
+ },
+ "OS-EXT-STS:vm_state": "active",
+ "flavor": {
+ "id": "1",
+ "links": [{
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/flavors/1",
+ "rel": "bookmark"
+ }]
+ },
+ "id": "0c80b392-db30-4736-ae02-4480090f1207",
+ "user_id": "df13814f6c354d00a8acf66502836323",
+ "OS-DCF:diskConfig": "MANUAL",
+ "accessIPv4": "",
+ "accessIPv6": "",
+ "progress": 0,
+ "OS-EXT-STS:power_state": 1,
+ "config_drive": "",
+ "status": "ACTIVE",
+ "updated": "2012-04-12T11:21:33Z",
+ "hostId": "03d796ebb52b1b555e5f6d9262f7dbd52b3f7c181e3aa89b34ca5408",
+ "key_name": "",
+ "name": "VM proxy",
+ "created": "2012-04-12T11:21:23Z",
+ "tenant_id": "8d10e6646d5d4585937395b04839a353",
+ "metadata": {}
+ }, {
+ "OS-EXT-STS:task_state": null,
+ "addresses": {
+ "Net TenantA Front-Middle": [{
+ "version": 4,
+ "addr": "172.16.11.4"
+ }],
+ "Net TenantA Middle-Back": [{
+ "version": 4,
+ "addr": "172.16.12.5"
+ }]
+ },
+ "links": [{
+ "href": "http://nova:8774/v1.1/8d10e6646d5d4585937395b04839a353/servers/b332b5cd-535e-4677-b68e-fc8badc13236",
+ "rel": "self"
+ }, {
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/servers/b332b5cd-535e-4677-b68e-fc8badc13236",
+ "rel": "bookmark"
+ }],
+ "image": {
+ "id": "416af940-2d3c-4a7c-977c-a9030685ad5e",
+ "links": [{
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/images/416af940-2d3c-4a7c-977c-a9030685ad5e",
+ "rel": "bookmark"
+ }]
+ },
+ "OS-EXT-STS:vm_state": "active",
+ "flavor": {
+ "id": "1",
+ "links": [{
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/flavors/1",
+ "rel": "bookmark"
+ }]
+ },
+ "id": "b332b5cd-535e-4677-b68e-fc8badc13236",
+ "user_id": "df13814f6c354d00a8acf66502836323",
+ "OS-DCF:diskConfig": "MANUAL",
+ "accessIPv4": "",
+ "accessIPv6": "",
+ "progress": 0,
+ "OS-EXT-STS:power_state": 1,
+ "config_drive": "",
+ "status": "ACTIVE",
+ "updated": "2012-04-12T11:18:58Z",
+ "hostId": "e5bbff80bebacfe1db63951e787b5341427060a602d33abfefb6a1bc",
+ "key_name": "",
+ "name": "VM blog",
+ "created": "2012-04-12T11:18:48Z",
+ "tenant_id": "8d10e6646d5d4585937395b04839a353",
+ "metadata": {}
+ }, {
+ "OS-EXT-STS:task_state": null,
+ "addresses": {
+ "Net TenantA Middle-Back": [{
+ "version": 4,
+ "addr": "172.16.12.4"
+ }]
+ },
+ "links": [{
+ "href": "http://nova:8774/v1.1/8d10e6646d5d4585937395b04839a353/servers/f9d43436-4572-4c9b-9b74-5fa6890a2f21",
+ "rel": "self"
+ }, {
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/servers/f9d43436-4572-4c9b-9b74-5fa6890a2f21",
+ "rel": "bookmark"
+ }],
+ "image": {
+ "id": "416af940-2d3c-4a7c-977c-a9030685ad5e",
+ "links": [{
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/images/416af940-2d3c-4a7c-977c-a9030685ad5e",
+ "rel": "bookmark"
+ }]
+ },
+ "OS-EXT-STS:vm_state": "active",
+ "flavor": {
+ "id": "1",
+ "links": [{
+ "href": "http://nova:8774/8d10e6646d5d4585937395b04839a353/flavors/1",
+ "rel": "bookmark"
+ }]
+ },
+ "id": "f9d43436-4572-4c9b-9b74-5fa6890a2f21",
+ "user_id": "df13814f6c354d00a8acf66502836323",
+ "OS-DCF:diskConfig": "MANUAL",
+ "accessIPv4": "",
+ "accessIPv6": "",
+ "progress": 0,
+ "OS-EXT-STS:power_state": 1,
+ "config_drive": "",
+ "status": "ACTIVE",
+ "updated": "2012-04-12T11:15:09Z",
+ "hostId": "03d796ebb52b1b555e5f6d9262f7dbd52b3f7c181e3aa89b34ca5408",
+ "key_name": "",
+ "name": "VM MySQL",
+ "created": "2012-04-12T11:14:56Z",
+ "tenant_id": "8d10e6646d5d4585937395b04839a353",
+ "metadata": {}
+ }]
+}
\ No newline at end of file
diff --git a/core/src/test/java/org/jclouds/rest/internal/BaseRestClientExpectTest.java b/core/src/test/java/org/jclouds/rest/internal/BaseRestClientExpectTest.java
index 88e6758..8e77a56 100644
--- a/core/src/test/java/org/jclouds/rest/internal/BaseRestClientExpectTest.java
+++ b/core/src/test/java/org/jclouds/rest/internal/BaseRestClientExpectTest.java
@@ -22,11 +22,13 @@
import static org.testng.Assert.assertEquals;
import java.io.IOException;
+import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Properties;
import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
@@ -57,11 +59,13 @@
import org.jclouds.http.handlers.DelegatingRetryHandler;
import org.jclouds.http.internal.BaseHttpCommandExecutorService;
import org.jclouds.http.internal.HttpWire;
+import org.jclouds.io.CopyInputStreamInputSupplierMap;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import org.jclouds.logging.config.NullLoggingModule;
import org.jclouds.providers.ProviderMetadata;
import org.jclouds.rest.RestApiMetadata;
+import org.jclouds.rest.config.CredentialStoreModule;
import org.jclouds.util.Strings2;
import org.testng.annotations.Test;
import org.w3c.dom.Node;
@@ -74,6 +78,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
+import com.google.common.io.InputSupplier;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.inject.AbstractModule;
@@ -540,11 +545,13 @@
this.api = RestApiMetadata.class.cast(builder.getApiMetadata()).getApi();
+ // isolate tests from eachother, as default credentialStore is static
return builder.credentials(identity, credential).modules(
- ImmutableSet.of(new ExpectModule(fn), new NullLoggingModule(), module)).overrides(setupProperties())
+ ImmutableSet.of(new ExpectModule(fn), new NullLoggingModule(), new CredentialStoreModule(new CopyInputStreamInputSupplierMap(
+ new ConcurrentHashMap<String, InputSupplier<InputStream>>())), module)).overrides(setupProperties())
.buildInjector();
}
-
+
/**
* override this to supply context-specific parameters during tests.
*/