public LoadBalancerMetadata createLoadBalancerInLocation()

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));
   }