Current section

Files

Jump to
erlcloud src erlcloud_elb.erl
Raw

src/erlcloud_elb.erl

-module(erlcloud_elb).
%% Library initialization.
-export([configure/2, configure/3, new/2, new/3]).
%% ELB API Functions
-export([create_load_balancer/3, create_load_balancer/4, create_load_balancer/5,
delete_load_balancer/1, delete_load_balancer/2,
register_instance/2, register_instance/3,
deregister_instance/2, deregister_instance/3,
describe_load_balancer/1, describe_load_balancer/2,
describe_load_balancers/1, describe_load_balancers/2,
configure_health_check/2, configure_health_check/3,
describe_load_balancer_attributes/1, describe_load_balancer_attributes/2]).
-include("erlcloud.hrl").
-include("erlcloud_aws.hrl").
-define(API_VERSION, "2012-06-01").
-import(erlcloud_xml, [get_text/2]).
%%%===================================================================
%%% API
%%%===================================================================
-spec new(string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey) ->
#aws_config{access_key_id=AccessKeyID,
secret_access_key=SecretAccessKey}.
-spec new(string(), string(), string()) -> aws_config().
new(AccessKeyID, SecretAccessKey, Host) ->
#aws_config{access_key_id=AccessKeyID,
secret_access_key=SecretAccessKey,
elb_host=Host}.
-spec configure(string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey) ->
put(aws_config, new(AccessKeyID, SecretAccessKey)),
ok.
-spec configure(string(), string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey, Host) ->
put(aws_config, new(AccessKeyID, SecretAccessKey, Host)),
ok.
default_config() -> erlcloud_aws:default_config().
create_load_balancer(LB, Port, Protocol) when is_list(LB),
is_integer(Port),
is_atom(Protocol) ->
create_load_balancer(LB, Port, Protocol, default_config()).
create_load_balancer(LB, Port, Protocol, Config) when is_list(LB),
is_integer(Port),
is_atom(Protocol) ->
create_load_balancer(LB, Port, Protocol, "us-east-1d", Config).
create_load_balancer(LB, Port, Protocol, Zone, Config) when is_list(LB),
is_integer(Port),
is_atom(Protocol),
is_list(Zone) ->
XML = elb_request(Config,
"CreateLoadBalancer",
[{"AvailabilityZones.member.1", Zone},
{"LoadBalancerName", LB} |
erlcloud_aws:param_list([[{"LoadBalancerPort", Port},
{"InstancePort", Port},
{"Protocol", string:to_upper(atom_to_list(Protocol))}]],
"Listeners.member")]),
{ok, get_text("/CreateLoadBalancerResponse/CreateLoadBalancerResult/DNSName", XML)}.
delete_load_balancer(LB) when is_list(LB) ->
delete_load_balancer(LB, default_config()).
delete_load_balancer(LB, Config) when is_list(LB) ->
elb_simple_request(Config,
"DeleteLoadBalancer",
[{"LoadBalancerName", LB}]).
-spec register_instance(string(), string()) -> proplist().
register_instance(LB, InstanceId) ->
register_instance(LB, InstanceId, default_config()).
-spec register_instance(string(), string(), aws_config()) -> proplist().
register_instance(LB, InstanceId, Config) when is_list(LB) ->
elb_simple_request(Config,
"RegisterInstancesWithLoadBalancer",
[{"LoadBalancerName", LB} |
erlcloud_aws:param_list([[{"InstanceId", InstanceId}]], "Instances.member")]).
-spec deregister_instance(string(), string()) -> proplist().
deregister_instance(LB, InstanceId) ->
deregister_instance(LB, InstanceId, default_config()).
-spec deregister_instance(string(), string(), aws_config()) -> proplist().
deregister_instance(LB, InstanceId, Config) when is_list(LB) ->
elb_simple_request(Config,
"DeregisterInstancesFromLoadBalancer",
[{"LoadBalancerName", LB} |
erlcloud_aws:param_list([[{"InstanceId", InstanceId}]], "Instances.member")]).
-spec configure_health_check(string(), string()) -> proplist().
configure_health_check(LB, Target) when is_list(LB),
is_list(Target) ->
configure_health_check(LB, Target, default_config()).
-spec configure_health_check(string(), string(), aws_config()) -> proplist().
configure_health_check(LB, Target, Config) when is_list(LB) ->
elb_simple_request(Config,
"ConfigureHealthCheck",
[{"LoadBalancerName", [LB]},
{"HealthCheck.Target", Target}]).
-spec describe_load_balancer(string()) -> proplist().
describe_load_balancer(Name) ->
describe_load_balancer(Name, default_config()).
describe_load_balancer(Name, Config) ->
describe_load_balancers([Name], Config).
-spec describe_load_balancers([string()]) -> proplist().
describe_load_balancers(Names) ->
describe_load_balancers(Names, default_config()).
describe_load_balancers(Names, Config) ->
elb_request(Config,
"DescribeLoadBalancers",
[erlcloud_aws:param_list(Names, "LoadBalancerName.member")]).
-spec describe_load_balancer_attributes(string()) -> proplist().
describe_load_balancer_attributes(Name) ->
describe_load_balancer_attributes(Name, default_config()).
-spec describe_load_balancer_attributes(string(), aws_config()) -> proplist().
describe_load_balancer_attributes(Name, Config) ->
Node = elb_request(Config,
"DescribeLoadBalancerAttributes",
[{"LoadBalancerName", Name}]),
extract_elb_attribs(Node).
%%%===================================================================
%%% Internal functions
%%%===================================================================
-spec extract_elb_attribs(proplist()) -> proplist().
extract_elb_attribs(Node) ->
RootPath = "DescribeLoadBalancerAttributesResult/LoadBalancerAttributes",
erlcloud_xml:decode(
[
{access_log_enabled, RootPath ++ "/AccessLog/Enabled", boolean},
{access_log_s3_name, RootPath ++ "/AccessLog/S3BucketName", text},
{access_log_s3_prefix, RootPath ++ "/AccessLog/S3BucketPrefix", text},
{access_log_emit_interval, RootPath ++ "/AccessLog/EmitInterval", integer},
{connection_settings_idletimeout, RootPath ++ "/ConnectionSettings/IdleTimeout", integer},
{cross_zone_load_balancing_enabled, RootPath ++ "/CrossZoneLoadBalancing/Enabled", boolean},
{connection_draining_enabled, RootPath ++ "/ConnectionDraining/Enabled", boolean},
{connection_draining_timeout, RootPath ++ "/ConnectionDraining/Timeout", integer}
], Node).
elb_request(Config, Action, Params) ->
QParams = [{"Action", Action}, {"Version", ?API_VERSION} | Params],
erlcloud_aws:aws_request_xml(get, Config#aws_config.elb_host,
"/", QParams, Config).
elb_simple_request(Config, Action, Params) ->
_Doc = elb_request(Config, Action, Params),
ok.