List of usage examples for com.amazonaws.services.elasticloadbalancing.model LoadBalancerDescription getAvailabilityZones
public java.util.List<String> getAvailabilityZones()
The Availability Zones for the load balancer.
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; }