mirror of https://github.com/apache/jclouds.git
Elastic Load Balancer
This commit is contained in:
parent
dfdbc44700
commit
596ca233e3
|
@ -0,0 +1,39 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.ec2;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import javax.inject.Qualifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Related to a ELB resource.
|
||||||
|
*
|
||||||
|
* @author Lili Nader
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Retention(value = RetentionPolicy.RUNTIME)
|
||||||
|
@Target(value = { ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
|
||||||
|
@Qualifier
|
||||||
|
public @interface ELB {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.ec2.binders;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.aws.ec2.util.EC2Utils;
|
||||||
|
import org.jclouds.http.HttpRequest;
|
||||||
|
import org.jclouds.rest.Binder;
|
||||||
|
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds the String [] to form parameters named with InstanceId.index
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class BindELBInstanceIdsToIndexedFormParams implements Binder {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void bindToRequest(HttpRequest request, Object input) {
|
||||||
|
checkArgument(checkNotNull(request, "input") instanceof GeneratedHttpRequest,
|
||||||
|
"this binder is only valid for GeneratedHttpRequests!");
|
||||||
|
EC2Utils.indexStringArrayToFormValuesWithStringFormat((GeneratedHttpRequest<?>) request, "Instances.member.%s.InstanceId", input);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.aws.ec2.compute.strategy;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.aws.ec2.EC2Client;
|
||||||
|
import org.jclouds.aws.ec2.compute.config.EC2ComputeServiceContextModule.GetRegionFromLocation;
|
||||||
|
import org.jclouds.aws.ec2.domain.AvailabilityZone;
|
||||||
|
import org.jclouds.aws.ec2.services.ElasticLoadBalancerClient;
|
||||||
|
import org.jclouds.compute.reference.ComputeServiceConstants;
|
||||||
|
import org.jclouds.compute.strategy.LoadBalancerStrategy;
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
import org.jclouds.logging.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class EC2LoadBalancerStrategy implements LoadBalancerStrategy
|
||||||
|
{
|
||||||
|
@Resource
|
||||||
|
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
|
||||||
|
protected Logger logger = Logger.NULL;
|
||||||
|
protected final EC2Client ec2Client;
|
||||||
|
protected final GetRegionFromLocation getRegionFromLocation;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
protected EC2LoadBalancerStrategy(EC2Client ec2Client, GetRegionFromLocation getRegionFromLocation)
|
||||||
|
{
|
||||||
|
this.ec2Client = ec2Client;
|
||||||
|
this.getRegionFromLocation = getRegionFromLocation;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String execute(Location location, String name,
|
||||||
|
String protocol, Integer loadBalancerPort, Integer instancePort,
|
||||||
|
Set<String> instanceIds)
|
||||||
|
{
|
||||||
|
String region = getRegionFromLocation.apply(location);
|
||||||
|
String dnsName = new String();
|
||||||
|
|
||||||
|
// TODO: Fix temp hack
|
||||||
|
String availabilityZone = new String();
|
||||||
|
for (String az : AvailabilityZone.zones)
|
||||||
|
{
|
||||||
|
if (az.startsWith(region))
|
||||||
|
availabilityZone = az;
|
||||||
|
}
|
||||||
|
|
||||||
|
ElasticLoadBalancerClient elbClient = ec2Client
|
||||||
|
.getElasticLoadBalancerServices();
|
||||||
|
|
||||||
|
dnsName = elbClient.createLoadBalancer(region, name, protocol,
|
||||||
|
loadBalancerPort, instancePort, availabilityZone);
|
||||||
|
|
||||||
|
Set<String> registeredInstanceIds = elbClient
|
||||||
|
.registerInstancesWithLoadBalancer(region, name,
|
||||||
|
(String[]) instanceIds.toArray());
|
||||||
|
|
||||||
|
// deregister instances
|
||||||
|
boolean changed = registeredInstanceIds.removeAll(instanceIds);
|
||||||
|
if (changed)
|
||||||
|
elbClient.deregisterInstancesWithLoadBalancer(region, name,
|
||||||
|
(String[]) registeredInstanceIds.toArray());
|
||||||
|
|
||||||
|
return dnsName;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,525 @@
|
||||||
|
package org.jclouds.aws.ec2.domain;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
|
public class ElasticLoadBalancer implements Comparable<ElasticLoadBalancer>
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
private String region;
|
||||||
|
private String name;
|
||||||
|
private Set<String> instanceIds;
|
||||||
|
private Set<String> availabilityZones;
|
||||||
|
private String dnsName;
|
||||||
|
private AppCookieStickinessPolicy appCookieStickinessPolicy;
|
||||||
|
private LBCookieStickinessPolicy lBCookieStickinessPolicy;
|
||||||
|
private Set<LoadBalancerListener> loadBalancerListeners;
|
||||||
|
|
||||||
|
public ElasticLoadBalancer()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.instanceIds = new HashSet<String>();
|
||||||
|
this.availabilityZones = new HashSet<String>();
|
||||||
|
this.loadBalancerListeners = new HashSet<LoadBalancerListener>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ElasticLoadBalancer(String region, String name,
|
||||||
|
Set<String> instanceIds, Set<String> availabilityZones,
|
||||||
|
String dnsName)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.region = region;
|
||||||
|
this.name = name;
|
||||||
|
this.instanceIds = instanceIds;
|
||||||
|
this.availabilityZones = availabilityZones;
|
||||||
|
this.dnsName = dnsName;
|
||||||
|
this.loadBalancerListeners = new HashSet<LoadBalancerListener>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setRegion(String region)
|
||||||
|
{
|
||||||
|
this.region = region;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstanceIds(Set<String> instanceIds)
|
||||||
|
{
|
||||||
|
this.instanceIds = instanceIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvailabilityZones(Set<String> availabilityZones)
|
||||||
|
{
|
||||||
|
this.availabilityZones = availabilityZones;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDnsName(String dnsName)
|
||||||
|
{
|
||||||
|
this.dnsName = dnsName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppCookieStickinessPolicy(
|
||||||
|
AppCookieStickinessPolicy appCookieStickinessPolicy)
|
||||||
|
{
|
||||||
|
this.appCookieStickinessPolicy = appCookieStickinessPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setlBCookieStickinessPolicy(
|
||||||
|
LBCookieStickinessPolicy lBCookieStickinessPolicy)
|
||||||
|
{
|
||||||
|
this.lBCookieStickinessPolicy = lBCookieStickinessPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadBalancerListeners(
|
||||||
|
Set<LoadBalancerListener> loadBalancerListeners)
|
||||||
|
{
|
||||||
|
this.loadBalancerListeners = loadBalancerListeners;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getInstanceIds()
|
||||||
|
{
|
||||||
|
return instanceIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getAvailabilityZones()
|
||||||
|
{
|
||||||
|
return availabilityZones;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDnsName()
|
||||||
|
{
|
||||||
|
return dnsName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppCookieStickinessPolicy getAppCookieStickinessPolicy()
|
||||||
|
{
|
||||||
|
return appCookieStickinessPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LBCookieStickinessPolicy getlBCookieStickinessPolicy()
|
||||||
|
{
|
||||||
|
return lBCookieStickinessPolicy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<LoadBalancerListener> getLoadBalancerListeners()
|
||||||
|
{
|
||||||
|
return loadBalancerListeners;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getRegion()
|
||||||
|
{
|
||||||
|
return region;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(ElasticLoadBalancer that)
|
||||||
|
{
|
||||||
|
return name.compareTo(that.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime
|
||||||
|
* result
|
||||||
|
+ ((appCookieStickinessPolicy == null) ? 0
|
||||||
|
: appCookieStickinessPolicy.hashCode());
|
||||||
|
result = prime
|
||||||
|
* result
|
||||||
|
+ ((availabilityZones == null) ? 0 : availabilityZones
|
||||||
|
.hashCode());
|
||||||
|
result = prime * result + ((dnsName == null) ? 0 : dnsName.hashCode());
|
||||||
|
result = prime * result
|
||||||
|
+ ((instanceIds == null) ? 0 : instanceIds.hashCode());
|
||||||
|
result = prime
|
||||||
|
* result
|
||||||
|
+ ((lBCookieStickinessPolicy == null) ? 0
|
||||||
|
: lBCookieStickinessPolicy.hashCode());
|
||||||
|
result = prime
|
||||||
|
* result
|
||||||
|
+ ((loadBalancerListeners == null) ? 0 : loadBalancerListeners
|
||||||
|
.hashCode());
|
||||||
|
result = prime * result + ((name == null) ? 0 : name.hashCode());
|
||||||
|
result = prime * result + ((region == null) ? 0 : region.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
ElasticLoadBalancer other = (ElasticLoadBalancer) obj;
|
||||||
|
if (appCookieStickinessPolicy == null)
|
||||||
|
{
|
||||||
|
if (other.appCookieStickinessPolicy != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!appCookieStickinessPolicy
|
||||||
|
.equals(other.appCookieStickinessPolicy))
|
||||||
|
return false;
|
||||||
|
if (availabilityZones == null)
|
||||||
|
{
|
||||||
|
if (other.availabilityZones != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!availabilityZones.equals(other.availabilityZones))
|
||||||
|
return false;
|
||||||
|
if (dnsName == null)
|
||||||
|
{
|
||||||
|
if (other.dnsName != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!dnsName.equals(other.dnsName))
|
||||||
|
return false;
|
||||||
|
if (instanceIds == null)
|
||||||
|
{
|
||||||
|
if (other.instanceIds != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!instanceIds.equals(other.instanceIds))
|
||||||
|
return false;
|
||||||
|
if (lBCookieStickinessPolicy == null)
|
||||||
|
{
|
||||||
|
if (other.lBCookieStickinessPolicy != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!lBCookieStickinessPolicy
|
||||||
|
.equals(other.lBCookieStickinessPolicy))
|
||||||
|
return false;
|
||||||
|
if (loadBalancerListeners == null)
|
||||||
|
{
|
||||||
|
if (other.loadBalancerListeners != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!loadBalancerListeners.equals(other.loadBalancerListeners))
|
||||||
|
return false;
|
||||||
|
if (name == null)
|
||||||
|
{
|
||||||
|
if (other.name != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!name.equals(other.name))
|
||||||
|
return false;
|
||||||
|
if (region == null)
|
||||||
|
{
|
||||||
|
if (other.region != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!region.equals(other.region))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static class AppCookieStickinessPolicy
|
||||||
|
{
|
||||||
|
private String policyName;
|
||||||
|
private String cookieName;
|
||||||
|
|
||||||
|
|
||||||
|
public AppCookieStickinessPolicy()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppCookieStickinessPolicy(String policyName, String cookieName)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.policyName = policyName;
|
||||||
|
this.cookieName = cookieName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPolicyName()
|
||||||
|
{
|
||||||
|
return policyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCookieName()
|
||||||
|
{
|
||||||
|
return cookieName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPolicyName(String policyName)
|
||||||
|
{
|
||||||
|
this.policyName = policyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCookieName(String cookieName)
|
||||||
|
{
|
||||||
|
this.cookieName = cookieName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result
|
||||||
|
+ ((cookieName == null) ? 0 : cookieName.hashCode());
|
||||||
|
result = prime * result
|
||||||
|
+ ((policyName == null) ? 0 : policyName.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
AppCookieStickinessPolicy other = (AppCookieStickinessPolicy) obj;
|
||||||
|
if (cookieName == null)
|
||||||
|
{
|
||||||
|
if (other.cookieName != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!cookieName.equals(other.cookieName))
|
||||||
|
return false;
|
||||||
|
if (policyName == null)
|
||||||
|
{
|
||||||
|
if (other.policyName != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!policyName.equals(other.policyName))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class LBCookieStickinessPolicy
|
||||||
|
{
|
||||||
|
private String policyName;
|
||||||
|
private Integer cookieExpirationPeriod;
|
||||||
|
|
||||||
|
public LBCookieStickinessPolicy()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public LBCookieStickinessPolicy(String policyName,
|
||||||
|
Integer cookieExpirationPeriod)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.policyName = policyName;
|
||||||
|
this.cookieExpirationPeriod = cookieExpirationPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPolicyName()
|
||||||
|
{
|
||||||
|
return policyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getCookieExpirationPeriod()
|
||||||
|
{
|
||||||
|
return cookieExpirationPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPolicyName(String policyName)
|
||||||
|
{
|
||||||
|
this.policyName = policyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCookieExpirationPeriod(Integer cookieExpirationPeriod)
|
||||||
|
{
|
||||||
|
this.cookieExpirationPeriod = cookieExpirationPeriod;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime
|
||||||
|
* result
|
||||||
|
+ ((cookieExpirationPeriod == null) ? 0
|
||||||
|
: cookieExpirationPeriod.hashCode());
|
||||||
|
result = prime * result
|
||||||
|
+ ((policyName == null) ? 0 : policyName.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
LBCookieStickinessPolicy other = (LBCookieStickinessPolicy) obj;
|
||||||
|
if (cookieExpirationPeriod == null)
|
||||||
|
{
|
||||||
|
if (other.cookieExpirationPeriod != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!cookieExpirationPeriod
|
||||||
|
.equals(other.cookieExpirationPeriod))
|
||||||
|
return false;
|
||||||
|
if (policyName == null)
|
||||||
|
{
|
||||||
|
if (other.policyName != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!policyName.equals(other.policyName))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class LoadBalancerListener
|
||||||
|
{
|
||||||
|
private Set<String> policyNames;
|
||||||
|
private Integer instancePort;
|
||||||
|
private Integer loadBalancerPort;
|
||||||
|
private String protocol;
|
||||||
|
|
||||||
|
public LoadBalancerListener(Set<String> policyNames,
|
||||||
|
Integer instancePort, Integer loadBalancerPort, String protocol)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.policyNames = policyNames;
|
||||||
|
this.instancePort = instancePort;
|
||||||
|
this.loadBalancerPort = loadBalancerPort;
|
||||||
|
this.protocol = protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LoadBalancerListener()
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Set<String> getPolicyNames()
|
||||||
|
{
|
||||||
|
return policyNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getInstancePort()
|
||||||
|
{
|
||||||
|
return instancePort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getLoadBalancerPort()
|
||||||
|
{
|
||||||
|
return loadBalancerPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProtocol()
|
||||||
|
{
|
||||||
|
return protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPolicyNames(Set<String> policyNames)
|
||||||
|
{
|
||||||
|
this.policyNames = policyNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInstancePort(Integer instancePort)
|
||||||
|
{
|
||||||
|
this.instancePort = instancePort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLoadBalancerPort(Integer loadBalancerPort)
|
||||||
|
{
|
||||||
|
this.loadBalancerPort = loadBalancerPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setProtocol(String protocol)
|
||||||
|
{
|
||||||
|
this.protocol = protocol;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
result = prime * result
|
||||||
|
+ ((instancePort == null) ? 0 : instancePort.hashCode());
|
||||||
|
result = prime
|
||||||
|
* result
|
||||||
|
+ ((loadBalancerPort == null) ? 0 : loadBalancerPort
|
||||||
|
.hashCode());
|
||||||
|
result = prime * result
|
||||||
|
+ ((policyNames == null) ? 0 : policyNames.hashCode());
|
||||||
|
result = prime * result
|
||||||
|
+ ((protocol == null) ? 0 : protocol.hashCode());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if (this == obj)
|
||||||
|
return true;
|
||||||
|
if (obj == null)
|
||||||
|
return false;
|
||||||
|
if (getClass() != obj.getClass())
|
||||||
|
return false;
|
||||||
|
LoadBalancerListener other = (LoadBalancerListener) obj;
|
||||||
|
if (instancePort == null)
|
||||||
|
{
|
||||||
|
if (other.instancePort != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!instancePort.equals(other.instancePort))
|
||||||
|
return false;
|
||||||
|
if (loadBalancerPort == null)
|
||||||
|
{
|
||||||
|
if (other.loadBalancerPort != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!loadBalancerPort.equals(other.loadBalancerPort))
|
||||||
|
return false;
|
||||||
|
if (policyNames == null)
|
||||||
|
{
|
||||||
|
if (other.policyNames != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!policyNames.equals(other.policyNames))
|
||||||
|
return false;
|
||||||
|
if (protocol == null)
|
||||||
|
{
|
||||||
|
if (other.protocol != null)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (!protocol.equals(other.protocol))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.ec2.functions;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.aws.ec2.ELB;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ELBRegionToEndpoint implements Function<Object, URI> {
|
||||||
|
private final Map<String, URI> regionToEndpoint;
|
||||||
|
private final URI defaultUri;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
public ELBRegionToEndpoint(@ELB Map<String, URI> regionToEndpoint, @ELB URI defaultUri) {
|
||||||
|
this.regionToEndpoint = regionToEndpoint;
|
||||||
|
this.defaultUri = defaultUri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public URI apply(Object from) {
|
||||||
|
return from == null ? defaultUri : regionToEndpoint.get(from);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,117 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.ec2.services;
|
||||||
|
|
||||||
|
import static org.jclouds.aws.ec2.reference.EC2Parameters.ACTION;
|
||||||
|
import static org.jclouds.aws.ec2.reference.EC2Parameters.VERSION;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import javax.ws.rs.FormParam;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
|
||||||
|
import org.jclouds.aws.ec2.binders.BindELBInstanceIdsToIndexedFormParams;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer;
|
||||||
|
import org.jclouds.aws.ec2.functions.ELBRegionToEndpoint;
|
||||||
|
import org.jclouds.aws.ec2.xml.CreateLoadBalancerResponseHandler;
|
||||||
|
import org.jclouds.aws.ec2.xml.DescribeLoadBalancersResponseHandler;
|
||||||
|
import org.jclouds.aws.ec2.xml.RegisterInstancesWithLoadBalancerResponseHandler;
|
||||||
|
import org.jclouds.aws.filters.FormSigner;
|
||||||
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
|
import org.jclouds.rest.annotations.FormParams;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.VirtualHost;
|
||||||
|
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to EC2 Elastic Load Balancer via REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @author Lili Nader
|
||||||
|
*/
|
||||||
|
@RequestFilters(FormSigner.class)
|
||||||
|
@FormParams(keys = VERSION, values = "2009-11-25")
|
||||||
|
@VirtualHost
|
||||||
|
public interface ElasticLoadBalancerAsyncClient
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @see ElasticLoadBalancerClient#createLoadBalancer
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(CreateLoadBalancerResponseHandler.class)
|
||||||
|
@FormParams(keys = ACTION, values = "CreateLoadBalancer")
|
||||||
|
ListenableFuture<String> createLoadBalancer(
|
||||||
|
@EndpointParam(parser = ELBRegionToEndpoint.class) @Nullable String region,
|
||||||
|
@FormParam("LoadBalancerName") String name,
|
||||||
|
@FormParam("Listeners.member.1.Protocol") String protocol,
|
||||||
|
@FormParam("Listeners.member.1.LoadBalancerPort") Integer loadBalancerPort,
|
||||||
|
@FormParam("Listeners.member.1.InstancePort") Integer instancePort,
|
||||||
|
@FormParam("AvailabilityZones.member.1") String availabilityZone);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ElasticLoadBalancerClient#deleteLoadBalancer
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "DeleteLoadBalancer")
|
||||||
|
ListenableFuture<Void> deleteLoadBalancer(
|
||||||
|
@EndpointParam(parser = ELBRegionToEndpoint.class) @Nullable String region,
|
||||||
|
@FormParam("LoadBalancerName") String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ElasticLoadBalancerClient#registerInstancesWithLoadBalancer
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(RegisterInstancesWithLoadBalancerResponseHandler.class)
|
||||||
|
@FormParams(keys = ACTION, values = "RegisterInstancesWithLoadBalancer")
|
||||||
|
ListenableFuture<? extends Set<String>> registerInstancesWithLoadBalancer(
|
||||||
|
@EndpointParam(parser = ELBRegionToEndpoint.class) @Nullable String region,
|
||||||
|
@FormParam("LoadBalancerName") String name,
|
||||||
|
@BinderParam(BindELBInstanceIdsToIndexedFormParams.class) String... instanceIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ElasticLoadBalancerClient#deregisterInstancesWithLoadBalancer
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "DeregisterInstancesWithLoadBalancer")
|
||||||
|
ListenableFuture<Void> deregisterInstancesWithLoadBalancer(
|
||||||
|
@EndpointParam(parser = ELBRegionToEndpoint.class) @Nullable String region,
|
||||||
|
@FormParam("LoadBalancerName") String name,
|
||||||
|
@BinderParam(BindELBInstanceIdsToIndexedFormParams.class) String... instanceIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ElasticLoadBalancerClient#describeLoadBalancers
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@XMLResponseParser(DescribeLoadBalancersResponseHandler.class)
|
||||||
|
@FormParams(keys = ACTION, values = "DescribeLoadBalancers")
|
||||||
|
ListenableFuture<? extends Set<ElasticLoadBalancer>> describeLoadBalancers(
|
||||||
|
@EndpointParam(parser = ELBRegionToEndpoint.class) @Nullable String region,
|
||||||
|
@FormParam("LoadBalancerName") @Nullable String name);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.ec2.services;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer;
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to EC2 Elastic Load Balancer via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @author Lili Nader
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface ElasticLoadBalancerClient {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a load balancer
|
||||||
|
*
|
||||||
|
* @param name Name of the load balancer
|
||||||
|
* @param loadBalancerPort Port for the load balancer to listen on
|
||||||
|
* @param instancePort Port to forward the request to
|
||||||
|
* @return dns the DNS name for the load balancer
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/ElasticLoadBalancing/latest/DeveloperGuide/"
|
||||||
|
*/
|
||||||
|
String createLoadBalancer(@Nullable String region, String name, String protocol, Integer loadBalancerPort, Integer instancePort, String availabilityZone);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete load balancer
|
||||||
|
*
|
||||||
|
* @param name Name of the load balancer
|
||||||
|
* @return
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/ElasticLoadBalancing/2009-05-15/DeveloperGuide/"
|
||||||
|
*/
|
||||||
|
void deleteLoadBalancer(@Nullable String region, String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register instances with an existing load balancer
|
||||||
|
* @param name Load Balancer name
|
||||||
|
* @param instanceIds Set of instance Ids to register with load balancer
|
||||||
|
* @return instanceIds registered with load balancer
|
||||||
|
*
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/ElasticLoadBalancing/2009-05-15/DeveloperGuide/"
|
||||||
|
*/
|
||||||
|
Set<String> registerInstancesWithLoadBalancer(@Nullable String region, String name, String... instanceIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deregister instances with an existing load balancer
|
||||||
|
* @param name Load Balancer name
|
||||||
|
* @param instanceIds Set of instance Ids to deregister with load balancer
|
||||||
|
* @return
|
||||||
|
*
|
||||||
|
* @see <a href="http://docs.amazonwebservices.com/ElasticLoadBalancing/2009-05-15/DeveloperGuide/"
|
||||||
|
*/
|
||||||
|
void deregisterInstancesWithLoadBalancer(@Nullable String region, String name, String... instanceIds);
|
||||||
|
|
||||||
|
|
||||||
|
Set<ElasticLoadBalancer> describeLoadBalancers(@Nullable String region, @Nullable String name);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
package org.jclouds.aws.ec2.xml;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import org.jclouds.http.functions.ParseSax.HandlerWithResult;
|
||||||
|
import org.jclouds.logging.Logger;
|
||||||
|
|
||||||
|
public class CreateLoadBalancerResponseHandler extends HandlerWithResult<String> {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
protected Logger logger = Logger.NULL;
|
||||||
|
|
||||||
|
private String dnsName;
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
|
||||||
|
protected String currentOrNull() {
|
||||||
|
String returnVal = currentText.toString().trim();
|
||||||
|
return returnVal.equals("") ? null : returnVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endElement(String uri, String name, String qName) {
|
||||||
|
if (qName.equals("DNSName")) {
|
||||||
|
dnsName = currentOrNull();
|
||||||
|
}
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void characters(char ch[], int start, int length) {
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getResult() {
|
||||||
|
return dnsName;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,241 @@
|
||||||
|
package org.jclouds.aws.ec2.xml;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.jclouds.aws.ec2.EC2;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer.AppCookieStickinessPolicy;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer.LBCookieStickinessPolicy;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer.LoadBalancerListener;
|
||||||
|
import org.jclouds.aws.ec2.util.EC2Utils;
|
||||||
|
import org.jclouds.date.DateService;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.logging.Logger;
|
||||||
|
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||||
|
import org.xml.sax.Attributes;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
public class DescribeLoadBalancersResponseHandler extends
|
||||||
|
ParseSax.HandlerWithResult<Set<ElasticLoadBalancer>>
|
||||||
|
{
|
||||||
|
@Inject
|
||||||
|
public DescribeLoadBalancersResponseHandler(@EC2 String defaultRegion)
|
||||||
|
{
|
||||||
|
this.defaultRegion = defaultRegion;
|
||||||
|
this.listenerHandler = new LoadBalancerListenerHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
protected DateService dateService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
protected Logger logger = Logger.NULL;
|
||||||
|
|
||||||
|
private Set<ElasticLoadBalancer> contents = Sets
|
||||||
|
.newLinkedHashSet();
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
private final String defaultRegion;
|
||||||
|
private final LoadBalancerListenerHandler listenerHandler;
|
||||||
|
|
||||||
|
private boolean inListenerDescriptions = false;
|
||||||
|
private boolean inInstances = false;
|
||||||
|
private boolean inAppCookieStickinessPolicies = false;
|
||||||
|
private boolean inLBCookieStickinessPolicies = false;
|
||||||
|
private boolean inAvailabilityZones = false;
|
||||||
|
private boolean inLoadBalancerDescriptions = false;
|
||||||
|
|
||||||
|
private ElasticLoadBalancer elb;
|
||||||
|
private AppCookieStickinessPolicy appCookieStickinessPolicy;
|
||||||
|
private LBCookieStickinessPolicy lBCookieStickinessPolicy;
|
||||||
|
|
||||||
|
public void startElement(String uri, String localName, String qName,
|
||||||
|
Attributes attributes)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (qName.equals("ListenerDescriptions") || inListenerDescriptions)
|
||||||
|
{
|
||||||
|
inListenerDescriptions = true;
|
||||||
|
}
|
||||||
|
else if (qName.equals("AppCookieStickinessPolicies"))
|
||||||
|
{
|
||||||
|
inAppCookieStickinessPolicies = true;
|
||||||
|
}
|
||||||
|
else if (qName.equals("LBCookieStickinessPolicies"))
|
||||||
|
{
|
||||||
|
inLBCookieStickinessPolicies = true;
|
||||||
|
}
|
||||||
|
else if (qName.equals("LoadBalancerDescriptions"))
|
||||||
|
{
|
||||||
|
inLoadBalancerDescriptions = true;
|
||||||
|
}
|
||||||
|
else if (qName.equals("Instances"))
|
||||||
|
{
|
||||||
|
inInstances = true;
|
||||||
|
}
|
||||||
|
else if (qName.equals("AvailabilityZones"))
|
||||||
|
{
|
||||||
|
inAvailabilityZones = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qName.equals("member"))
|
||||||
|
{
|
||||||
|
if (!(inListenerDescriptions || inAppCookieStickinessPolicies || inInstances
|
||||||
|
|| inLBCookieStickinessPolicies || inAvailabilityZones))
|
||||||
|
{
|
||||||
|
elb = new ElasticLoadBalancer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endElement(String uri, String localName, String qName)
|
||||||
|
{
|
||||||
|
logger.info(qName);
|
||||||
|
|
||||||
|
//if end tag is one of below then set inXYZ to false
|
||||||
|
if (qName.equals("ListenerDescriptions"))
|
||||||
|
{
|
||||||
|
inListenerDescriptions = false;
|
||||||
|
}
|
||||||
|
else if (qName.equals("AppCookieStickinessPolicies"))
|
||||||
|
{
|
||||||
|
inAppCookieStickinessPolicies = false;
|
||||||
|
}
|
||||||
|
else if (qName.equals("LBCookieStickinessPolicies"))
|
||||||
|
{
|
||||||
|
inLBCookieStickinessPolicies = false;
|
||||||
|
}
|
||||||
|
else if (qName.equals("LoadBalancerDescriptions"))
|
||||||
|
{
|
||||||
|
inLoadBalancerDescriptions = false;
|
||||||
|
}
|
||||||
|
else if (qName.equals("Instances"))
|
||||||
|
{
|
||||||
|
inInstances = false;
|
||||||
|
}
|
||||||
|
else if (qName.equals("AvailabilityZones"))
|
||||||
|
{
|
||||||
|
inAvailabilityZones = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (qName.equals("DNSName"))
|
||||||
|
{
|
||||||
|
elb.setDnsName(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
else if (qName.equals("LoadBalancerName"))
|
||||||
|
{
|
||||||
|
elb.setName(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
else if (qName.equals("InstanceId"))
|
||||||
|
{
|
||||||
|
elb.getInstanceIds().add(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (qName.equals("member"))
|
||||||
|
{
|
||||||
|
|
||||||
|
if (inAvailabilityZones)
|
||||||
|
{
|
||||||
|
elb.getAvailabilityZones().add(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
else if (!(inListenerDescriptions || inAppCookieStickinessPolicies || inInstances
|
||||||
|
|| inLBCookieStickinessPolicies || inAvailabilityZones))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
String region = EC2Utils.findRegionInArgsOrNull(request);
|
||||||
|
if (region == null)
|
||||||
|
region = defaultRegion;
|
||||||
|
|
||||||
|
elb.setRegion(region);
|
||||||
|
contents.add(elb);
|
||||||
|
}
|
||||||
|
catch (NullPointerException e)
|
||||||
|
{
|
||||||
|
logger.warn(e, "malformed load balancer: %s", localName);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.elb = null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<ElasticLoadBalancer> getResult()
|
||||||
|
{
|
||||||
|
return contents;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void characters(char ch[], int start, int length)
|
||||||
|
{
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setContext(GeneratedHttpRequest<?> request) {
|
||||||
|
listenerHandler.setContext(request);
|
||||||
|
super.setContext(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class LoadBalancerListenerHandler extends
|
||||||
|
ParseSax.HandlerWithResult<Set<LoadBalancerListener>>
|
||||||
|
{
|
||||||
|
private Set<LoadBalancerListener> listeners = Sets.newHashSet();
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
private LoadBalancerListener listener;
|
||||||
|
|
||||||
|
public void startElement(String uri, String name, String qName,
|
||||||
|
Attributes attrs)
|
||||||
|
{
|
||||||
|
if (qName.equals("member"))
|
||||||
|
{
|
||||||
|
listener = new LoadBalancerListener();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void endElement(String uri, String name, String qName)
|
||||||
|
{
|
||||||
|
if (qName.equals("Protocol"))
|
||||||
|
{
|
||||||
|
listener.setProtocol(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
else if (qName.equals("LoadBalancerPort"))
|
||||||
|
{
|
||||||
|
listener.setLoadBalancerPort(Integer.parseInt(currentText
|
||||||
|
.toString().trim()));
|
||||||
|
}
|
||||||
|
else if (qName.equals("InstancePort"))
|
||||||
|
{
|
||||||
|
listener.setInstancePort(Integer.parseInt(currentText
|
||||||
|
.toString().trim()));
|
||||||
|
}
|
||||||
|
else if (qName.equals("member"))
|
||||||
|
{
|
||||||
|
listeners.add(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
currentText = new StringBuilder();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<LoadBalancerListener> getResult()
|
||||||
|
{
|
||||||
|
return listeners;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void characters(char ch[], int start, int length)
|
||||||
|
{
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package org.jclouds.aws.ec2.xml;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.logging.Logger;
|
||||||
|
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
public class RegisterInstancesWithLoadBalancerResponseHandler extends
|
||||||
|
ParseSax.HandlerWithResult<Set<String>>
|
||||||
|
{
|
||||||
|
@Inject
|
||||||
|
public RegisterInstancesWithLoadBalancerResponseHandler()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
protected Logger logger = Logger.NULL;
|
||||||
|
|
||||||
|
private Set<String> instanceIds = Sets.newLinkedHashSet();
|
||||||
|
private StringBuilder currentText = new StringBuilder();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public void endElement(String uri, String localName, String qName)
|
||||||
|
{
|
||||||
|
if(qName.equals("InstanceId"))
|
||||||
|
instanceIds.add(currentText.toString().trim());
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public Set<String> getResult()
|
||||||
|
{
|
||||||
|
return instanceIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void characters(char ch[], int start, int length)
|
||||||
|
{
|
||||||
|
currentText.append(ch, start, length);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.ec2.services;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
import static org.testng.Assert.assertNotNull;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
|
import org.jclouds.aws.ec2.EC2AsyncClient;
|
||||||
|
import org.jclouds.aws.ec2.EC2Client;
|
||||||
|
import org.jclouds.aws.ec2.EC2ContextFactory;
|
||||||
|
import org.jclouds.aws.ec2.domain.AvailabilityZone;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer;
|
||||||
|
import org.jclouds.logging.log4j.config.Log4JLoggingModule;
|
||||||
|
import org.jclouds.rest.RestContext;
|
||||||
|
import org.testng.annotations.AfterTest;
|
||||||
|
import org.testng.annotations.BeforeGroups;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code ElasticIPAddressClient}
|
||||||
|
*
|
||||||
|
* @author Lili Nader
|
||||||
|
*/
|
||||||
|
@Test(groups = "live", sequential = true, testName = "ec2.ElasticLoadBalancerClientLiveTest")
|
||||||
|
public class ElasticLoadBalancerClientLiveTest
|
||||||
|
{
|
||||||
|
|
||||||
|
private ElasticLoadBalancerClient client;
|
||||||
|
private RestContext<EC2AsyncClient, EC2Client> context;
|
||||||
|
|
||||||
|
@BeforeGroups(groups = { "live" })
|
||||||
|
public void setupClient()
|
||||||
|
{
|
||||||
|
String user = checkNotNull(System.getProperty("jclouds.test.user"),
|
||||||
|
"jclouds.test.user");
|
||||||
|
String password = checkNotNull(System.getProperty("jclouds.test.key"),
|
||||||
|
"jclouds.test.key");
|
||||||
|
|
||||||
|
context = EC2ContextFactory.createContext(user, password,
|
||||||
|
new Log4JLoggingModule()).getProviderSpecificContext();
|
||||||
|
client = context.getApi().getElasticLoadBalancerServices();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testCreateLoadBalancer()
|
||||||
|
{
|
||||||
|
String name = "TestLoadBalancer";
|
||||||
|
for (String region : ImmutableSet.of(Region.US_EAST_1))
|
||||||
|
{
|
||||||
|
String dnsName = client.createLoadBalancer(region, name, "http",
|
||||||
|
80, 80, AvailabilityZone.US_EAST_1A);
|
||||||
|
assertNotNull(dnsName);
|
||||||
|
assert (dnsName.startsWith(name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testDescribeLoadBalancers()
|
||||||
|
{
|
||||||
|
String name = "TestDescribeLoadBalancer";
|
||||||
|
for (String region : ImmutableSet.of(Region.US_EAST_1))
|
||||||
|
{
|
||||||
|
client.createLoadBalancer(region, name, "http",
|
||||||
|
80, 80, AvailabilityZone.US_EAST_1A);
|
||||||
|
Set<ElasticLoadBalancer> allResults = client.describeLoadBalancers(
|
||||||
|
region, name);
|
||||||
|
assertNotNull(allResults);
|
||||||
|
assert (allResults.size() >= 1);
|
||||||
|
|
||||||
|
client.deleteLoadBalancer(region, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testDeleteLoadBalancer()
|
||||||
|
{
|
||||||
|
for (String region : ImmutableSet.of(Region.US_EAST_1))
|
||||||
|
{
|
||||||
|
client.deleteLoadBalancer(region, "TestLoadBalancer");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterTest
|
||||||
|
public void shutdown()
|
||||||
|
{
|
||||||
|
context.close();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,81 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.jclouds.aws.ec2.xml;
|
||||||
|
|
||||||
|
import static org.easymock.EasyMock.expect;
|
||||||
|
import static org.easymock.classextension.EasyMock.createMock;
|
||||||
|
import static org.easymock.classextension.EasyMock.replay;
|
||||||
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.aws.domain.Region;
|
||||||
|
import org.jclouds.aws.ec2.domain.AvailabilityZone;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer;
|
||||||
|
import org.jclouds.aws.ec2.domain.Image;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer.AppCookieStickinessPolicy;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer.LBCookieStickinessPolicy;
|
||||||
|
import org.jclouds.aws.ec2.domain.ElasticLoadBalancer.LoadBalancerListener;
|
||||||
|
import org.jclouds.http.functions.ParseSax;
|
||||||
|
import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||||
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests behavior of {@code DescribeLoadBalancersResponseHandler}
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Test(groups = "unit", testName = "ec2.DescribeLoadBalancersResponseHandlerTest")
|
||||||
|
public class DescribeLoadBalancerResponseHandlerTest extends BaseEC2HandlerTest {
|
||||||
|
|
||||||
|
public void testParse() {
|
||||||
|
InputStream is = getClass().getResourceAsStream("/ec2/describe_loadbalancers.xml");
|
||||||
|
|
||||||
|
Set<ElasticLoadBalancer> contents = Sets.newHashSet();
|
||||||
|
ElasticLoadBalancer dummy = new ElasticLoadBalancer(defaultRegion, "my-load-balancer",
|
||||||
|
ImmutableSet.of("i-5b33e630", "i-8f26d7e4", "i-5933e632"), ImmutableSet.of("us-east-1a"),
|
||||||
|
"my-load-balancer-1400212309.us-east-1.elb.amazonaws.com");
|
||||||
|
contents.add(dummy);
|
||||||
|
|
||||||
|
Set<ElasticLoadBalancer> result = parseLoadBalancers(is);
|
||||||
|
|
||||||
|
assertEquals(result, contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Set<ElasticLoadBalancer> parseLoadBalancers(InputStream is) {
|
||||||
|
DescribeLoadBalancersResponseHandler handler = injector
|
||||||
|
.getInstance(DescribeLoadBalancersResponseHandler.class);
|
||||||
|
addDefaultRegionToHandler(handler);
|
||||||
|
Set<ElasticLoadBalancer> result = factory.create(handler).parse(is);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addDefaultRegionToHandler(ParseSax.HandlerWithResult<?> handler) {
|
||||||
|
GeneratedHttpRequest<?> request = createMock(GeneratedHttpRequest.class);
|
||||||
|
expect(request.getArgs()).andReturn(new Object[] { null });
|
||||||
|
replay(request);
|
||||||
|
handler.setContext(request);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
<DescribeLoadBalancersResponse
|
||||||
|
xmlns="http://elasticloadbalancing.amazonaws.com/doc/2009-11-25/">
|
||||||
|
<DescribeLoadBalancersResult>
|
||||||
|
<LoadBalancerDescriptions>
|
||||||
|
<member>
|
||||||
|
<LoadBalancerName>my-load-balancer</LoadBalancerName>
|
||||||
|
<CreatedTime>2010-03-03T20:54:45.110Z</CreatedTime>
|
||||||
|
<DNSName>my-load-balancer-1400212309.us-east-1.elb.amazonaws.com</DNSName>
|
||||||
|
<HealthCheck>
|
||||||
|
<Interval>300</Interval>
|
||||||
|
<Target>HTTP:80/index.html</Target>
|
||||||
|
<HealthyThreshold>3</HealthyThreshold>
|
||||||
|
<Timeout>30</Timeout>
|
||||||
|
<UnhealthyThreshold>5</UnhealthyThreshold>
|
||||||
|
</HealthCheck>
|
||||||
|
<ListenerDescriptions>
|
||||||
|
<member>
|
||||||
|
<PolicyNames />
|
||||||
|
<Listener>
|
||||||
|
<Protocol>HTTP</Protocol>
|
||||||
|
<LoadBalancerPort>80</LoadBalancerPort>
|
||||||
|
<InstancePort>80</InstancePort>
|
||||||
|
</Listener>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<PolicyNames />
|
||||||
|
<Listener>
|
||||||
|
<Protocol>TCP</Protocol>
|
||||||
|
<LoadBalancerPort>443</LoadBalancerPort>
|
||||||
|
<InstancePort>443</InstancePort>
|
||||||
|
</Listener>
|
||||||
|
</member>
|
||||||
|
</ListenerDescriptions>
|
||||||
|
<Instances>
|
||||||
|
<member>
|
||||||
|
<InstanceId>i-5b33e630</InstanceId>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<InstanceId>i-8f26d7e4</InstanceId>
|
||||||
|
</member>
|
||||||
|
<member>
|
||||||
|
<InstanceId>i-5933e632</InstanceId>
|
||||||
|
</member>
|
||||||
|
</Instances>
|
||||||
|
<Policies>
|
||||||
|
<AppCookieStickinessPolicies>
|
||||||
|
<member>
|
||||||
|
<CookieName>MyCookie</CookieName>
|
||||||
|
<PolicyName>MyLoadBalancerPolicy</PolicyName>
|
||||||
|
</member>
|
||||||
|
</AppCookieStickinessPolicies>
|
||||||
|
<LBCookieStickinessPolicies />
|
||||||
|
</Policies>
|
||||||
|
<AvailabilityZones>
|
||||||
|
<member>us-east-1a</member>
|
||||||
|
</AvailabilityZones>
|
||||||
|
</member>
|
||||||
|
</LoadBalancerDescriptions>
|
||||||
|
</DescribeLoadBalancersResult>
|
||||||
|
<ResponseMetadata>
|
||||||
|
<RequestId>10e2b9c9-3899-11df-a1e2-b5349194c035</RequestId>
|
||||||
|
</ResponseMetadata>
|
||||||
|
</DescribeLoadBalancersResponse>
|
|
@ -0,0 +1,38 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jclouds.compute.strategy;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.jclouds.domain.Location;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a load balancer for nodes listed
|
||||||
|
*
|
||||||
|
* @author Lili Nader
|
||||||
|
*/
|
||||||
|
public interface LoadBalancerStrategy
|
||||||
|
{
|
||||||
|
|
||||||
|
String execute(Location loaction, String name, String protocol,
|
||||||
|
Integer loadBalancerPort, Integer instancePort,
|
||||||
|
Set<String> instanceIds);
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue