Package com.elastisys.scale.cloudadapters.aws.commons.requests.elb

Source Code of com.elastisys.scale.cloudadapters.aws.commons.requests.elb.CreateLoadBalancer

package com.elastisys.scale.cloudadapters.aws.commons.requests.elb;

import java.util.List;
import java.util.Set;
import java.util.concurrent.Callable;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.services.ec2.model.AvailabilityZone;
import com.amazonaws.services.elasticloadbalancing.model.ConfigureHealthCheckRequest;
import com.amazonaws.services.elasticloadbalancing.model.CreateLoadBalancerRequest;
import com.amazonaws.services.elasticloadbalancing.model.CreateLoadBalancerResult;
import com.amazonaws.services.elasticloadbalancing.model.HealthCheck;
import com.amazonaws.services.elasticloadbalancing.model.Listener;
import com.amazonaws.services.elasticloadbalancing.model.LoadBalancerDescription;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

/**
* A {@link Callable} task that, when executed, requests the creation of an AWS
* Elastic Load Balancer.
*
*
*/
public class CreateLoadBalancer extends
    AmazonElbRequest<CreateLoadBalancerResult> {

  /** The name of the load-balancer to create. */
  private final String loadBalancerName;
  /** The availability zone(s) to load-balance between. */
  private final List<String> availabilityZones;
  /**
   * Which inbound ports (and protocols) to listen for and what ports on
   * instances to forward requests to.
   */
  private final List<Listener> portForwarding;

  public CreateLoadBalancer(AWSCredentials awsCredentials, String region,
      String loadBalancerName, List<String> availabilityZones,
      List<Listener> portForwarding) {
    super(awsCredentials, region);
    this.loadBalancerName = loadBalancerName;
    this.availabilityZones = availabilityZones;
    this.portForwarding = portForwarding;
  }

  public static List<String> getNames(List<AvailabilityZone> availabilityZones) {
    List<String> names = Lists.newArrayList();
    for (AvailabilityZone zone : availabilityZones) {
      names.add(zone.getZoneName());
    }
    return names;
  }

  @Override
  public CreateLoadBalancerResult call() {
    try {
      Set<String> existingLoadBalancers = getLoadBalancers();
      if (existingLoadBalancers.contains(this.loadBalancerName)) {
        throw new IllegalArgumentException(String.format(
            "A load balancer with name '%s' already exists.",
            this.loadBalancerName));
      }
      CreateLoadBalancerRequest request = new CreateLoadBalancerRequest()
          .withLoadBalancerName(this.loadBalancerName)
          .withAvailabilityZones(this.availabilityZones)
          .withListeners(this.portForwarding);
      CreateLoadBalancerResult result = getClient().getApi()
          .createLoadBalancer(request);
      HealthCheck healthCheck = new HealthCheck().withTarget("HTTP:80/")
          .withInterval(10).withUnhealthyThreshold(3).withTimeout(5)
          .withHealthyThreshold(3);
      getClient()
          .getApi()
          .configureHealthCheck(
              new ConfigureHealthCheckRequest()
                  .withLoadBalancerName(this.loadBalancerName)
                  .withHealthCheck(healthCheck));
      return result;
    } finally {
      getClient().getApi().shutdown();
    }
  }

  private Set<String> getLoadBalancers() {
    Set<String> names = Sets.newHashSet();
    List<LoadBalancerDescription> loadBalancers = new GetLoadBalancers(
        getAwsCredentials(), getRegion()).call();
    for (LoadBalancerDescription loadBalancerDescription : loadBalancers) {
      names.add(loadBalancerDescription.getLoadBalancerName());
    }
    return names;
  }
}
TOP

Related Classes of com.elastisys.scale.cloudadapters.aws.commons.requests.elb.CreateLoadBalancer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.