handling cases where Nova returns all addresses as private rather than private and public

This commit is contained in:
Mike Arnold 2012-03-08 17:13:54 -06:00
parent 0613f3390c
commit 967926dc28
1 changed files with 27 additions and 9 deletions

View File

@ -21,21 +21,17 @@ package org.jclouds.openstack.nova.v1_1.domain;
import static com.google.common.base.Objects.toStringHelper; import static com.google.common.base.Objects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import com.google.common.collect.*;
import org.jclouds.openstack.domain.Link; import org.jclouds.openstack.domain.Link;
import org.jclouds.openstack.domain.Resource; import org.jclouds.openstack.domain.Resource;
import org.jclouds.openstack.nova.v1_1.domain.Address.Type; import org.jclouds.openstack.nova.v1_1.domain.Address.Type;
import org.jclouds.util.Multimaps2; import org.jclouds.util.Multimaps2;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.gson.annotations.SerializedName; import com.google.gson.annotations.SerializedName;
/** /**
@ -354,7 +350,7 @@ public class Server extends Resource {
* @return the private ip addresses assigned to the server * @return the private ip addresses assigned to the server
*/ */
public Set<Address> getPrivateAddresses() { public Set<Address> getPrivateAddresses() {
Set<Address> privateAddresses = addresses.get(Address.Type.PRIVATE); Collection<Address> privateAddresses = getAddresses().get(Address.Type.PRIVATE);
if (privateAddresses == null) { if (privateAddresses == null) {
return ImmutableSet.<Address> of(); return ImmutableSet.<Address> of();
} else { } else {
@ -366,7 +362,7 @@ public class Server extends Resource {
* @return the public ip addresses assigned to the server * @return the public ip addresses assigned to the server
*/ */
public Set<Address> getPublicAddresses() { public Set<Address> getPublicAddresses() {
Set<Address> publicAddrs = addresses.get(Address.Type.PUBLIC); Collection<Address> publicAddrs = getAddresses().get(Address.Type.PUBLIC);
if (publicAddrs == null) { if (publicAddrs == null) {
return ImmutableSet.<Address> of(); return ImmutableSet.<Address> of();
} else { } else {
@ -378,7 +374,29 @@ public class Server extends Resource {
* @return the ip addresses assigned to the server * @return the ip addresses assigned to the server
*/ */
public Multimap<Type, Address> getAddresses() { public Multimap<Type, Address> getAddresses() {
return Multimaps2.fromOldSchool(addresses); ImmutableSetMultimap.Builder returnMapBuilder = new ImmutableSetMultimap.Builder<Type, Address>();
Set<Address> publicAddresses = addresses.get(Address.Type.PUBLIC);
Set<Address> privateAddresses = addresses.get(Address.Type.PRIVATE);
if (privateAddresses.size() > 1) {
if (publicAddresses != null) {
returnMapBuilder.putAll(Type.PUBLIC, publicAddresses);
}
for (Address address : privateAddresses) {
if (address.getAddr().startsWith("10.") ||
address.getAddr().startsWith("192.168.") ||
address.getAddr().matches("^172\\.(1[6-9]|2[0-9]|3[0-1])\\..*")) {
returnMapBuilder.put(Address.Type.PRIVATE, address);
} else {
returnMapBuilder.put(Address.Type.PUBLIC, address);
}
}
} else {
return Multimaps2.fromOldSchool(addresses);
}
return returnMapBuilder.build();
} }
@Override @Override