Example usage for com.amazonaws.services.elasticloadbalancing.model Listener Listener

List of usage examples for com.amazonaws.services.elasticloadbalancing.model Listener Listener

Introduction

In this page you can find the example usage for com.amazonaws.services.elasticloadbalancing.model Listener Listener.

Prototype

public Listener(String protocol, Integer loadBalancerPort, Integer instancePort) 

Source Link

Document

Constructs a new Listener object.

Usage

From source file:AwsAuto.java

License:Open Source License

public static void main(String[] args) throws Exception {

    // initialize/determine parameters
    String instanceType = "m3.medium";
    String loadGeneratorAmi = "ami-8ac4e9e0";
    String dataCenterAmi = "ami-349fbb5e";
    String bidPrice = "0.1";
    String loadGeneratorDns = null; // load generator DNS
    String dashboardUrl = null; // the URL where we check our performance
    String testId = null;/*from w ww  .ja  v  a2  s .c  om*/

    // create project tag for instances
    ArrayList<com.amazonaws.services.ec2.model.Tag> loadGeneratorTags = new ArrayList<>();
    com.amazonaws.services.ec2.model.Tag loadGeneratorTag = new com.amazonaws.services.ec2.model.Tag("Project",
            "2.1");
    loadGeneratorTags.add(loadGeneratorTag);

    // create project tag for auto-scaling
    com.amazonaws.services.autoscaling.model.Tag asgTag = new com.amazonaws.services.autoscaling.model.Tag();
    asgTag.setKey("Project");
    asgTag.setValue("2.1");

    // create project tag for load balancer
    ArrayList<com.amazonaws.services.elasticloadbalancing.model.Tag> loadBalancerTags = new ArrayList<>();
    com.amazonaws.services.elasticloadbalancing.model.Tag loadBalancerTag = new com.amazonaws.services.elasticloadbalancing.model.Tag();
    loadBalancerTag.setKey("Project");
    loadBalancerTag.setValue("2.1");
    loadBalancerTags.add(loadBalancerTag);

    /**
     * =========================================================================
     * ================= Create security groups
     * =========================================================================
     * =================
     */

    String loadGeneratorSecurityName = "LoadGeneratorSGP2";
    String allPurposeSecurityName = "AllPurposeSGP2";
    SecurityGroup loadGeneratorSecurityGroup = new SecurityGroup(loadGeneratorSecurityName);
    SecurityGroup allPurposeSecurityGroup = new SecurityGroup(allPurposeSecurityName);

    /**
     * =========================================================================
     * ================= Grant permission and credentials
     * =========================================================================
     * =================
     */

    AWSCredentials credentials = null;
    try {
        credentials = new ProfileCredentialsProvider("School").getCredentials();
    } catch (Exception e) {
        throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
                + "Please make sure that your credentials file is at the correct "
                + "location (C:\\Users\\Jiabei\\.aws\\credentials), and is in valid format.", e);
    }

    // set region
    AmazonEC2 ec2 = new AmazonEC2Client(credentials);
    Region usEast1 = Region.getRegion(Regions.US_EAST_1);
    ec2.setRegion(usEast1);

    /**
     * =========================================================================
     * ================= Create a load generator and submit password
     * =========================================================================
     * =================
     */

    Requests requestsLg = new Requests(instanceType, loadGeneratorAmi, bidPrice, loadGeneratorSecurityName,
            loadGeneratorTags);
    loadGeneratorDns = requestsLg.submitRequests();
    String submissionUrl = "http://" + loadGeneratorDns
            + "/password?passwd=0WSb4ufhYI7SkxfLWnnIWU0MC1NdcNKT&andrewId=jiabeip";
    sendGET(submissionUrl);

    try {

        /**
         * =======================================================================
         * =================== Create a load balancer
         * =======================================================================
         * ===================
         */

        String loadBalancerDns = null;
        String loadBalancerName = "LoadBalancerProj2";
        String healthCheckPage = "/heartbeat?lg=" + loadGeneratorDns;
        AmazonElasticLoadBalancingClient loadBalancerClient = new AmazonElasticLoadBalancingClient(credentials);

        // configure a request
        CreateLoadBalancerRequest loadBalancerRequest = new CreateLoadBalancerRequest()
                .withAvailabilityZones("us-east-1b").withListeners(new Listener("HTTP", 80, 80))
                .withLoadBalancerName(loadBalancerName).withSecurityGroups(allPurposeSecurityGroup.getGroupId())
                .withTags(loadBalancerTags);

        CreateLoadBalancerResult loadBalancerResult = loadBalancerClient
                .createLoadBalancer(loadBalancerRequest);
        loadBalancerDns = loadBalancerResult.getDNSName();

        // configure health check setting
        HealthCheck loadBalancerHealthCheck = new HealthCheck().withTarget("HTTP:80" + healthCheckPage)
                .withTimeout(5).withInterval(30).withUnhealthyThreshold(2).withHealthyThreshold(10);

        ConfigureHealthCheckRequest healthCheckRequest = new ConfigureHealthCheckRequest()
                .withLoadBalancerName(loadBalancerName).withHealthCheck(loadBalancerHealthCheck);

        // attach health check setting to load balancer
        ConfigureHealthCheckResult healthCheckResult = loadBalancerClient
                .configureHealthCheck(healthCheckRequest);

        System.out.println("Load balancer created!\nDNS: " + loadBalancerDns);

        /**
         * =======================================================================
         * =================== Create launch configuration
         * =======================================================================
         * ===================
         */

        String launchConfigName = "LaunchConfigProj2";
        String autoScalingGroupName = "AutoScalingGroupProj2";

        AmazonAutoScalingClient autoScalingGroupClient = new AmazonAutoScalingClient(credentials);
        AmazonCloudWatchClient cloudWatchClient = new AmazonCloudWatchClient(credentials);

        System.out.println("Creating launch configuration...");

        // configure the request
        CreateLaunchConfigurationRequest launchConfigRequest = new CreateLaunchConfigurationRequest()
                .withImageId(dataCenterAmi).withInstanceType(instanceType)
                .withLaunchConfigurationName(launchConfigName)
                .withSecurityGroups(allPurposeSecurityGroup.getGroupId()).withSpotPrice(bidPrice)
                .withKeyName("primary");

        // enable detail monitoring
        InstanceMonitoring monitor = new InstanceMonitoring();
        monitor.setEnabled(true);
        launchConfigRequest.setInstanceMonitoring(monitor);

        // attach the configuration to the ASG client
        autoScalingGroupClient.createLaunchConfiguration(launchConfigRequest);

        System.out.println("Configuration complete!\nCreating auto-scaling group...");

        /**
         * =======================================================================
         * =================== Create auto-scaling group
         * =======================================================================
         * ===================
         */

        // configure ASG request
        CreateAutoScalingGroupRequest asgRequest = new CreateAutoScalingGroupRequest()
                .withAutoScalingGroupName(autoScalingGroupName).withAvailabilityZones("us-east-1b")
                .withLoadBalancerNames(loadBalancerName).withNewInstancesProtectedFromScaleIn(false)
                .withTags(asgTag).withDefaultCooldown(120).withMinSize(1).withMaxSize(8).withDesiredCapacity(1) // Start
                // from
                // one
                .withHealthCheckGracePeriod(120).withHealthCheckType("ELB")
                .withLaunchConfigurationName(launchConfigName);

        // attach group configuration to ASG client
        autoScalingGroupClient.createAutoScalingGroup(asgRequest);

        /**
         * =======================================================================
         * =================== Create scaling up policy for ASG
         * =======================================================================
         * ===================
         */

        StepAdjustment upRule1 = new StepAdjustment().withMetricIntervalLowerBound(0.0)
                .withMetricIntervalUpperBound(25.0).withScalingAdjustment(1);

        StepAdjustment upRule2 = new StepAdjustment().withMetricIntervalLowerBound(25.0)
                .withMetricIntervalUpperBound(30.0).withScalingAdjustment(2);

        StepAdjustment upRule3 = new StepAdjustment().withMetricIntervalLowerBound(30.0)
                .withMetricIntervalUpperBound(null).withScalingAdjustment(3);

        String upPolicyName = "Scaling Up";

        PutScalingPolicyRequest scalingUpPolicy = new PutScalingPolicyRequest()
                .withAdjustmentType("ChangeInCapacity").withPolicyType("StepScaling")
                .withStepAdjustments(upRule1, upRule2, upRule3).withAutoScalingGroupName(autoScalingGroupName)
                .withPolicyName(upPolicyName).withEstimatedInstanceWarmup(120);

        StepAdjustment downRule1 = new StepAdjustment().withMetricIntervalLowerBound(-20.0)
                .withMetricIntervalUpperBound(-0.0).withScalingAdjustment(-1);

        StepAdjustment downRule2 = new StepAdjustment().withMetricIntervalLowerBound(-30.0)
                .withMetricIntervalUpperBound(-20.0).withScalingAdjustment(-2);

        StepAdjustment downRule3 = new StepAdjustment().withMetricIntervalLowerBound(null)
                .withMetricIntervalUpperBound(-30.0).withScalingAdjustment(-3);

        String downPolicyName = "Scaling Down";

        PutScalingPolicyRequest scalingDownPolicy = new PutScalingPolicyRequest().withAdjustmentType("")
                .withPolicyType("ChangeInCapacity").withStepAdjustments(downRule1, downRule2, downRule3)
                .withAutoScalingGroupName(autoScalingGroupName).withPolicyName(downPolicyName)
                .withEstimatedInstanceWarmup(60);

        // attach policies to ASG and get ARN for setting alarm
        PutScalingPolicyResult scaleUpResult = autoScalingGroupClient.putScalingPolicy(scalingUpPolicy);
        String upArn = scaleUpResult.getPolicyARN();
        PutScalingPolicyResult scaleDownResult = autoScalingGroupClient.putScalingPolicy(scalingDownPolicy);
        String downArn = scaleDownResult.getPolicyARN();

        /**
         * =======================================================================
         * =================== Create alarms for policies
         * =======================================================================
         * ===================
         */

        String upAlarmName = "UpAlarm_Mild";
        String downAlarmName = "DownAlarm_Mild";
        Dimension dimension = new Dimension();
        dimension.setName("AutoScalingGroupName");
        dimension.setValue(autoScalingGroupName);

        PutMetricAlarmRequest upAlarmRequest = new PutMetricAlarmRequest().withAlarmName(upAlarmName)
                .withMetricName("CPUUtilization").withNamespace("AWS/EC2").withDimensions(dimension)
                .withStatistic(Statistic.SampleCount)
                .withComparisonOperator(ComparisonOperator.GreaterThanOrEqualToThreshold).withThreshold(65.0)
                .withEvaluationPeriods(1).withPeriod(120).withAlarmActions(upArn);

        PutMetricAlarmRequest downAlarmRequest = new PutMetricAlarmRequest().withAlarmName(downAlarmName)
                .withNamespace("AWS/EC2").withDimensions(dimension).withMetricName("CPUUtilization")
                .withStatistic(Statistic.Average)
                .withComparisonOperator(ComparisonOperator.LessThanOrEqualToThreshold).withThreshold(60.0)
                .withEvaluationPeriods(1).withPeriod(120).withAlarmActions(downArn);

        cloudWatchClient.putMetricAlarm(upAlarmRequest);
        cloudWatchClient.putMetricAlarm(downAlarmRequest);

        System.out.println("All settings complete! \nReady for warmup...");

        /**
         * =======================================================================
         * =================== Warm up ELB
         * =======================================================================
         * ===================
         */

        String warmUpUrl = "http://" + loadGeneratorDns + "/warmup?dns=" + loadBalancerDns;
        sendGET(warmUpUrl);
        System.out.println("Warmup link: " + warmUpUrl);

        try {
            Thread.sleep(15 * 60 * 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Warmup complete!\nReady for battle...");

        /**
         * =======================================================================
         * =================== Start the test
         * =======================================================================
         * ===================
         */

        String testUrl = "http://" + loadGeneratorDns + "/junior?dns=" + loadBalancerDns;
        testId = sendGET(testUrl);
        System.out.println("Test ID is: " + testId);

        System.out.println("Test link: " + testUrl);

        try {
            Thread.sleep(60 * 60 * 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("Test finished!");

        /**
         * =======================================================================
         * =================== Delete resources
         * =======================================================================
         * ===================
         */

        // clear ASG
        UpdateAutoScalingGroupRequest asgClearRequest = new UpdateAutoScalingGroupRequest()
                .withAutoScalingGroupName(autoScalingGroupName).withMaxSize(0).withMinSize(0);
        autoScalingGroupClient.updateAutoScalingGroup(asgClearRequest);

        // delete policies
        DeletePolicyRequest upPolicyDeleteRequest = new DeletePolicyRequest()
                .withAutoScalingGroupName(autoScalingGroupName).withPolicyName(upPolicyName);
        autoScalingGroupClient.deletePolicy(upPolicyDeleteRequest);

        DeletePolicyRequest downPolicyDeleteRequest = new DeletePolicyRequest()
                .withAutoScalingGroupName(autoScalingGroupName).withPolicyName(downPolicyName);
        autoScalingGroupClient.deletePolicy(downPolicyDeleteRequest);
        System.out.println("Policies deleted...");

        // delete alarms
        DeleteAlarmsRequest alarmsDeleteRequest = new DeleteAlarmsRequest().withAlarmNames(upAlarmName,
                downAlarmName);
        cloudWatchClient.deleteAlarms(alarmsDeleteRequest);
        System.out.println("Alarms deleted...");

        // delete load balancer
        DeleteLoadBalancerRequest lgDeleteRequest = new DeleteLoadBalancerRequest()
                .withLoadBalancerName(loadBalancerName);
        loadBalancerClient.deleteLoadBalancer(lgDeleteRequest);
        System.out.println("Load generator deleted...");

        // delete ASG
        DeleteAutoScalingGroupRequest asgDeleteRequest = new DeleteAutoScalingGroupRequest()
                .withForceDelete(true).withAutoScalingGroupName(autoScalingGroupName);
        autoScalingGroupClient.deleteAutoScalingGroup(asgDeleteRequest);
        System.out.println("ASG deleted...");

        // delete launch configuration
        DeleteLaunchConfigurationRequest launchConfigDeleteRequest = new DeleteLaunchConfigurationRequest()
                .withLaunchConfigurationName(launchConfigName);
        autoScalingGroupClient.deleteLaunchConfiguration(launchConfigDeleteRequest);
        System.out.println("Launch configuration deleted...");

        // delete security group
        DeleteSecurityGroupRequest sgDeleteRequest = new DeleteSecurityGroupRequest()
                .withGroupName(allPurposeSecurityName);
        ec2.deleteSecurityGroup(sgDeleteRequest);
        System.out.println("Security group deleted...");

        /**
         * =======================================================================
         * =================== All done
         * =======================================================================
         * ===================
         */
        System.out.println("All done :)");

    } catch (AmazonServiceException ase) {
        // Write out any exceptions that may have occurred.
        System.out.println("Caught Exception: " + ase.getMessage());
        System.out.println("Reponse Status Code: " + ase.getStatusCode());
        System.out.println("Error Code: " + ase.getErrorCode());
        System.out.println("Request ID: " + ase.getRequestId());

    } catch (Exception e) {
        System.out.println("Unexcepted error!");
        System.out.println(e.getMessage());
    }

}

From source file:com.hazelcast.simulator.provisioner.AwsProvisioner.java

License:Open Source License

String createLoadBalancer(String name) {
    CreateLoadBalancerRequest request = new CreateLoadBalancerRequest();
    request.setLoadBalancerName(name);/*from  www  .j a  v a2  s  . co  m*/
    request.withAvailabilityZones(elbAvailabilityZones.split(","));

    List<Listener> listeners = new ArrayList<Listener>();
    listeners.add(new Listener(elbProtocol, elbPortIn, elbPortOut));
    request.setListeners(listeners);

    CreateLoadBalancerResult lbResult = elb.createLoadBalancer(request);
    appendText(lbResult.getDNSName() + NEW_LINE, elbFile);

    return request.getLoadBalancerName();
}

From source file:com.urbancode.terraform.tasks.aws.LoadBalancerTask.java

License:Apache License

@Override
public void create() throws EnvironmentCreationException {
    if (DNSName == null) {
        if (elbClient == null) {
            elbClient = context.fetchELBClient();
        }//from   w w w.j  ava2s.  co  m

        String uuid = context.getEnvironment().fetchSuffix();
        fullName = loadBalancerName + ("-" + uuid);
        log.debug("Security Group " + loadBalancerName + " has fullname " + fullName);

        String stickyPolicyName = "StickyPolicy";
        long defaultCookieExp = 60000;

        // get amazon ids
        List<String> subnetIds = null;
        List<String> availZones = null;
        List<String> secGroupIds = null;
        try {

            if (subnetName != null && !subnetName.isEmpty()) {
                subnetIds = resolveSubnetIds(subnetName);
            } else {
                log.warn("No subnets specified on load balancer " + fullName);
                if (zones != null && !zones.isEmpty()) {
                    availZones = resolveZones(zones);
                } else {
                    log.warn("No zones specified on load balancer " + fullName);
                    throw new EnvironmentCreationException(
                            "Must specify either zones or " + "subnets on load balancer " + fullName);
                }
            }

            secGroupIds = resolveSecGroupIds(getSecRefs());

            List<Listener> listeners = new ArrayList<Listener>();
            if (getListeners() != null) {
                for (ListenerTask task : getListeners()) {
                    Listener tmp = new Listener(task.getProtocol(), task.getLoadBalancerPort(),
                            task.getInstancePort());
                    if (task.isSecure()) {
                        tmp.setSSLCertificateId(task.getCertId());
                    }
                    listeners.add(tmp);
                }
            } else {
                log.warn("No listeners specified for LoadBalancer: " + fullName
                        + "\nThis load balancer is not configured to balance any " + "instances.");
            }

            // launch the load balancer
            DNSName = helper.launchLoadBalancer(fullName, subnetIds, secGroupIds, listeners, availZones,
                    elbClient);

            // configure sticky sessions
            helper.createStickyPolicy(fullName, stickyPolicyName, getAppCookieName(), defaultCookieExp,
                    elbClient);

            // configure the HealthChecks on the instances for them to be registered
            if (getHealthCheck() != null) {
                String hcTarget = getHealthCheck().getProtocol() + ":" + getHealthCheck().getPort()
                        + getHealthCheck().getPath();
                int health = getHealthCheck().getHealthyCount();
                int unhealth = getHealthCheck().getUnhealthyCount();
                int interval = getHealthCheck().getInterval();
                int timeout = getHealthCheck().getTimeout();
                helper.setupHealthCheck(fullName, hcTarget, health, unhealth, interval, timeout, elbClient);
            } else {
                log.warn("No HealthCheck specified for load balancer " + fullName
                        + "\nYou may not be able to reach the instances behind this " + "load balancer.");
            }
        } catch (Exception e) {
            log.error("Could not create load balancer " + fullName + " completely");
            throw new EnvironmentCreationException("Could not start load balancer " + fullName, e);
        } finally {
            elbClient = null;
        }
    }
}

From source file:fr.xebia.demo.amazon.aws.AmazonAwsInfrastructureMaker.java

License:Apache License

public CreateLoadBalancerResult createElasticLoadBalancer(List<Instance> ec2Instances) {
    Set<String> availabilityZones = Sets
            .newHashSet(Lists.transform(ec2Instances, new Function<Instance, String>() {
                @Override/*from  www  .  j av a 2 s. co m*/
                public String apply(Instance instance) {
                    return instance.getPlacement().getAvailabilityZone();
                }
            }));

    List<com.amazonaws.services.elasticloadbalancing.model.Instance> elbInstances = Lists.transform(
            ec2Instances, new Function<Instance, com.amazonaws.services.elasticloadbalancing.model.Instance>() {
                @Override
                public com.amazonaws.services.elasticloadbalancing.model.Instance apply(Instance ec2Instance) {
                    return new com.amazonaws.services.elasticloadbalancing.model.Instance(
                            ec2Instance.getInstanceId());
                }
            });

    CreateLoadBalancerRequest createLoadBalancerRequest = new CreateLoadBalancerRequest() //
            .withLoadBalancerName("travel-ecommerce") //
            .withListeners(new Listener("HTTP", 80, 8080)) //
            .withAvailabilityZones(availabilityZones) //
    ;
    CreateLoadBalancerResult createLoadBalancerResult = elb.createLoadBalancer(createLoadBalancerRequest);

    // HEALTH CHECK
    HealthCheck helsathCheck = new HealthCheck() //
            .withTarget("HTTP:8080/") //
            .withHealthyThreshold(2) //
            .withUnhealthyThreshold(2) //
            .withInterval(30) //
            .withTimeout(2);
    ConfigureHealthCheckRequest configureHealthCheckRequest = new ConfigureHealthCheckRequest(
            createLoadBalancerRequest.getLoadBalancerName(), //
            helsathCheck);
    elb.configureHealthCheck(configureHealthCheckRequest);

    // COOKIE STICKINESS
    CreateLBCookieStickinessPolicyRequest createLbCookieStickinessPolicy = new CreateLBCookieStickinessPolicyRequest() //
            .withLoadBalancerName(createLoadBalancerRequest.getLoadBalancerName())//
            .withPolicyName("travel-ecommerce-stickiness-policy");
    elb.createLBCookieStickinessPolicy(createLbCookieStickinessPolicy);

    SetLoadBalancerPoliciesOfListenerRequest setLoadBalancerPoliciesOfListenerRequest = new SetLoadBalancerPoliciesOfListenerRequest() //
            .withLoadBalancerName(createLoadBalancerRequest.getLoadBalancerName()) //
            .withLoadBalancerPort(80) //
            .withPolicyNames(createLbCookieStickinessPolicy.getPolicyName())//
    ;
    elb.setLoadBalancerPoliciesOfListener(setLoadBalancerPoliciesOfListenerRequest);

    // INSTANCES
    RegisterInstancesWithLoadBalancerRequest registerInstancesWithLoadBalancerRequest = new RegisterInstancesWithLoadBalancerRequest(
            createLoadBalancerRequest.getLoadBalancerName(), elbInstances);
    elb.registerInstancesWithLoadBalancer(registerInstancesWithLoadBalancerRequest);

    logger.info("Created {}", createLoadBalancerResult);

    return createLoadBalancerResult;
}

From source file:fr.xebia.demo.amazon.aws.PetclinicInfrastructureEnforcer.java

License:Apache License

/**
 * /*from   w  w w. ja v  a2s  .  c  o m*/
 * @param healthCheckUri
 *            start with slash. E.g. "/myapp/healthcheck.jsp
 * @param applicationIdentifier
 *            used to name the load balancer and to filter the instances on
 *            their "Role" tag.
 * @return created load balancer description
 */
@Nonnull
public LoadBalancerDescription createOrUpdateElasticLoadBalancer(@Nonnull String healthCheckUri,
        @Nonnull String applicationIdentifier) {
    LOGGER.info("ENFORCE LOAD BALANCER");

    DescribeInstancesRequest describeInstancesWithRoleRequest = new DescribeInstancesRequest(). //
            withFilters(new Filter("tag:Role", Arrays.asList(applicationIdentifier)));
    DescribeInstancesResult describeInstancesResult = ec2.describeInstances(describeInstancesWithRoleRequest);

    Iterable<Instance> expectedEc2Instances = toEc2Instances(describeInstancesResult.getReservations());

    Set<String> expectedAvailabilityZones = Sets
            .newHashSet(Iterables.transform(expectedEc2Instances, EC2_INSTANCE_TO_AVAILABILITY_ZONE));
    Listener expectedListener = new Listener("HTTP", 80, 8080);

    String loadBalancerName = applicationIdentifier;

    LoadBalancerDescription actualLoadBalancerDescription;
    try {
        DescribeLoadBalancersResult describeLoadBalancers = elb
                .describeLoadBalancers(new DescribeLoadBalancersRequest(Arrays.asList(loadBalancerName)));
        if (describeLoadBalancers.getLoadBalancerDescriptions().isEmpty()) {
            // unexpected, this should have been a
            // LoadBalancerNotFoundException
            actualLoadBalancerDescription = null;
        } else {
            // re-query to get updated config

            actualLoadBalancerDescription = Iterables
                    .getFirst(describeLoadBalancers.getLoadBalancerDescriptions(), null);
        }
    } catch (LoadBalancerNotFoundException e) {
        actualLoadBalancerDescription = null;
    }

    Set<String> actualAvailabilityZones;
    Set<String> actualInstanceIds;
    Policies actualPolicies;
    HealthCheck actualHealthCheck;
    ListenerDescription actualListenerDescription = null;
    if (actualLoadBalancerDescription == null) {
        CreateLoadBalancerRequest createLoadBalancerRequest = new CreateLoadBalancerRequest() //
                .withLoadBalancerName(loadBalancerName) //
                .withAvailabilityZones(expectedAvailabilityZones) //
                .withListeners(expectedListener);
        elb.createLoadBalancer(createLoadBalancerRequest);

        actualListenerDescription = new ListenerDescription().withListener(expectedListener);
        actualAvailabilityZones = expectedAvailabilityZones;
        actualInstanceIds = Collections.emptySet();
        actualHealthCheck = new HealthCheck();
        actualPolicies = new Policies();
    } else {
        // check listeners
        List<ListenerDescription> actualListenerDescriptions = actualLoadBalancerDescription
                .getListenerDescriptions();
        boolean loadBalancerMustBeRecreated;

        if (actualListenerDescriptions.size() == 1) {
            actualListenerDescription = Iterables.getOnlyElement(actualListenerDescriptions);
            Listener actualListener = actualListenerDescription.getListener();
            if (ObjectUtils.equals(expectedListener.getProtocol(), actualListener.getProtocol()) && //
                    ObjectUtils.equals(expectedListener.getLoadBalancerPort(),
                            actualListener.getLoadBalancerPort())
                    && //
                    ObjectUtils.equals(expectedListener.getInstancePort(), actualListener.getInstancePort())) {
                loadBalancerMustBeRecreated = false;
            } else {
                loadBalancerMustBeRecreated = true;
            }
        } else {
            loadBalancerMustBeRecreated = true;
        }

        if (loadBalancerMustBeRecreated) {
            LOGGER.info("Recreate miss configured load balancer actualListeners:{}, expectedListener:{}",
                    actualListenerDescriptions, expectedListener);
            elb.deleteLoadBalancer(new DeleteLoadBalancerRequest(loadBalancerName));
            return createOrUpdateElasticLoadBalancer(healthCheckUri, applicationIdentifier);
        }

        //
        actualAvailabilityZones = Sets.newHashSet(actualLoadBalancerDescription.getAvailabilityZones());
        actualInstanceIds = Sets.newHashSet(
                Iterables.transform(actualLoadBalancerDescription.getInstances(), ELB_INSTANCE_TO_INSTANCE_ID));

        actualHealthCheck = actualLoadBalancerDescription.getHealthCheck();

        actualPolicies = actualLoadBalancerDescription.getPolicies();
    }

    // HEALTH CHECK
    if (!healthCheckUri.startsWith("/")) {
        healthCheckUri = "/" + healthCheckUri;
    }

    HealthCheck expectedHealthCheck = new HealthCheck() //
            .withTarget("HTTP:8080" + healthCheckUri) //
            .withHealthyThreshold(2) //
            .withUnhealthyThreshold(2) //
            .withInterval(30) //
            .withTimeout(2);
    if (Objects.equal(expectedHealthCheck.getTarget(), actualHealthCheck.getTarget()) && //
            Objects.equal(expectedHealthCheck.getHealthyThreshold(), actualHealthCheck.getHealthyThreshold()) && //
            Objects.equal(expectedHealthCheck.getInterval(), actualHealthCheck.getInterval()) && //
            Objects.equal(expectedHealthCheck.getTimeout(), actualHealthCheck.getTimeout()) && //
            Objects.equal(expectedHealthCheck.getUnhealthyThreshold(),
                    actualHealthCheck.getHealthyThreshold())) {
        // health check is ok
    } else {
        LOGGER.info("Set Healthcheck: {}", expectedHealthCheck);
        elb.configureHealthCheck(new ConfigureHealthCheckRequest(loadBalancerName, expectedHealthCheck));
    }

    // AVAILABILITY ZONES
    // enable
    Iterable<String> availabilityZonesToEnable = Sets.difference(expectedAvailabilityZones,
            actualAvailabilityZones);
    LOGGER.info("Enable availability zones: {}", availabilityZonesToEnable);
    if (!Iterables.isEmpty(availabilityZonesToEnable)) {
        elb.enableAvailabilityZonesForLoadBalancer(new EnableAvailabilityZonesForLoadBalancerRequest(
                loadBalancerName, Lists.newArrayList(availabilityZonesToEnable)));
    }

    // disable
    Iterable<String> availabilityZonesToDisable = Sets.difference(actualAvailabilityZones,
            expectedAvailabilityZones);
    LOGGER.info("Disable availability zones: {}", availabilityZonesToDisable);
    if (!Iterables.isEmpty(availabilityZonesToDisable)) {
        elb.disableAvailabilityZonesForLoadBalancer(new DisableAvailabilityZonesForLoadBalancerRequest(
                loadBalancerName, Lists.newArrayList(availabilityZonesToDisable)));
    }

    // STICKINESS
    List<AppCookieStickinessPolicy> appCookieStickinessPoliciesToDelete = actualPolicies
            .getAppCookieStickinessPolicies();
    LOGGER.info("Delete app cookie stickiness policies: {}", appCookieStickinessPoliciesToDelete);
    for (AppCookieStickinessPolicy appCookieStickinessPolicyToDelete : appCookieStickinessPoliciesToDelete) {
        elb.deleteLoadBalancerPolicy(new DeleteLoadBalancerPolicyRequest(loadBalancerName,
                appCookieStickinessPolicyToDelete.getPolicyName()));
    }

    final LBCookieStickinessPolicy expectedLbCookieStickinessPolicy = new LBCookieStickinessPolicy(
            applicationIdentifier + "-stickiness-policy", null);
    Predicate<LBCookieStickinessPolicy> isExpectedPolicyPredicate = new Predicate<LBCookieStickinessPolicy>() {
        @Override
        public boolean apply(LBCookieStickinessPolicy lbCookieStickinessPolicy) {
            return Objects.equal(expectedLbCookieStickinessPolicy.getPolicyName(),
                    lbCookieStickinessPolicy.getPolicyName()) && //
            Objects.equal(expectedLbCookieStickinessPolicy.getCookieExpirationPeriod(),
                    lbCookieStickinessPolicy.getCookieExpirationPeriod());
        }
    };
    Collection<LBCookieStickinessPolicy> lbCookieStickinessPoliciesToDelete = Collections2
            .filter(actualPolicies.getLBCookieStickinessPolicies(), Predicates.not(isExpectedPolicyPredicate));
    LOGGER.info("Delete lb cookie stickiness policies: {}", lbCookieStickinessPoliciesToDelete);
    for (LBCookieStickinessPolicy lbCookieStickinessPolicy : lbCookieStickinessPoliciesToDelete) {
        elb.deleteLoadBalancerPolicy(new DeleteLoadBalancerPolicyRequest(loadBalancerName,
                lbCookieStickinessPolicy.getPolicyName()));
    }

    Collection<LBCookieStickinessPolicy> matchingLbCookieStyckinessPolicy = Collections2
            .filter(actualPolicies.getLBCookieStickinessPolicies(), isExpectedPolicyPredicate);
    if (matchingLbCookieStyckinessPolicy.isEmpty()) {
        // COOKIE STICKINESS
        CreateLBCookieStickinessPolicyRequest createLbCookieStickinessPolicy = new CreateLBCookieStickinessPolicyRequest() //
                .withLoadBalancerName(loadBalancerName) //
                .withPolicyName(expectedLbCookieStickinessPolicy.getPolicyName())
                //
                .withCookieExpirationPeriod(expectedLbCookieStickinessPolicy.getCookieExpirationPeriod());
        LOGGER.info("Create LBCookieStickinessPolicy: {}", createLbCookieStickinessPolicy);
        elb.createLBCookieStickinessPolicy(createLbCookieStickinessPolicy);

    } else {
        // what ?
    }

    // TODO verify load balancer policy is associated with the listener
    List<String> expectedListenerDescriptionPolicyNames = Lists
            .newArrayList(expectedLbCookieStickinessPolicy.getPolicyName());

    boolean mustOverWriteListenerPolicy = !ObjectUtils.equals(expectedListenerDescriptionPolicyNames,
            actualListenerDescription.getPolicyNames());

    if (mustOverWriteListenerPolicy) {

        SetLoadBalancerPoliciesOfListenerRequest setLoadBalancerPoliciesOfListenerRequest = new SetLoadBalancerPoliciesOfListenerRequest() //
                .withLoadBalancerName(loadBalancerName) //
                .withLoadBalancerPort(expectedListener.getLoadBalancerPort()) //
                .withPolicyNames(expectedLbCookieStickinessPolicy.getPolicyName());
        LOGGER.debug("setLoadBalancerPoliciesOfListener: {}", setLoadBalancerPoliciesOfListenerRequest);
        elb.setLoadBalancerPoliciesOfListener(setLoadBalancerPoliciesOfListenerRequest);
    }

    // INSTANCES
    Set<String> expectedEc2InstanceIds = Sets
            .newHashSet(Iterables.transform(expectedEc2Instances, EC2_INSTANCE_TO_INSTANCE_ID));
    // register
    Iterable<String> instanceIdsToRegister = Sets.difference(expectedEc2InstanceIds, actualInstanceIds);
    LOGGER.info("Register {} instances: {}", applicationIdentifier, instanceIdsToRegister);
    if (!Iterables.isEmpty(instanceIdsToRegister)) {
        elb.registerInstancesWithLoadBalancer(new RegisterInstancesWithLoadBalancerRequest(loadBalancerName,
                Lists.newArrayList(Iterables.transform(instanceIdsToRegister, INSTANCE_ID_TO_ELB_INSTANCE))));
    }

    // deregister
    Iterable<String> instanceIdsToDeregister = Sets.difference(actualInstanceIds, expectedEc2InstanceIds);
    LOGGER.info("Deregister {} instances: {}", applicationIdentifier, instanceIdsToDeregister);
    if (!Iterables.isEmpty(instanceIdsToDeregister)) {
        elb.deregisterInstancesFromLoadBalancer(new DeregisterInstancesFromLoadBalancerRequest(loadBalancerName,
                Lists.newArrayList(Iterables.transform(instanceIdsToDeregister, INSTANCE_ID_TO_ELB_INSTANCE))));
    }

    // QUERY TO GET UP TO DATE LOAD BALANCER DESCRIPTION
    LoadBalancerDescription elasticLoadBalancerDescription = Iterables.getOnlyElement(
            elb.describeLoadBalancers(new DescribeLoadBalancersRequest(Arrays.asList(loadBalancerName)))
                    .getLoadBalancerDescriptions());

    return elasticLoadBalancerDescription;
}

From source file:fr.xebia.workshop.infrastructureascode.AmazonAwsPetclinicInfrastructureEnforcer.java

License:Apache License

/**
 * /*from w w w .  j a  v a2  s.c o m*/
 * @param healthCheckUri
 *            start with slash. E.g. "/myapp/healthcheck.jsp
 * @param applicationIdentifier
 *            used to name the load balancer and to filter the instances on
 *            their "Role" tag.
 * @return created load balancer description
 */
@Nonnull
public LoadBalancerDescription createOrUpdateElasticLoadBalancer(@Nonnull String healthCheckUri,
        @Nonnull String applicationIdentifier) {
    logger.info("ENFORCE LOAD BALANCER");

    DescribeInstancesRequest describeInstancesWithRoleRequest = new DescribeInstancesRequest(). //
            withFilters(new Filter("tag:Role", Arrays.asList(applicationIdentifier)));
    DescribeInstancesResult describeInstancesResult = ec2.describeInstances(describeInstancesWithRoleRequest);

    Iterable<Instance> expectedEc2Instances = toEc2Instances(describeInstancesResult.getReservations());

    Set<String> expectedAvailabilityZones = Sets
            .newHashSet(Iterables.transform(expectedEc2Instances, EC2_INSTANCE_TO_AVAILABILITY_ZONE));
    Listener expectedListener = new Listener("HTTP", 80, 8080);

    String loadBalancerName = applicationIdentifier;

    LoadBalancerDescription actualLoadBalancerDescription;
    try {
        DescribeLoadBalancersResult describeLoadBalancers = elb
                .describeLoadBalancers(new DescribeLoadBalancersRequest(Arrays.asList(loadBalancerName)));
        if (describeLoadBalancers.getLoadBalancerDescriptions().isEmpty()) {
            // unexpected, this should have been a
            // LoadBalancerNotFoundException
            actualLoadBalancerDescription = null;
        } else {
            // re-query to get updated config

            actualLoadBalancerDescription = Iterables
                    .getFirst(describeLoadBalancers.getLoadBalancerDescriptions(), null);
        }
    } catch (LoadBalancerNotFoundException e) {
        actualLoadBalancerDescription = null;
    }

    Set<String> actualAvailabilityZones;
    Set<String> actualInstanceIds;
    Policies actualPolicies;
    HealthCheck actualHealthCheck;
    ListenerDescription actualListenerDescription = null;
    if (actualLoadBalancerDescription == null) {
        CreateLoadBalancerRequest createLoadBalancerRequest = new CreateLoadBalancerRequest() //
                .withLoadBalancerName(loadBalancerName) //
                .withAvailabilityZones(expectedAvailabilityZones) //
                .withListeners(expectedListener);
        elb.createLoadBalancer(createLoadBalancerRequest);

        actualListenerDescription = new ListenerDescription().withListener(expectedListener);
        actualAvailabilityZones = expectedAvailabilityZones;
        actualInstanceIds = Collections.emptySet();
        actualHealthCheck = new HealthCheck();
        actualPolicies = new Policies();
    } else {
        // check listeners
        List<ListenerDescription> actualListenerDescriptions = actualLoadBalancerDescription
                .getListenerDescriptions();
        boolean loadBalancerMustBeRecreated;

        if (actualListenerDescriptions.size() == 1) {
            actualListenerDescription = Iterables.getOnlyElement(actualListenerDescriptions);
            Listener actualListener = actualListenerDescription.getListener();
            if (ObjectUtils.equals(expectedListener.getProtocol(), actualListener.getProtocol()) && //
                    ObjectUtils.equals(expectedListener.getLoadBalancerPort(),
                            actualListener.getLoadBalancerPort())
                    && //
                    ObjectUtils.equals(expectedListener.getInstancePort(), actualListener.getInstancePort())) {
                loadBalancerMustBeRecreated = false;
            } else {
                loadBalancerMustBeRecreated = true;
            }
        } else {
            loadBalancerMustBeRecreated = true;
        }

        if (loadBalancerMustBeRecreated) {
            logger.info("Recreate miss configured load balancer actualListeners:{}, expectedListener:{}",
                    actualListenerDescriptions, expectedListener);
            elb.deleteLoadBalancer(new DeleteLoadBalancerRequest(loadBalancerName));
            return createOrUpdateElasticLoadBalancer(healthCheckUri, applicationIdentifier);
        }

        //
        actualAvailabilityZones = Sets.newHashSet(actualLoadBalancerDescription.getAvailabilityZones());
        actualInstanceIds = Sets.newHashSet(
                Iterables.transform(actualLoadBalancerDescription.getInstances(), ELB_INSTANCE_TO_INSTANCE_ID));

        actualHealthCheck = actualLoadBalancerDescription.getHealthCheck();

        actualPolicies = actualLoadBalancerDescription.getPolicies();
    }

    // HEALTH CHECK
    if (!healthCheckUri.startsWith("/")) {
        healthCheckUri = "/" + healthCheckUri;
    }

    HealthCheck expectedHealthCheck = new HealthCheck() //
            .withTarget("HTTP:8080" + healthCheckUri) //
            .withHealthyThreshold(2) //
            .withUnhealthyThreshold(2) //
            .withInterval(30) //
            .withTimeout(2);
    if (Objects.equal(expectedHealthCheck.getTarget(), actualHealthCheck.getTarget()) && //
            Objects.equal(expectedHealthCheck.getHealthyThreshold(), actualHealthCheck.getHealthyThreshold()) && //
            Objects.equal(expectedHealthCheck.getInterval(), actualHealthCheck.getInterval()) && //
            Objects.equal(expectedHealthCheck.getTimeout(), actualHealthCheck.getTimeout()) && //
            Objects.equal(expectedHealthCheck.getUnhealthyThreshold(),
                    actualHealthCheck.getHealthyThreshold())) {
        // health check is ok
    } else {
        logger.info("Set Healthcheck: " + expectedHealthCheck);
        elb.configureHealthCheck(new ConfigureHealthCheckRequest(loadBalancerName, expectedHealthCheck));
    }

    // AVAILABILITY ZONES
    // enable
    Iterable<String> availabilityZonesToEnable = Sets.difference(expectedAvailabilityZones,
            actualAvailabilityZones);
    logger.info("Enable availability zones: " + availabilityZonesToEnable);
    if (!Iterables.isEmpty(availabilityZonesToEnable)) {
        elb.enableAvailabilityZonesForLoadBalancer(new EnableAvailabilityZonesForLoadBalancerRequest(
                loadBalancerName, Lists.newArrayList(availabilityZonesToEnable)));
    }

    // disable
    Iterable<String> availabilityZonesToDisable = Sets.difference(actualAvailabilityZones,
            expectedAvailabilityZones);
    logger.info("Disable availability zones: " + availabilityZonesToDisable);
    if (!Iterables.isEmpty(availabilityZonesToDisable)) {
        elb.disableAvailabilityZonesForLoadBalancer(new DisableAvailabilityZonesForLoadBalancerRequest(
                loadBalancerName, Lists.newArrayList(availabilityZonesToDisable)));
    }

    // STICKINESS
    List<AppCookieStickinessPolicy> appCookieStickinessPoliciesToDelete = actualPolicies
            .getAppCookieStickinessPolicies();
    logger.info("Delete app cookie stickiness policies:" + appCookieStickinessPoliciesToDelete);
    for (AppCookieStickinessPolicy appCookieStickinessPolicyToDelete : appCookieStickinessPoliciesToDelete) {
        elb.deleteLoadBalancerPolicy(new DeleteLoadBalancerPolicyRequest(loadBalancerName,
                appCookieStickinessPolicyToDelete.getPolicyName()));
    }

    final LBCookieStickinessPolicy expectedLbCookieStickinessPolicy = new LBCookieStickinessPolicy(
            applicationIdentifier + "-stickiness-policy", null);
    Predicate<LBCookieStickinessPolicy> isExpectedPolicyPredicate = new Predicate<LBCookieStickinessPolicy>() {
        @Override
        public boolean apply(LBCookieStickinessPolicy lbCookieStickinessPolicy) {
            return Objects.equal(expectedLbCookieStickinessPolicy.getPolicyName(),
                    lbCookieStickinessPolicy.getPolicyName()) && //
            Objects.equal(expectedLbCookieStickinessPolicy.getCookieExpirationPeriod(),
                    lbCookieStickinessPolicy.getCookieExpirationPeriod());
        }
    };
    Collection<LBCookieStickinessPolicy> lbCookieStickinessPoliciesToDelete = Collections2
            .filter(actualPolicies.getLBCookieStickinessPolicies(), Predicates.not(isExpectedPolicyPredicate));
    logger.info("Delete lb cookie stickiness policies: " + lbCookieStickinessPoliciesToDelete);
    for (LBCookieStickinessPolicy lbCookieStickinessPolicy : lbCookieStickinessPoliciesToDelete) {
        elb.deleteLoadBalancerPolicy(new DeleteLoadBalancerPolicyRequest(loadBalancerName,
                lbCookieStickinessPolicy.getPolicyName()));
    }

    Collection<LBCookieStickinessPolicy> matchingLbCookieStyckinessPolicy = Collections2
            .filter(actualPolicies.getLBCookieStickinessPolicies(), isExpectedPolicyPredicate);
    if (matchingLbCookieStyckinessPolicy.isEmpty()) {
        // COOKIE STICKINESS
        CreateLBCookieStickinessPolicyRequest createLbCookieStickinessPolicy = new CreateLBCookieStickinessPolicyRequest() //
                .withLoadBalancerName(loadBalancerName) //
                .withPolicyName(expectedLbCookieStickinessPolicy.getPolicyName()) //
                .withCookieExpirationPeriod(expectedLbCookieStickinessPolicy.getCookieExpirationPeriod());
        logger.info("Create LBCookieStickinessPolicy: " + createLbCookieStickinessPolicy);
        elb.createLBCookieStickinessPolicy(createLbCookieStickinessPolicy);

    } else {
        // what ?
    }

    // TODO verify load balancer policy is associated with the listener
    List<String> expectedListenerDescriptionPolicyNames = Lists
            .newArrayList(expectedLbCookieStickinessPolicy.getPolicyName());

    boolean mustOverWriteListenerPolicy = !ObjectUtils.equals(expectedListenerDescriptionPolicyNames,
            actualListenerDescription.getPolicyNames());

    if (mustOverWriteListenerPolicy) {

        SetLoadBalancerPoliciesOfListenerRequest setLoadBalancerPoliciesOfListenerRequest = new SetLoadBalancerPoliciesOfListenerRequest() //
                .withLoadBalancerName(loadBalancerName) //
                .withLoadBalancerPort(expectedListener.getLoadBalancerPort()) //
                .withPolicyNames(expectedLbCookieStickinessPolicy.getPolicyName());
        logger.debug("setLoadBalancerPoliciesOfListener: {}", setLoadBalancerPoliciesOfListenerRequest);
        elb.setLoadBalancerPoliciesOfListener(setLoadBalancerPoliciesOfListenerRequest);
    }

    // INSTANCES
    Set<String> expectedEc2InstanceIds = Sets
            .newHashSet(Iterables.transform(expectedEc2Instances, EC2_INSTANCE_TO_INSTANCE_ID));
    // register
    Iterable<String> instanceIdsToRegister = Sets.difference(expectedEc2InstanceIds, actualInstanceIds);
    logger.info("Register " + applicationIdentifier + " instances: " + instanceIdsToRegister);
    if (!Iterables.isEmpty(instanceIdsToRegister)) {
        elb.registerInstancesWithLoadBalancer(new RegisterInstancesWithLoadBalancerRequest(loadBalancerName,
                Lists.newArrayList(Iterables.transform(instanceIdsToRegister, INSTANCE_ID_TO_ELB_INSTANCE))));
    }

    // deregister
    Iterable<String> instanceIdsToDeregister = Sets.difference(actualInstanceIds, expectedEc2InstanceIds);
    logger.info("Deregister " + applicationIdentifier + " instances: " + instanceIdsToDeregister);
    if (!Iterables.isEmpty(instanceIdsToDeregister)) {
        elb.deregisterInstancesFromLoadBalancer(new DeregisterInstancesFromLoadBalancerRequest(loadBalancerName,
                Lists.newArrayList(Iterables.transform(instanceIdsToDeregister, INSTANCE_ID_TO_ELB_INSTANCE))));
    }

    // QUERY TO GET UP TO DATE LOAD BALANCER DESCRIPTION
    LoadBalancerDescription elasticLoadBalancerDescription = Iterables.getOnlyElement(
            elb.describeLoadBalancers(new DescribeLoadBalancersRequest(Arrays.asList(loadBalancerName)))
                    .getLoadBalancerDescriptions());

    return elasticLoadBalancerDescription;
}

From source file:org.apache.stratos.aws.extension.AWSHelper.java

License:Apache License

/**
 * Returns the Listeners required for the service. Listeners are derived
 * from the proxy port, port and protocol values of the service.
 *
 * @param service// w  ww .j  av  a2  s  .c  o m
 * @return list of listeners required for the service
 */
public List<Listener> getRequiredListeners(Member member) throws LoadBalancerExtensionException {
    List<Listener> listeners = new ArrayList<Listener>();

    Collection<Port> ports = member.getPorts();

    for (Port port : ports) {
        int instancePort = port.getValue();
        int proxyPort = port.getProxy();
        String protocol = port.getProtocol().toUpperCase();
        String instanceProtocol = protocol;

        Listener listener = new Listener(protocol, proxyPort, instancePort);
        listener.setInstanceProtocol(instanceProtocol);
        if ("HTTPS".equalsIgnoreCase(protocol) || "SSL".equalsIgnoreCase(protocol)) {
            // if the SSL certificate is not configured in the aws.properties file, can't continue
            if (getSslCertificateId() == null || getSslCertificateId().isEmpty()) {
                String errorMsg = "Required property " + Constants.LOAD_BALANCER_SSL_CERTIFICATE_ID
                        + " not provided in configuration";
                log.error(errorMsg);
                throw new LoadBalancerExtensionException(errorMsg);
            }
            // TODO: make debug?
            if (log.isInfoEnabled()) {
                log.info("Listener protocol = " + protocol + ", hence setting the SSL Certificate Id: "
                        + getSslCertificateId());
            }
            listener.setSSLCertificateId(getSslCertificateId());
        }

        listeners.add(listener);
    }

    return listeners;
}