Current section

Files

Jump to
nextroll_erlcloud src erlcloud_autoscaling.erl
Raw

src/erlcloud_autoscaling.erl

%%
%% Amazon Auto Scaling Web Service API Client.
%% Documentation - http://docs.aws.amazon.com/AutoScaling/latest/APIReference/API_Operations.html
%%
-module(erlcloud_autoscaling).
-author('pavel@alertlogic.com').
-export([configure/2, configure/3, new/2, new/3]).
-export([describe_autoscaling_groups/0, describe_autoscaling_groups/1, describe_autoscaling_groups/2,
describe_launch_configurations/0, describe_launch_configurations/1, describe_launch_configurations/2,
describe_autoscaling_groups_all/0, describe_autoscaling_groups_all/1, describe_autoscaling_groups_all/2,
describe_launch_configurations_all/0, describe_launch_configurations_all/1, describe_launch_configurations_all/2
]).
-include("erlcloud.hrl").
-include("erlcloud_aws.hrl").
-include_lib("xmerl/include/xmerl.hrl").
-import(erlcloud_xml, [get_text/1, get_text/2, get_bool/2, get_integer/2]).
-define(API_VERSION, "2011-01-01").
-define(SERVICE_NAME, "autoscaling").
-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,
autoscaling_host=Host}.
-spec configure(string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey) ->
erlcloud_config:configure(AccessKeyID, SecretAccessKey, fun new/2).
-spec configure(string(), string(), string()) -> ok.
configure(AccessKeyID, SecretAccessKey, Host) ->
erlcloud_config:configure(AccessKeyID, SecretAccessKey, Host, fun new/3).
-spec describe_autoscaling_groups() -> {string(), proplist()} | {error, term()}.
describe_autoscaling_groups() -> describe_autoscaling_groups([]).
-spec describe_autoscaling_groups([string()] | aws_config()) -> {string(), proplist()} | {error, term()}.
describe_autoscaling_groups(Config) when is_record(Config, aws_config) ->
describe_autoscaling_groups([], Config);
describe_autoscaling_groups(GroupNames) ->
describe_autoscaling_groups(GroupNames, default_config()).
-spec describe_autoscaling_groups([string()], aws_config()) -> {string(), proplist()} | {error, term()}.
describe_autoscaling_groups(GroupNames, Config)
when is_list(GroupNames), is_record(Config, aws_config) ->
%case autoscaling_query(Config, "DescribeAutoScalingGroups", []) of % erlcloud_aws:param_list(GroupNames, "AutoScalingGroupNames.member")) of
case autoscaling_query(Config, "DescribeAutoScalingGroups", erlcloud_aws:param_list(GroupNames, "AutoScalingGroupNames.member")) of
{ok, Doc} ->
Groups = xmerl_xpath:string("/DescribeAutoScalingGroupsResponse/DescribeAutoScalingGroupsResult/AutoScalingGroups/member", Doc),
{erlcloud_util:next_token("/DescribeAutoScalingGroupsResponse/DescribeAutoScalingGroupsResult/NextToken", Doc), [extract_autoscaling_group(Group) || Group <- Groups]};
{error, Reason} ->
{error, Reason}
end.
-spec describe_autoscaling_groups_all() -> {ok, proplist()} | {error, term()}.
describe_autoscaling_groups_all() -> describe_autoscaling_groups_all([]).
-spec describe_autoscaling_groups_all([string()] | aws_config()) -> {ok, proplist()} | {error, term()}.
describe_autoscaling_groups_all(Config) when is_record(Config, aws_config) ->
describe_autoscaling_groups_all([], Config);
describe_autoscaling_groups_all(GroupNames) ->
describe_autoscaling_groups_all(GroupNames, default_config()).
-spec describe_autoscaling_groups_all([string()], aws_config()) -> {ok, proplist()} | {error, term()}.
describe_autoscaling_groups_all(GroupNames, Config)
when is_list(GroupNames), is_record(Config, aws_config) ->
%case autoscaling_query(Config, "DescribeAutoScalingGroups", []) of % erlcloud_aws:param_list(GroupNames, "AutoScalingGroupNames.member")) of
case erlcloud_util:query_all_token(fun autoscaling_query/3, Config, "DescribeAutoScalingGroups", erlcloud_aws:param_list(GroupNames, "AutoScalingGroupNames.member")) of
{ok, Docs} ->
Groups = lists:append([xmerl_xpath:string("/DescribeAutoScalingGroupsResponse/DescribeAutoScalingGroupsResult/AutoScalingGroups/member", Doc) || Doc <- Docs]),
{ok, [extract_autoscaling_group(Group) || Group <- Groups]};
{error, Reason} ->
{error, Reason}
end.
-spec describe_launch_configurations() -> {string(), proplist()} | {error, term()}.
describe_launch_configurations() -> describe_launch_configurations([]).
-spec describe_launch_configurations([string()] | aws_config()) -> {string(), proplist()} | {error, term()}.
describe_launch_configurations(Config) when is_record(Config, aws_config) ->
describe_launch_configurations([], Config);
describe_launch_configurations(ConfiguratoinNames) ->
describe_launch_configurations(ConfiguratoinNames, default_config()).
-spec describe_launch_configurations([string()], aws_config()) -> {string(), proplist()} | {error, term()}.
describe_launch_configurations(ConfiguratoinNames, Config)
when is_list(ConfiguratoinNames), is_record(Config, aws_config) ->
case autoscaling_query(Config, "DescribeLaunchConfigurations", erlcloud_aws:param_list(ConfiguratoinNames, "LaunchConfigurationNames.member")) of
{ok, Doc} ->
Configurations = xmerl_xpath:string("/DescribeLaunchConfigurationsResponse/DescribeLaunchConfigurationsResult/LaunchConfigurations/member", Doc),
{erlcloud_util:next_token("/DescribeLaunchConfigurationsResponse/DescribeLaunchConfigurationsResult/NextToken", Doc), [extract_launch_configuration(Configuration) || Configuration <- Configurations]};
{error, Reason} ->
{error, Reason}
end.
-spec describe_launch_configurations_all() -> {ok, proplist()} | {error, term()}.
describe_launch_configurations_all() -> describe_launch_configurations_all([]).
-spec describe_launch_configurations_all([string()] | aws_config()) -> {ok, proplist()} | {error, term()}.
describe_launch_configurations_all(Config) when is_record(Config, aws_config) ->
describe_launch_configurations_all([], Config);
describe_launch_configurations_all(ConfiguratoinNames) ->
describe_launch_configurations_all(ConfiguratoinNames, default_config()).
-spec describe_launch_configurations_all([string()], aws_config()) -> {ok, proplist()} | {error, term()}.
describe_launch_configurations_all(ConfiguratoinNames, Config)
when is_list(ConfiguratoinNames), is_record(Config, aws_config) ->
case erlcloud_util:query_all_token(fun autoscaling_query/3, Config, "DescribeLaunchConfigurations", erlcloud_aws:param_list(ConfiguratoinNames, "LaunchConfigurationNames.member")) of
{ok, Docs} ->
Configurations = lists:append([xmerl_xpath:string("/DescribeLaunchConfigurationsResponse/DescribeLaunchConfigurationsResult/LaunchConfigurations/member", Doc) || Doc <- Docs]),
{ok, [extract_launch_configuration(Configuration) || Configuration <- Configurations]};
{error, Reason} ->
{error, Reason}
end.
%
% @private
%
extract_autoscaling_group(Item) ->
[
{autoscaling_group_name, get_text("AutoScalingGroupName", Item)},
{autoscaling_group_arn, get_text("AutoScalingGroupARN", Item)},
{launch_configuration_name, get_text("LaunchConfigurationName", Item)},
{min_size, get_integer("MinSize", Item)},
{max_size, get_integer("MaxSize", Item)},
{create_time, erlcloud_xml:get_time("CreatedTime", Item)},
{health_check_type, get_text("HealthCheckType", Item)},
{desired_capacity, get_integer("DesiredCapacity", Item)},
{placement_group, get_text("PlacementGroup", Item)},
{status, get_text("Status", Item)},
{subnets, string:tokens(get_text("VPCZoneIdentifier", Item), ",")},
{availability_zones, [get_text(Z) || Z <- xmerl_xpath:string("AvailabilityZones/member", Item)]},
{load_balancers, [get_text(L) || L <- xmerl_xpath:string("LoadBalancerNames/member", Item)]},
{instances, [extract_instance(I) || I <- xmerl_xpath:string("Instances/member", Item)]},
{tag_set, [extract_tag_item(Tag) || Tag<- xmerl_xpath:string("Tags/member", Item)]}
].
extract_instance(Node) ->
[
{instance_id, get_text("InstanceId", Node)},
{launch_configuration_name, get_text("LaunchConfigurationName", Node)},
{lifecycle_state, get_text("LifecycleState", Node)},
{health_status, get_text("HealthStatus", Node)},
{availability_zone, get_text("AvailabilityZone", Node)}
].
extract_tag_item(Node) ->
[
{key, get_text("Key", Node)},
{value, get_text("Value", Node)},
{propogate_at_launch, get_text("PropagateAtLaunch", Node)},
{resource_id, get_text("ResourceId", Node)},
{resource_type, get_text("ResourceType", Node)}
].
extract_launch_configuration(Item) ->
[
{launch_configuration_name, get_text("LaunchConfigurationName", Item)},
{launch_configuration_arn, get_text("LaunchConfigurationARN", Item)},
{image_id, get_text("ImageId", Item)},
{kernel_id, get_text("KernelId", Item)},
{ramdisk_id, get_text("RamdiskId", Item)},
{instance_type, get_text("InstanceType", Item)},
{iam_instance_profile, get_text("IamInstanceProfile", Item)},
{associate_public_ip_address, get_bool("AssociatePublicIpAddress", Item)},
{placement_tenancy, get_text("PlacementTenancy", Item)},
{create_time, erlcloud_xml:get_time("CreatedTime", Item)},
{key_name, get_text("KeyName", Item)},
{user_data, get_text("UserData", Item)},
{security_groups, [get_text(L) || L <- xmerl_xpath:string("SecurityGroups/member", Item)]}
].
autoscaling_query(Config, Action, Params) ->
autoscaling_query(Config, Action, Params, ?API_VERSION).
autoscaling_query(Config, Action, Params, ApiVersion) ->
QParams = [{"Action", Action}, {"Version", ApiVersion}|Params],
erlcloud_aws:aws_request_xml4(post,
Config#aws_config.autoscaling_host,
"/", QParams, ?SERVICE_NAME, Config).
default_config() -> erlcloud_aws:default_config().