mirror of https://github.com/apache/jclouds.git
Issue 888: consolidate code that addresses naming conventions, using hyphen as default delimiter
This commit is contained in:
parent
5c6ce9f081
commit
49e475edcd
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.cloudservers.compute.functions;
|
package org.jclouds.cloudservers.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
@ -39,6 +38,7 @@ 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.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
|
@ -63,6 +63,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
protected final Map<ServerStatus, NodeState> serverToNodeState;
|
protected final Map<ServerStatus, NodeState> serverToNodeState;
|
||||||
protected final Supplier<Set<? extends Image>> images;
|
protected final Supplier<Set<? extends Image>> images;
|
||||||
protected final Supplier<Set<? extends Hardware>> hardwares;
|
protected final Supplier<Set<? extends Hardware>> hardwares;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
private static class FindImageForServer implements Predicate<Image> {
|
private static class FindImageForServer implements Predicate<Image> {
|
||||||
private final Server instance;
|
private final Server instance;
|
||||||
|
@ -93,7 +94,9 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
@Inject
|
@Inject
|
||||||
ServerToNodeMetadata(Map<ServerStatus, NodeState> serverStateToNodeState,
|
ServerToNodeMetadata(Map<ServerStatus, NodeState> serverStateToNodeState,
|
||||||
@Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location,
|
@Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location,
|
||||||
@Memoized Supplier<Set<? extends Hardware>> hardwares) {
|
@Memoized Supplier<Set<? extends Hardware>> hardwares,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
this.location = checkNotNull(location, "location");
|
this.location = checkNotNull(location, "location");
|
||||||
|
@ -109,7 +112,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
builder.location(new LocationBuilder().scope(LocationScope.HOST).id(from.getHostId()).description(
|
builder.location(new LocationBuilder().scope(LocationScope.HOST).id(from.getHostId()).description(
|
||||||
from.getHostId()).parent(location.get()).build());
|
from.getHostId()).parent(location.get()).build());
|
||||||
builder.userMetadata(from.getMetadata());
|
builder.userMetadata(from.getMetadata());
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.imageId(from.getImageId() + "");
|
builder.imageId(from.getImageId() + "");
|
||||||
builder.operatingSystem(parseOperatingSystem(from));
|
builder.operatingSystem(parseOperatingSystem(from));
|
||||||
builder.hardware(parseHardware(from));
|
builder.hardware(parseHardware(from));
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.jclouds.compute.domain.OsFamily;
|
||||||
import org.jclouds.compute.domain.Processor;
|
import org.jclouds.compute.domain.Processor;
|
||||||
import org.jclouds.compute.domain.Volume;
|
import org.jclouds.compute.domain.Volume;
|
||||||
import org.jclouds.compute.domain.VolumeBuilder;
|
import org.jclouds.compute.domain.VolumeBuilder;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
|
@ -47,13 +48,15 @@ import com.google.common.base.Suppliers;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit", testName = "ServerToNodeMetadataTest")
|
||||||
public class ServerToNodeMetadataTest {
|
public class ServerToNodeMetadataTest {
|
||||||
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build();
|
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build();
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testApplyWhereImageAndHardwareNotFound() {
|
public void testApplyWhereImageAndHardwareNotFound() {
|
||||||
|
@ -63,7 +66,7 @@ public class ServerToNodeMetadataTest {
|
||||||
Server server = ParseServerFromJsonResponseTest.parseServer();
|
Server server = ParseServerFromJsonResponseTest.parseServer();
|
||||||
|
|
||||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers
|
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers
|
||||||
.ofInstance(provider), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
.ofInstance(provider), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(server);
|
NodeMetadata metadata = parser.apply(server);
|
||||||
|
|
||||||
|
@ -77,6 +80,7 @@ public class ServerToNodeMetadataTest {
|
||||||
.id("1234")
|
.id("1234")
|
||||||
.providerId("1234")
|
.providerId("1234")
|
||||||
.name("sample-server")
|
.name("sample-server")
|
||||||
|
.group("sample")
|
||||||
.hostname("sample-server")
|
.hostname("sample-server")
|
||||||
.location(
|
.location(
|
||||||
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
||||||
|
@ -94,7 +98,7 @@ public class ServerToNodeMetadataTest {
|
||||||
Server server = ParseServerFromJsonResponseTest.parseServer();
|
Server server = ParseServerFromJsonResponseTest.parseServer();
|
||||||
|
|
||||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers
|
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers
|
||||||
.ofInstance(provider), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
.ofInstance(provider), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(server);
|
NodeMetadata metadata = parser.apply(server);
|
||||||
|
|
||||||
|
@ -112,6 +116,7 @@ public class ServerToNodeMetadataTest {
|
||||||
.providerId("1234")
|
.providerId("1234")
|
||||||
.name("sample-server")
|
.name("sample-server")
|
||||||
.hostname("sample-server")
|
.hostname("sample-server")
|
||||||
|
.group("sample")
|
||||||
.location(
|
.location(
|
||||||
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
||||||
.description("e4d909c290d0fb1ca068ffaddf22cbd0").parent(provider).build())
|
.description("e4d909c290d0fb1ca068ffaddf22cbd0").parent(provider).build())
|
||||||
|
@ -127,7 +132,7 @@ public class ServerToNodeMetadataTest {
|
||||||
Server server = ParseServerFromJsonResponseTest.parseServer();
|
Server server = ParseServerFromJsonResponseTest.parseServer();
|
||||||
|
|
||||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers
|
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers
|
||||||
.ofInstance(provider), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
.ofInstance(provider), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(server);
|
NodeMetadata metadata = parser.apply(server);
|
||||||
|
|
||||||
|
@ -153,6 +158,7 @@ public class ServerToNodeMetadataTest {
|
||||||
.id("1234")
|
.id("1234")
|
||||||
.providerId("1234")
|
.providerId("1234")
|
||||||
.name("sample-server")
|
.name("sample-server")
|
||||||
|
.group("sample")
|
||||||
.hostname("sample-server")
|
.hostname("sample-server")
|
||||||
.location(
|
.location(
|
||||||
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.cloudsigma.compute.functions;
|
package org.jclouds.cloudsigma.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -43,6 +42,7 @@ import org.jclouds.compute.domain.NodeState;
|
||||||
import org.jclouds.compute.domain.Processor;
|
import org.jclouds.compute.domain.Processor;
|
||||||
import org.jclouds.compute.domain.Volume;
|
import org.jclouds.compute.domain.Volume;
|
||||||
import org.jclouds.compute.domain.VolumeBuilder;
|
import org.jclouds.compute.domain.VolumeBuilder;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
|
|
||||||
|
@ -73,24 +73,26 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
|
||||||
private final Function<String, Image> findImageForId;
|
private final Function<String, Image> findImageForId;
|
||||||
private final Supplier<Location> locationSupplier;
|
private final Supplier<Location> locationSupplier;
|
||||||
private final Function<Device, Volume> deviceToVolume;
|
private final Function<Device, Volume> deviceToVolume;
|
||||||
|
private final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ServerInfoToNodeMetadata(Function<Server, String> getImageIdFromServer, Function<String, Image> findImageForId,
|
ServerInfoToNodeMetadata(Function<Server, String> getImageIdFromServer, Function<String, Image> findImageForId,
|
||||||
Function<Device, Volume> deviceToVolume, Supplier<Location> locationSupplier) {
|
Function<Device, Volume> deviceToVolume, Supplier<Location> locationSupplier,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier");
|
this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier");
|
||||||
this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume");
|
this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume");
|
||||||
this.findImageForId = checkNotNull(findImageForId, "findImageForId");
|
this.findImageForId = checkNotNull(findImageForId, "findImageForId");
|
||||||
this.getImageIdFromServer = checkNotNull(getImageIdFromServer, "getImageIdFromServer");
|
this.getImageIdFromServer = checkNotNull(getImageIdFromServer, "getImageIdFromServer");
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
|
||||||
@Override
|
@Override
|
||||||
public NodeMetadata apply(ServerInfo from) {
|
public NodeMetadata apply(ServerInfo from) {
|
||||||
NodeMetadataBuilder builder = new NodeMetadataBuilder();
|
NodeMetadataBuilder builder = new NodeMetadataBuilder();
|
||||||
builder.ids(from.getUuid());
|
builder.ids(from.getUuid());
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.location(locationSupplier.get());
|
builder.location(locationSupplier.get());
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
|
|
||||||
String imageId = getImageIdFromServer.apply(from);
|
String imageId = getImageIdFromServer.apply(from);
|
||||||
if (imageId != null) {
|
if (imageId != null) {
|
||||||
|
|
|
@ -22,7 +22,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.collect.Iterables.filter;
|
import static com.google.common.collect.Iterables.filter;
|
||||||
import static com.google.common.collect.Iterables.transform;
|
import static com.google.common.collect.Iterables.transform;
|
||||||
import static com.google.common.collect.Sets.newHashSet;
|
import static com.google.common.collect.Sets.newHashSet;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
import static org.jclouds.util.InetAddresses2.isPrivateIPAddress;
|
import static org.jclouds.util.InetAddresses2.isPrivateIPAddress;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -44,6 +43,7 @@ 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.compute.domain.Processor;
|
import org.jclouds.compute.domain.Processor;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.rest.ResourceNotFoundException;
|
import org.jclouds.rest.ResourceNotFoundException;
|
||||||
import org.jclouds.util.Throwables2;
|
import org.jclouds.util.Throwables2;
|
||||||
|
@ -79,11 +79,14 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
|
||||||
private final FindLocationForVirtualMachine findLocationForVirtualMachine;
|
private final FindLocationForVirtualMachine findLocationForVirtualMachine;
|
||||||
private final FindImageForVirtualMachine findImageForVirtualMachine;
|
private final FindImageForVirtualMachine findImageForVirtualMachine;
|
||||||
private final LoadingCache<Long, Set<IPForwardingRule>> getIPForwardingRulesByVirtualMachine;
|
private final LoadingCache<Long, Set<IPForwardingRule>> getIPForwardingRulesByVirtualMachine;
|
||||||
|
private final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
VirtualMachineToNodeMetadata(FindLocationForVirtualMachine findLocationForVirtualMachine,
|
VirtualMachineToNodeMetadata(FindLocationForVirtualMachine findLocationForVirtualMachine,
|
||||||
FindImageForVirtualMachine findImageForVirtualMachine,
|
FindImageForVirtualMachine findImageForVirtualMachine,
|
||||||
LoadingCache<Long, Set<IPForwardingRule>> getIPForwardingRulesByVirtualMachine) {
|
LoadingCache<Long, Set<IPForwardingRule>> getIPForwardingRulesByVirtualMachine,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.findLocationForVirtualMachine = checkNotNull(findLocationForVirtualMachine, "findLocationForVirtualMachine");
|
this.findLocationForVirtualMachine = checkNotNull(findLocationForVirtualMachine, "findLocationForVirtualMachine");
|
||||||
this.findImageForVirtualMachine = checkNotNull(findImageForVirtualMachine, "findImageForVirtualMachine");
|
this.findImageForVirtualMachine = checkNotNull(findImageForVirtualMachine, "findImageForVirtualMachine");
|
||||||
this.getIPForwardingRulesByVirtualMachine = checkNotNull(getIPForwardingRulesByVirtualMachine,
|
this.getIPForwardingRulesByVirtualMachine = checkNotNull(getIPForwardingRulesByVirtualMachine,
|
||||||
|
@ -104,7 +107,7 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
|
||||||
// on hosts not started with jclouds
|
// on hosts not started with jclouds
|
||||||
builder.hostname(from.getDisplayName());
|
builder.hostname(from.getDisplayName());
|
||||||
builder.location(findLocationForVirtualMachine.apply(from));
|
builder.location(findLocationForVirtualMachine.apply(from));
|
||||||
builder.group(parseGroupFromName(from.getDisplayName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getDisplayName()));
|
||||||
Image image = findImageForVirtualMachine.apply(from);
|
Image image = findImageForVirtualMachine.apply(from);
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
builder.imageId(image.getId());
|
builder.imageId(image.getId());
|
||||||
|
|
|
@ -37,6 +37,7 @@ 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.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.date.internal.SimpleDateFormatDateService;
|
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;
|
||||||
|
@ -48,6 +49,7 @@ import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.cache.CacheLoader;
|
import com.google.common.cache.CacheLoader;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole, Andrei Savu
|
* @author Adrian Cole, Andrei Savu
|
||||||
|
@ -55,6 +57,8 @@ import com.google.common.collect.Iterables;
|
||||||
@Test(groups = "unit", testName = "VirtualMachineToNodeMetadataTest")
|
@Test(groups = "unit", testName = "VirtualMachineToNodeMetadataTest")
|
||||||
public class VirtualMachineToNodeMetadataTest {
|
public class VirtualMachineToNodeMetadataTest {
|
||||||
|
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testApplyWhereVirtualMachineWithIPForwardingRule() throws UnknownHostException {
|
public void testApplyWhereVirtualMachineWithIPForwardingRule() throws UnknownHostException {
|
||||||
|
|
||||||
|
@ -73,7 +77,7 @@ public class VirtualMachineToNodeMetadataTest {
|
||||||
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());
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), namingConvention);
|
||||||
|
|
||||||
// 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);
|
||||||
|
@ -82,7 +86,7 @@ public class VirtualMachineToNodeMetadataTest {
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
node.toString(),
|
node.toString(),
|
||||||
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3")
|
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3-54")
|
||||||
.location(ZoneToLocationTest.one).state(NodeState.PENDING).hostname("i-3-54-VM")
|
.location(ZoneToLocationTest.one).state(NodeState.PENDING).hostname("i-3-54-VM")
|
||||||
.privateAddresses(ImmutableSet.of("10.1.1.18")).publicAddresses(ImmutableSet.of("1.1.1.1"))
|
.privateAddresses(ImmutableSet.of("10.1.1.18")).publicAddresses(ImmutableSet.of("1.1.1.1"))
|
||||||
.hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
|
.hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
|
||||||
|
@ -109,7 +113,7 @@ public class VirtualMachineToNodeMetadataTest {
|
||||||
return ImmutableSet.of();
|
return ImmutableSet.of();
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), namingConvention);
|
||||||
|
|
||||||
VirtualMachine guest =VirtualMachine.builder()
|
VirtualMachine guest =VirtualMachine.builder()
|
||||||
.id(54)
|
.id(54)
|
||||||
|
@ -145,7 +149,7 @@ public class VirtualMachineToNodeMetadataTest {
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
node.toString(),
|
node.toString(),
|
||||||
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3")
|
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3-54")
|
||||||
.location(ZoneToLocationTest.one).state(NodeState.PENDING).hostname("i-3-54-VM")
|
.location(ZoneToLocationTest.one).state(NodeState.PENDING).hostname("i-3-54-VM")
|
||||||
.privateAddresses(ImmutableSet.<String>of())
|
.privateAddresses(ImmutableSet.<String>of())
|
||||||
.publicAddresses(ImmutableSet.<String>of("1.1.1.5"))
|
.publicAddresses(ImmutableSet.<String>of("1.1.1.5"))
|
||||||
|
@ -172,7 +176,7 @@ public class VirtualMachineToNodeMetadataTest {
|
||||||
throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0);
|
throw new ResourceNotFoundException("no ip forwarding rule for: " + arg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}), namingConvention);
|
||||||
|
|
||||||
// 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);
|
||||||
|
@ -181,7 +185,7 @@ public class VirtualMachineToNodeMetadataTest {
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(
|
||||||
node.toString(),
|
node.toString(),
|
||||||
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3")
|
new NodeMetadataBuilder().id("54").providerId("54").name("i-3-54-VM").group("i-3-54")
|
||||||
.location(ZoneToLocationTest.one).state(NodeState.PENDING).hostname("i-3-54-VM")
|
.location(ZoneToLocationTest.one).state(NodeState.PENDING).hostname("i-3-54-VM")
|
||||||
.privateAddresses(ImmutableSet.of("10.1.1.18"))
|
.privateAddresses(ImmutableSet.of("10.1.1.18"))
|
||||||
.hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
|
.hardware(addHypervisor(ServiceOfferingToHardwareTest.one, "XenServer"))
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.deltacloud.compute.functions;
|
package org.jclouds.deltacloud.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
@ -37,6 +36,7 @@ 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.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.deltacloud.domain.Instance;
|
import org.jclouds.deltacloud.domain.Instance;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
|
@ -67,6 +67,7 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
|
||||||
protected final Supplier<Set<? extends Location>> locations;
|
protected final Supplier<Set<? extends Location>> locations;
|
||||||
protected final Supplier<Set<? extends Image>> images;
|
protected final Supplier<Set<? extends Image>> images;
|
||||||
protected final Supplier<Set<? extends Hardware>> hardwares;
|
protected final Supplier<Set<? extends Hardware>> hardwares;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
private static class FindImageForInstance implements Predicate<Image> {
|
private static class FindImageForInstance implements Predicate<Image> {
|
||||||
private final Instance instance;
|
private final Instance instance;
|
||||||
|
@ -136,7 +137,9 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
InstanceToNodeMetadata(@Memoized Supplier<Set<? extends Location>> locations,
|
InstanceToNodeMetadata(@Memoized Supplier<Set<? extends Location>> locations,
|
||||||
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares) {
|
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
this.locations = checkNotNull(locations, "locations");
|
this.locations = checkNotNull(locations, "locations");
|
||||||
this.hardwares = checkNotNull(hardwares, "hardwares");
|
this.hardwares = checkNotNull(hardwares, "hardwares");
|
||||||
|
@ -148,7 +151,7 @@ public class InstanceToNodeMetadata implements Function<Instance, NodeMetadata>
|
||||||
builder.ids(from.getHref().toASCIIString());
|
builder.ids(from.getHref().toASCIIString());
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.location(parseLocation(from));
|
builder.location(parseLocation(from));
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.imageId(from.getImage().toASCIIString());
|
builder.imageId(from.getImage().toASCIIString());
|
||||||
builder.operatingSystem(parseOperatingSystem(from));
|
builder.operatingSystem(parseOperatingSystem(from));
|
||||||
builder.hardware(parseHardware(from));
|
builder.hardware(parseHardware(from));
|
||||||
|
|
|
@ -36,7 +36,7 @@ import com.google.common.base.Supplier;
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit", testName = "CreateUniqueKeyPairTest")
|
||||||
public class CreateUniqueKeyPairTest {
|
public class CreateUniqueKeyPairTest {
|
||||||
@SuppressWarnings( { "unchecked" })
|
@SuppressWarnings( { "unchecked" })
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.elasticstack.compute.functions;
|
package org.jclouds.elasticstack.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -39,6 +38,7 @@ import org.jclouds.compute.domain.NodeState;
|
||||||
import org.jclouds.compute.domain.Processor;
|
import org.jclouds.compute.domain.Processor;
|
||||||
import org.jclouds.compute.domain.Volume;
|
import org.jclouds.compute.domain.Volume;
|
||||||
import org.jclouds.compute.domain.VolumeBuilder;
|
import org.jclouds.compute.domain.VolumeBuilder;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.elasticstack.domain.Device;
|
import org.jclouds.elasticstack.domain.Device;
|
||||||
import org.jclouds.elasticstack.domain.DriveInfo;
|
import org.jclouds.elasticstack.domain.DriveInfo;
|
||||||
|
@ -74,10 +74,13 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
|
||||||
private final Function<String, Image> findImageForId;
|
private final Function<String, Image> findImageForId;
|
||||||
private final Supplier<Location> locationSupplier;
|
private final Supplier<Location> locationSupplier;
|
||||||
private final Function<Device, Volume> deviceToVolume;
|
private final Function<Device, Volume> deviceToVolume;
|
||||||
|
private final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ServerInfoToNodeMetadata(Function<Server, String> getImageIdFromServer, Function<String, Image> findImageForId,
|
ServerInfoToNodeMetadata(Function<Server, String> getImageIdFromServer, Function<String, Image> findImageForId,
|
||||||
Function<Device, Volume> deviceToVolume, Supplier<Location> locationSupplier) {
|
Function<Device, Volume> deviceToVolume, Supplier<Location> locationSupplier,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier");
|
this.locationSupplier = checkNotNull(locationSupplier, "locationSupplier");
|
||||||
this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume");
|
this.deviceToVolume = checkNotNull(deviceToVolume, "deviceToVolume");
|
||||||
this.findImageForId = checkNotNull(findImageForId, "findImageForId");
|
this.findImageForId = checkNotNull(findImageForId, "findImageForId");
|
||||||
|
@ -91,7 +94,7 @@ public class ServerInfoToNodeMetadata implements Function<ServerInfo, NodeMetada
|
||||||
builder.ids(from.getUuid());
|
builder.ids(from.getUuid());
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.location(locationSupplier.get());
|
builder.location(locationSupplier.get());
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
|
|
||||||
String imageId = getImageIdFromServer.apply(from);
|
String imageId = getImageIdFromServer.apply(from);
|
||||||
if (imageId != null) {
|
if (imageId != null) {
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.openstack.nova.compute.functions;
|
package org.jclouds.openstack.nova.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
@ -36,6 +35,7 @@ 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.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
|
@ -63,6 +63,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
protected final Map<ServerStatus, NodeState> serverToNodeState;
|
protected final Map<ServerStatus, NodeState> serverToNodeState;
|
||||||
protected final Supplier<Set<? extends Image>> images;
|
protected final Supplier<Set<? extends Image>> images;
|
||||||
protected final Supplier<Set<? extends Hardware>> hardwares;
|
protected final Supplier<Set<? extends Hardware>> hardwares;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
private static class FindImageForServer implements Predicate<Image> {
|
private static class FindImageForServer implements Predicate<Image> {
|
||||||
private final Server instance;
|
private final Server instance;
|
||||||
|
@ -93,7 +94,9 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
@Inject
|
@Inject
|
||||||
ServerToNodeMetadata(Map<ServerStatus, NodeState> serverStateToNodeState,
|
ServerToNodeMetadata(Map<ServerStatus, NodeState> serverStateToNodeState,
|
||||||
@Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location,
|
@Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location,
|
||||||
@Memoized Supplier<Set<? extends Hardware>> hardwares) {
|
@Memoized Supplier<Set<? extends Hardware>> hardwares,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
this.serverToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
this.location = checkNotNull(location, "location");
|
this.location = checkNotNull(location, "location");
|
||||||
|
@ -108,7 +111,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
builder.location(new LocationBuilder().scope(LocationScope.HOST).id(from.getHostId()).description(
|
builder.location(new LocationBuilder().scope(LocationScope.HOST).id(from.getHostId()).description(
|
||||||
from.getHostId()).parent(location.get()).build());
|
from.getHostId()).parent(location.get()).build());
|
||||||
builder.userMetadata(from.getMetadata());
|
builder.userMetadata(from.getMetadata());
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
Image image = parseImage(from);
|
Image image = parseImage(from);
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
builder.imageId(image.getId());
|
builder.imageId(image.getId());
|
||||||
|
|
|
@ -37,6 +37,7 @@ import org.jclouds.compute.domain.OsFamily;
|
||||||
import org.jclouds.compute.domain.Processor;
|
import org.jclouds.compute.domain.Processor;
|
||||||
import org.jclouds.compute.domain.Volume;
|
import org.jclouds.compute.domain.Volume;
|
||||||
import org.jclouds.compute.domain.VolumeBuilder;
|
import org.jclouds.compute.domain.VolumeBuilder;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
|
@ -50,6 +51,7 @@ import com.google.common.base.Suppliers;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
@ -57,6 +59,7 @@ import com.google.common.collect.ImmutableSet;
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit")
|
||||||
public class ServerToNodeMetadataTest {
|
public class ServerToNodeMetadataTest {
|
||||||
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build();
|
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build();
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException, NoSuchMethodException,
|
public void testApplyWhereImageAndHardwareNotFound() throws UnknownHostException, NoSuchMethodException,
|
||||||
|
@ -68,7 +71,7 @@ public class ServerToNodeMetadataTest {
|
||||||
|
|
||||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
|
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
|
||||||
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
|
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
|
||||||
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(server);
|
NodeMetadata metadata = parser.apply(server);
|
||||||
|
|
||||||
|
@ -85,6 +88,7 @@ public class ServerToNodeMetadataTest {
|
||||||
.privateAddresses(ImmutableSet.of("10.176.42.16", "::babe:10.176.42.16"))
|
.privateAddresses(ImmutableSet.of("10.176.42.16", "::babe:10.176.42.16"))
|
||||||
.id("1234")
|
.id("1234")
|
||||||
.providerId("1234")
|
.providerId("1234")
|
||||||
|
.group("sample")
|
||||||
.name("sample-server")
|
.name("sample-server")
|
||||||
.location(
|
.location(
|
||||||
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
new LocationBuilder().scope(LocationScope.HOST).id("e4d909c290d0fb1ca068ffaddf22cbd0")
|
||||||
|
@ -104,7 +108,7 @@ public class ServerToNodeMetadataTest {
|
||||||
|
|
||||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
|
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
|
||||||
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
|
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
|
||||||
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(server);
|
NodeMetadata metadata = parser.apply(server);
|
||||||
|
|
||||||
|
@ -128,12 +132,13 @@ public class ServerToNodeMetadataTest {
|
||||||
|
|
||||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
|
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState,
|
||||||
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
|
Suppliers.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider),
|
||||||
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(server);
|
NodeMetadata metadata = parser.apply(server);
|
||||||
|
|
||||||
NodeMetadata constructedMetadata = newNodeMetadataBuilder()
|
NodeMetadata constructedMetadata = newNodeMetadataBuilder()
|
||||||
.imageId("2")
|
.imageId("2")
|
||||||
|
.group("sample")
|
||||||
.operatingSystem(
|
.operatingSystem(
|
||||||
new OperatingSystem.Builder().family(OsFamily.CENTOS).description("CentOS 5.2").version("5.2")
|
new OperatingSystem.Builder().family(OsFamily.CENTOS).description("CentOS 5.2").version("5.2")
|
||||||
.is64Bit(true).build())
|
.is64Bit(true).build())
|
||||||
|
|
|
@ -38,6 +38,7 @@ import org.jclouds.compute.domain.Hardware;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.TemplateBuilder;
|
import org.jclouds.compute.domain.TemplateBuilder;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.internal.BaseComputeService;
|
import org.jclouds.compute.internal.BaseComputeService;
|
||||||
import org.jclouds.compute.internal.PersistNodeCredentials;
|
import org.jclouds.compute.internal.PersistNodeCredentials;
|
||||||
import org.jclouds.compute.options.TemplateOptions;
|
import org.jclouds.compute.options.TemplateOptions;
|
||||||
|
@ -67,7 +68,6 @@ import org.jclouds.scriptbuilder.functions.InitAdminAccess;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Predicates;
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
@ -79,39 +79,41 @@ import com.google.common.collect.Multimap;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class NovaComputeService extends BaseComputeService {
|
public class NovaComputeService extends BaseComputeService {
|
||||||
private final NovaClient novaClient;
|
protected final NovaClient novaClient;
|
||||||
private final LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupMap;
|
protected final LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupMap;
|
||||||
private final LoadingCache<ZoneAndName, KeyPair> keyPairCache;
|
protected final LoadingCache<ZoneAndName, KeyPair> keyPairCache;
|
||||||
private final Function<Set<? extends NodeMetadata>, Multimap<String, String>> orphanedGroupsByZoneId;
|
protected final Function<Set<? extends NodeMetadata>, Multimap<String, String>> orphanedGroupsByZoneId;
|
||||||
|
protected final GroupNamingConvention.Factory namingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
protected NovaComputeService(ComputeServiceContext context, Map<String, Credentials> credentialStore,
|
protected NovaComputeService(ComputeServiceContext context, Map<String, Credentials> credentialStore,
|
||||||
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> sizes,
|
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> sizes,
|
||||||
@Memoized Supplier<Set<? extends Location>> locations, ListNodesStrategy listNodesStrategy,
|
@Memoized Supplier<Set<? extends Location>> locations, ListNodesStrategy listNodesStrategy,
|
||||||
GetNodeMetadataStrategy getNodeMetadataStrategy,
|
GetNodeMetadataStrategy getNodeMetadataStrategy, CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy,
|
||||||
CreateNodesInGroupThenAddToSet runNodesAndAddToSetStrategy, RebootNodeStrategy rebootNodeStrategy,
|
RebootNodeStrategy rebootNodeStrategy, DestroyNodeStrategy destroyNodeStrategy,
|
||||||
DestroyNodeStrategy destroyNodeStrategy, ResumeNodeStrategy startNodeStrategy,
|
ResumeNodeStrategy startNodeStrategy, SuspendNodeStrategy stopNodeStrategy,
|
||||||
SuspendNodeStrategy stopNodeStrategy, Provider<TemplateBuilder> templateBuilderProvider,
|
Provider<TemplateBuilder> templateBuilderProvider, Provider<TemplateOptions> templateOptionsProvider,
|
||||||
Provider<TemplateOptions> templateOptionsProvider,
|
@Named("NODE_RUNNING") Predicate<AtomicReference<NodeMetadata>> nodeRunning,
|
||||||
@Named("NODE_RUNNING") Predicate<AtomicReference<NodeMetadata>> nodeRunning,
|
@Named("NODE_TERMINATED") Predicate<AtomicReference<NodeMetadata>> nodeTerminated,
|
||||||
@Named("NODE_TERMINATED") Predicate<AtomicReference<NodeMetadata>> nodeTerminated,
|
@Named("NODE_SUSPENDED") Predicate<AtomicReference<NodeMetadata>> nodeSuspended,
|
||||||
@Named("NODE_SUSPENDED") Predicate<AtomicReference<NodeMetadata>> nodeSuspended,
|
InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory,
|
||||||
InitializeRunScriptOnNodeOrPlaceInBadMap.Factory initScriptRunnerFactory,
|
RunScriptOnNode.Factory runScriptOnNodeFactory, InitAdminAccess initAdminAccess,
|
||||||
RunScriptOnNode.Factory runScriptOnNodeFactory, InitAdminAccess initAdminAccess,
|
PersistNodeCredentials persistNodeCredentials, Timeouts timeouts,
|
||||||
PersistNodeCredentials persistNodeCredentials, Timeouts timeouts,
|
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, NovaClient novaClient,
|
||||||
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, NovaClient novaClient,
|
LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupMap,
|
||||||
LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupMap,
|
LoadingCache<ZoneAndName, KeyPair> keyPairCache,
|
||||||
LoadingCache<ZoneAndName, KeyPair> keyPairCache,
|
Function<Set<? extends NodeMetadata>, Multimap<String, String>> orphanedGroupsByZoneId,
|
||||||
Function<Set<? extends NodeMetadata>, Multimap<String, String>> orphanedGroupsByZoneId) {
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy,
|
super(context, credentialStore, images, sizes, locations, listNodesStrategy, getNodeMetadataStrategy,
|
||||||
runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, startNodeStrategy,
|
runNodesAndAddToSetStrategy, rebootNodeStrategy, destroyNodeStrategy, startNodeStrategy, stopNodeStrategy,
|
||||||
stopNodeStrategy, templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated,
|
templateBuilderProvider, templateOptionsProvider, nodeRunning, nodeTerminated, nodeSuspended,
|
||||||
nodeSuspended, initScriptRunnerFactory, initAdminAccess, runScriptOnNodeFactory, persistNodeCredentials,
|
initScriptRunnerFactory, initAdminAccess, runScriptOnNodeFactory, persistNodeCredentials, timeouts,
|
||||||
timeouts, executor);
|
executor);
|
||||||
this.novaClient = checkNotNull(novaClient, "novaClient");
|
this.novaClient = checkNotNull(novaClient, "novaClient");
|
||||||
this.securityGroupMap = checkNotNull(securityGroupMap, "securityGroupMap");
|
this.securityGroupMap = checkNotNull(securityGroupMap, "securityGroupMap");
|
||||||
this.keyPairCache = checkNotNull(keyPairCache, "keyPairCache");
|
this.keyPairCache = checkNotNull(keyPairCache, "keyPairCache");
|
||||||
this.orphanedGroupsByZoneId = checkNotNull(orphanedGroupsByZoneId, "orphanedGroupsByZoneId");
|
this.orphanedGroupsByZoneId = checkNotNull(orphanedGroupsByZoneId, "orphanedGroupsByZoneId");
|
||||||
|
this.namingConvention = checkNotNull(namingConvention, "namingConvention");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -132,7 +134,7 @@ public class NovaComputeService extends BaseComputeService {
|
||||||
if (securityGroupClient.isPresent()) {
|
if (securityGroupClient.isPresent()) {
|
||||||
for (String group : groups) {
|
for (String group : groups) {
|
||||||
for (SecurityGroup securityGroup : Iterables.filter(securityGroupClient.get().listSecurityGroups(),
|
for (SecurityGroup securityGroup : Iterables.filter(securityGroupClient.get().listSecurityGroups(),
|
||||||
SecurityGroupPredicates.nameEquals("jclouds_" + group))) {
|
SecurityGroupPredicates.nameMatches(namingConvention.create().containsGroup(group)))) {
|
||||||
ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, securityGroup.getName());
|
ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, securityGroup.getName());
|
||||||
logger.debug(">> deleting securityGroup(%s)", zoneAndName);
|
logger.debug(">> deleting securityGroup(%s)", zoneAndName);
|
||||||
securityGroupClient.get().deleteSecurityGroup(securityGroup.getId());
|
securityGroupClient.get().deleteSecurityGroup(securityGroup.getId());
|
||||||
|
@ -143,16 +145,14 @@ public class NovaComputeService extends BaseComputeService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cleanupOrphanedKeyPairsInZone(Set<String> groups, String zoneId) {
|
private void cleanupOrphanedKeyPairsInZone(Set<String> groups, String zoneId) {
|
||||||
Optional<KeyPairClient> keyPairClient = novaClient.getKeyPairExtensionForZone(zoneId);
|
Optional<KeyPairClient> keyPairClient = novaClient.getKeyPairExtensionForZone(zoneId);
|
||||||
if (keyPairClient.isPresent()) {
|
if (keyPairClient.isPresent()) {
|
||||||
for (String group : groups) {
|
for (String group : groups) {
|
||||||
for (Map<String, KeyPair> wrapper : keyPairClient.get().listKeyPairs()) {
|
for (Map<String, KeyPair> wrapper : keyPairClient.get().listKeyPairs()) {
|
||||||
for (KeyPair pair : Iterables.filter(
|
for (KeyPair pair : Iterables.filter(wrapper.values(),
|
||||||
wrapper.values(),
|
KeyPairPredicates.nameMatches(namingConvention.create().containsGroup(group)))) {
|
||||||
Predicates.or(KeyPairPredicates.nameStartsWith("jclouds_" + group + "_"),
|
|
||||||
KeyPairPredicates.nameEquals("jclouds_" + group)))) {
|
|
||||||
ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, pair.getName());
|
ZoneAndName zoneAndName = ZoneAndName.fromZoneAndName(zoneId, pair.getName());
|
||||||
logger.debug(">> deleting keypair(%s)", zoneAndName);
|
logger.debug(">> deleting keypair(%s)", zoneAndName);
|
||||||
keyPairClient.get().deleteKeyPair(pair.getName());
|
keyPairClient.get().deleteKeyPair(pair.getName());
|
||||||
|
@ -161,7 +161,8 @@ public class NovaComputeService extends BaseComputeService {
|
||||||
logger.debug("<< deleted keypair(%s)", zoneAndName);
|
logger.debug("<< deleted keypair(%s)", zoneAndName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
keyPairCache.invalidate(ZoneAndName.fromZoneAndName(zoneId, "jclouds_" + group));
|
keyPairCache.invalidate(ZoneAndName.fromZoneAndName(zoneId,
|
||||||
|
namingConvention.create().sharedNameForGroup(group)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@ import static org.jclouds.openstack.nova.v1_1.config.NovaProperties.AUTO_ALLOCAT
|
||||||
import static org.jclouds.openstack.nova.v1_1.config.NovaProperties.AUTO_GENERATE_KEYPAIRS;
|
import static org.jclouds.openstack.nova.v1_1.config.NovaProperties.AUTO_GENERATE_KEYPAIRS;
|
||||||
import static org.jclouds.openstack.nova.v1_1.config.NovaProperties.TIMEOUT_SECURITYGROUP_PRESENT;
|
import static org.jclouds.openstack.nova.v1_1.config.NovaProperties.TIMEOUT_SECURITYGROUP_PRESENT;
|
||||||
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -50,13 +49,12 @@ import org.jclouds.openstack.nova.v1_1.NovaClient;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.NovaComputeService;
|
import org.jclouds.openstack.nova.v1_1.compute.NovaComputeService;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.NovaComputeServiceAdapter;
|
import org.jclouds.openstack.nova.v1_1.compute.NovaComputeServiceAdapter;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.functions.CreateSecurityGroupIfNeeded;
|
import org.jclouds.openstack.nova.v1_1.compute.functions.CreateSecurityGroupIfNeeded;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.functions.CreateUniqueKeyPair;
|
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.functions.FlavorInZoneToHardware;
|
import org.jclouds.openstack.nova.v1_1.compute.functions.FlavorInZoneToHardware;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.functions.ImageInZoneToImage;
|
import org.jclouds.openstack.nova.v1_1.compute.functions.ImageInZoneToImage;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.functions.ImageToOperatingSystem;
|
import org.jclouds.openstack.nova.v1_1.compute.functions.ImageToOperatingSystem;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.functions.OrphanedGroupsByZoneId;
|
import org.jclouds.openstack.nova.v1_1.compute.functions.OrphanedGroupsByZoneId;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.functions.ServerInZoneToNodeMetadata;
|
import org.jclouds.openstack.nova.v1_1.compute.functions.ServerInZoneToNodeMetadata;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.loaders.FindKeyPairOrCreate;
|
import org.jclouds.openstack.nova.v1_1.compute.loaders.CreateUniqueKeyPair;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.loaders.FindSecurityGroupOrCreate;
|
import org.jclouds.openstack.nova.v1_1.compute.loaders.FindSecurityGroupOrCreate;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.loaders.LoadFloatingIpsForInstance;
|
import org.jclouds.openstack.nova.v1_1.compute.loaders.LoadFloatingIpsForInstance;
|
||||||
import org.jclouds.openstack.nova.v1_1.compute.options.NovaTemplateOptions;
|
import org.jclouds.openstack.nova.v1_1.compute.options.NovaTemplateOptions;
|
||||||
|
@ -141,11 +139,8 @@ public class NovaComputeServiceContextModule
|
||||||
bind(CreateNodesWithGroupEncodedIntoNameThenAddToSet.class).to(
|
bind(CreateNodesWithGroupEncodedIntoNameThenAddToSet.class).to(
|
||||||
ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.class);
|
ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.class);
|
||||||
|
|
||||||
bind(new TypeLiteral<Function<ZoneAndName, KeyPair>>() {
|
|
||||||
}).to(CreateUniqueKeyPair.class);
|
|
||||||
|
|
||||||
bind(new TypeLiteral<CacheLoader<ZoneAndName, KeyPair>>() {
|
bind(new TypeLiteral<CacheLoader<ZoneAndName, KeyPair>>() {
|
||||||
}).to(FindKeyPairOrCreate.class);
|
}).to(CreateUniqueKeyPair.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -194,20 +189,6 @@ public class NovaComputeServiceContextModule
|
||||||
return CacheBuilder.newBuilder().build(in);
|
return CacheBuilder.newBuilder().build(in);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Singleton
|
|
||||||
Supplier<String> provideSuffix() {
|
|
||||||
return new Supplier<String>() {
|
|
||||||
final SecureRandom random = new SecureRandom();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String get() {
|
|
||||||
return random.nextInt(100) + "";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
protected Supplier<Map<String, Location>> createLocationIndexedById(
|
protected Supplier<Map<String, Location>> createLocationIndexedById(
|
||||||
|
|
|
@ -24,7 +24,6 @@ import static com.google.common.collect.Iterables.concat;
|
||||||
import static com.google.common.collect.Iterables.filter;
|
import static com.google.common.collect.Iterables.filter;
|
||||||
import static com.google.common.collect.Iterables.find;
|
import static com.google.common.collect.Iterables.find;
|
||||||
import static com.google.common.collect.Iterables.transform;
|
import static com.google.common.collect.Iterables.transform;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -42,6 +41,7 @@ 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.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
|
@ -58,7 +58,8 @@ import com.google.common.base.Supplier;
|
||||||
import com.google.common.net.InetAddresses;
|
import com.google.common.net.InetAddresses;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A function for transforming a nova-specific Server into a generic NodeMetadata object.
|
* A function for transforming a nova-specific Server into a generic
|
||||||
|
* NodeMetadata object.
|
||||||
*
|
*
|
||||||
* @author Matt Stephenson, Adam Lowe, Adrian Cole
|
* @author Matt Stephenson, Adam Lowe, Adrian Cole
|
||||||
*/
|
*/
|
||||||
|
@ -70,10 +71,13 @@ public class ServerInZoneToNodeMetadata implements Function<ServerInZone, NodeMe
|
||||||
protected final Supplier<Map<String, Location>> locationIndex;
|
protected final Supplier<Map<String, Location>> locationIndex;
|
||||||
protected final Supplier<Set<? extends Image>> images;
|
protected final Supplier<Set<? extends Image>> images;
|
||||||
protected final Supplier<Set<? extends Hardware>> hardwares;
|
protected final Supplier<Set<? extends Hardware>> hardwares;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ServerInZoneToNodeMetadata(Supplier<Map<String, Location>> locationIndex,
|
public ServerInZoneToNodeMetadata(Supplier<Map<String, Location>> locationIndex,
|
||||||
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares) {
|
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.locationIndex = checkNotNull(locationIndex, "locationIndex");
|
this.locationIndex = checkNotNull(locationIndex, "locationIndex");
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
this.hardwares = checkNotNull(hardwares, "hardwares");
|
this.hardwares = checkNotNull(hardwares, "hardwares");
|
||||||
|
@ -91,17 +95,18 @@ public class ServerInZoneToNodeMetadata implements Function<ServerInZone, NodeMe
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.hostname(from.getName());
|
builder.hostname(from.getName());
|
||||||
builder.location(from.getHostId() != null ? new LocationBuilder().scope(LocationScope.HOST).id(from.getHostId())
|
builder.location(from.getHostId() != null ? new LocationBuilder().scope(LocationScope.HOST).id(from.getHostId())
|
||||||
.description(from.getHostId()).parent(zone).build() : zone);
|
.description(from.getHostId()).parent(zone).build() : zone);
|
||||||
builder.userMetadata(from.getMetadata());
|
builder.userMetadata(from.getMetadata());
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.imageId(ZoneAndId.fromZoneAndId(serverInZone.getZone(), from.getImage().getId()).slashEncode());
|
builder.imageId(ZoneAndId.fromZoneAndId(serverInZone.getZone(), from.getImage().getId()).slashEncode());
|
||||||
builder.operatingSystem(findOperatingSystemForServerOrNull(serverInZone));
|
builder.operatingSystem(findOperatingSystemForServerOrNull(serverInZone));
|
||||||
builder.hardware(findHardwareForServerOrNull(serverInZone));
|
builder.hardware(findHardwareForServerOrNull(serverInZone));
|
||||||
builder.state(from.getStatus().getNodeState());
|
builder.state(from.getStatus().getNodeState());
|
||||||
builder.publicAddresses(filter(transform(concat(from.getPublicAddresses(), from.getInternetAddresses()),
|
builder.publicAddresses(filter(
|
||||||
AddressToStringTransformationFunction.INSTANCE), isInet4Address));
|
transform(concat(from.getPublicAddresses(), from.getInternetAddresses()),
|
||||||
builder.privateAddresses(filter(transform(from.getPrivateAddresses(),
|
AddressToStringTransformationFunction.INSTANCE), isInet4Address));
|
||||||
AddressToStringTransformationFunction.INSTANCE), isInet4Address));
|
builder.privateAddresses(filter(
|
||||||
|
transform(from.getPrivateAddresses(), AddressToStringTransformationFunction.INSTANCE), isInet4Address));
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
@ -130,17 +135,17 @@ public class ServerInZoneToNodeMetadata implements Function<ServerInZone, NodeMe
|
||||||
|
|
||||||
protected Hardware findHardwareForServerOrNull(ServerInZone serverInZone) {
|
protected Hardware findHardwareForServerOrNull(ServerInZone serverInZone) {
|
||||||
return findObjectOfTypeForServerOrNull(hardwares.get(), "hardware", serverInZone.getServer().getFlavor().getId(),
|
return findObjectOfTypeForServerOrNull(hardwares.get(), "hardware", serverInZone.getServer().getFlavor().getId(),
|
||||||
serverInZone);
|
serverInZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected OperatingSystem findOperatingSystemForServerOrNull(ServerInZone serverInZone) {
|
protected OperatingSystem findOperatingSystemForServerOrNull(ServerInZone serverInZone) {
|
||||||
Image image = findObjectOfTypeForServerOrNull(images.get(), "image", serverInZone.getServer().getImage().getId(),
|
Image image = findObjectOfTypeForServerOrNull(images.get(), "image", serverInZone.getServer().getImage().getId(),
|
||||||
serverInZone);
|
serverInZone);
|
||||||
return (image != null) ? image.getOperatingSystem() : null;
|
return (image != null) ? image.getOperatingSystem() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends ComputeMetadata> T findObjectOfTypeForServerOrNull(Set<? extends T> supply, String type,
|
public <T extends ComputeMetadata> T findObjectOfTypeForServerOrNull(Set<? extends T> supply, String type,
|
||||||
final String objectId, final ZoneAndId serverInZone) {
|
final String objectId, final ZoneAndId serverInZone) {
|
||||||
try {
|
try {
|
||||||
return find(supply, new Predicate<T>() {
|
return find(supply, new Predicate<T>() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -16,59 +16,59 @@
|
||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.jclouds.openstack.nova.v1_1.compute.functions;
|
package org.jclouds.openstack.nova.v1_1.compute.loaders;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import com.google.common.base.Function;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import com.google.common.base.Optional;
|
|
||||||
import com.google.common.base.Supplier;
|
import javax.annotation.Resource;
|
||||||
|
import javax.inject.Named;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
import org.jclouds.openstack.nova.v1_1.NovaClient;
|
import org.jclouds.openstack.nova.v1_1.NovaClient;
|
||||||
import org.jclouds.openstack.nova.v1_1.domain.KeyPair;
|
import org.jclouds.openstack.nova.v1_1.domain.KeyPair;
|
||||||
import org.jclouds.openstack.nova.v1_1.domain.zonescoped.ZoneAndName;
|
import org.jclouds.openstack.nova.v1_1.domain.zonescoped.ZoneAndName;
|
||||||
import org.jclouds.openstack.nova.v1_1.extensions.KeyPairClient;
|
import org.jclouds.openstack.nova.v1_1.extensions.KeyPairClient;
|
||||||
import org.jclouds.openstack.nova.v1_1.extensions.SecurityGroupClient;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import com.google.common.base.Optional;
|
||||||
import javax.inject.Inject;
|
import com.google.common.cache.CacheLoader;
|
||||||
import javax.inject.Named;
|
import com.google.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adam Lowe
|
* @author Adam Lowe
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class CreateUniqueKeyPair implements Function<ZoneAndName, KeyPair> {
|
public class CreateUniqueKeyPair extends CacheLoader<ZoneAndName, KeyPair> {
|
||||||
@Resource
|
@Resource
|
||||||
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
||||||
protected Logger logger = Logger.NULL;
|
protected Logger logger = Logger.NULL;
|
||||||
protected final NovaClient novaClient;
|
protected final NovaClient novaClient;
|
||||||
protected final Supplier<String> randomSuffix;
|
protected final GroupNamingConvention.Factory namingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public CreateUniqueKeyPair(NovaClient novaClient, Supplier<String> randomSuffix) {
|
public CreateUniqueKeyPair(NovaClient novaClient, GroupNamingConvention.Factory namingConvention) {
|
||||||
this.novaClient = checkNotNull(novaClient, "novaClient");
|
this.novaClient = checkNotNull(novaClient, "novaClient");
|
||||||
this.randomSuffix = randomSuffix;
|
this.namingConvention = checkNotNull(namingConvention, "namingConvention");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public KeyPair apply(ZoneAndName zoneAndName) {
|
public KeyPair load(ZoneAndName zoneAndName) {
|
||||||
String zoneId = checkNotNull(zoneAndName, "zoneAndName").getZone();
|
String zoneId = checkNotNull(zoneAndName, "zoneAndName").getZone();
|
||||||
String prefix = zoneAndName.getName();
|
String prefix = zoneAndName.getName();
|
||||||
|
|
||||||
Optional<KeyPairClient> client = novaClient.getKeyPairExtensionForZone(zoneId);
|
Optional<KeyPairClient> client = novaClient.getKeyPairExtensionForZone(zoneId);
|
||||||
checkArgument(client.isPresent(), "Key pairs are required, but the extension is not available in zone %s!", zoneId);
|
checkArgument(client.isPresent(), "Key pairs are required, but the extension is not available in zone %s!",
|
||||||
|
zoneId);
|
||||||
|
|
||||||
logger.debug(">> creating keyPair zone(%s) prefix(%s)", zoneId, prefix);
|
logger.debug(">> creating keyPair zone(%s) prefix(%s)", zoneId, prefix);
|
||||||
|
|
||||||
KeyPair keyPair = null;
|
KeyPair keyPair = null;
|
||||||
while (keyPair == null) {
|
while (keyPair == null) {
|
||||||
try {
|
try {
|
||||||
keyPair = client.get().createKeyPair(getNextName(prefix));
|
keyPair = client.get().createKeyPair(namingConvention.createWithoutPrefix().uniqueNameForGroup(prefix));
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -78,10 +78,4 @@ public class CreateUniqueKeyPair implements Function<ZoneAndName, KeyPair> {
|
||||||
return keyPair;
|
return keyPair;
|
||||||
}
|
}
|
||||||
|
|
||||||
// nova cannot use hashes, else a hang on the console like this:
|
|
||||||
// Caught exception reading instance data:
|
|
||||||
// http://169.254.169.254/2009-04-04/meta-data/mpi/jclouds#hpcloud-computeblock#11
|
|
||||||
private String getNextName(String prefix) {
|
|
||||||
return String.format("%s_%s", prefix, randomSuffix.get());
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,54 +0,0 @@
|
||||||
/**
|
|
||||||
* 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.compute.loaders;
|
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
|
|
||||||
import javax.inject.Inject;
|
|
||||||
|
|
||||||
import org.jclouds.openstack.nova.v1_1.domain.KeyPair;
|
|
||||||
import org.jclouds.openstack.nova.v1_1.domain.zonescoped.ZoneAndName;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
|
||||||
import com.google.common.cache.CacheLoader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Adam Lowe
|
|
||||||
*/
|
|
||||||
public class FindKeyPairOrCreate extends CacheLoader<ZoneAndName, KeyPair> {
|
|
||||||
protected final Function<ZoneAndName, KeyPair> keypairCreator;
|
|
||||||
|
|
||||||
@Inject
|
|
||||||
public FindKeyPairOrCreate(
|
|
||||||
Function<ZoneAndName, KeyPair> keypairCreator) {
|
|
||||||
this.keypairCreator = checkNotNull(keypairCreator, "keypairCreator");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public KeyPair load(ZoneAndName in) {
|
|
||||||
// not retrieving KeyPairs from the server as the private key isn't returned
|
|
||||||
return keypairCreator.apply(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "returnExistingKeyPairInZoneOrCreateAsNeeded()";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -40,6 +40,7 @@ import org.jclouds.compute.config.CustomizationResponse;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.Template;
|
import org.jclouds.compute.domain.Template;
|
||||||
import org.jclouds.compute.domain.TemplateBuilder;
|
import org.jclouds.compute.domain.TemplateBuilder;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
|
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
|
||||||
import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
|
import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
|
||||||
import org.jclouds.compute.strategy.ListNodesStrategy;
|
import org.jclouds.compute.strategy.ListNodesStrategy;
|
||||||
|
@ -64,7 +65,7 @@ import com.google.common.primitives.Ints;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public class ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet extends
|
public class ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet extends
|
||||||
CreateNodesWithGroupEncodedIntoNameThenAddToSet {
|
CreateNodesWithGroupEncodedIntoNameThenAddToSet {
|
||||||
|
|
||||||
private final AllocateAndAddFloatingIpToNode allocateAndAddFloatingIpToNode;
|
private final AllocateAndAddFloatingIpToNode allocateAndAddFloatingIpToNode;
|
||||||
private final LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupCache;
|
private final LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupCache;
|
||||||
|
@ -74,28 +75,28 @@ public class ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddT
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
protected ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet(
|
protected ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet(
|
||||||
CreateNodeWithGroupEncodedIntoName addNodeWithTagStrategy,
|
CreateNodeWithGroupEncodedIntoName addNodeWithTagStrategy,
|
||||||
ListNodesStrategy listNodesStrategy,
|
ListNodesStrategy listNodesStrategy,
|
||||||
@Named("NAMING_CONVENTION") String nodeNamingConvention,
|
GroupNamingConvention.Factory namingConvention,
|
||||||
CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory,
|
CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory,
|
||||||
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor,
|
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor,
|
||||||
Provider<TemplateBuilder> templateBuilderProvider,
|
Provider<TemplateBuilder> templateBuilderProvider,
|
||||||
AllocateAndAddFloatingIpToNode allocateAndAddFloatingIpToNode,
|
AllocateAndAddFloatingIpToNode allocateAndAddFloatingIpToNode,
|
||||||
LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupCache,
|
LoadingCache<ZoneAndName, SecurityGroupInZone> securityGroupCache,
|
||||||
LoadingCache<ZoneAndName, KeyPair> keyPairCache, NovaClient novaClient) {
|
LoadingCache<ZoneAndName, KeyPair> keyPairCache, NovaClient novaClient) {
|
||||||
super(addNodeWithTagStrategy, listNodesStrategy, nodeNamingConvention, executor,
|
super(addNodeWithTagStrategy, listNodesStrategy, namingConvention, executor,
|
||||||
customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
|
customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
|
||||||
this.templateBuilderProvider = checkNotNull(templateBuilderProvider, "templateBuilderProvider");
|
this.templateBuilderProvider = checkNotNull(templateBuilderProvider, "templateBuilderProvider");
|
||||||
this.securityGroupCache = checkNotNull(securityGroupCache, "securityGroupCache");
|
this.securityGroupCache = checkNotNull(securityGroupCache, "securityGroupCache");
|
||||||
this.keyPairCache = checkNotNull(keyPairCache, "keyPairCache");
|
this.keyPairCache = checkNotNull(keyPairCache, "keyPairCache");
|
||||||
this.allocateAndAddFloatingIpToNode = checkNotNull(allocateAndAddFloatingIpToNode,
|
this.allocateAndAddFloatingIpToNode = checkNotNull(allocateAndAddFloatingIpToNode,
|
||||||
"allocateAndAddFloatingIpToNode");
|
"allocateAndAddFloatingIpToNode");
|
||||||
this.novaClient = checkNotNull(novaClient, "novaClient");
|
this.novaClient = checkNotNull(novaClient, "novaClient");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<?, Future<Void>> execute(String group, int count, Template template, Set<NodeMetadata> goodNodes,
|
public Map<?, Future<Void>> execute(String group, int count, Template template, Set<NodeMetadata> goodNodes,
|
||||||
Map<NodeMetadata, Exception> badNodes, Multimap<NodeMetadata, CustomizationResponse> customizationResponses) {
|
Map<NodeMetadata, Exception> badNodes, Multimap<NodeMetadata, CustomizationResponse> customizationResponses) {
|
||||||
// ensure we don't mutate the input template
|
// ensure we don't mutate the input template
|
||||||
Template mutableTemplate = templateBuilderProvider.get().fromTemplate(template).build();
|
Template mutableTemplate = templateBuilderProvider.get().fromTemplate(template).build();
|
||||||
NovaTemplateOptions templateOptions = NovaTemplateOptions.class.cast(mutableTemplate.getOptions());
|
NovaTemplateOptions templateOptions = NovaTemplateOptions.class.cast(mutableTemplate.getOptions());
|
||||||
|
@ -104,15 +105,15 @@ public class ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddT
|
||||||
|
|
||||||
if (templateOptions.shouldAutoAssignFloatingIp()) {
|
if (templateOptions.shouldAutoAssignFloatingIp()) {
|
||||||
checkArgument(novaClient.getFloatingIPExtensionForZone(zone).isPresent(),
|
checkArgument(novaClient.getFloatingIPExtensionForZone(zone).isPresent(),
|
||||||
"Floating IPs are required by options, but the extension is not available! options: %s",
|
"Floating IPs are required by options, but the extension is not available! options: %s", templateOptions);
|
||||||
templateOptions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean keyPairExensionPresent = novaClient.getKeyPairExtensionForZone(zone).isPresent();
|
boolean keyPairExensionPresent = novaClient.getKeyPairExtensionForZone(zone).isPresent();
|
||||||
if (templateOptions.shouldGenerateKeyPair()) {
|
if (templateOptions.shouldGenerateKeyPair()) {
|
||||||
checkArgument(keyPairExensionPresent,
|
checkArgument(keyPairExensionPresent,
|
||||||
"Key Pairs are required by options, but the extension is not available! options: %s", templateOptions);
|
"Key Pairs are required by options, but the extension is not available! options: %s", templateOptions);
|
||||||
KeyPair keyPair = keyPairCache.getUnchecked(ZoneAndName.fromZoneAndName(zone, "jclouds_" + group));
|
KeyPair keyPair = keyPairCache.getUnchecked(ZoneAndName.fromZoneAndName(zone, namingConvention.create()
|
||||||
|
.sharedNameForGroup(group)));
|
||||||
keyPairCache.asMap().put(ZoneAndName.fromZoneAndName(zone, keyPair.getName()), keyPair);
|
keyPairCache.asMap().put(ZoneAndName.fromZoneAndName(zone, keyPair.getName()), keyPair);
|
||||||
templateOptions.keyPairName(keyPair.getName());
|
templateOptions.keyPairName(keyPair.getName());
|
||||||
} else if (templateOptions.getKeyPairName() != null) {
|
} else if (templateOptions.getKeyPairName() != null) {
|
||||||
|
@ -130,10 +131,10 @@ public class ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddT
|
||||||
List<Integer> inboundPorts = Ints.asList(templateOptions.getInboundPorts());
|
List<Integer> inboundPorts = Ints.asList(templateOptions.getInboundPorts());
|
||||||
if (templateOptions.getSecurityGroupNames().size() > 0) {
|
if (templateOptions.getSecurityGroupNames().size() > 0) {
|
||||||
checkArgument(novaClient.getSecurityGroupExtensionForZone(zone).isPresent(),
|
checkArgument(novaClient.getSecurityGroupExtensionForZone(zone).isPresent(),
|
||||||
"Security groups are required by options, but the extension is not available! options: %s",
|
"Security groups are required by options, but the extension is not available! options: %s",
|
||||||
templateOptions);
|
templateOptions);
|
||||||
} else if (securityGroupExensionPresent && inboundPorts.size() > 0) {
|
} else if (securityGroupExensionPresent && inboundPorts.size() > 0) {
|
||||||
String securityGroupName = "jclouds_" + group;
|
String securityGroupName = namingConvention.create().sharedNameForGroup(group);
|
||||||
try {
|
try {
|
||||||
securityGroupCache.get(new ZoneSecurityGroupNameAndPorts(zone, securityGroupName, inboundPorts));
|
securityGroupCache.get(new ZoneSecurityGroupNameAndPorts(zone, securityGroupName, inboundPorts));
|
||||||
} catch (ExecutionException e) {
|
} catch (ExecutionException e) {
|
||||||
|
@ -147,7 +148,7 @@ public class ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddT
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Future<AtomicReference<NodeMetadata>> createNodeInGroupWithNameAndTemplate(String group,
|
protected Future<AtomicReference<NodeMetadata>> createNodeInGroupWithNameAndTemplate(String group,
|
||||||
final String name, Template template) {
|
final String name, Template template) {
|
||||||
|
|
||||||
Future<AtomicReference<NodeMetadata>> future = super.createNodeInGroupWithNameAndTemplate(group, name, template);
|
Future<AtomicReference<NodeMetadata>> future = super.createNodeInGroupWithNameAndTemplate(group, name, template);
|
||||||
NovaTemplateOptions templateOptions = NovaTemplateOptions.class.cast(template.getOptions());
|
NovaTemplateOptions templateOptions = NovaTemplateOptions.class.cast(template.getOptions());
|
||||||
|
|
|
@ -32,24 +32,25 @@ import com.google.common.base.Predicate;
|
||||||
|
|
||||||
public class KeyPairPredicates {
|
public class KeyPairPredicates {
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* matches name of the given keypair starts with the specified prefix
|
* matches name of the given key pair
|
||||||
*
|
*
|
||||||
* @param prefix the prefix you are looking for
|
* @param name
|
||||||
* @return the predicate
|
* @return predicate that matches name
|
||||||
*/
|
*/
|
||||||
public static Predicate<KeyPair> nameStartsWith(final String prefix) {
|
public static Predicate<KeyPair> nameMatches(final Predicate<String> name) {
|
||||||
checkNotNull(prefix, "name must be defined");
|
checkNotNull(name, "name must be defined");
|
||||||
|
|
||||||
return new Predicate<KeyPair>() {
|
return new Predicate<KeyPair>() {
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(KeyPair ext) {
|
public boolean apply(KeyPair ext) {
|
||||||
return ext.getName() != null && ext.getName().startsWith(prefix);
|
return name.apply(ext.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "nameStartsWith(" + prefix + ")";
|
return "nameMatches(" + name + ")";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ import com.google.common.base.Predicate;
|
||||||
public class SecurityGroupPredicates {
|
public class SecurityGroupPredicates {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* matches name of the given extension
|
* matches name of the given security group
|
||||||
*
|
*
|
||||||
* @param name
|
* @param name
|
||||||
* @return predicate that matches name
|
* @return predicate that matches name
|
||||||
|
@ -53,4 +53,26 @@ public class SecurityGroupPredicates {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* matches name of the given security group
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* @return predicate that matches name
|
||||||
|
*/
|
||||||
|
public static Predicate<SecurityGroup> nameMatches(final Predicate<String> name) {
|
||||||
|
checkNotNull(name, "name must be defined");
|
||||||
|
|
||||||
|
return new Predicate<SecurityGroup>() {
|
||||||
|
@Override
|
||||||
|
public boolean apply(SecurityGroup ext) {
|
||||||
|
return name.apply(ext.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "nameMatches(" + name + ")";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import java.util.Set;
|
||||||
import org.jclouds.compute.domain.Hardware;
|
import org.jclouds.compute.domain.Hardware;
|
||||||
import org.jclouds.compute.domain.Image;
|
import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
|
@ -41,6 +42,7 @@ import com.google.common.base.Suppliers;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableMultimap;
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -57,6 +59,8 @@ public class OrphanedGroupsByZoneIdTest {
|
||||||
Supplier<Map<String, Location>> locationIndex = Suppliers.<Map<String, Location>> ofInstance(ImmutableMap
|
Supplier<Map<String, Location>> locationIndex = Suppliers.<Map<String, Location>> ofInstance(ImmutableMap
|
||||||
.<String, Location> of("az-1.region-a.geo-1", zone));
|
.<String, Location> of("az-1.region-a.geo-1", zone));
|
||||||
|
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testWhenComputeServiceSaysAllNodesAreDeadBothGroupsAreReturned() {
|
public void testWhenComputeServiceSaysAllNodesAreDeadBothGroupsAreReturned() {
|
||||||
|
|
||||||
|
@ -65,7 +69,7 @@ public class OrphanedGroupsByZoneIdTest {
|
||||||
|
|
||||||
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex, Suppliers
|
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex, Suppliers
|
||||||
.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of()), Suppliers
|
.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of()), Suppliers
|
||||||
.<Set<? extends Hardware>> ofInstance(ImmutableSet.<Hardware> of()));
|
.<Set<? extends Hardware>> ofInstance(ImmutableSet.<Hardware> of()), namingConvention);
|
||||||
|
|
||||||
Set<? extends NodeMetadata> set = ImmutableSet.of(converter.apply(withHost), converter.apply(withoutHost));
|
Set<? extends NodeMetadata> set = ImmutableSet.of(converter.apply(withHost), converter.apply(withoutHost));
|
||||||
|
|
||||||
|
@ -81,7 +85,7 @@ public class OrphanedGroupsByZoneIdTest {
|
||||||
|
|
||||||
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex, Suppliers
|
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex, Suppliers
|
||||||
.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of()), Suppliers
|
.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of()), Suppliers
|
||||||
.<Set<? extends Hardware>> ofInstance(ImmutableSet.<Hardware> of()));
|
.<Set<? extends Hardware>> ofInstance(ImmutableSet.<Hardware> of()), namingConvention);
|
||||||
|
|
||||||
Set<? extends NodeMetadata> set = ImmutableSet.of(converter.apply(withHost), converter.apply(withoutHost));
|
Set<? extends NodeMetadata> set = ImmutableSet.of(converter.apply(withHost), converter.apply(withoutHost));
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@ import org.jclouds.compute.domain.ImageBuilder;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
import org.jclouds.compute.domain.OsFamily;
|
import org.jclouds.compute.domain.OsFamily;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
|
@ -44,62 +45,66 @@ import com.google.common.base.Supplier;
|
||||||
import com.google.common.base.Suppliers;
|
import com.google.common.base.Suppliers;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for the function for transforming a nova specific Server into a generic NodeMetadata
|
* Tests for the function for transforming a nova specific Server into a generic
|
||||||
* object.
|
* NodeMetadata object.
|
||||||
*
|
*
|
||||||
* @author Matt Stephenson, Adam Lowe, Adrian Cole
|
* @author Matt Stephenson, Adam Lowe, Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(testName = "ServerInZoneToNodeMetadataTest")
|
@Test(testName = "ServerInZoneToNodeMetadataTest")
|
||||||
public class ServerInZoneToNodeMetadataTest {
|
public class ServerInZoneToNodeMetadataTest {
|
||||||
|
|
||||||
Location provider = new LocationBuilder().scope(LocationScope.PROVIDER).id("openstack-nova").description(
|
Location provider = new LocationBuilder().scope(LocationScope.PROVIDER).id("openstack-nova")
|
||||||
"openstack-nova").build();
|
.description("openstack-nova").build();
|
||||||
Location zone = new LocationBuilder().id("az-1.region-a.geo-1").description("az-1.region-a.geo-1").scope(
|
Location zone = new LocationBuilder().id("az-1.region-a.geo-1").description("az-1.region-a.geo-1")
|
||||||
LocationScope.ZONE).parent(provider).build();
|
.scope(LocationScope.ZONE).parent(provider).build();
|
||||||
Supplier<Map<String, Location>> locationIndex = Suppliers.<Map<String, Location>> ofInstance(ImmutableMap
|
Supplier<Map<String, Location>> locationIndex = Suppliers.<Map<String, Location>> ofInstance(ImmutableMap
|
||||||
.<String, Location> of("az-1.region-a.geo-1", zone));
|
.<String, Location> of("az-1.region-a.geo-1", zone));
|
||||||
|
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testWhenNoHardwareOrImageMatchServerScopedIdsImageIdIsStillSet() {
|
public void testWhenNoHardwareOrImageMatchServerScopedIdsImageIdIsStillSet() {
|
||||||
|
|
||||||
Hardware existingHardware = new HardwareBuilder().id("az-1.region-a.geo-1/FOOOOOOOO").providerId("FOOOOOOOO")
|
Hardware existingHardware = new HardwareBuilder().id("az-1.region-a.geo-1/FOOOOOOOO").providerId("FOOOOOOOO")
|
||||||
.location(zone).build();
|
.location(zone).build();
|
||||||
Image existingImage = new ImageBuilder().id("az-1.region-a.geo-1/FOOOOOOOO").operatingSystem(
|
Image existingImage = new ImageBuilder().id("az-1.region-a.geo-1/FOOOOOOOO")
|
||||||
OperatingSystem.builder().family(OsFamily.LINUX).description("foobuntu").build())
|
.operatingSystem(OperatingSystem.builder().family(OsFamily.LINUX).description("foobuntu").build())
|
||||||
.providerId("FOOOOOOOO").description("foobuntu").location(zone).build();
|
.providerId("FOOOOOOOO").description("foobuntu").location(zone).build();
|
||||||
|
|
||||||
checkHardwareAndImageStatus(null, existingHardware, "az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f6f006e54",
|
checkHardwareAndImageStatus(null, existingHardware, "az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f6f006e54",
|
||||||
null, existingImage);
|
null, existingImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testWhenNoHardwareAndImageMatchServerScopedIdsHardwareOperatingSystemAndImageIdAreSet() {
|
public void testWhenNoHardwareAndImageMatchServerScopedIdsHardwareOperatingSystemAndImageIdAreSet() {
|
||||||
|
|
||||||
Hardware existingHardware = new HardwareBuilder().id("az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f216543fd")
|
Hardware existingHardware = new HardwareBuilder().id("az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f216543fd")
|
||||||
.providerId("52415800-8b69-11e0-9b19-734f216543fd").location(zone).build();
|
.providerId("52415800-8b69-11e0-9b19-734f216543fd").location(zone).build();
|
||||||
Image existingImage = new ImageBuilder().id("az-1.region-a.geo-1/52415800-8b69-11e0-9b19-734f6f006e54")
|
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())
|
.operatingSystem(OperatingSystem.builder().family(OsFamily.LINUX).description("foobuntu").build())
|
||||||
.providerId("52415800-8b69-11e0-9b19-734f6f006e54").description("foobuntu").location(zone).build();
|
.providerId("52415800-8b69-11e0-9b19-734f6f006e54").description("foobuntu").location(zone).build();
|
||||||
|
|
||||||
checkHardwareAndImageStatus(existingHardware, existingHardware, existingImage.getId(), existingImage
|
checkHardwareAndImageStatus(existingHardware, existingHardware, existingImage.getId(),
|
||||||
.getOperatingSystem(), existingImage);
|
existingImage.getOperatingSystem(), existingImage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: clean up this syntax
|
// TODO: clean up this syntax
|
||||||
private void checkHardwareAndImageStatus(Hardware expectedHardware, Hardware existingHardware,
|
private void checkHardwareAndImageStatus(Hardware expectedHardware, Hardware existingHardware,
|
||||||
String expectedImageId, OperatingSystem expectedOs, Image existingImage) {
|
String expectedImageId, OperatingSystem expectedOs, Image existingImage) {
|
||||||
|
|
||||||
Set<Image> images = existingImage == null ? ImmutableSet.<Image> of() : ImmutableSet.of(existingImage);
|
Set<Image> images = existingImage == null ? ImmutableSet.<Image> of() : ImmutableSet.of(existingImage);
|
||||||
Set<Hardware> hardwares = existingHardware == null ? ImmutableSet.<Hardware> of() : ImmutableSet
|
Set<Hardware> hardwares = existingHardware == null ? ImmutableSet.<Hardware> of() : ImmutableSet
|
||||||
.of(existingHardware);
|
.of(existingHardware);
|
||||||
Server serverToConvert = new ParseServerTest().expected();
|
Server serverToConvert = new ParseServerTest().expected();
|
||||||
|
|
||||||
ServerInZone serverInZoneToConvert = new ServerInZone(serverToConvert, "az-1.region-a.geo-1");
|
ServerInZone serverInZoneToConvert = new ServerInZone(serverToConvert, "az-1.region-a.geo-1");
|
||||||
|
|
||||||
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex, Suppliers
|
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex,
|
||||||
.<Set<? extends Image>> ofInstance(images), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
Suppliers.<Set<? extends Image>> ofInstance(images),
|
||||||
|
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata convertedNodeMetadata = converter.apply(serverInZoneToConvert);
|
NodeMetadata convertedNodeMetadata = converter.apply(serverInZoneToConvert);
|
||||||
|
|
||||||
|
@ -129,8 +134,8 @@ public class ServerInZoneToNodeMetadataTest {
|
||||||
assertEquals(convertedNodeMetadata.getPublicAddresses(), ImmutableSet.of("67.23.10.132", "67.23.10.131"));
|
assertEquals(convertedNodeMetadata.getPublicAddresses(), ImmutableSet.of("67.23.10.132", "67.23.10.131"));
|
||||||
|
|
||||||
assertNotNull(convertedNodeMetadata.getUserMetadata());
|
assertNotNull(convertedNodeMetadata.getUserMetadata());
|
||||||
assertEquals(convertedNodeMetadata.getUserMetadata(), ImmutableMap.<String, String> of("Server Label",
|
assertEquals(convertedNodeMetadata.getUserMetadata(),
|
||||||
"Web Head 1", "Image Version", "2.1"));
|
ImmutableMap.<String, String> of("Server Label", "Web Head 1", "Image Version", "2.1"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -143,9 +148,9 @@ public class ServerInZoneToNodeMetadataTest {
|
||||||
|
|
||||||
ServerInZone serverInZoneToConvert = new ServerInZone(serverToConvert, "az-1.region-a.geo-1");
|
ServerInZone serverInZoneToConvert = new ServerInZone(serverToConvert, "az-1.region-a.geo-1");
|
||||||
|
|
||||||
|
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex,
|
||||||
ServerInZoneToNodeMetadata converter = new ServerInZoneToNodeMetadata(locationIndex, Suppliers
|
Suppliers.<Set<? extends Image>> ofInstance(images),
|
||||||
.<Set<? extends Image>> ofInstance(images), Suppliers.<Set<? extends Hardware>> ofInstance(hardwares));
|
Suppliers.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata convertedNodeMetadata = converter.apply(serverInZoneToConvert);
|
NodeMetadata convertedNodeMetadata = converter.apply(serverInZoneToConvert);
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.jclouds.openstack.nova.v1_1.compute.functions;
|
package org.jclouds.openstack.nova.v1_1.compute.loaders;
|
||||||
|
|
||||||
import static org.easymock.EasyMock.createMock;
|
import static org.easymock.EasyMock.createMock;
|
||||||
import static org.easymock.EasyMock.expect;
|
import static org.easymock.EasyMock.expect;
|
||||||
|
@ -27,6 +27,7 @@ import static org.testng.Assert.assertEquals;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
|
||||||
import org.jclouds.openstack.nova.v1_1.NovaClient;
|
import org.jclouds.openstack.nova.v1_1.NovaClient;
|
||||||
|
import org.jclouds.openstack.nova.v1_1.compute.loaders.CreateUniqueKeyPair;
|
||||||
import org.jclouds.openstack.nova.v1_1.domain.KeyPair;
|
import org.jclouds.openstack.nova.v1_1.domain.KeyPair;
|
||||||
import org.jclouds.openstack.nova.v1_1.domain.zonescoped.ZoneAndName;
|
import org.jclouds.openstack.nova.v1_1.domain.zonescoped.ZoneAndName;
|
||||||
import org.jclouds.openstack.nova.v1_1.extensions.KeyPairClient;
|
import org.jclouds.openstack.nova.v1_1.extensions.KeyPairClient;
|
||||||
|
@ -34,65 +35,78 @@ import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.base.Suppliers;
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adam Lowe
|
* @author Adam Lowe
|
||||||
*/
|
*/
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit", testName = "CreateUniqueKeyPairTest")
|
||||||
public class CreateUniqueKeyPairTest {
|
public class CreateUniqueKeyPairTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testApply() throws UnknownHostException {
|
public void testApply() throws UnknownHostException {
|
||||||
NovaClient client = createMock(NovaClient.class);
|
final NovaClient client = createMock(NovaClient.class);
|
||||||
KeyPairClient keyClient = createMock(KeyPairClient.class);
|
KeyPairClient keyClient = createMock(KeyPairClient.class);
|
||||||
Supplier<String> uniqueIdSupplier = createMock(Supplier.class);
|
|
||||||
|
|
||||||
KeyPair pair = createMock(KeyPair.class);
|
KeyPair pair = createMock(KeyPair.class);
|
||||||
|
|
||||||
expect(client.getKeyPairExtensionForZone("zone")).andReturn(Optional.of(keyClient)).atLeastOnce();
|
expect(client.getKeyPairExtensionForZone("zone")).andReturn(Optional.of(keyClient)).atLeastOnce();
|
||||||
|
|
||||||
expect(uniqueIdSupplier.get()).andReturn("1");
|
expect(keyClient.createKeyPair("group-1")).andReturn(pair);
|
||||||
expect(keyClient.createKeyPair("group_1")).andReturn(pair);
|
|
||||||
|
|
||||||
replay(client);
|
replay(client, keyClient);
|
||||||
replay(keyClient);
|
|
||||||
replay(uniqueIdSupplier);
|
|
||||||
|
|
||||||
CreateUniqueKeyPair parser = new CreateUniqueKeyPair(client, uniqueIdSupplier);
|
CreateUniqueKeyPair parser = Guice.createInjector(new AbstractModule() {
|
||||||
|
|
||||||
assertEquals(parser.apply(ZoneAndName.fromZoneAndName("zone", "group")), pair);
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(new TypeLiteral<Supplier<String>>() {
|
||||||
|
}).toInstance(Suppliers.ofInstance("1"));
|
||||||
|
bind(NovaClient.class).toInstance(client);
|
||||||
|
}
|
||||||
|
|
||||||
verify(client);
|
}).getInstance(CreateUniqueKeyPair.class);
|
||||||
verify(keyClient);
|
|
||||||
verify(uniqueIdSupplier);
|
assertEquals(parser.load(ZoneAndName.fromZoneAndName("zone", "group")), pair);
|
||||||
|
|
||||||
|
verify(client, keyClient);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testApplyWithIllegalStateException() throws UnknownHostException {
|
public void testApplyWithIllegalStateException() throws UnknownHostException {
|
||||||
NovaClient client = createMock(NovaClient.class);
|
final NovaClient client = createMock(NovaClient.class);
|
||||||
KeyPairClient keyClient = createMock(KeyPairClient.class);
|
KeyPairClient keyClient = createMock(KeyPairClient.class);
|
||||||
Supplier<String> uniqueIdSupplier = createMock(Supplier.class);
|
@SuppressWarnings("unchecked")
|
||||||
|
final Supplier<String> uniqueIdSupplier = createMock(Supplier.class);
|
||||||
|
|
||||||
KeyPair pair = createMock(KeyPair.class);
|
KeyPair pair = createMock(KeyPair.class);
|
||||||
|
|
||||||
expect(client.getKeyPairExtensionForZone("zone")).andReturn(Optional.of(keyClient)).atLeastOnce();
|
expect(client.getKeyPairExtensionForZone("zone")).andReturn(Optional.of(keyClient)).atLeastOnce();
|
||||||
|
|
||||||
expect(uniqueIdSupplier.get()).andReturn("1");
|
expect(uniqueIdSupplier.get()).andReturn("1");
|
||||||
expect(keyClient.createKeyPair("group_1")).andThrow(new IllegalStateException());
|
expect(keyClient.createKeyPair("group-1")).andThrow(new IllegalStateException());
|
||||||
expect(uniqueIdSupplier.get()).andReturn("2");
|
expect(uniqueIdSupplier.get()).andReturn("2");
|
||||||
expect(keyClient.createKeyPair("group_2")).andReturn(pair);
|
expect(keyClient.createKeyPair("group-2")).andReturn(pair);
|
||||||
|
|
||||||
replay(client);
|
replay(client, keyClient, uniqueIdSupplier);
|
||||||
replay(keyClient);
|
|
||||||
replay(uniqueIdSupplier);
|
|
||||||
|
|
||||||
CreateUniqueKeyPair parser = new CreateUniqueKeyPair(client, uniqueIdSupplier);
|
CreateUniqueKeyPair parser = Guice.createInjector(new AbstractModule() {
|
||||||
|
|
||||||
assertEquals(parser.apply(ZoneAndName.fromZoneAndName("zone", "group")), pair);
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(new TypeLiteral<Supplier<String>>() {
|
||||||
|
}).toInstance(uniqueIdSupplier);
|
||||||
|
bind(NovaClient.class).toInstance(client);
|
||||||
|
}
|
||||||
|
|
||||||
verify(client);
|
}).getInstance(CreateUniqueKeyPair.class);
|
||||||
verify(keyClient);
|
|
||||||
verify(uniqueIdSupplier);
|
assertEquals(parser.load(ZoneAndName.fromZoneAndName("zone", "group")), pair);
|
||||||
|
|
||||||
|
verify(client, keyClient, uniqueIdSupplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -21,7 +21,6 @@ package org.jclouds.vcloud.compute.functions;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.base.Predicates.not;
|
import static com.google.common.base.Predicates.not;
|
||||||
import static com.google.common.collect.Iterables.filter;
|
import static com.google.common.collect.Iterables.filter;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom;
|
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getCredentialsFrom;
|
||||||
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getIpsFromVApp;
|
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.getIpsFromVApp;
|
||||||
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs;
|
import static org.jclouds.vcloud.compute.util.VCloudComputeUtils.toComputeOs;
|
||||||
|
@ -37,6 +36,7 @@ import org.jclouds.compute.domain.Hardware;
|
||||||
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.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Credentials;
|
import org.jclouds.domain.Credentials;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;
|
import org.jclouds.util.InetAddresses2.IsPrivateIPAddress;
|
||||||
|
@ -57,10 +57,13 @@ public class VAppToNodeMetadata implements Function<VApp, NodeMetadata> {
|
||||||
protected final Function<VApp, Hardware> hardwareForVApp;
|
protected final Function<VApp, Hardware> hardwareForVApp;
|
||||||
protected final Map<Status, NodeState> vAppStatusToNodeState;
|
protected final Map<Status, NodeState> vAppStatusToNodeState;
|
||||||
protected final Map<String, Credentials> credentialStore;
|
protected final Map<String, Credentials> credentialStore;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
protected VAppToNodeMetadata(Map<Status, NodeState> vAppStatusToNodeState, Map<String, Credentials> credentialStore,
|
protected VAppToNodeMetadata(Map<Status, NodeState> vAppStatusToNodeState, Map<String, Credentials> credentialStore,
|
||||||
FindLocationForResource findLocationForResourceInVDC, Function<VApp, Hardware> hardwareForVApp) {
|
FindLocationForResource findLocationForResourceInVDC, Function<VApp, Hardware> hardwareForVApp,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.hardwareForVApp = checkNotNull(hardwareForVApp, "hardwareForVApp");
|
this.hardwareForVApp = checkNotNull(hardwareForVApp, "hardwareForVApp");
|
||||||
this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC");
|
this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC");
|
||||||
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
|
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
|
||||||
|
@ -74,14 +77,14 @@ public class VAppToNodeMetadata implements Function<VApp, NodeMetadata> {
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.hostname(from.getName());
|
builder.hostname(from.getName());
|
||||||
builder.location(findLocationForResourceInVDC.apply(from.getVDC()));
|
builder.location(findLocationForResourceInVDC.apply(from.getVDC()));
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.operatingSystem(toComputeOs(from, null));
|
builder.operatingSystem(toComputeOs(from, null));
|
||||||
builder.hardware(hardwareForVApp.apply(from));
|
builder.hardware(hardwareForVApp.apply(from));
|
||||||
builder.state(vAppStatusToNodeState.get(from.getStatus()));
|
builder.state(vAppStatusToNodeState.get(from.getStatus()));
|
||||||
Set<String> addresses = getIpsFromVApp(from);
|
Set<String> addresses = getIpsFromVApp(from);
|
||||||
builder.publicAddresses(filter(addresses, not(IsPrivateIPAddress.INSTANCE)));
|
builder.publicAddresses(filter(addresses, not(IsPrivateIPAddress.INSTANCE)));
|
||||||
builder.privateAddresses(filter(addresses, IsPrivateIPAddress.INSTANCE));
|
builder.privateAddresses(filter(addresses, IsPrivateIPAddress.INSTANCE));
|
||||||
|
|
||||||
// normally, we don't affect the credential store when reading vApps.
|
// normally, we don't affect the credential store when reading vApps.
|
||||||
// However, login user, etc, is actually in the metadata, so lets see
|
// However, login user, etc, is actually in the metadata, so lets see
|
||||||
Credentials fromApi = getCredentialsFrom(from);
|
Credentials fromApi = getCredentialsFrom(from);
|
||||||
|
|
|
@ -101,13 +101,6 @@ public class ${providerName}ComputeServiceContextModule extends ${providerName}C
|
||||||
protected TemplateBuilder provideTemplate(TemplateBuilder template) {
|
protected TemplateBuilder provideTemplate(TemplateBuilder template) {
|
||||||
return template.osFamily(UBUNTU);
|
return template.osFamily(UBUNTU);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Named("NAMING_CONVENTION")
|
|
||||||
@Singleton
|
|
||||||
String provideNamingConvention() {
|
|
||||||
return "%s-%s";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public static class ${providerName}AddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
public static class ${providerName}AddNodeWithTagStrategy implements AddNodeWithTagStrategy {
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.trmk.vcloud_0_8.compute.functions;
|
package org.jclouds.trmk.vcloud_0_8.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -35,6 +34,7 @@ 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.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.util.ComputeServiceUtils;
|
import org.jclouds.compute.util.ComputeServiceUtils;
|
||||||
import org.jclouds.domain.Credentials;
|
import org.jclouds.domain.Credentials;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
|
@ -58,11 +58,14 @@ public class VAppToNodeMetadata implements Function<VApp, NodeMetadata> {
|
||||||
protected final FindLocationForResource findLocationForResourceInVDC;
|
protected final FindLocationForResource findLocationForResourceInVDC;
|
||||||
protected final HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp;
|
protected final HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp;
|
||||||
protected final Map<Status, NodeState> vAppStatusToNodeState;
|
protected final Map<Status, NodeState> vAppStatusToNodeState;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
protected VAppToNodeMetadata(TerremarkVCloudComputeClient computeClient, Map<String, Credentials> credentialStore,
|
protected VAppToNodeMetadata(TerremarkVCloudComputeClient computeClient, Map<String, Credentials> credentialStore,
|
||||||
Map<Status, NodeState> vAppStatusToNodeState, HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp,
|
Map<Status, NodeState> vAppStatusToNodeState, HardwareForVCloudExpressVApp hardwareForVCloudExpressVApp,
|
||||||
FindLocationForResource findLocationForResourceInVDC, @Memoized Supplier<Set<? extends Image>> images) {
|
FindLocationForResource findLocationForResourceInVDC, @Memoized Supplier<Set<? extends Image>> images,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
this.hardwareForVCloudExpressVApp = checkNotNull(hardwareForVCloudExpressVApp, "hardwareForVCloudExpressVApp");
|
this.hardwareForVCloudExpressVApp = checkNotNull(hardwareForVCloudExpressVApp, "hardwareForVCloudExpressVApp");
|
||||||
this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC");
|
this.findLocationForResourceInVDC = checkNotNull(findLocationForResourceInVDC, "findLocationForResourceInVDC");
|
||||||
|
@ -97,8 +100,7 @@ public class VAppToNodeMetadata implements Function<VApp, NodeMetadata> {
|
||||||
builder.state(vAppStatusToNodeState.get(from.getStatus()));
|
builder.state(vAppStatusToNodeState.get(from.getStatus()));
|
||||||
builder.publicAddresses(computeClient.getPublicAddresses(from.getHref()));
|
builder.publicAddresses(computeClient.getPublicAddresses(from.getHref()));
|
||||||
builder.privateAddresses(computeClient.getPrivateAddresses(from.getHref()));
|
builder.privateAddresses(computeClient.getPrivateAddresses(from.getHref()));
|
||||||
String group = parseGroupFromName(from.getName());
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.group(group);
|
|
||||||
builder.credentials(LoginCredentials.fromCredentials(credentialStore
|
builder.credentials(LoginCredentials.fromCredentials(credentialStore
|
||||||
.get("node#" + from.getHref().toASCIIString())));
|
.get("node#" + from.getHref().toASCIIString())));
|
||||||
return builder.build();
|
return builder.build();
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.jclouds.Constants;
|
||||||
import org.jclouds.compute.config.CustomizationResponse;
|
import org.jclouds.compute.config.CustomizationResponse;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.Template;
|
import org.jclouds.compute.domain.Template;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
|
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
|
||||||
import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
|
import org.jclouds.compute.strategy.CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap;
|
||||||
import org.jclouds.compute.strategy.ListNodesStrategy;
|
import org.jclouds.compute.strategy.ListNodesStrategy;
|
||||||
|
@ -55,11 +56,11 @@ public class TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy extends Creat
|
||||||
protected TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy(
|
protected TerremarkEncodeTagIntoNameRunNodesAndAddToSetStrategy(
|
||||||
CreateNodeWithGroupEncodedIntoName addNodeWithTagStrategy,
|
CreateNodeWithGroupEncodedIntoName addNodeWithTagStrategy,
|
||||||
ListNodesStrategy listNodesStrategy,
|
ListNodesStrategy listNodesStrategy,
|
||||||
@Named("NAMING_CONVENTION") String nodeNamingConvention,
|
GroupNamingConvention.Factory namingConvention,
|
||||||
CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory,
|
CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory,
|
||||||
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor,
|
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor,
|
||||||
CreateNewKeyPairUnlessUserSpecifiedOtherwise createNewKeyPairUnlessUserSpecifiedOtherwise) {
|
CreateNewKeyPairUnlessUserSpecifiedOtherwise createNewKeyPairUnlessUserSpecifiedOtherwise) {
|
||||||
super(addNodeWithTagStrategy, listNodesStrategy, nodeNamingConvention, executor,
|
super(addNodeWithTagStrategy, listNodesStrategy, namingConvention, executor,
|
||||||
customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
|
customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory);
|
||||||
this.createNewKeyPairUnlessUserSpecifiedOtherwise = createNewKeyPairUnlessUserSpecifiedOtherwise;
|
this.createNewKeyPairUnlessUserSpecifiedOtherwise = createNewKeyPairUnlessUserSpecifiedOtherwise;
|
||||||
}
|
}
|
||||||
|
|
|
@ -200,17 +200,6 @@ public abstract class BaseComputeServiceContextModule extends AbstractModule {
|
||||||
return options;
|
return options;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* supplies how the tag is encoded into the name. A string of hex characters
|
|
||||||
* is the last argument and tag is the first
|
|
||||||
*/
|
|
||||||
@Provides
|
|
||||||
@Named("NAMING_CONVENTION")
|
|
||||||
@Singleton
|
|
||||||
protected String provideNamingConvention() {
|
|
||||||
return "%s-%s";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
protected Supplier<Map<String, ? extends Image>> provideImageMap(@Memoized Supplier<Set<? extends Image>> images) {
|
protected Supplier<Map<String, ? extends Image>> provideImageMap(@Memoized Supplier<Set<? extends Image>> images) {
|
||||||
|
|
|
@ -24,6 +24,8 @@ package org.jclouds.compute.config;
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
public interface ComputeServiceProperties {
|
public interface ComputeServiceProperties {
|
||||||
|
public static final String RESOURCENAME_PREFIX = "jclouds.compute.resourcename-prefix";
|
||||||
|
public static final String RESOURCENAME_DELIMITER = "jclouds.compute.resourcename-delimiter";
|
||||||
|
|
||||||
public static final String TIMEOUT_NODE_TERMINATED = "jclouds.compute.timeout.node-terminated";
|
public static final String TIMEOUT_NODE_TERMINATED = "jclouds.compute.timeout.node-terminated";
|
||||||
public static final String TIMEOUT_NODE_RUNNING = "jclouds.compute.timeout.node-running";
|
public static final String TIMEOUT_NODE_RUNNING = "jclouds.compute.timeout.node-running";
|
||||||
|
|
|
@ -0,0 +1,163 @@
|
||||||
|
/**
|
||||||
|
* 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.compute.functions;
|
||||||
|
|
||||||
|
import org.jclouds.compute.ComputeService;
|
||||||
|
import org.jclouds.compute.internal.FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat;
|
||||||
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.inject.ImplementedBy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* jclouds needs to understand the difference between resources it creates and
|
||||||
|
* those supplied by the user. For example, if jclouds creates a security group,
|
||||||
|
* it should be able to delete this as a part of cleanup without accidentally
|
||||||
|
* deleting resources the user specified manually.
|
||||||
|
*
|
||||||
|
* <h3>uniqueness of a name</h3>
|
||||||
|
*
|
||||||
|
* The naming convention must apply to both to resources shared across all
|
||||||
|
* members of a group, and those created for a subset of members.
|
||||||
|
*
|
||||||
|
* <ol>
|
||||||
|
* <li>shared: something shared across all members of a group, and fully
|
||||||
|
* retrievable via api. Ex. security group or network</li>
|
||||||
|
* <li>unique: something that only applies to individuals or subsets of a group,
|
||||||
|
* or isn't fully retrievable via api. Ex. node names or keypair names</li>
|
||||||
|
* </ol>
|
||||||
|
*
|
||||||
|
* <h4>why repeat?</h4>
|
||||||
|
*
|
||||||
|
* Some resources we'd otherwise want to share across a group must be
|
||||||
|
* redundantly created, if the user has no access to the complete object via api
|
||||||
|
* or otherwise. For example, ssh key apis generally do not store the private
|
||||||
|
* key data on the server. In order to ensure we can always log into a server
|
||||||
|
* without configuration, we may generate a temporary key on-demand for each
|
||||||
|
* call to {@link ComputeService#createNodesInGroup}
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Typically, a security group or network is something shared across all members
|
||||||
|
* of a group, so the name should be concise, yet unique.
|
||||||
|
*
|
||||||
|
* <h2>implementation</h2>
|
||||||
|
*
|
||||||
|
* Typically, a security group or network is something shared across all members
|
||||||
|
* of a group, so the name should be concise, yet unique.
|
||||||
|
*
|
||||||
|
* <h4>character sets and delimiters</h4>
|
||||||
|
*
|
||||||
|
* Character sets in apis are often bound to dns names, perhaps also allowing
|
||||||
|
* underscores. Since jclouds groups are allowed to be alphanumeric with hyphens
|
||||||
|
* (hostname style), care must be taken to implement this in a way that allows
|
||||||
|
* the delimiter to be also nested in the group name itself. In other words, we
|
||||||
|
* need to be able to encode a group into a name even when they share the same
|
||||||
|
* character set. Note that characters like {@code #} can sometimes break apis.
|
||||||
|
* As such, you may end preferring always using a hyphen.
|
||||||
|
*
|
||||||
|
* <h4>shared resources</h4>
|
||||||
|
*
|
||||||
|
* A good name for a shared resources might include a prefix of jclouds, a
|
||||||
|
* delimiter of {@code -} followed by the group name. The jclouds prefix
|
||||||
|
* signifies this resource is safe to delete, and the hash clearly delineates
|
||||||
|
* the encoding from what's in the group name.
|
||||||
|
*
|
||||||
|
* <h3>example</h3>
|
||||||
|
*
|
||||||
|
* given a jclouds group named {@code mycluster}, the naming convention for
|
||||||
|
* shared resources would produce {@code jclouds-mycluster}
|
||||||
|
*
|
||||||
|
* <h4>unique resources</h4>
|
||||||
|
*
|
||||||
|
* A good name for a unique resource might be the same as the shared, with a
|
||||||
|
* random hex string suffix. A few hex characters can give you 4096
|
||||||
|
* combinations, giving a small degree of collision avoidance, yet without
|
||||||
|
* making the resource name difficult.
|
||||||
|
*
|
||||||
|
* <h3>example</h3>
|
||||||
|
*
|
||||||
|
* given a jclouds group named {@code mycluster}, the naming convention for
|
||||||
|
* unique resources could produce {@code jclouds-mycluster-f3e} the first time,
|
||||||
|
* and {@code jclouds-mycluster-e64} the next.
|
||||||
|
*
|
||||||
|
* <h3>note</h3>
|
||||||
|
*
|
||||||
|
* It is typically safe to assume that an {@link IllegalStateException} is
|
||||||
|
* thrown when attempting to create a named resource which already exists.
|
||||||
|
* However, if you attempt to create a resource with a name generated by
|
||||||
|
* {@link GroupNamingConvention}, and receive an {@link IllegalStateException},
|
||||||
|
* it may have been for another reason besides name conflict.
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Beta
|
||||||
|
public interface GroupNamingConvention {
|
||||||
|
|
||||||
|
@ImplementedBy(FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat.Factory.class)
|
||||||
|
public static interface Factory {
|
||||||
|
|
||||||
|
GroupNamingConvention create();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* top-level resources do not need a prefix, yet still may need to follow
|
||||||
|
* a naming convention
|
||||||
|
*/
|
||||||
|
GroupNamingConvention createWithoutPrefix();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* encodes the {code group parameter} into a name that exists only once in
|
||||||
|
* the group.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
String sharedNameForGroup(String group);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* encodes the {code group parameter} into a name that exists more than once
|
||||||
|
* in the group.
|
||||||
|
*
|
||||||
|
* <h3>note</h3>
|
||||||
|
*
|
||||||
|
* Do not expect this name to be guaranteed unique, though a good
|
||||||
|
* implementation should guess a unique name in one or two tries.
|
||||||
|
*/
|
||||||
|
String uniqueNameForGroup(String group);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* retrieve the group associated with the encoded name
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
String groupInUniqueNameOrNull(String encoded);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* retrieve the group associated with the encoded name
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
String groupInSharedNameOrNull(String encoded);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* identifies if this name has a group encoded in it.
|
||||||
|
*/
|
||||||
|
Predicate<String> containsGroup(String group);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,175 @@
|
||||||
|
/**
|
||||||
|
* 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.compute.internal;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.jclouds.compute.config.ComputeServiceProperties.RESOURCENAME_DELIMITER;
|
||||||
|
import static org.jclouds.compute.config.ComputeServiceProperties.RESOURCENAME_PREFIX;
|
||||||
|
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
import java.util.NoSuchElementException;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.inject.Named;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
|
import org.jclouds.predicates.Validator;
|
||||||
|
import org.jclouds.predicates.validators.DnsNameValidator;
|
||||||
|
|
||||||
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.cache.CacheBuilder;
|
||||||
|
import com.google.common.cache.CacheLoader;
|
||||||
|
import com.google.common.cache.LoadingCache;
|
||||||
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a name using a random mechanism that still ties all nodes in a group
|
||||||
|
* together.
|
||||||
|
*
|
||||||
|
* This implementation will pass the group and a hex formatted random number to
|
||||||
|
* the configured naming convention.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat implements GroupNamingConvention {
|
||||||
|
|
||||||
|
protected final String prefix;
|
||||||
|
protected final char delimiter;
|
||||||
|
protected final Supplier<String> suffixSupplier;
|
||||||
|
protected final String sharedFormat;
|
||||||
|
protected final String uniqueFormat;
|
||||||
|
protected final Pattern uniqueGroupPattern;
|
||||||
|
protected final Pattern sharedGroupPattern;
|
||||||
|
protected final Validator<String> groupValidator;
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
public static class Factory implements GroupNamingConvention.Factory {
|
||||||
|
@Inject(optional = true)
|
||||||
|
@Named(RESOURCENAME_PREFIX)
|
||||||
|
private String prefix = "jclouds";
|
||||||
|
@Inject(optional = true)
|
||||||
|
@Named(RESOURCENAME_DELIMITER)
|
||||||
|
private char delimiter = '-';
|
||||||
|
@Inject(optional = true)
|
||||||
|
private Supplier<String> suffixSupplier = new Supplier<String>() {
|
||||||
|
final SecureRandom random = new SecureRandom();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get() {
|
||||||
|
return Integer.toHexString(random.nextInt(4095));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Inject(optional = true)
|
||||||
|
private Validator<String> groupValidator = new DnsNameValidator(3, 63);
|
||||||
|
|
||||||
|
// lazy init, so that @Inject stuff can work, and avoid calling the
|
||||||
|
// constructor
|
||||||
|
// each time, as it compiles new regexes
|
||||||
|
LoadingCache<String, GroupNamingConvention> cache = CacheBuilder.newBuilder().build(
|
||||||
|
new CacheLoader<String, GroupNamingConvention>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GroupNamingConvention load(String key) throws Exception {
|
||||||
|
return new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(key, delimiter, suffixSupplier, groupValidator);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GroupNamingConvention create() {
|
||||||
|
return cache.getUnchecked(prefix);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GroupNamingConvention createWithoutPrefix() {
|
||||||
|
return cache.getUnchecked("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(String prefix, char delimiter,
|
||||||
|
Supplier<String> suffixSupplier, Validator<String> groupValidator) {
|
||||||
|
this.prefix = checkNotNull(prefix, "prefix");
|
||||||
|
this.delimiter = delimiter;
|
||||||
|
this.suffixSupplier = checkNotNull(suffixSupplier, "suffixSupplier");
|
||||||
|
this.groupValidator = checkNotNull(groupValidator, "groupValidator");
|
||||||
|
this.sharedFormat = "".equals(prefix) ? "%s" : new StringBuilder().append(prefix).append(delimiter).append("%s")
|
||||||
|
.toString();
|
||||||
|
this.uniqueFormat = new StringBuilder(sharedFormat).append(delimiter).append("%s").toString();
|
||||||
|
this.uniqueGroupPattern = Pattern.compile("^" + ("".equals(prefix) ? "" : (prefix + delimiter)) + "(.+)"
|
||||||
|
+ delimiter + "[^" + delimiter + "]+");
|
||||||
|
this.sharedGroupPattern = Pattern.compile("^" + ("".equals(prefix) ? "" : (prefix + delimiter)) + "(.+)$");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String sharedNameForGroup(String group) {
|
||||||
|
return String.format(sharedFormat, checkGroup(group));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String checkGroup(String group) {
|
||||||
|
groupValidator.validate(checkNotNull(group, "group"));
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String uniqueNameForGroup(String group) {
|
||||||
|
return String.format(uniqueFormat, checkGroup(group), suffixSupplier.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String groupInUniqueNameOrNull(String encoded) {
|
||||||
|
return firstGroupInPatternOrNull(uniqueGroupPattern, encoded);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String firstGroupInPatternOrNull(Pattern pattern, String encoded) {
|
||||||
|
Matcher matcher = pattern.matcher(checkNotNull(encoded, "encoded"));
|
||||||
|
if (!matcher.matches())
|
||||||
|
return null;
|
||||||
|
return matcher.group(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String groupInSharedNameOrNull(String encoded) {
|
||||||
|
return firstGroupInPatternOrNull(sharedGroupPattern, encoded);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Predicate<String> containsGroup(final String group) {
|
||||||
|
checkGroup(group);
|
||||||
|
return new Predicate<String>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean apply(String input) {
|
||||||
|
try {
|
||||||
|
return group.equals(groupInUniqueNameOrNull(input)) || group.equals(groupInSharedNameOrNull(input));
|
||||||
|
} catch (NoSuchElementException e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "containsGroup(" + group + ")";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -31,11 +31,14 @@ import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_NODE_T
|
||||||
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_PORT_OPEN;
|
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_PORT_OPEN;
|
||||||
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
|
import static org.jclouds.compute.config.ComputeServiceProperties.TIMEOUT_SCRIPT_COMPLETE;
|
||||||
|
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
import javax.inject.Named;
|
import javax.inject.Named;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
import org.jclouds.compute.config.ComputeServiceProperties;
|
import org.jclouds.compute.config.ComputeServiceProperties;
|
||||||
|
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -108,6 +111,20 @@ public interface ComputeServiceConstants {
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static final String PROPERTY_OS_VERSION_MAP_JSON = OS_VERSION_MAP_JSON;
|
public static final String PROPERTY_OS_VERSION_MAP_JSON = OS_VERSION_MAP_JSON;
|
||||||
|
|
||||||
|
@Singleton
|
||||||
|
public static class NamingConvention {
|
||||||
|
|
||||||
|
@Inject(optional = true)
|
||||||
|
public final Supplier<String> randomSuffix = new Supplier<String>() {
|
||||||
|
final SecureRandom random = new SecureRandom();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String get() {
|
||||||
|
return random.nextInt(100) + "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
public static class InitStatusProperties {
|
public static class InitStatusProperties {
|
||||||
@Inject(optional = true)
|
@Inject(optional = true)
|
||||||
|
|
|
@ -25,7 +25,6 @@ import static com.google.common.collect.Maps.newLinkedHashMap;
|
||||||
import static com.google.common.collect.Sets.newLinkedHashSet;
|
import static com.google.common.collect.Sets.newLinkedHashSet;
|
||||||
import static org.jclouds.concurrent.Futures.compose;
|
import static org.jclouds.concurrent.Futures.compose;
|
||||||
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
@ -44,6 +43,7 @@ import org.jclouds.compute.domain.ComputeMetadata;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.NodeState;
|
import org.jclouds.compute.domain.NodeState;
|
||||||
import org.jclouds.compute.domain.Template;
|
import org.jclouds.compute.domain.Template;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
|
import org.jclouds.compute.strategy.CreateNodeWithGroupEncodedIntoName;
|
||||||
import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
|
import org.jclouds.compute.strategy.CreateNodesInGroupThenAddToSet;
|
||||||
|
@ -94,7 +94,7 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet implements CreateNo
|
||||||
protected Logger logger = Logger.NULL;
|
protected Logger logger = Logger.NULL;
|
||||||
protected final CreateNodeWithGroupEncodedIntoName addNodeWithGroupStrategy;
|
protected final CreateNodeWithGroupEncodedIntoName addNodeWithGroupStrategy;
|
||||||
protected final ListNodesStrategy listNodesStrategy;
|
protected final ListNodesStrategy listNodesStrategy;
|
||||||
protected final String nodeNamingConvention;
|
protected final GroupNamingConvention.Factory namingConvention;
|
||||||
protected final ExecutorService executor;
|
protected final ExecutorService executor;
|
||||||
protected final CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory;
|
protected final CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory;
|
||||||
|
|
||||||
|
@ -102,12 +102,12 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet implements CreateNo
|
||||||
protected CreateNodesWithGroupEncodedIntoNameThenAddToSet(
|
protected CreateNodesWithGroupEncodedIntoNameThenAddToSet(
|
||||||
CreateNodeWithGroupEncodedIntoName addNodeWithGroupStrategy,
|
CreateNodeWithGroupEncodedIntoName addNodeWithGroupStrategy,
|
||||||
ListNodesStrategy listNodesStrategy,
|
ListNodesStrategy listNodesStrategy,
|
||||||
@Named("NAMING_CONVENTION") String nodeNamingConvention,
|
GroupNamingConvention.Factory namingConvention,
|
||||||
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor,
|
@Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor,
|
||||||
CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory) {
|
CustomizeNodeAndAddToGoodMapOrPutExceptionIntoBadMap.Factory customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory) {
|
||||||
this.addNodeWithGroupStrategy = addNodeWithGroupStrategy;
|
this.addNodeWithGroupStrategy = addNodeWithGroupStrategy;
|
||||||
this.listNodesStrategy = listNodesStrategy;
|
this.listNodesStrategy = listNodesStrategy;
|
||||||
this.nodeNamingConvention = nodeNamingConvention;
|
this.namingConvention = namingConvention;
|
||||||
this.executor = executor;
|
this.executor = executor;
|
||||||
this.customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory = customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory;
|
this.customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory = customizeNodeAndAddToGoodMapOrPutExceptionIntoBadMapFactory;
|
||||||
}
|
}
|
||||||
|
@ -185,7 +185,7 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet implements CreateNo
|
||||||
int maxTries = 100;
|
int maxTries = 100;
|
||||||
int currentTries = 0;
|
int currentTries = 0;
|
||||||
while (names.size() < count && currentTries++ < maxTries) {
|
while (names.size() < count && currentTries++ < maxTries) {
|
||||||
final String name = getNextName(group, template);
|
final String name = namingConvention.createWithoutPrefix().uniqueNameForGroup(group);
|
||||||
if (!any(currentNodes, new Predicate<ComputeMetadata>() {
|
if (!any(currentNodes, new Predicate<ComputeMetadata>() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -200,15 +200,4 @@ public class CreateNodesWithGroupEncodedIntoNameThenAddToSet implements CreateNo
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a name using a random mechanism that still ties all nodes in a group together.
|
|
||||||
*
|
|
||||||
* This implementation will pass the group and a hex formatted random number to the configured
|
|
||||||
* naming convention.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
protected String getNextName(final String group, final Template template) {
|
|
||||||
return String.format(nodeNamingConvention, group, Integer.toHexString(new SecureRandom().nextInt(4095)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -32,7 +32,6 @@ import java.util.Formatter;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.jclouds.compute.ComputeServiceContextBuilder;
|
import org.jclouds.compute.ComputeServiceContextBuilder;
|
||||||
|
@ -100,17 +99,6 @@ public class ComputeServiceUtils {
|
||||||
return extractZipIntoDirectory(new HttpRequest("GET", zip), directory);
|
return extractZipIntoDirectory(new HttpRequest("GET", zip), directory);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return null if group cannot be parsed
|
|
||||||
*/
|
|
||||||
public static String parseGroupFromName(String from) {
|
|
||||||
if (from == null)
|
|
||||||
return null;
|
|
||||||
Matcher matcher = DELIMETED_BY_HYPHEN_ENDING_IN_HYPHEN_HEX.matcher(from);
|
|
||||||
return matcher.find() ? matcher.group(1) : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static double getCores(Hardware input) {
|
public static double getCores(Hardware input) {
|
||||||
double cores = 0;
|
double cores = 0;
|
||||||
for (Processor processor : input.getProcessors())
|
for (Processor processor : input.getProcessors())
|
||||||
|
|
|
@ -0,0 +1,182 @@
|
||||||
|
/**
|
||||||
|
* 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.compute.internal;
|
||||||
|
|
||||||
|
import static org.jclouds.compute.config.ComputeServiceProperties.RESOURCENAME_DELIMITER;
|
||||||
|
import static org.jclouds.compute.config.ComputeServiceProperties.RESOURCENAME_PREFIX;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
import static org.testng.Assert.assertFalse;
|
||||||
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
|
import org.jclouds.predicates.Validator;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.base.Suppliers;
|
||||||
|
import com.google.inject.AbstractModule;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
import com.google.inject.name.Names;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(testName = "FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeatTest")
|
||||||
|
public class FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeatTest {
|
||||||
|
Validator<String> okValidator = new Validator<String>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void validate(String t) throws IllegalArgumentException {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public void testSharedName() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"jclouds", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
|
||||||
|
assertEquals(fn.sharedNameForGroup("cluster"), "jclouds_cluster");
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds_cluster"), "cluster");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds_cluster"), null);
|
||||||
|
assertTrue(fn.containsGroup("cluster").apply("jclouds_cluster"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOkToHaveDelimiterInGroupOnUniqueName() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"jclouds", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
|
||||||
|
assertEquals(fn.sharedNameForGroup("cluster_"), "jclouds_cluster_");
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds_cluster_"), "cluster_");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds_cluster_"), null);
|
||||||
|
assertTrue(fn.containsGroup("cluster_").apply("jclouds_cluster_"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSharedNameWithHyphenInGroup() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"jclouds", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
|
||||||
|
assertEquals(fn.sharedNameForGroup("cluster-"), "jclouds_cluster-");
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds_cluster-"), "cluster-");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds_cluster-"), null);
|
||||||
|
assertTrue(fn.containsGroup("cluster-").apply("jclouds_cluster-"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNextName() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"jclouds", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
|
||||||
|
assertEquals(fn.uniqueNameForGroup("cluster"), "jclouds_cluster_123");
|
||||||
|
// note accidental treatment of a unique node as a shared one can lead to
|
||||||
|
// incorrect group names, as long as we permit delimiter to be in group name
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds_cluster_123"), "cluster_123");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds_cluster_123"), "cluster");
|
||||||
|
assertTrue(fn.containsGroup("cluster").apply("jclouds_cluster_123"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCannotFindSharedNameWhenDelimiterWrong() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"jclouds", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds#cluster"), null);
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds#cluster"), null);
|
||||||
|
assertFalse(fn.containsGroup("cluster").apply("jclouds#cluster"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCannotFindNextNameWhenDelimiterWrong() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"jclouds", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds#cluster#123"), null);
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds#cluster#123"), null);
|
||||||
|
assertFalse(fn.containsGroup("cluster").apply("jclouds#cluster#123"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPropertyChangesDelimiter() {
|
||||||
|
GroupNamingConvention fn = Guice.createInjector(new AbstractModule() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bindConstant().annotatedWith(Names.named(RESOURCENAME_DELIMITER)).to('#');
|
||||||
|
}
|
||||||
|
}).getInstance(GroupNamingConvention.Factory.class).create();
|
||||||
|
|
||||||
|
assertEquals(fn.sharedNameForGroup("cluster"), "jclouds#cluster");
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds#cluster"), "cluster");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds#cluster"), null);
|
||||||
|
assertTrue(fn.containsGroup("cluster").apply("jclouds#cluster"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testPropertyChangesPrefix() {
|
||||||
|
GroupNamingConvention fn = Guice.createInjector(new AbstractModule() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bindConstant().annotatedWith(Names.named(RESOURCENAME_PREFIX)).to("kclouds");
|
||||||
|
}
|
||||||
|
}).getInstance(GroupNamingConvention.Factory.class).create();
|
||||||
|
|
||||||
|
assertEquals(fn.sharedNameForGroup("cluster"), "kclouds-cluster");
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("kclouds-cluster"), "cluster");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("kclouds-cluster"), null);
|
||||||
|
assertTrue(fn.containsGroup("cluster").apply("kclouds-cluster"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCanChangeSuffixSupplier() {
|
||||||
|
GroupNamingConvention fn = Guice.createInjector(new AbstractModule() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure() {
|
||||||
|
bind(new TypeLiteral<Supplier<String>>() {
|
||||||
|
}).toInstance(Suppliers.ofInstance("foo"));
|
||||||
|
}
|
||||||
|
}).getInstance(GroupNamingConvention.Factory.class).create();
|
||||||
|
|
||||||
|
assertEquals(fn.uniqueNameForGroup("cluster"), "jclouds-cluster-foo");
|
||||||
|
// note accidental treatment of a unique node as a shared one can lead to
|
||||||
|
// incorrect group names, as long as we permit delimiter to be in group name
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("jclouds-cluster-foo"), "cluster-foo");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("jclouds-cluster-foo"), "cluster");
|
||||||
|
assertTrue(fn.containsGroup("cluster").apply("jclouds-cluster-foo"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ///
|
||||||
|
|
||||||
|
public void testSharedNameNoPrefix() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
|
||||||
|
assertEquals(fn.sharedNameForGroup("cluster"), "cluster");
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("cluster"), "cluster");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("cluster"), null);
|
||||||
|
assertTrue(fn.containsGroup("cluster").apply("cluster"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testNextNameNoPrefix() {
|
||||||
|
FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat fn = new FormatSharedNamesAndAppendUniqueStringToThoseWhichRepeat(
|
||||||
|
"", '_', Suppliers.ofInstance("123"), okValidator);
|
||||||
|
|
||||||
|
assertEquals(fn.uniqueNameForGroup("cluster"), "cluster_123");
|
||||||
|
assertEquals(fn.groupInSharedNameOrNull("cluster_123"), "cluster_123");
|
||||||
|
assertEquals(fn.groupInUniqueNameOrNull("cluster_123"), "cluster");
|
||||||
|
assertTrue(fn.containsGroup("cluster").apply("cluster_123"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,7 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.compute.util;
|
package org.jclouds.compute.util;
|
||||||
|
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseVersionOrReturnEmptyString;
|
import static org.jclouds.compute.util.ComputeServiceUtils.parseVersionOrReturnEmptyString;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
@ -48,11 +47,6 @@ public class ComputeServiceUtilsTest {
|
||||||
}.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
|
}.provideOsVersionMap(new ComputeServiceConstants.ReferenceData(), Guice.createInjector(new GsonModule())
|
||||||
.getInstance(Json.class));
|
.getInstance(Json.class));
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testParseGroupFromName() {
|
|
||||||
assertEquals(parseGroupFromName("gogrid--849"), "gogrid-");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testParseVersionOrReturnEmptyStringUbuntu1004() {
|
public void testParseVersionOrReturnEmptyStringUbuntu1004() {
|
||||||
assertEquals(parseVersionOrReturnEmptyString(OsFamily.UBUNTU, "Ubuntu 10.04", map), "10.04");
|
assertEquals(parseVersionOrReturnEmptyString(OsFamily.UBUNTU, "Ubuntu 10.04", map), "10.04");
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.glesys.compute.functions;
|
package org.jclouds.glesys.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
@ -41,6 +40,7 @@ import org.jclouds.compute.domain.OperatingSystem;
|
||||||
import org.jclouds.compute.domain.Processor;
|
import org.jclouds.compute.domain.Processor;
|
||||||
import org.jclouds.compute.domain.Volume;
|
import org.jclouds.compute.domain.Volume;
|
||||||
import org.jclouds.compute.domain.internal.VolumeImpl;
|
import org.jclouds.compute.domain.internal.VolumeImpl;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.compute.reference.ComputeServiceConstants;
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.glesys.domain.Ip;
|
import org.jclouds.glesys.domain.Ip;
|
||||||
|
@ -73,6 +73,7 @@ public class ServerDetailsToNodeMetadata implements Function<ServerDetails, Node
|
||||||
|
|
||||||
protected final Supplier<Set<? extends Image>> images;
|
protected final Supplier<Set<? extends Image>> images;
|
||||||
protected final FindLocationForServerDetails findLocationForServerDetails;
|
protected final FindLocationForServerDetails findLocationForServerDetails;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
private static class FindImageForServer implements Predicate<Image> {
|
private static class FindImageForServer implements Predicate<Image> {
|
||||||
private final ServerDetails instance;
|
private final ServerDetails instance;
|
||||||
|
@ -89,7 +90,9 @@ public class ServerDetailsToNodeMetadata implements Function<ServerDetails, Node
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ServerDetailsToNodeMetadata(FindLocationForServerDetails findLocationForServerDetails,
|
ServerDetailsToNodeMetadata(FindLocationForServerDetails findLocationForServerDetails,
|
||||||
@Memoized Supplier<Set<? extends Image>> images) {
|
@Memoized Supplier<Set<? extends Image>> images,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.findLocationForServerDetails = checkNotNull(findLocationForServerDetails, "findLocationForServerDetails");
|
this.findLocationForServerDetails = checkNotNull(findLocationForServerDetails, "findLocationForServerDetails");
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
}
|
}
|
||||||
|
@ -102,7 +105,7 @@ public class ServerDetailsToNodeMetadata implements Function<ServerDetails, Node
|
||||||
builder.hostname(from.getHostname());
|
builder.hostname(from.getHostname());
|
||||||
Location location = findLocationForServerDetails.apply(from);
|
Location location = findLocationForServerDetails.apply(from);
|
||||||
assert (location != null) : String.format("no location matched ServerDetails %s", from);
|
assert (location != null) : String.format("no location matched ServerDetails %s", from);
|
||||||
builder.group(parseGroupFromName(from.getDescription()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getDescription()));
|
||||||
builder.imageId(from.getTemplateName() + "");
|
builder.imageId(from.getTemplateName() + "");
|
||||||
builder.operatingSystem(parseOperatingSystem(from));
|
builder.operatingSystem(parseOperatingSystem(from));
|
||||||
builder.hardware(new HardwareBuilder().ids(from.getId() + "").ram(from.getMemorySizeMB())
|
builder.hardware(new HardwareBuilder().ids(from.getId() + "").ram(from.getMemorySizeMB())
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.jclouds.savvis.vpdc.compute.functions;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.base.Predicates.not;
|
import static com.google.common.base.Predicates.not;
|
||||||
import static com.google.common.collect.Iterables.filter;
|
import static com.google.common.collect.Iterables.filter;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -35,6 +34,7 @@ import org.jclouds.compute.domain.CIMOperatingSystem;
|
||||||
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.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.savvis.vpdc.domain.VM;
|
import org.jclouds.savvis.vpdc.domain.VM;
|
||||||
import org.jclouds.savvis.vpdc.util.Utils;
|
import org.jclouds.savvis.vpdc.util.Utils;
|
||||||
|
@ -58,9 +58,12 @@ public class VMToNodeMetadata implements Function<VM, NodeMetadata> {
|
||||||
NodeState.SUSPENDED).put(VM.Status.UNRESOLVED, NodeState.PENDING).build();
|
NodeState.SUSPENDED).put(VM.Status.UNRESOLVED, NodeState.PENDING).build();
|
||||||
|
|
||||||
private final FindLocationForVM findLocationForVM;
|
private final FindLocationForVM findLocationForVM;
|
||||||
|
private final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
VMToNodeMetadata(FindLocationForVM findLocationForVM) {
|
VMToNodeMetadata(FindLocationForVM findLocationForVM,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.findLocationForVM = checkNotNull(findLocationForVM, "findLocationForVM");
|
this.findLocationForVM = checkNotNull(findLocationForVM, "findLocationForVM");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +73,7 @@ public class VMToNodeMetadata implements Function<VM, NodeMetadata> {
|
||||||
builder.ids(from.getHref().toASCIIString());
|
builder.ids(from.getHref().toASCIIString());
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.location(findLocationForVM.apply(from));
|
builder.location(findLocationForVM.apply(from));
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
try {
|
try {
|
||||||
builder.operatingSystem(CIMOperatingSystem.toComputeOs(from.getOperatingSystemSection()));
|
builder.operatingSystem(CIMOperatingSystem.toComputeOs(from.getOperatingSystemSection()));
|
||||||
} catch (NullPointerException e) {
|
} catch (NullPointerException e) {
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.gogrid.compute.functions;
|
package org.jclouds.gogrid.compute.functions;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
@ -34,6 +33,7 @@ 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.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.gogrid.domain.Server;
|
import org.jclouds.gogrid.domain.Server;
|
||||||
import org.jclouds.gogrid.domain.ServerState;
|
import org.jclouds.gogrid.domain.ServerState;
|
||||||
|
@ -58,6 +58,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
private final Supplier<Set<? extends Image>> images;
|
private final Supplier<Set<? extends Image>> images;
|
||||||
private final Supplier<Set<? extends Hardware>> hardwares;
|
private final Supplier<Set<? extends Hardware>> hardwares;
|
||||||
private final Supplier<Set<? extends Location>> locations;
|
private final Supplier<Set<? extends Location>> locations;
|
||||||
|
private final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
static class FindImageForServer implements Predicate<Image> {
|
static class FindImageForServer implements Predicate<Image> {
|
||||||
private final Server instance;
|
private final Server instance;
|
||||||
|
@ -92,7 +93,9 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
@Inject
|
@Inject
|
||||||
ServerToNodeMetadata(Map<ServerState, NodeState> serverStateToNodeState,
|
ServerToNodeMetadata(Map<ServerState, NodeState> serverStateToNodeState,
|
||||||
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares,
|
@Memoized Supplier<Set<? extends Image>> images, @Memoized Supplier<Set<? extends Hardware>> hardwares,
|
||||||
@Memoized Supplier<Set<? extends Location>> locations) {
|
@Memoized Supplier<Set<? extends Location>> locations,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.serverStateToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
this.serverStateToNodeState = checkNotNull(serverStateToNodeState, "serverStateToNodeState");
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
this.hardwares = checkNotNull(hardwares, "hardwares");
|
this.hardwares = checkNotNull(hardwares, "hardwares");
|
||||||
|
@ -106,7 +109,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
Location location = Iterables.find(locations.get(), LocationPredicates.idEquals(from.getDatacenter().getId() + ""));
|
Location location = Iterables.find(locations.get(), LocationPredicates.idEquals(from.getDatacenter().getId() + ""));
|
||||||
builder.location(location);
|
builder.location(location);
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.hardware(parseHardware(from));
|
builder.hardware(parseHardware(from));
|
||||||
builder.imageId(from.getImage().getId() + "");
|
builder.imageId(from.getImage().getId() + "");
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.jclouds.compute.domain.Image;
|
||||||
import org.jclouds.compute.domain.NodeMetadata;
|
import org.jclouds.compute.domain.NodeMetadata;
|
||||||
import org.jclouds.compute.domain.NodeState;
|
import org.jclouds.compute.domain.NodeState;
|
||||||
import org.jclouds.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
|
@ -45,6 +46,7 @@ import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Suppliers;
|
import com.google.common.base.Suppliers;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
@ -52,6 +54,7 @@ import com.google.common.collect.ImmutableSet;
|
||||||
//NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
|
//NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
|
||||||
@Test(groups = "unit", testName = "ServerToNodeMetadataTest")
|
@Test(groups = "unit", testName = "ServerToNodeMetadataTest")
|
||||||
public class ServerToNodeMetadataTest {
|
public class ServerToNodeMetadataTest {
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Test
|
@Test
|
||||||
|
@ -93,7 +96,7 @@ public class ServerToNodeMetadataTest {
|
||||||
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers
|
ServerToNodeMetadata parser = new ServerToNodeMetadata(serverStateToNodeState, Suppliers
|
||||||
.<Set<? extends Image>> ofInstance(images), Suppliers
|
.<Set<? extends Image>> ofInstance(images), Suppliers
|
||||||
.<Set<? extends Hardware>> ofInstance(GoGridHardwareSupplier.H_ALL), Suppliers
|
.<Set<? extends Hardware>> ofInstance(GoGridHardwareSupplier.H_ALL), Suppliers
|
||||||
.<Set<? extends Location>> ofInstance(locations));
|
.<Set<? extends Location>> ofInstance(locations), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(server);
|
NodeMetadata metadata = parser.apply(server);
|
||||||
assertEquals(metadata.getLocation(), location);
|
assertEquals(metadata.getLocation(), location);
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.rimuhosting.miro.compute.functions;
|
package org.jclouds.rimuhosting.miro.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
@ -35,6 +34,7 @@ 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.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
import org.jclouds.rimuhosting.miro.domain.Server;
|
import org.jclouds.rimuhosting.miro.domain.Server;
|
||||||
|
@ -54,10 +54,12 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
protected Logger logger = Logger.NULL;
|
protected Logger logger = Logger.NULL;
|
||||||
|
|
||||||
protected final Supplier<Set<? extends Location>> locations;
|
protected final Supplier<Set<? extends Location>> locations;
|
||||||
protected final Function<Server, Iterable<String>> getPublicAddresses;
|
protected final Function<Server, Iterable<String>> getPublicAddresses;
|
||||||
protected final Map<RunningState, NodeState> runningStateToNodeState;
|
protected final Map<RunningState, NodeState> runningStateToNodeState;
|
||||||
protected final Supplier<Set<? extends Image>> images;
|
protected final Supplier<Set<? extends Image>> images;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
private static class FindImageForServer implements Predicate<Image> {
|
private static class FindImageForServer implements Predicate<Image> {
|
||||||
private final Location location;
|
private final Location location;
|
||||||
|
@ -79,7 +81,9 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
@Inject
|
@Inject
|
||||||
ServerToNodeMetadata(Function<Server, Iterable<String>> getPublicAddresses,
|
ServerToNodeMetadata(Function<Server, Iterable<String>> getPublicAddresses,
|
||||||
@Memoized Supplier<Set<? extends Location>> locations, Map<RunningState, NodeState> runningStateToNodeState,
|
@Memoized Supplier<Set<? extends Location>> locations, Map<RunningState, NodeState> runningStateToNodeState,
|
||||||
@Memoized Supplier<Set<? extends Image>> images) {
|
@Memoized Supplier<Set<? extends Image>> images,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.getPublicAddresses = checkNotNull(getPublicAddresses, "serverStateToNodeState");
|
this.getPublicAddresses = checkNotNull(getPublicAddresses, "serverStateToNodeState");
|
||||||
this.locations = checkNotNull(locations, "locations");
|
this.locations = checkNotNull(locations, "locations");
|
||||||
this.runningStateToNodeState = checkNotNull(runningStateToNodeState, "serverStateToNodeState");
|
this.runningStateToNodeState = checkNotNull(runningStateToNodeState, "serverStateToNodeState");
|
||||||
|
@ -94,7 +98,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
builder.hostname(from.getName());
|
builder.hostname(from.getName());
|
||||||
Location location = findLocationWithId(from.getLocation().getId());
|
Location location = findLocationWithId(from.getLocation().getId());
|
||||||
builder.location(location);
|
builder.location(location);
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.imageId(from.getImageId() + "");
|
builder.imageId(from.getImageId() + "");
|
||||||
builder.operatingSystem(parseOperatingSystem(from, location));
|
builder.operatingSystem(parseOperatingSystem(from, location));
|
||||||
builder.hardware(null);// TODO
|
builder.hardware(null);// TODO
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.slicehost.compute.functions;
|
package org.jclouds.slicehost.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.NoSuchElementException;
|
import java.util.NoSuchElementException;
|
||||||
|
@ -36,6 +35,7 @@ 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.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
import org.jclouds.slicehost.domain.Slice;
|
import org.jclouds.slicehost.domain.Slice;
|
||||||
|
@ -54,6 +54,7 @@ public class SliceToNodeMetadata implements Function<Slice, NodeMetadata> {
|
||||||
protected final Map<Slice.Status, NodeState> sliceToNodeState;
|
protected final Map<Slice.Status, NodeState> sliceToNodeState;
|
||||||
protected final Supplier<Set<? extends Image>> images;
|
protected final Supplier<Set<? extends Image>> images;
|
||||||
protected final Supplier<Set<? extends Hardware>> hardwares;
|
protected final Supplier<Set<? extends Hardware>> hardwares;
|
||||||
|
protected final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
protected Logger logger = Logger.NULL;
|
protected Logger logger = Logger.NULL;
|
||||||
|
@ -87,7 +88,9 @@ public class SliceToNodeMetadata implements Function<Slice, NodeMetadata> {
|
||||||
@Inject
|
@Inject
|
||||||
SliceToNodeMetadata(Map<Slice.Status, NodeState> sliceStateToNodeState,
|
SliceToNodeMetadata(Map<Slice.Status, NodeState> sliceStateToNodeState,
|
||||||
@Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location,
|
@Memoized Supplier<Set<? extends Image>> images, Supplier<Location> location,
|
||||||
@Memoized Supplier<Set<? extends Hardware>> hardwares) {
|
@Memoized Supplier<Set<? extends Hardware>> hardwares,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.sliceToNodeState = checkNotNull(sliceStateToNodeState, "sliceStateToNodeState");
|
this.sliceToNodeState = checkNotNull(sliceStateToNodeState, "sliceStateToNodeState");
|
||||||
this.images = checkNotNull(images, "images");
|
this.images = checkNotNull(images, "images");
|
||||||
this.location = checkNotNull(location, "location");
|
this.location = checkNotNull(location, "location");
|
||||||
|
@ -101,7 +104,7 @@ public class SliceToNodeMetadata implements Function<Slice, NodeMetadata> {
|
||||||
builder.name(from.getName());
|
builder.name(from.getName());
|
||||||
builder.hostname(from.getName());
|
builder.hostname(from.getName());
|
||||||
builder.location(location.get());
|
builder.location(location.get());
|
||||||
builder.group(parseGroupFromName(from.getName()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getName()));
|
||||||
builder.imageId(from.getImageId() + "");
|
builder.imageId(from.getImageId() + "");
|
||||||
builder.operatingSystem(parseOperatingSystem(from));
|
builder.operatingSystem(parseOperatingSystem(from));
|
||||||
builder.hardware(parseHardware(from));
|
builder.hardware(parseHardware(from));
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.jclouds.compute.domain.OsFamily;
|
||||||
import org.jclouds.compute.domain.Processor;
|
import org.jclouds.compute.domain.Processor;
|
||||||
import org.jclouds.compute.domain.Volume;
|
import org.jclouds.compute.domain.Volume;
|
||||||
import org.jclouds.compute.domain.VolumeBuilder;
|
import org.jclouds.compute.domain.VolumeBuilder;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LocationBuilder;
|
import org.jclouds.domain.LocationBuilder;
|
||||||
import org.jclouds.domain.LocationScope;
|
import org.jclouds.domain.LocationScope;
|
||||||
|
@ -46,13 +47,15 @@ import com.google.common.base.Suppliers;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit", testName = "SliceToNodeMetadataTest")
|
||||||
public class SliceToNodeMetadataTest {
|
public class SliceToNodeMetadataTest {
|
||||||
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build();
|
Location provider = new LocationBuilder().scope(LocationScope.ZONE).id("dallas").description("description").build();
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testApplyWhereImageAndHardwareNotFound() {
|
public void testApplyWhereImageAndHardwareNotFound() {
|
||||||
|
@ -63,7 +66,7 @@ public class SliceToNodeMetadataTest {
|
||||||
|
|
||||||
SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, Suppliers
|
SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, Suppliers
|
||||||
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider), Suppliers
|
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider), Suppliers
|
||||||
.<Set<? extends Hardware>> ofInstance(hardwares));
|
.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(slice);
|
NodeMetadata metadata = parser.apply(slice);
|
||||||
|
|
||||||
|
@ -83,7 +86,7 @@ public class SliceToNodeMetadataTest {
|
||||||
|
|
||||||
SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, Suppliers
|
SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, Suppliers
|
||||||
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider), Suppliers
|
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider), Suppliers
|
||||||
.<Set<? extends Hardware>> ofInstance(hardwares));
|
.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(slice);
|
NodeMetadata metadata = parser.apply(slice);
|
||||||
assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses(
|
assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses(
|
||||||
|
@ -104,7 +107,7 @@ public class SliceToNodeMetadataTest {
|
||||||
|
|
||||||
SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, Suppliers
|
SliceToNodeMetadata parser = new SliceToNodeMetadata(sliceStateToNodeState, Suppliers
|
||||||
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider), Suppliers
|
.<Set<? extends Image>> ofInstance(images), Suppliers.ofInstance(provider), Suppliers
|
||||||
.<Set<? extends Hardware>> ofInstance(hardwares));
|
.<Set<? extends Hardware>> ofInstance(hardwares), namingConvention);
|
||||||
|
|
||||||
NodeMetadata metadata = parser.apply(slice);
|
NodeMetadata metadata = parser.apply(slice);
|
||||||
assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses(
|
assertEquals(metadata, new NodeMetadataBuilder().state(NodeState.PENDING).publicAddresses(
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.softlayer.compute.functions;
|
package org.jclouds.softlayer.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -34,6 +33,7 @@ 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.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.softlayer.SoftLayerClient;
|
import org.jclouds.softlayer.SoftLayerClient;
|
||||||
import org.jclouds.softlayer.domain.Datacenter;
|
import org.jclouds.softlayer.domain.Datacenter;
|
||||||
|
@ -62,10 +62,13 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
|
||||||
private final FindLocationForVirtualGuest findLocationForVirtualGuest;
|
private final FindLocationForVirtualGuest findLocationForVirtualGuest;
|
||||||
private final GetHardwareForVirtualGuest getHardwareForVirtualGuest;
|
private final GetHardwareForVirtualGuest getHardwareForVirtualGuest;
|
||||||
private final GetImageForVirtualGuest getImageForVirtualGuest;
|
private final GetImageForVirtualGuest getImageForVirtualGuest;
|
||||||
|
private final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
VirtualGuestToNodeMetadata(FindLocationForVirtualGuest findLocationForVirtualGuest,
|
VirtualGuestToNodeMetadata(FindLocationForVirtualGuest findLocationForVirtualGuest,
|
||||||
GetHardwareForVirtualGuest getHardwareForVirtualGuest, GetImageForVirtualGuest getImageForVirtualGuest) {
|
GetHardwareForVirtualGuest getHardwareForVirtualGuest, GetImageForVirtualGuest getImageForVirtualGuest,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.findLocationForVirtualGuest = checkNotNull(findLocationForVirtualGuest, "findLocationForVirtualGuest");
|
this.findLocationForVirtualGuest = checkNotNull(findLocationForVirtualGuest, "findLocationForVirtualGuest");
|
||||||
this.getHardwareForVirtualGuest = checkNotNull(getHardwareForVirtualGuest, "getHardwareForVirtualGuest");
|
this.getHardwareForVirtualGuest = checkNotNull(getHardwareForVirtualGuest, "getHardwareForVirtualGuest");
|
||||||
this.getImageForVirtualGuest = checkNotNull(getImageForVirtualGuest, "getImageForVirtualGuest");
|
this.getImageForVirtualGuest = checkNotNull(getImageForVirtualGuest, "getImageForVirtualGuest");
|
||||||
|
@ -79,7 +82,7 @@ public class VirtualGuestToNodeMetadata implements Function<VirtualGuest, NodeMe
|
||||||
builder.name(from.getHostname());
|
builder.name(from.getHostname());
|
||||||
builder.hostname(from.getHostname());
|
builder.hostname(from.getHostname());
|
||||||
builder.location(findLocationForVirtualGuest.apply(from));
|
builder.location(findLocationForVirtualGuest.apply(from));
|
||||||
builder.group(parseGroupFromName(from.getHostname()));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.getHostname()));
|
||||||
|
|
||||||
Image image = getImageForVirtualGuest.getImage(from);
|
Image image = getImageForVirtualGuest.getImage(from);
|
||||||
if (image != null) {
|
if (image != null) {
|
||||||
|
|
|
@ -31,6 +31,7 @@ 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.compute.domain.OperatingSystem;
|
import org.jclouds.compute.domain.OperatingSystem;
|
||||||
|
import org.jclouds.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.softlayer.SoftLayerClient;
|
import org.jclouds.softlayer.SoftLayerClient;
|
||||||
import org.jclouds.softlayer.compute.functions.VirtualGuestToNodeMetadata.FindLocationForVirtualGuest;
|
import org.jclouds.softlayer.compute.functions.VirtualGuestToNodeMetadata.FindLocationForVirtualGuest;
|
||||||
|
@ -46,12 +47,14 @@ import com.google.common.base.Function;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.base.Suppliers;
|
import com.google.common.base.Suppliers;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.inject.Guice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
@Test(groups = "unit", testName = "VirtualGuestToNodeMetadataTest")
|
@Test(groups = "unit", testName = "VirtualGuestToNodeMetadataTest")
|
||||||
public class VirtualGuestToNodeMetadataTest {
|
public class VirtualGuestToNodeMetadataTest {
|
||||||
|
GroupNamingConvention.Factory namingConvention = Guice.createInjector().getInstance(GroupNamingConvention.Factory.class);
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testApplyWhereVirtualGuestWithNoPassword() {
|
public void testApplyWhereVirtualGuestWithNoPassword() {
|
||||||
|
@ -65,7 +68,7 @@ public class VirtualGuestToNodeMetadataTest {
|
||||||
.<Location> of(expectedLocation));
|
.<Location> of(expectedLocation));
|
||||||
|
|
||||||
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
||||||
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock());
|
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock(), namingConvention);
|
||||||
|
|
||||||
NodeMetadata node = parser.apply(guest);
|
NodeMetadata node = parser.apply(guest);
|
||||||
|
|
||||||
|
@ -92,7 +95,7 @@ public class VirtualGuestToNodeMetadataTest {
|
||||||
.<Location> of());
|
.<Location> of());
|
||||||
|
|
||||||
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
||||||
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock());
|
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock(), namingConvention);
|
||||||
|
|
||||||
NodeMetadata node = parser.apply(guest);
|
NodeMetadata node = parser.apply(guest);
|
||||||
|
|
||||||
|
@ -117,7 +120,7 @@ public class VirtualGuestToNodeMetadataTest {
|
||||||
.<Location> of(expectedLocation));
|
.<Location> of(expectedLocation));
|
||||||
|
|
||||||
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
||||||
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock());
|
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock(), namingConvention);
|
||||||
|
|
||||||
NodeMetadata node = parser.apply(guest);
|
NodeMetadata node = parser.apply(guest);
|
||||||
|
|
||||||
|
@ -145,7 +148,7 @@ public class VirtualGuestToNodeMetadataTest {
|
||||||
.<Location> of(expectedLocation));
|
.<Location> of(expectedLocation));
|
||||||
|
|
||||||
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
||||||
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock());
|
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock(), namingConvention);
|
||||||
|
|
||||||
NodeMetadata node = parser.apply(guest);
|
NodeMetadata node = parser.apply(guest);
|
||||||
|
|
||||||
|
@ -173,7 +176,7 @@ public class VirtualGuestToNodeMetadataTest {
|
||||||
.<Location> of(expectedLocation));
|
.<Location> of(expectedLocation));
|
||||||
|
|
||||||
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
VirtualGuestToNodeMetadata parser = new VirtualGuestToNodeMetadata(new FindLocationForVirtualGuest(
|
||||||
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock());
|
locationSupplier), new GetHardwareForVirtualGuestMock(), new GetImageForVirtualGuestMock(), namingConvention);
|
||||||
|
|
||||||
NodeMetadata node = parser.apply(guest);
|
NodeMetadata node = parser.apply(guest);
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
package org.jclouds.servermanager.compute.functions;
|
package org.jclouds.servermanager.compute.functions;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static org.jclouds.compute.util.ComputeServiceUtils.parseGroupFromName;
|
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
@ -34,6 +33,7 @@ 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.compute.functions.GroupNamingConvention;
|
||||||
import org.jclouds.domain.Credentials;
|
import org.jclouds.domain.Credentials;
|
||||||
import org.jclouds.domain.Location;
|
import org.jclouds.domain.Location;
|
||||||
import org.jclouds.domain.LoginCredentials;
|
import org.jclouds.domain.LoginCredentials;
|
||||||
|
@ -61,10 +61,13 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
private final FindLocationForServer findLocationForServer;
|
private final FindLocationForServer findLocationForServer;
|
||||||
private final FindImageForServer findImageForServer;
|
private final FindImageForServer findImageForServer;
|
||||||
private final Map<String, Credentials> credentialStore;
|
private final Map<String, Credentials> credentialStore;
|
||||||
|
private final GroupNamingConvention nodeNamingConvention;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
ServerToNodeMetadata(Map<String, Credentials> credentialStore, FindHardwareForServer findHardwareForServer,
|
ServerToNodeMetadata(Map<String, Credentials> credentialStore, FindHardwareForServer findHardwareForServer,
|
||||||
FindLocationForServer findLocationForServer, FindImageForServer findImageForServer) {
|
FindLocationForServer findLocationForServer, FindImageForServer findImageForServer,
|
||||||
|
GroupNamingConvention.Factory namingConvention) {
|
||||||
|
this.nodeNamingConvention = checkNotNull(namingConvention, "namingConvention").createWithoutPrefix();
|
||||||
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
|
this.credentialStore = checkNotNull(credentialStore, "credentialStore");
|
||||||
this.findHardwareForServer = checkNotNull(findHardwareForServer, "findHardwareForServer");
|
this.findHardwareForServer = checkNotNull(findHardwareForServer, "findHardwareForServer");
|
||||||
this.findLocationForServer = checkNotNull(findLocationForServer, "findLocationForServer");
|
this.findLocationForServer = checkNotNull(findLocationForServer, "findLocationForServer");
|
||||||
|
@ -78,7 +81,7 @@ public class ServerToNodeMetadata implements Function<Server, NodeMetadata> {
|
||||||
builder.ids(from.id + "");
|
builder.ids(from.id + "");
|
||||||
builder.name(from.name);
|
builder.name(from.name);
|
||||||
builder.location(findLocationForServer.apply(from));
|
builder.location(findLocationForServer.apply(from));
|
||||||
builder.group(parseGroupFromName(from.name));
|
builder.group(nodeNamingConvention.groupInUniqueNameOrNull(from.name));
|
||||||
builder.imageId(from.imageId + "");
|
builder.imageId(from.imageId + "");
|
||||||
Image image = findImageForServer.apply(from);
|
Image image = findImageForServer.apply(from);
|
||||||
if (image != null)
|
if (image != null)
|
||||||
|
|
Loading…
Reference in New Issue