mirror of https://github.com/apache/jclouds.git
enhanced ec2 lb logic
This commit is contained in:
parent
a4bdd433f4
commit
4fc5f3cf2e
|
@ -55,7 +55,7 @@ public class EC2DestroyLoadBalancerStrategy implements DestroyLoadBalancerStrate
|
|||
@Override
|
||||
public boolean execute(InetAddress loadBalancer) {
|
||||
Map<String, String> tuple = EC2Utils.getLoadBalancerNameAndRegionFromDnsName(loadBalancer
|
||||
.getCanonicalHostName());
|
||||
.getHostName());
|
||||
// Only one load balancer per DNS name is expected
|
||||
for (String key : tuple.keySet()) {
|
||||
elbClient.deleteLoadBalancerInRegion(key, tuple.get(key));
|
||||
|
|
|
@ -21,8 +21,9 @@ package org.jclouds.aws.ec2.util;
|
|||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.inject.Singleton;
|
||||
|
||||
|
@ -35,6 +36,7 @@ import org.jclouds.domain.LocationScope;
|
|||
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||
|
||||
import com.google.common.base.Function;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.Iterables;
|
||||
|
||||
/**
|
||||
|
@ -90,16 +92,19 @@ public class EC2Utils {
|
|||
for (Object arg : gRequest.getArgs()) {
|
||||
if (arg instanceof String) {
|
||||
String regionName = (String) arg;
|
||||
if (Region.EU_WEST_1.equals(regionName) || Region.US_WEST_1.equals(regionName)
|
||||
|| Region.US_EAST_1.equals(regionName)
|
||||
|| Region.US_STANDARD.equals(regionName)
|
||||
|| Region.AP_SOUTHEAST_1.equals(regionName))
|
||||
if (isRegion(regionName))
|
||||
return regionName;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean isRegion(String regionName) {
|
||||
return Region.EU_WEST_1.equals(regionName) || Region.US_WEST_1.equals(regionName)
|
||||
|| Region.US_EAST_1.equals(regionName) || Region.US_STANDARD.equals(regionName)
|
||||
|| Region.AP_SOUTHEAST_1.equals(regionName);
|
||||
}
|
||||
|
||||
public static String findAvailabilityZoneInArgsOrNull(GeneratedHttpRequest<?> gRequest) {
|
||||
for (Object arg : gRequest.getArgs()) {
|
||||
if (arg instanceof String) {
|
||||
|
@ -123,23 +128,17 @@ public class EC2Utils {
|
|||
}
|
||||
}
|
||||
|
||||
public static Map<String, String> getLoadBalancerNameAndRegionFromDnsName(String handle)
|
||||
{
|
||||
String[] parts = checkNotNull(handle, "handle").split(".");
|
||||
checkArgument(parts.length == 5, "handle syntax is my-load-balancer-1277832914.us-east-1.elb.amazonaws.com");
|
||||
|
||||
String loadBalancerName = parts[0].substring(0, parts[0].lastIndexOf("-"));
|
||||
|
||||
String regionName = parts[1];
|
||||
|
||||
checkArgument((Region.EU_WEST_1.equals(regionName) || Region.US_WEST_1.equals(regionName)
|
||||
|| Region.US_EAST_1.equals(regionName)
|
||||
|| Region.US_STANDARD.equals(regionName)
|
||||
|| Region.AP_SOUTHEAST_1.equals(regionName)), String.format("Region (%s, args) is not a valid region", regionName));
|
||||
|
||||
Map<String, String> map = new HashMap<String, String>();
|
||||
map.put(regionName, loadBalancerName);
|
||||
return map;
|
||||
private static final Pattern ELB_PATTERN = Pattern
|
||||
.compile("([^.]+)-[^.]+\\.([^.]+)\\.elb\\.amazonaws\\.com");
|
||||
|
||||
public static Map<String, String> getLoadBalancerNameAndRegionFromDnsName(String dnsName) {
|
||||
Matcher matcher = ELB_PATTERN.matcher(checkNotNull(dnsName, "dnsName"));
|
||||
checkArgument(matcher.find(), "dnsName syntax is " + ELB_PATTERN + " didn't match: "
|
||||
+ dnsName);
|
||||
String loadBalancerName = matcher.group(1);
|
||||
String regionName = matcher.group(2);
|
||||
checkArgument((isRegion(regionName)), String.format(
|
||||
"Region (%s) parsed from (%s) is not a valid region", regionName, dnsName));
|
||||
return ImmutableMap.<String, String> of(regionName, loadBalancerName);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/**
|
||||
*
|
||||
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||
*
|
||||
* ====================================================================
|
||||
* Licensed 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.aws.ec2.utils;
|
||||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import org.jclouds.aws.ec2.util.EC2Utils;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
|
||||
/**
|
||||
* @author Adrian Cole
|
||||
*/
|
||||
@Test(groups = "unit", testName = "ec2.EC2UtilsTest")
|
||||
public class EC2UtilsTest {
|
||||
|
||||
public void testGetLoadBalancerNameAndRegionFromDnsName() {
|
||||
assertEquals(
|
||||
ImmutableMap.<String, String> of("us-east-1", "my-load-balancer"),
|
||||
EC2Utils
|
||||
.getLoadBalancerNameAndRegionFromDnsName("my-load-balancer-1277832914.us-east-1.elb.amazonaws.com"));
|
||||
assertEquals(
|
||||
ImmutableMap.<String, String> of("us-east-1", "ec2lb"),
|
||||
EC2Utils
|
||||
.getLoadBalancerNameAndRegionFromDnsName("ec2lb-915583419.us-east-1.elb.amazonaws.com"));
|
||||
}
|
||||
|
||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||
public void testGetLoadBalancerNameAndRegionFromDnsNameFail() {
|
||||
EC2Utils
|
||||
.getLoadBalancerNameAndRegionFromDnsName("my-load-balancer-1277832914.us-east-1.microsoft.com");
|
||||
}
|
||||
|
||||
}
|
|
@ -185,11 +185,17 @@ public class ComputeUtils {
|
|||
}
|
||||
|
||||
if (options.getPort() > 0) {
|
||||
checkNodeHasPublicIps(node);
|
||||
blockUntilPortIsListeningOnPublicIp(options.getPort(), options.getSeconds(), Iterables
|
||||
.get(node.getPublicAddresses(), 0));
|
||||
}
|
||||
}
|
||||
|
||||
private void checkNodeHasPublicIps(NodeMetadata node) {
|
||||
checkState(node.getPublicAddresses().size() > 0,
|
||||
"node does not have IP addresses configured: " + node);
|
||||
}
|
||||
|
||||
private void blockUntilPortIsListeningOnPublicIp(int port, int seconds, InetAddress inetAddress) {
|
||||
logger.debug(">> blocking on port %s:%d for %d seconds", inetAddress, port, seconds);
|
||||
RetryablePredicate<InetSocketAddress> tester = new RetryablePredicate<InetSocketAddress>(
|
||||
|
@ -222,6 +228,7 @@ public class ComputeUtils {
|
|||
public Map<SshCallable<?>, ?> runCallablesOnNode(NodeMetadata node,
|
||||
Iterable<? extends SshCallable<?>> parallel, @Nullable SshCallable<?> last) {
|
||||
checkState(this.sshFactory != null, "runScript requested, but no SshModule configured");
|
||||
checkNodeHasPublicIps(node);
|
||||
checkNotNull(node.getCredentials().key, "credentials.key for node " + node.getProviderId());
|
||||
SshClient ssh = createSshClientOncePortIsListeningOnNode(node);
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue