From fbf4317149a8d54c4058a6e5cefaa738f09dce6c Mon Sep 17 00:00:00 2001 From: Andrea Turli Date: Thu, 25 Jun 2015 11:30:11 +0200 Subject: [PATCH] [NOVA] change some access modifiers to simplify the downstream provider impl modify the BasicAuthenticator in Keystone destroy node if creation timeouts --- .../functions/internal/BaseAuthenticator.java | 6 ++--- .../compute/NovaComputeServiceAdapter.java | 24 +++++++++++++++---- .../functions/ImageToOperatingSystem.java | 2 +- .../ServerInRegionToNodeMetadata.java | 4 ++-- ...sWithGroupEncodedIntoNameThenAddToSet.java | 6 ++--- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/functions/internal/BaseAuthenticator.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/functions/internal/BaseAuthenticator.java index 93ece91d13f..3e4216a233c 100644 --- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/functions/internal/BaseAuthenticator.java +++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/functions/internal/BaseAuthenticator.java @@ -64,10 +64,10 @@ public Access apply(Credentials input) { String usernameOrAccessKey = input.identity; if (!tenantName.isPresent() && input.identity.indexOf(':') != -1) { - tenantName = Optional.of(input.identity.substring(0, input.identity.indexOf(':'))); - usernameOrAccessKey = input.identity.substring(input.identity.indexOf(':') + 1); + tenantName = Optional.of(input.identity.substring(0, input.identity.lastIndexOf(':'))); + usernameOrAccessKey = input.identity.substring(input.identity.lastIndexOf(':') + 1); } - + String passwordOrSecretKey = input.credential; C creds = createCredentials(usernameOrAccessKey, passwordOrSecretKey); diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java index 4518e71451e..4714d53f315 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceAdapter.java @@ -21,7 +21,10 @@ import static com.google.common.collect.Iterables.contains; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; +import static java.lang.String.format; +import static java.util.concurrent.TimeUnit.SECONDS; import static org.jclouds.compute.util.ComputeServiceUtils.metadataAndTagsAsCommaDelimitedValue; +import static org.jclouds.util.Predicates2.retry; import java.util.Set; @@ -127,16 +130,27 @@ public NodeAndInitialCredentials createNodeWithGroupEncodedIntoN } } - String regionId = template.getLocation().getId(); + final String regionId = template.getLocation().getId(); String imageId = template.getImage().getProviderId(); String flavorId = template.getHardware().getProviderId(); logger.debug(">> creating new server region(%s) name(%s) image(%s) flavor(%s) options(%s)", regionId, name, imageId, flavorId, options); - ServerCreated lightweightServer = novaApi.getServerApi(regionId).create(name, imageId, flavorId, options); - Server server = novaApi.getServerApi(regionId).get(lightweightServer.getId()); - - logger.trace("<< server(%s)", server.getId()); + final ServerCreated lightweightServer = novaApi.getServerApi(regionId).create(name, imageId, flavorId, options); + if (!retry(new Predicate() { + @Override + public boolean apply(String serverId) { + Server server = novaApi.getServerApi(regionId).get(serverId); + return server != null && server.getAddresses() != null && !server.getAddresses().isEmpty(); + } + }, 30 * 60, 1, SECONDS).apply(lightweightServer.getId())) { + final String message = format("Server %s was not created within %sms so it will be destroyed.", name, "30 * 60"); + logger.warn(message); + destroyNode(lightweightServer.getId()); + throw new IllegalStateException(message); + } + logger.trace("<< server(%s)", lightweightServer.getId()); + Server server = novaApi.getServerApi(regionId).get(lightweightServer.getId()); ServerInRegion serverInRegion = new ServerInRegion(server, regionId); if (!privateKey.isPresent() && lightweightServer.getAdminPass().isPresent()) credentialsBuilder.password(lightweightServer.getAdminPass().get()); diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ImageToOperatingSystem.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ImageToOperatingSystem.java index 2781942c1fb..4805a57f14d 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ImageToOperatingSystem.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ImageToOperatingSystem.java @@ -57,7 +57,7 @@ public class ImageToOperatingSystem implements Function @Named(ComputeServiceConstants.COMPUTE_LOGGER) protected Logger logger = Logger.NULL; - private final Map> osVersionMap; + protected final Map> osVersionMap; @Inject public ImageToOperatingSystem(Map> osVersionMap) { diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java index 2134bb232bf..e48554fbb7a 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/functions/ServerInRegionToNodeMetadata.java @@ -144,7 +144,7 @@ public NodeMetadata apply(ServerInRegion serverInRegion) { return builder.build(); } - private static final Predicate
isPrivateAddress = new Predicate
() { + public static final Predicate
isPrivateAddress = new Predicate
() { public boolean apply(Address in) { return InetAddresses2.IsPrivateIPAddress.INSTANCE.apply(in.getAddr()); } @@ -164,7 +164,7 @@ public boolean apply(String input) { }; - private enum AddressToStringTransformationFunction implements Function { + public enum AddressToStringTransformationFunction implements Function { INSTANCE; @Override public String apply(Address address) { diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/strategy/ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/strategy/ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.java index 8085c6c56d7..9a4a482c633 100644 --- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/strategy/ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.java +++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/compute/strategy/ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet.java @@ -64,9 +64,9 @@ public class ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddT CreateNodesWithGroupEncodedIntoNameThenAddToSet { private final AllocateAndAddFloatingIpToNode createAndAddFloatingIpToNode; - private final LoadingCache securityGroupCache; - private final LoadingCache keyPairCache; - private final NovaApi novaApi; + protected final LoadingCache securityGroupCache; + protected final LoadingCache keyPairCache; + protected final NovaApi novaApi; @Inject protected ApplyNovaTemplateOptionsCreateNodesWithGroupEncodedIntoNameThenAddToSet(