Example usage for com.amazonaws.services.elasticloadbalancing.model LoadBalancerDescription getAvailabilityZones

List of usage examples for com.amazonaws.services.elasticloadbalancing.model LoadBalancerDescription getAvailabilityZones

Introduction

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

Prototype


public java.util.List<String> getAvailabilityZones() 

Source Link

Document

The Availability Zones for the load balancer.

Usage

From source file:com.haskins.cloudtrailviewer.dialog.resourcedetail.detailpanels.ElbDetail.java

License:Open Source License

private void buildUI(DescribeLoadBalancersResult detail) {

    JTabbedPane tabs = new JTabbedPane();

    tabs.add("Load Balancer", primaryScrollPane);

    final JTable healthCheckTable = new JTable(healthCheckTableModel);
    JScrollPane healthCheckScrollPane = new JScrollPane(healthCheckTable);
    tabs.add("Health Check", healthCheckScrollPane);

    final JTable listenersTable = new JTable(listenersTableModel);
    JScrollPane listenersScrollPane = new JScrollPane(listenersTable);
    tabs.add("Listeners", listenersScrollPane);

    this.add(tabs, BorderLayout.CENTER);

    List<LoadBalancerDescription> elbs = detail.getLoadBalancerDescriptions();
    if (!elbs.isEmpty()) {

        LoadBalancerDescription elb = elbs.get(0);

        if (!elb.getAvailabilityZones().isEmpty()) {

            StringBuilder azs = new StringBuilder();
            for (String az : elb.getAvailabilityZones()) {
                azs.append(az).append(", ");
            }/*  w w w  .  j a  v a2 s .  co  m*/

            primaryTableModel.addRow(new Object[] { "Availability Zones", azs.toString() });
        }

        if (elb.getCanonicalHostedZoneName() != null) {
            primaryTableModel
                    .addRow(new Object[] { "Canonical Hosted Zone name", elb.getCanonicalHostedZoneName() });
        }
        if (elb.getCanonicalHostedZoneNameID() != null) {
            primaryTableModel.addRow(
                    new Object[] { "Canonical Hosted Zone name Id", elb.getCanonicalHostedZoneNameID() });
        }
        if (elb.getCreatedTime() != null) {
            primaryTableModel.addRow(new Object[] { "Created", elb.getCreatedTime() });
        }
        if (elb.getDNSName() != null) {
            primaryTableModel.addRow(new Object[] { "DNS Name", elb.getDNSName() });
        }

        if (!elb.getInstances().isEmpty()) {

            StringBuilder instances = new StringBuilder();
            for (Instance instance : elb.getInstances()) {
                instances.append(instance.getInstanceId()).append(", ");
            }

            primaryTableModel.addRow(new Object[] { "Instances", instances.toString() });
        }

        if (elb.getLoadBalancerName() != null) {
            primaryTableModel.addRow(new Object[] { "Load Balander Name", elb.getLoadBalancerName() });
        }
        if (elb.getScheme() != null) {
            primaryTableModel.addRow(new Object[] { "Scheme", elb.getScheme() });
        }

        if (!elb.getSecurityGroups().isEmpty()) {

            StringBuilder sgs = new StringBuilder();
            for (String sg : elb.getSecurityGroups()) {
                sgs.append(sg).append(", ");
            }

            primaryTableModel.addRow(new Object[] { "Security Groups", sgs.toString() });
        }

        if (elb.getSourceSecurityGroup() != null) {
            primaryTableModel.addRow(
                    new Object[] { "Source Security Group", elb.getSourceSecurityGroup().getGroupName() });
        }

        if (!elb.getSubnets().isEmpty()) {

            StringBuilder subnets = new StringBuilder();
            for (String subnet : elb.getSubnets()) {
                subnets.append(subnet).append(", ");
            }

            primaryTableModel.addRow(new Object[] { "Subnets", subnets.toString() });
        }

        if (elb.getVPCId() != null) {
            primaryTableModel.addRow(new Object[] { "VPC Id", elb.getVPCId() });
        }

        /**
         * Health Check
         */

        healthCheckTableModel.addColumn("Property");
        healthCheckTableModel.addColumn("Value");

        HealthCheck healthCheck = elb.getHealthCheck();
        if (healthCheck.getHealthyThreshold() != null) {
            healthCheckTableModel.addRow(new Object[] { "Threshold", healthCheck.getHealthyThreshold() });
        }
        if (healthCheck.getInterval() != null) {
            healthCheckTableModel.addRow(new Object[] { "Interval", healthCheck.getInterval() });
        }
        if (healthCheck.getTarget() != null) {
            healthCheckTableModel.addRow(new Object[] { "Target", healthCheck.getTarget() });
        }
        if (healthCheck.getTimeout() != null) {
            healthCheckTableModel.addRow(new Object[] { "Timeout", healthCheck.getTimeout() });
        }
        if (healthCheck.getUnhealthyThreshold() != null) {
            healthCheckTableModel
                    .addRow(new Object[] { "Unhealth Threshold", healthCheck.getUnhealthyThreshold() });
        }

        /**
         * Listeners
         */

        listenersTableModel.addColumn("Instance Port");
        listenersTableModel.addColumn("Instance Protocol");
        listenersTableModel.addColumn("Load Balancer Port");
        listenersTableModel.addColumn("Load Balancer Protocol");
        listenersTableModel.addColumn("SSL Certificate Id");

        List<ListenerDescription> listenerDescriptions = elb.getListenerDescriptions();
        for (ListenerDescription description : listenerDescriptions) {

            Listener listener = description.getListener();

            String ssl = "";
            if (listener.getSSLCertificateId() != null) {
                ssl = listener.getSSLCertificateId();
            }

            listenersTableModel
                    .addRow(new Object[] { listener.getInstancePort(), listener.getInstanceProtocol(),
                            listener.getLoadBalancerPort(), listener.getProtocol(), ssl });
        }
    }
}

From source file:com.netflix.simianarmy.resources.chaos.ChaosMonkeyResource.java

License:Apache License

@Path("/Gorilla")
@GET/*  w  ww . j  a v a 2 s . com*/
public Response getELB(@Context UriInfo uriInfo) throws IOException {

    String elbName = "";
    for (Map.Entry<String, List<String>> pair : uriInfo.getQueryParameters().entrySet()) {
        if (pair.getValue().isEmpty()) {
            continue;
        }
        if (pair.getKey().equals("elbName")) {
            elbName = pair.getValue().get(0);
        }
    }

    AWSClient client;
    client = new AWSClient(Region.US_WEST_2);
    LOGGER.info(String.format("Get instances and AZ of ELB '%s'", elbName));

    List<LoadBalancerDescription> elbDescriptionList = client.describeElasticLoadBalancers(elbName);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    JsonGenerator gen = JSON_FACTORY.createJsonGenerator(baos, JsonEncoding.UTF8);

    for (LoadBalancerDescription elbDescription : elbDescriptionList) {

        gen.writeStartObject();
        gen.writeStringField("load_balancer_name", elbDescription.getLoadBalancerName());

        //          Find and add availability zones instances attached to ELB
        StringBuilder sbuild = new StringBuilder();
        List<String> AZList = elbDescription.getAvailabilityZones();
        for (int i = 0; i < AZList.size(); i++) {
            sbuild.append(AZList.get(i));
            if (i != AZList.size() - 1)
                sbuild.append(",");
        }

        gen.writeStringField("availability_zones", sbuild.toString());

        //          Find and add ec2 instances attached to ELB
        sbuild = new StringBuilder();
        List<Instance> InstanceList = elbDescription.getInstances();
        for (int i = 0; i < InstanceList.size(); i++) {
            sbuild.append(InstanceList.get(i).getInstanceId());
            if (i != InstanceList.size() - 1)
                sbuild.append(",");
        }
        gen.writeStringField("ec2_instances", sbuild.toString());

        gen.writeEndObject();
    }
    gen.close();
    return Response.status(Response.Status.OK).entity(baos.toString("UTF-8")).build();

}

From source file:com.netflix.spinnaker.clouddriver.aws.deploy.handlers.MigrateLoadBalancerStrategy.java

License:Apache License

/**
 * Generates a result set describing the actions required to migrate the source load balancer to the target.
 *
 * @param sourceLookup            a security group lookup cache for the source region
 * @param targetLookup            a security group lookup cache for the target region (may be the same object as the sourceLookup)
 * @param source                  the source load balancer
 * @param target                  the target location
 * @param subnetType              the subnetType in which to migrate the load balancer (should be null for EC Classic migrations)
 * @param applicationName         the name of the source application
 * @param allowIngressFromClassic whether ingress should be granted from classic link
 * @param dryRun                  whether to actually perform the migration
 * @return the result set//from   w ww.  ja v a  2  s.c  o m
 */
public synchronized MigrateLoadBalancerResult generateResults(SecurityGroupLookup sourceLookup,
        SecurityGroupLookup targetLookup, MigrateSecurityGroupStrategy migrateSecurityGroupStrategy,
        LoadBalancerLocation source, TargetLoadBalancerLocation target, String subnetType,
        String applicationName, boolean allowIngressFromClassic, boolean dryRun) {

    this.migrateSecurityGroupStrategy = migrateSecurityGroupStrategy;
    this.sourceLookup = sourceLookup;
    this.targetLookup = targetLookup;
    this.source = source;
    this.target = target;
    this.subnetType = subnetType;
    this.applicationName = applicationName;
    this.allowIngressFromClassic = allowIngressFromClassic;
    this.dryRun = dryRun;

    if (!target.isUseZonesFromSource()
            && (target.getAvailabilityZones() == null || target.getAvailabilityZones().isEmpty())) {
        throw new IllegalStateException("No availability zones specified for load balancer migration");
    }

    final MigrateLoadBalancerResult result = new MigrateLoadBalancerResult();

    LoadBalancerDescription sourceLoadBalancer = getLoadBalancer(source.getCredentials(), source.getRegion(),
            source.getName());
    if (sourceLoadBalancer == null) {
        throw new IllegalStateException("Source load balancer not found: " + source);
    }

    if (target.isUseZonesFromSource()) {
        target.setAvailabilityZones(sourceLoadBalancer.getAvailabilityZones());
        if (target.getAvailabilityZones() == null || target.getAvailabilityZones().isEmpty()) {
            throw new IllegalStateException("No availability zones specified for load balancer migration");
        }
    }

    Vpc sourceVpc = getVpc(source);
    Vpc targetVpc = getVpc(target);

    String targetName = target.getName() != null ? target.getName()
            : generateLoadBalancerName(source.getName(), sourceVpc, targetVpc);
    LoadBalancerDescription targetLoadBalancer = getLoadBalancer(target.getCredentials(), target.getRegion(),
            targetName);
    verifyLoadBalancerName(result, targetName, targetLoadBalancer);

    List<MigrateSecurityGroupResult> targetGroups = getTargetSecurityGroups(sourceLoadBalancer, result);

    List<String> securityGroups = targetGroups.stream().filter(g -> !g.getSkipped().contains(g.getTarget()))
            .map(g -> g.getTarget().getTargetId()).distinct().collect(Collectors.toList());
    securityGroups.addAll(buildExtraSecurityGroups(sourceLoadBalancer, result));

    result.getSecurityGroups().addAll(targetGroups);

    result.setTargetName(targetName);
    result.setTargetExists(targetLoadBalancer != null);
    if (!dryRun) {
        updateTargetLoadBalancer(sourceLoadBalancer, targetLoadBalancer, targetName, securityGroups, result);
    }

    return result;
}

From source file:com.zotoh.cloudapi.aws.ElasticLoadBalancer.java

License:Open Source License

private LoadBalancer toELB(LoadBalancerDescription desc) {
    LoadBalancer b = null;/*from  www  .j a v  a  2 s.  c  o  m*/
    if (desc != null) {
        ProviderContext x = _svc.getCloud().getContext();
        b = new LoadBalancer();

        b.setCreationTimestamp(desc.getCreatedTime().getTime());
        b.setProviderRegionId(x.getRegionId());
        b.setAddressType(LoadBalancerAddressType.DNS);
        b.setCurrentState(LoadBalancerState.ACTIVE);
        b.setProviderOwnerId(x.getAccountNumber());
        b.setName(desc.getLoadBalancerName());
        b.setDescription(b.getName());
        b.setProviderLoadBalancerId(b.getName());
        b.setAddress(desc.getDNSName());

        // zones
        {
            List<String> lst = desc.getAvailabilityZones();
            if (!isNil(lst)) {
                b.setProviderDataCenterIds(lst.toArray(new String[0]));
            }
        }
        // servers
        {
            List<Instance> lst = desc.getInstances();
            List<String> s = LT();
            if (!isNil(lst))
                for (int i = 0; i < lst.size(); ++i) {
                    s.add(lst.get(i).getInstanceId());
                }
            b.setProviderServerIds(s.toArray(new String[0]));
        }
        // listeners/ports
        {
            List<ListenerDescription> lst = desc.getListenerDescriptions();
            List<LbListener> rc = LT();
            int[] pports;
            if (lst != null)
                for (int i = 0; i < lst.size(); ++i) {
                    rc.add(toLis(lst.get(i)));
                }
            b.setListeners(rc.toArray(new LbListener[0]));
            pports = new int[rc.size()];
            for (int i = 0; i < pports.length; ++i) {
                pports[i] = rc.get(i).getPublicPort();
            }
            b.setPublicPorts(pports);
        }

        // unsupported
        desc.getHealthCheck();
        desc.getPolicies();
        desc.getSourceSecurityGroup();
        desc.getCanonicalHostedZoneName();
    }

    return b;
}

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

License:Apache License

/**
 * //from   w ww  .j  a  va2  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 {} 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 va 2s . 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;
}