in elb/src/main/java/org/jclouds/elb/loadbalancer/strategy/ELBLoadBalanceNodesStrategy.java [64:115]
public LoadBalancerMetadata createLoadBalancerInLocation(Location location, String name, String protocol,
int loadBalancerPort, int instancePort, Iterable<? extends NodeMetadata> nodes) {
checkNotNull(location, "location");
String region = getRegionFromLocationOrNull(location);
Set<String> zonesDesired = ImmutableSet.copyOf(transform(nodes, new Function<NodeMetadata, String>() {
@Override
public String apply(NodeMetadata from) {
return from.getLocation().getId();
}
}));
logger.debug(">> creating loadBalancer(%s) in zones(%s)", name, zonesDesired);
try {
String dnsName = api.getLoadBalancerApiForRegion(region).createListeningInAvailabilityZones(
name,
ImmutableSet.of(Listener.builder().port(loadBalancerPort).instancePort(instancePort)
.protocol(Protocol.valueOf(protocol)).build()), zonesDesired);
logger.debug("<< created loadBalancer(%s) dnsName(%s)", name, dnsName);
} catch (IllegalStateException e) {
logger.debug("<< converging zones(%s) in loadBalancer(%s)", zonesDesired, name);
Set<String> currentZones = api.getLoadBalancerApi().get(name).getAvailabilityZones();
Set<String> zonesToAdd = Sets.difference(zonesDesired, currentZones);
if (zonesToAdd.size() > 0)
currentZones = api.getAvailabilityZoneApi().addAvailabilityZonesToLoadBalancer(zonesToAdd, name);
Set<String> zonesToRemove = Sets.difference(currentZones, zonesDesired);
if (zonesToRemove.size() > 0)
api.getAvailabilityZoneApi().removeAvailabilityZonesFromLoadBalancer(zonesToRemove, name);
}
Set<String> instanceIds = ImmutableSet.copyOf(transform(nodes, new Function<NodeMetadata, String>() {
@Override
public String apply(NodeMetadata from) {
return from.getProviderId();
}
}));
logger.debug(">> converging loadBalancer(%s) to instances(%s)", name, instanceIds);
Set<String> registeredInstanceIds = api.getInstanceApiForRegion(region).registerInstancesWithLoadBalancer(
instanceIds, name);
Set<String> instancesToRemove = filter(registeredInstanceIds, not(in(instanceIds)));
if (instancesToRemove.size() > 0) {
logger.debug(">> deregistering instances(%s) from loadBalancer(%s)", instancesToRemove, name);
api.getInstanceApiForRegion(region).deregisterInstancesFromLoadBalancer(instancesToRemove, name);
}
logger.debug("<< converged loadBalancer(%s) ", name);
return converter.apply(new LoadBalancerInRegion(api.getLoadBalancerApiForRegion(region).get(name), region));
}