Merge pull request #341 from andreisavu/master

Collect all IP addresses before building the NodeMetadata object
This commit is contained in:
Andrei Savu 2012-01-31 08:11:12 -08:00
commit 1572092731
2 changed files with 151 additions and 72 deletions

View File

@ -18,19 +18,19 @@
*/ */
package org.jclouds.cloudstack.compute.functions; package org.jclouds.cloudstack.compute.functions;
import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.base.Function;
import static com.google.common.collect.Iterables.filter; import com.google.common.base.Predicate;
import static com.google.common.collect.Iterables.transform; import com.google.common.base.Supplier;
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName; import com.google.common.base.Throwables;
import com.google.common.cache.LoadingCache;
import java.util.Map; import com.google.common.collect.ImmutableList;
import java.util.Set; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import javax.annotation.Nullable; import com.google.common.collect.Iterables;
import javax.inject.Inject; import com.google.common.collect.Sets;
import javax.inject.Singleton; import com.google.common.util.concurrent.UncheckedExecutionException;
import org.jclouds.cloudstack.domain.IPForwardingRule; import org.jclouds.cloudstack.domain.IPForwardingRule;
import org.jclouds.cloudstack.domain.NIC;
import org.jclouds.cloudstack.domain.VirtualMachine; import org.jclouds.cloudstack.domain.VirtualMachine;
import org.jclouds.collect.FindResourceInSet; import org.jclouds.collect.FindResourceInSet;
import org.jclouds.collect.Memoized; import org.jclouds.collect.Memoized;
@ -46,18 +46,21 @@ import org.jclouds.rest.ResourceNotFoundException;
import org.jclouds.util.InetAddresses2; import org.jclouds.util.InetAddresses2;
import org.jclouds.util.Throwables2; import org.jclouds.util.Throwables2;
import com.google.common.base.Function; import javax.annotation.Nullable;
import com.google.common.base.Predicate; import javax.inject.Inject;
import com.google.common.base.Supplier; import javax.inject.Singleton;
import com.google.common.base.Throwables; import java.util.Map;
import com.google.common.cache.LoadingCache; import java.util.Set;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import static com.google.common.base.Preconditions.checkNotNull;
import com.google.common.collect.ImmutableSet; import static com.google.common.collect.Iterables.filter;
import com.google.common.util.concurrent.UncheckedExecutionException; import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Sets.newHashSet;
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
import static org.jclouds.util.InetAddresses2.isPrivateIPAddress;
/** /**
* @author Adrian Cole * @author Adrian Cole, Andrei Savu
*/ */
@Singleton @Singleton
public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, NodeMetadata> { public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, NodeMetadata> {
@ -108,7 +111,7 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
builder.imageId(image.getId()); builder.imageId(image.getId());
builder.operatingSystem(image.getOperatingSystem()); builder.operatingSystem(image.getOperatingSystem());
} }
builder.hardware(new HardwareBuilder() builder.hardware(new HardwareBuilder()
.ids(from.getServiceOfferingId() + "") .ids(from.getServiceOfferingId() + "")
.name(from.getServiceOfferingName() + "") .name(from.getServiceOfferingName() + "")
@ -120,37 +123,47 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
builder.state(vmStateToNodeState.get(from.getState())); builder.state(vmStateToNodeState.get(from.getState()));
// TODO: check to see public or private Set<String> publicAddresses = newHashSet(), privateAddresses = newHashSet();
if (from.getIPAddress() != null) { if (from.getIPAddress() != null) {
boolean isPrivate = InetAddresses2.isPrivateIPAddress(from.getIPAddress()); boolean isPrivate = isPrivateIPAddress(from.getIPAddress());
Set<String> addresses = ImmutableSet.<String> of(from.getIPAddress()); if (isPrivate) {
if (isPrivate) privateAddresses.add(from.getIPAddress());
builder.privateAddresses(addresses); } else {
else publicAddresses.add(from.getIPAddress());
builder.publicAddresses(addresses); }
}
for (NIC nic : from.getNICs()) {
if (nic.getIPAddress() != null) {
if (isPrivateIPAddress(nic.getIPAddress())) {
privateAddresses.add(nic.getIPAddress());
} else {
publicAddresses.add(nic.getIPAddress());
}
}
} }
try { try {
/* Also add to the list of public IPs any public IP address that has a
builder.publicAddresses(transform( forwarding rule that links to this machine */
filter(getIPForwardingRulesByVirtualMachine.getUnchecked(from.getId()), Iterables.addAll(publicAddresses, transform(
new Predicate<IPForwardingRule>() { filter(getIPForwardingRulesByVirtualMachine.getUnchecked(from.getId()),
@Override new Predicate<IPForwardingRule>() {
public boolean apply(@Nullable IPForwardingRule rule) {
return !"Deleting".equals(rule.getState());
}
}), new Function<IPForwardingRule, String>() {
@Override @Override
public String apply(@Nullable IPForwardingRule rule) { public boolean apply(@Nullable IPForwardingRule rule) {
return rule.getIPAddress(); return !"Deleting".equals(rule.getState());
} }
})); }), new Function<IPForwardingRule, String>() {
@Override
public String apply(@Nullable IPForwardingRule rule) {
return rule.getIPAddress();
}
}));
} catch (UncheckedExecutionException e) { } catch (UncheckedExecutionException e) {
if (Throwables2.getFirstThrowableOfType(e, ResourceNotFoundException.class) == null) { if (Throwables2.getFirstThrowableOfType(e, ResourceNotFoundException.class) == null) {
Throwables.propagateIfPossible(e.getCause()); Throwables.propagateIfPossible(e.getCause());
throw e; throw e;
} }
} }
return builder.build(); return builder.privateAddresses(privateAddresses).publicAddresses(publicAddresses).build();
} }
@Singleton @Singleton

View File

@ -18,14 +18,18 @@
*/ */
package org.jclouds.cloudstack.compute.functions; package org.jclouds.cloudstack.compute.functions;
import static org.testng.Assert.assertEquals; import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import java.net.UnknownHostException; import com.google.common.cache.CacheBuilder;
import java.util.Set; import com.google.common.cache.CacheLoader;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import org.jclouds.cloudstack.compute.functions.VirtualMachineToNodeMetadata.FindImageForVirtualMachine; import org.jclouds.cloudstack.compute.functions.VirtualMachineToNodeMetadata.FindImageForVirtualMachine;
import org.jclouds.cloudstack.compute.functions.VirtualMachineToNodeMetadata.FindLocationForVirtualMachine; import org.jclouds.cloudstack.compute.functions.VirtualMachineToNodeMetadata.FindLocationForVirtualMachine;
import org.jclouds.cloudstack.domain.GuestIPType;
import org.jclouds.cloudstack.domain.IPForwardingRule; import org.jclouds.cloudstack.domain.IPForwardingRule;
import org.jclouds.cloudstack.domain.NIC;
import org.jclouds.cloudstack.domain.TrafficType;
import org.jclouds.cloudstack.domain.VirtualMachine; import org.jclouds.cloudstack.domain.VirtualMachine;
import org.jclouds.cloudstack.parse.ListVirtualMachinesResponseTest; import org.jclouds.cloudstack.parse.ListVirtualMachinesResponseTest;
import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Hardware;
@ -34,19 +38,18 @@ import org.jclouds.compute.domain.Image;
import org.jclouds.compute.domain.NodeMetadata; import org.jclouds.compute.domain.NodeMetadata;
import org.jclouds.compute.domain.NodeMetadataBuilder; import org.jclouds.compute.domain.NodeMetadataBuilder;
import org.jclouds.compute.domain.NodeState; import org.jclouds.compute.domain.NodeState;
import org.jclouds.date.internal.SimpleDateFormatDateService;
import org.jclouds.domain.Location; import org.jclouds.domain.Location;
import org.jclouds.rest.ResourceNotFoundException; import org.jclouds.rest.ResourceNotFoundException;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import com.google.common.base.Supplier; import java.net.UnknownHostException;
import com.google.common.base.Suppliers; import java.util.Set;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader; import static org.testng.Assert.assertEquals;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
/** /**
* @author Adrian Cole * @author Adrian Cole, Andrei Savu
*/ */
@Test(groups = "unit", testName = "VirtualMachineToNodeMetadataTest") @Test(groups = "unit", testName = "VirtualMachineToNodeMetadataTest")
public class VirtualMachineToNodeMetadataTest { public class VirtualMachineToNodeMetadataTest {
@ -55,21 +58,21 @@ public class VirtualMachineToNodeMetadataTest {
public void testApplyWhereVirtualMachineWithIPForwardingRule() throws UnknownHostException { public void testApplyWhereVirtualMachineWithIPForwardingRule() throws UnknownHostException {
Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
.<Location> of(ZoneToLocationTest.one, ZoneToLocationTest.two)); .<Location>of(ZoneToLocationTest.one, ZoneToLocationTest.two));
Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
.<Image> of(TemplateToImageTest.one, TemplateToImageTest.two)); .<Image>of(TemplateToImageTest.one, TemplateToImageTest.two));
VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(new FindLocationForVirtualMachine( VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(new FindLocationForVirtualMachine(
locationSupplier), new FindImageForVirtualMachine( locationSupplier), new FindImageForVirtualMachine(
imageSupplier), CacheBuilder.newBuilder().<Long, Set<IPForwardingRule>> build( imageSupplier), CacheBuilder.newBuilder().<Long, Set<IPForwardingRule>> build(
new CacheLoader<Long, Set<IPForwardingRule>>() { new CacheLoader<Long, Set<IPForwardingRule>>() {
@Override @Override
public Set<IPForwardingRule> load(Long arg0) throws Exception { public Set<IPForwardingRule> load(Long arg0) throws Exception {
return ImmutableSet.of(IPForwardingRule.builder().id(1234l).IPAddress("1.1.1.1").build()); return ImmutableSet.of(IPForwardingRule.builder().id(1234l).IPAddress("1.1.1.1").build());
} }
})); }));
// notice if we've already parsed this properly here, we can rely on it. // notice if we've already parsed this properly here, we can rely on it.
VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0); VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0);
@ -87,25 +90,88 @@ public class VirtualMachineToNodeMetadataTest {
} }
@Test
public void testApplyWhereVirtualMachineHasNoIpForwardingRuleAndAPublicIP() throws UnknownHostException {
Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
.<Location>of(ZoneToLocationTest.one, ZoneToLocationTest.two));
Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
.<Image>of(TemplateToImageTest.one, TemplateToImageTest.two));
VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(new FindLocationForVirtualMachine(
locationSupplier), new FindImageForVirtualMachine(
imageSupplier), CacheBuilder.newBuilder().<Long, Set<IPForwardingRule>> build(
new CacheLoader<Long, Set<IPForwardingRule>>() {
@Override
public Set<IPForwardingRule> load(Long arg0) throws Exception {
return ImmutableSet.of();
}
}));
VirtualMachine guest =VirtualMachine.builder()
.id(54)
.name("i-3-54-VM")
.displayName("i-3-54-VM")
.account("adrian")
.domainId(1)
.domain("ROOT")
.created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2011-02-16T14:28:37-0800"))
.state(VirtualMachine.State.STARTING)
.isHAEnabled(false)
.zoneId(1)
.zoneName("San Jose 1")
.templateId(2)
.templateName("CentOS 5.3(64-bit) no GUI (XenServer)")
.templateDisplayText("CentOS 5.3(64-bit) no GUI (XenServer)")
.passwordEnabled(false)
.serviceOfferingId(1)
.serviceOfferingName("Small Instance")
.cpuCount(1)
.cpuSpeed(500)
.memory(512)
.guestOSId(11)
.rootDeviceId(0)
.rootDeviceType("NetworkFilesystem")
.jobId(63l)
.jobStatus(0)
.nics(ImmutableSet.of(NIC.builder().id(72).networkId(204).netmask("255.255.255.0").gateway("1.1.1.1")
.IPAddress("1.1.1.5").trafficType(TrafficType.GUEST).guestIPType(GuestIPType.VIRTUAL)
.isDefault(true).build())).hypervisor("XenServer").build();
NodeMetadata node = parser.apply(guest);
assertEquals(
node.toString(),
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3")
.location(ZoneToLocationTest.one).state(NodeState.PENDING).hostname("i-3-54-VM")
.privateAddresses(ImmutableSet.<String>of())
.publicAddresses(ImmutableSet.<String>of("1.1.1.5"))
.hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
.imageId(TemplateToImageTest.one.getId())
.operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
}
@Test @Test
public void testApplyWhereVirtualMachineWithNoPassword() throws UnknownHostException { public void testApplyWhereVirtualMachineWithNoPassword() throws UnknownHostException {
Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet Supplier<Set<? extends Location>> locationSupplier = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
.<Location> of(ZoneToLocationTest.one, ZoneToLocationTest.two)); .<Location>of(ZoneToLocationTest.one, ZoneToLocationTest.two));
Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet Supplier<Set<? extends Image>> imageSupplier = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
.<Image> of(TemplateToImageTest.one, TemplateToImageTest.two)); .<Image>of(TemplateToImageTest.one, TemplateToImageTest.two));
VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(new FindLocationForVirtualMachine( VirtualMachineToNodeMetadata parser = new VirtualMachineToNodeMetadata(new FindLocationForVirtualMachine(
locationSupplier), new FindImageForVirtualMachine( locationSupplier), new FindImageForVirtualMachine(
imageSupplier), CacheBuilder.newBuilder().<Long, Set<IPForwardingRule>> build( imageSupplier), CacheBuilder.newBuilder().<Long, Set<IPForwardingRule>> build(
new CacheLoader<Long, Set<IPForwardingRule>>() { new CacheLoader<Long, Set<IPForwardingRule>>() {
@Override @Override
public Set<IPForwardingRule> load(Long arg0) throws Exception { public Set<IPForwardingRule> load(Long arg0) throws Exception {
throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0); throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0);
} }
})); }));
// notice if we've already parsed this properly here, we can rely on it. // notice if we've already parsed this properly here, we can rely on it.
VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0); VirtualMachine guest = Iterables.get(new ListVirtualMachinesResponseTest().expected(), 0);
@ -121,7 +187,7 @@ public class VirtualMachineToNodeMetadataTest {
.imageId(TemplateToImageTest.one.getId()) .imageId(TemplateToImageTest.one.getId())
.operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString()); .operatingSystem(TemplateToImageTest.one.getOperatingSystem()).build().toString());
} }
protected Hardware addHypervisor(Hardware in, String hypervisor) { protected Hardware addHypervisor(Hardware in, String hypervisor) {
return HardwareBuilder.fromHardware(in).hypervisor(hypervisor).build(); return HardwareBuilder.fromHardware(in).hypervisor(hypervisor).build();
} }