List of usage examples for com.amazonaws.services.elasticloadbalancing.model EnableAvailabilityZonesForLoadBalancerRequest EnableAvailabilityZonesForLoadBalancerRequest
public EnableAvailabilityZonesForLoadBalancerRequest(String loadBalancerName,
java.util.List<String> availabilityZones)
From source file:fr.xebia.demo.amazon.aws.PetclinicInfrastructureEnforcer.java
License:Apache License
/** * // 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 {} 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
/** * // w ww. jav a2 s .co 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:web.component.impl.aws.AWSELBImpl.java
@Override public EnableAvailabilityZonesForLoadBalancerResult enableAvailabilityZonesForLoadBalancer( String loadBalancerName, Collection<String> availabilityZones) { if (loadBalancerName == null || loadBalancerName.isEmpty()) throw new IllegalArgumentException("Load Balancer Name not specified."); if (availabilityZones == null || availabilityZones.isEmpty()) throw new IllegalArgumentException("Availability Zones not specified."); return awsHttpClient.enableAvailabilityZonesForLoadBalancer( new EnableAvailabilityZonesForLoadBalancerRequest(loadBalancerName, new ArrayList<>(availabilityZones))); }