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 2016/02/19 12:48:44 UTC
jclouds git commit: [JCLOUDS-1079] Make Floating IPs public in the
NodeMetadata in openstack-nova provider
Repository: jclouds
Updated Branches:
refs/heads/master 8bbcfed31 -> e0ab5d848
[JCLOUDS-1079] Make Floating IPs public in the NodeMetadata in openstack-nova provider
Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/e0ab5d84
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/e0ab5d84
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/e0ab5d84
Branch: refs/heads/master
Commit: e0ab5d848a8844a8bce5d3d8cd33e6ebeaebdd2d
Parents: 8bbcfed
Author: Josef Cacek <jc...@redhat.com>
Authored: Thu Feb 18 00:08:21 2016 +0100
Committer: Ignasi Barrera <na...@apache.org>
Committed: Fri Feb 19 11:59:52 2016 +0100
----------------------------------------------------------------------
.../functions/ServerInRegionToNodeMetadata.java | 14 ++-
.../openstack/nova/v2_0/domain/Address.java | 51 +++++++--
.../ServerInRegionToNodeMetadataTest.java | 25 +++++
.../parse/ParseServerDetailsStatesTest.java | 12 ++-
.../ParseServerWithAddressExtensionsTest.java | 107 +++++++++++++++++++
.../server_details_with_address_ext.json | 77 +++++++++++++
6 files changed, 272 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/jclouds/blob/e0ab5d84/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java
index e48554f..5054f6e 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java
@@ -18,7 +18,9 @@ package org.jclouds.openstack.nova.v2_0.compute.functions;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.not;
+import static com.google.common.base.Predicates.or;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.find;
import static com.google.common.collect.Iterables.transform;
@@ -37,6 +39,7 @@ import javax.annotation.Resource;
import javax.inject.Inject;
import javax.inject.Named;
+import com.google.common.base.Optional;
import org.jclouds.collect.Memoized;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.compute.domain.Hardware;
@@ -124,14 +127,14 @@ public class ServerInRegionToNodeMetadata implements Function<ServerInRegion, No
builder.publicAddresses(
filter(
transform(
- filter(addresses, not(isPrivateAddress)),
+ filter(addresses, or(isFloatingAddress, not(isPrivateAddress))),
AddressToStringTransformationFunction.INSTANCE),
isInet4Address));
builder.privateAddresses(
filter(
transform(
- filter(addresses, isPrivateAddress),
+ filter(addresses, and(not(isFloatingAddress), isPrivateAddress)),
AddressToStringTransformationFunction.INSTANCE),
isInet4Address));
@@ -144,6 +147,13 @@ public class ServerInRegionToNodeMetadata implements Function<ServerInRegion, No
return builder.build();
}
+ public static final Predicate<Address> isFloatingAddress = new Predicate<Address>() {
+ public boolean apply(Address in) {
+ final Optional<String> addrType = in.getType();
+ return addrType.isPresent() && "floating".equals(addrType.get());
+ }
+ };
+
public static final Predicate<Address> isPrivateAddress = new Predicate<Address>() {
public boolean apply(Address in) {
return InetAddresses2.IsPrivateIPAddress.INSTANCE.apply(in.getAddr());
http://git-wip-us.apache.org/repos/asf/jclouds/blob/e0ab5d84/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Address.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Address.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Address.java
index c57136c..1de3d93 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Address.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/domain/Address.java
@@ -22,6 +22,10 @@ import java.beans.ConstructorProperties;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.base.Optional;
+import org.jclouds.javax.annotation.Nullable;
+
+import javax.inject.Named;
/**
* IP address
@@ -50,7 +54,10 @@ public class Address {
protected String addr;
protected int version;
-
+ protected String macAddr;
+ protected String type;
+
+
/**
* @see Address#getAddr()
*/
@@ -67,14 +74,26 @@ public class Address {
return self();
}
+ public T macAddr(String macAddr) {
+ this.macAddr = macAddr;
+ return self();
+ }
+
+ public T type(String type) {
+ this.type = type;
+ return self();
+ }
+
public Address build() {
- return new Address(addr, version);
+ return new Address(addr, version, macAddr, type);
}
public T fromAddress(Address in) {
return this
.addr(in.getAddr())
- .version(in.getVersion());
+ .version(in.getVersion())
+ .macAddr(in.getMacAddr().orNull())
+ .type(in.getType().orNull());
}
}
@@ -87,13 +106,19 @@ public class Address {
private final String addr;
private final int version;
+ @Named("OS-EXT-IPS-MAC:mac_addr")
+ private final Optional<String> macAddr;
+ @Named("OS-EXT-IPS:type")
+ private final Optional<String> type;
@ConstructorProperties({
- "addr", "version"
+ "addr", "version", "OS-EXT-IPS-MAC:mac_addr", "OS-EXT-IPS:type"
})
- protected Address(String addr, int version) {
+ protected Address(String addr, int version, @Nullable String macAddr, @Nullable String type) {
this.addr = checkNotNull(addr, "addr");
this.version = version;
+ this.macAddr = Optional.fromNullable(macAddr);
+ this.type = Optional.fromNullable(type);
}
/**
@@ -110,9 +135,17 @@ public class Address {
return this.version;
}
+ public Optional<String> getMacAddr() {
+ return this.macAddr;
+ }
+
+ public Optional<String> getType() {
+ return this.type;
+ }
+
@Override
public int hashCode() {
- return Objects.hashCode(addr, version);
+ return Objects.hashCode(addr, version, macAddr, type);
}
@Override
@@ -121,12 +154,14 @@ public class Address {
if (obj == null || getClass() != obj.getClass()) return false;
Address that = Address.class.cast(obj);
return Objects.equal(this.addr, that.addr)
- && Objects.equal(this.version, that.version);
+ && Objects.equal(this.version, that.version)
+ && Objects.equal(this.macAddr, that.macAddr)
+ && Objects.equal(this.type, that.type);
}
protected ToStringHelper string() {
return Objects.toStringHelper(this)
- .add("addr", addr).add("version", version);
+ .add("addr", addr).add("version", version).add("macAddr", macAddr.or("")).add("type", type.or(""));
}
@Override
http://git-wip-us.apache.org/repos/asf/jclouds/blob/e0ab5d84/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadataTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadataTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadataTest.java
index e602f54..eadf033 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadataTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadataTest.java
@@ -40,6 +40,7 @@ import org.jclouds.openstack.nova.v2_0.compute.config.NovaComputeServiceContextM
import org.jclouds.openstack.nova.v2_0.domain.Server;
import org.jclouds.openstack.nova.v2_0.domain.regionscoped.ServerInRegion;
import org.jclouds.openstack.nova.v2_0.parse.ParseServerTest;
+import org.jclouds.openstack.nova.v2_0.parse.ParseServerWithAddressExtensionsTest;
import org.jclouds.openstack.nova.v2_0.parse.ParseServerWithoutImageTest;
import org.jclouds.openstack.v2_0.domain.Link;
import org.jclouds.openstack.v2_0.domain.Resource;
@@ -226,6 +227,30 @@ public class ServerInRegionToNodeMetadataTest {
assertNull(convertedNodeMetadata.getImageId());
}
+ @Test
+ public void testFloatingIp() {
+ Hardware existingHardware = new HardwareBuilder().id("az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f216543fd")
+ .providerId("52415800-8b69-11e0-9b19-734f216543fd").location(region).build();
+ Image existingImage = new ImageBuilder().id("az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f6f006e54")
+ .operatingSystem(OperatingSystem.builder().family(OsFamily.LINUX).description("foobuntu").build())
+ .providerId("52415800-8b69-11e0-9b19-734f6f006e54").description("foobuntu").status(Image.Status.AVAILABLE)
+ .location(region).build();
+
+ Server serverToConvert = new ParseServerWithAddressExtensionsTest().expected();
+ ServerInRegion serverInRegionToConvert = new ServerInRegion(serverToConvert, "az-1.region-a.geo-1");
+
+ ServerInRegionToNodeMetadata converter = new ServerInRegionToNodeMetadata(
+ NovaComputeServiceContextModule.toPortableNodeStatus, locationIndex,
+ Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.of(existingImage)),
+ Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet.of(existingHardware)),
+ namingConvention);
+
+ NodeMetadata convertedNodeMetadata = converter.apply(serverInRegionToConvert);
+
+ assertEquals(convertedNodeMetadata.getPrivateAddresses(), ImmutableSet.of("172.16.130.24"));
+ assertEquals(convertedNodeMetadata.getPublicAddresses(), ImmutableSet.of("10.8.54.75"));
+ }
+
// TODO: clean up this syntax
private void checkHardwareAndImageStatus(Hardware expectedHardware, Hardware existingHardware,
String expectedImageId, OperatingSystem expectedOs, Image existingImage) {
http://git-wip-us.apache.org/repos/asf/jclouds/blob/e0ab5d84/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerDetailsStatesTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerDetailsStatesTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerDetailsStatesTest.java
index 4461857..81e6fd3 100755
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerDetailsStatesTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerDetailsStatesTest.java
@@ -130,7 +130,8 @@ public class ParseServerDetailsStatesTest extends BaseSetParserTest<Server> {
.hypervisorHostName("rdohavana.localdomain").build()
)
.addresses(ImmutableMultimap.<String, Address>builder()
- .putAll("public", Address.createV4("172.24.4.232")).build()
+ .putAll("public", Address.builder().addr("172.24.4.232").version(4)
+ .macAddr("fa:16:3e:df:22:1b").type("fixed").build()).build()
).build(),
Server.builder()
.links(
@@ -168,7 +169,8 @@ public class ParseServerDetailsStatesTest extends BaseSetParserTest<Server> {
.instanceName("instance-00000006").build()
)
.addresses(ImmutableMultimap.<String, Address>builder()
- .putAll("public", Address.createV4("172.24.4.229")).build()
+ .putAll("public", Address.builder().addr("172.24.4.229").version(4)
+ .macAddr("fa:16:3e:cb:56:d6").type("fixed").build()).build()
).build(),
Server.builder()
.links(
@@ -209,7 +211,8 @@ public class ParseServerDetailsStatesTest extends BaseSetParserTest<Server> {
.hypervisorHostName("rdohavana.localdomain").build()
)
.addresses(ImmutableMultimap.<String, Address>builder()
- .putAll("public", Address.createV4("172.24.4.227")).build()
+ .putAll("public", Address.builder().addr("172.24.4.227").version(4)
+ .macAddr("fa:16:3e:18:fe:c8").type("fixed").build()).build()
).build(),
Server.builder()
.links(
@@ -250,7 +253,8 @@ public class ParseServerDetailsStatesTest extends BaseSetParserTest<Server> {
.hypervisorHostName("rdohavana.localdomain").build()
)
.addresses(ImmutableMultimap.<String, Address>builder()
- .putAll("public", Address.createV4("172.24.4.228")).build()
+ .putAll("public", Address.builder().addr("172.24.4.228").version(4)
+ .macAddr("fa:16:3e:64:1a:d5").type("fixed").build()).build()
).build()
);
}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/e0ab5d84/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithAddressExtensionsTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithAddressExtensionsTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithAddressExtensionsTest.java
new file mode 100644
index 0000000..d20c091
--- /dev/null
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/parse/ParseServerWithAddressExtensionsTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.nova.v2_0.parse;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.jclouds.date.internal.SimpleDateFormatDateService;
+import org.jclouds.json.BaseItemParserTest;
+import org.jclouds.json.config.GsonModule;
+import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
+import org.jclouds.openstack.nova.v2_0.domain.Address;
+import org.jclouds.openstack.nova.v2_0.domain.Server;
+import org.jclouds.openstack.nova.v2_0.domain.Server.Status;
+import org.jclouds.openstack.nova.v2_0.domain.ServerExtendedStatus;
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.Link.Relation;
+import org.jclouds.openstack.v2_0.domain.Resource;
+import org.jclouds.rest.annotations.SelectJson;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.core.MediaType;
+import java.net.URI;
+
+@Test(groups = "unit", testName = "ParseServerWithAddressExtensionsTest")
+public class ParseServerWithAddressExtensionsTest extends BaseItemParserTest<Server> {
+
+ @Override
+ public String resource() {
+ return "/server_details_with_address_ext.json";
+ }
+
+ @Override
+ @SelectJson("server")
+ @Consumes(MediaType.APPLICATION_JSON)
+ public Server expected() {
+ return Server
+ .builder()
+ .id("0bdc3a8d-3a96-4ccc-bb40-715537a7df7b")
+ .tenantId("cac29c920a6149aabe499757b6ba81c7")
+ .userId("ed15e338032f4a2c85b7fa80e40b9917")
+ .name("cloudts-f07")
+ .updated(new SimpleDateFormatDateService().iso8601SecondsDateParse("2016-02-17T14:48:00Z"))
+ .created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2016-02-17T14:46:13Z"))
+ .hostId("18a9cd55f76c520dcad6c31d5b2b8f4c921979629c0274c0f7d2de39")
+ .status(Status.ACTIVE)
+ .image(
+ Resource
+ .builder()
+ .id("9a9f496a-f5c2-4286-81a4-98189a48777a")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://openstack:8774/cac29c920a6149aabe499757b6ba81c7/images/9a9f496a-f5c2-4286-81a4-98189a48777a")))
+ .build())
+ .flavor(
+ Resource
+ .builder()
+ .id("3")
+ .links(
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://openstack:8774/cac29c920a6149aabe499757b6ba81c7/flavors/3")))
+ .build())
+ .links(
+ Link.create(
+ Relation.SELF,
+ URI.create("http://openstack:8774/v2/cac29c920a6149aabe499757b6ba81c7/servers/0bdc3a8d-3a96-4ccc-bb40-715537a7df7b")),
+ Link.create(
+ Relation.BOOKMARK,
+ URI.create("http://openstack:8774/cac29c920a6149aabe499757b6ba81c7/servers/0bdc3a8d-3a96-4ccc-bb40-715537a7df7b")))
+ .metadata(ImmutableMap.<String, String>of("jclouds-group", "cloudts"))
+ .addresses(ImmutableMultimap.<String, Address>builder()
+ .putAll("jenkins",
+ Address.builder().version(4).addr("172.16.130.24").macAddr("fa:16:3e:bf:82:43").type("fixed").build(),
+ Address.builder().version(4).addr("10.8.54.75").macAddr("fa:16:3e:bf:82:43").type("floating").build())
+ .build())
+ .diskConfig("MANUAL")
+ .configDrive("")
+ .availabilityZone("nova")
+ .accessIPv4("")
+ .accessIPv6("")
+ .keyName("jenkins")
+ .extendedStatus(ServerExtendedStatus.builder().vmState("active").powerState(1).build())
+ .build();
+ }
+
+ protected Injector injector() {
+ return Guice.createInjector(new NovaParserModule(), new GsonModule());
+ }
+}
http://git-wip-us.apache.org/repos/asf/jclouds/blob/e0ab5d84/apis/openstack-nova/src/test/resources/server_details_with_address_ext.json
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/resources/server_details_with_address_ext.json b/apis/openstack-nova/src/test/resources/server_details_with_address_ext.json
new file mode 100755
index 0000000..da2472d
--- /dev/null
+++ b/apis/openstack-nova/src/test/resources/server_details_with_address_ext.json
@@ -0,0 +1,77 @@
+{
+ "server": {
+ "OS-DCF:diskConfig": "MANUAL",
+ "OS-EXT-AZ:availability_zone": "nova",
+ "OS-EXT-STS:power_state": 1,
+ "OS-EXT-STS:task_state": null,
+ "OS-EXT-STS:vm_state": "active",
+ "OS-SRV-USG:launched_at": "2016-02-17T14:48:00.000000",
+ "OS-SRV-USG:terminated_at": null,
+ "accessIPv4": "",
+ "accessIPv6": "",
+ "addresses": {
+ "jenkins": [
+ {
+ "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:bf:82:43",
+ "OS-EXT-IPS:type": "fixed",
+ "addr": "172.16.130.24",
+ "version": 4
+ },
+ {
+ "OS-EXT-IPS-MAC:mac_addr": "fa:16:3e:bf:82:43",
+ "OS-EXT-IPS:type": "floating",
+ "addr": "10.8.54.75",
+ "version": 4
+ }
+ ]
+ },
+ "config_drive": "",
+ "created": "2016-02-17T14:46:13Z",
+ "flavor": {
+ "id": "3",
+ "links": [
+ {
+ "href": "http://openstack:8774/cac29c920a6149aabe499757b6ba81c7/flavors/3",
+ "rel": "bookmark"
+ }
+ ]
+ },
+ "hostId": "18a9cd55f76c520dcad6c31d5b2b8f4c921979629c0274c0f7d2de39",
+ "id": "0bdc3a8d-3a96-4ccc-bb40-715537a7df7b",
+ "image": {
+ "id": "9a9f496a-f5c2-4286-81a4-98189a48777a",
+ "links": [
+ {
+ "href": "http://openstack:8774/cac29c920a6149aabe499757b6ba81c7/images/9a9f496a-f5c2-4286-81a4-98189a48777a",
+ "rel": "bookmark"
+ }
+ ]
+ },
+ "key_name": "jenkins",
+ "links": [
+ {
+ "href": "http://openstack:8774/v2/cac29c920a6149aabe499757b6ba81c7/servers/0bdc3a8d-3a96-4ccc-bb40-715537a7df7b",
+ "rel": "self"
+ },
+ {
+ "href": "http://openstack:8774/cac29c920a6149aabe499757b6ba81c7/servers/0bdc3a8d-3a96-4ccc-bb40-715537a7df7b",
+ "rel": "bookmark"
+ }
+ ],
+ "metadata": {
+ "jclouds-group": "cloudts"
+ },
+ "name": "cloudts-f07",
+ "os-extended-volumes:volumes_attached": [],
+ "progress": 0,
+ "security_groups": [
+ {
+ "name": "allow-all"
+ }
+ ],
+ "status": "ACTIVE",
+ "tenant_id": "cac29c920a6149aabe499757b6ba81c7",
+ "updated": "2016-02-17T14:48:00Z",
+ "user_id": "ed15e338032f4a2c85b7fa80e40b9917"
+ }
+}
\ No newline at end of file