Current section
Files
Jump to
Current section
Files
src/erlcloud_iam.erl
%% Amazon Identity and Access Management Service(IAM)
% TODO: Add pagination support
-module(erlcloud_iam).
-include("erlcloud.hrl").
-include("erlcloud_aws.hrl").
-include("erlcloud_iam.hrl").
%% Library initialization.
-export([configure/2, configure/3, new/2, new/3, iam_query/5]).
%% IAM API Functions
-export([
%% Users
get_user/0, get_user/1, get_user/2,
list_access_keys/0, list_access_keys/1, list_access_keys/2,
list_access_keys_all/0, list_access_keys_all/1, list_access_keys_all/2,
get_access_key_last_used/1, get_access_key_last_used/2,
list_users/0, list_users/1, list_users/2,
list_users_all/0, list_users_all/1, list_users_all/2,
list_groups_for_user/1, list_groups_for_user/2,
list_groups_for_user_all/1, list_groups_for_user_all/2,
list_user_policies/1, list_user_policies/2,
list_user_policies_all/1, list_user_policies_all/2,
list_attached_user_policies/1, list_attached_user_policies/2, list_attached_user_policies/3,
list_attached_user_policies_all/1, list_attached_user_policies_all/2, list_attached_user_policies_all/3,
get_user_policy/2, get_user_policy/3,
get_login_profile/1, get_login_profile/2,
get_group/1, get_group/2,
list_groups/0, list_groups/1, list_groups/2,
list_groups_all/0, list_groups_all/1, list_groups_all/2,
list_group_policies/1, list_group_policies/2,
list_group_policies_all/1, list_group_policies_all/2,
get_group_policy/2, get_group_policy/3,
list_attached_group_policies/1, list_attached_group_policies/2, list_attached_group_policies/3,
list_attached_group_policies_all/1, list_attached_group_policies_all/2, list_attached_group_policies_all/3,
get_role/1, get_role/2,
list_roles/0, list_roles/1, list_roles/2,
list_roles_all/0, list_roles_all/1, list_roles_all/2,
list_role_policies/1, list_role_policies/2,
list_role_policies_all/1, list_role_policies_all/2,
list_attached_role_policies/1, list_attached_role_policies/2, list_attached_role_policies/3,
list_attached_role_policies_all/1, list_attached_role_policies_all/2, list_attached_role_policies_all/3,
get_role_policy/2, get_role_policy/3,
list_policies/0, list_policies/1, list_policies/2, list_policies/3,
list_policies_all/0, list_policies_all/1, list_policies_all/2, list_policies_all/3,
list_entities_for_policy/1, list_entities_for_policy/2, list_entities_for_policy/3, list_entities_for_policy/4,
list_entities_for_policy_all/1, list_entities_for_policy_all/2, list_entities_for_policy_all/3, list_entities_for_policy_all/4,
get_policy/1, get_policy/2,
get_policy_version/2, get_policy_version/3,
list_instance_profiles/0, list_instance_profiles/1, list_instance_profiles/2,
list_instance_profiles_all/0, list_instance_profiles_all/1, list_instance_profiles_all/2,
get_instance_profile/1, get_instance_profile/2,
get_account_authorization_details/0, get_account_authorization_details/1,
get_account_summary/0, get_account_summary/1,
get_account_password_policy/0, get_account_password_policy/1,
generate_credential_report/0, generate_credential_report/1,
get_credential_report/0, get_credential_report/1,
simulate_principal_policy/2, simulate_principal_policy/3,
simulate_custom_policy/2, simulate_custom_policy/3, simulate_custom_policy/4,
list_virtual_mfa_devices/0, list_virtual_mfa_devices/1, list_virtual_mfa_devices/2,
list_virtual_mfa_devices/3, list_virtual_mfa_devices/4,
list_virtual_mfa_devices_all/0, list_virtual_mfa_devices_all/1, list_virtual_mfa_devices_all/2
]).
-export([get_uri/2]).
-define(API_VERSION, "2010-05-08").
-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,
iam_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.
%
% Users API
%
-spec get_user() -> {ok, proplist()} | {error, any()}.
get_user() -> get_user([]).
-spec get_user(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
get_user(#aws_config{} = Config) ->
get_user("", Config);
get_user(UserName) ->
get_user(UserName, default_config()).
-spec get_user(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_user("", Config) ->
get_user_impl([], Config);
get_user(UserName, Config) ->
get_user_impl([{"UserName", UserName}], Config).
get_user_impl(UserNameParam, #aws_config{} = Config) ->
ItemPath = "/GetUserResponse/GetUserResult/User",
case iam_query(Config, "GetUser", UserNameParam, ItemPath, data_type("User")) of
{ok, [User]} -> {ok, User};
{error, _} = Error -> Error
end.
-spec list_access_keys() -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_access_keys() ->
list_access_keys([]).
-spec list_access_keys(string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_access_keys(#aws_config{} = Config) ->
list_access_keys([], Config);
list_access_keys(UserName) ->
list_access_keys(UserName, default_config()).
-spec list_access_keys(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_access_keys(UserName, #aws_config{} = Config) when is_list(UserName) ->
Params = case UserName of
[] -> [];
UserName -> [{"UserName", UserName}]
end,
ItemPath = "/ListAccessKeysResponse/ListAccessKeysResult/AccessKeyMetadata/member",
iam_query(Config, "ListAccessKeys", Params, ItemPath, data_type("AccessKeyMetadata")).
-spec list_access_keys_all() -> {ok, proplist()} | {error, any()}.
list_access_keys_all() ->
list_access_keys_all([]).
-spec list_access_keys_all(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_access_keys_all(#aws_config{} = Config) ->
list_access_keys_all([], Config);
list_access_keys_all(UserName) ->
list_access_keys_all(UserName, default_config()).
-spec list_access_keys_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_access_keys_all(UserName, #aws_config{} = Config) when is_list(UserName) ->
Params = case UserName of
[] -> [];
UserName -> [{"UserName", UserName}]
end,
ItemPath = "/ListAccessKeysResponse/ListAccessKeysResult/AccessKeyMetadata/member",
iam_query_all(Config, "ListAccessKeys", Params, ItemPath, data_type("AccessKeyMetadata")).
-spec get_access_key_last_used(string()) -> {ok, proplist()} | {error, any()}.
get_access_key_last_used(KeyId) when is_list(KeyId) ->
get_access_key_last_used(KeyId, default_config()).
-spec get_access_key_last_used(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_access_key_last_used(KeyId, #aws_config{} = Config) when is_list(KeyId) ->
Params = [{"AccessKeyId", KeyId}],
ItemPath = "/GetAccessKeyLastUsedResponse/GetAccessKeyLastUsedResult",
Result = iam_query(Config, "GetAccessKeyLastUsed", Params, ItemPath,
data_type("GetAccessKeyLastUsedResult")),
singular_result(Result).
singular_result({ok, [Res]}) ->
{ok, Res};
singular_result({error, _} = Error) ->
Error.
-spec list_users() -> {ok, [proplist()]} | {ok, [proplist()], string()} | {error, any()}.
list_users() -> list_users("/").
-spec list_users(string() | aws_config()) -> {ok, [proplist()]} | {ok, [proplist()], string()} | {error, any()}.
list_users(#aws_config{} = Config) ->
list_users("/", Config);
list_users(PathPrefix) ->
list_users(PathPrefix, default_config()).
-spec list_users(string(), aws_config()) -> {ok, [proplist()]} | {ok, [proplist()], string()} | {error, any()}.
list_users(PathPrefix, #aws_config{} = Config)
when is_list(PathPrefix) ->
ItemPath = "/ListUsersResponse/ListUsersResult/Users/member",
iam_query(Config, "ListUsers", [{"PathPrefix", PathPrefix}], ItemPath, data_type("User")).
-spec list_users_all() -> {ok, proplist()} | {error, any()}.
list_users_all() -> list_users_all("/").
-spec list_users_all(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_users_all(#aws_config{} = Config) ->
list_users_all("/", Config);
list_users_all(PathPrefix) ->
list_users_all(PathPrefix, default_config()).
-spec list_users_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_users_all(PathPrefix, #aws_config{} = Config)
when is_list(PathPrefix) ->
ItemPath = "/ListUsersResponse/ListUsersResult/Users/member",
iam_query_all(Config, "ListUsers", [{"PathPrefix", PathPrefix}], ItemPath, data_type("User")).
-spec list_groups_for_user(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_groups_for_user(UserName) ->
list_groups_for_user(UserName, default_config()).
-spec list_groups_for_user(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_groups_for_user(UserName, #aws_config{} = Config) ->
ItemPath = "/ListGroupsForUserResponse/ListGroupsForUserResult/Groups/member",
iam_query(Config, "ListGroupsForUser", [{"UserName", UserName}], ItemPath, data_type("Group")).
-spec list_groups_for_user_all(string()) -> {ok, proplist()} | {error, any()}.
list_groups_for_user_all(UserName) ->
list_groups_for_user_all(UserName, default_config()).
-spec list_groups_for_user_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_groups_for_user_all(UserName, #aws_config{} = Config) ->
ItemPath = "/ListGroupsForUserResponse/ListGroupsForUserResult/Groups/member",
iam_query_all(Config, "ListGroupsForUser", [{"UserName", UserName}], ItemPath, data_type("Group")).
-spec list_user_policies(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_user_policies(UserName) ->
list_user_policies(UserName, default_config()).
-spec list_user_policies(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_user_policies(UserName, #aws_config{} = Config) ->
ItemPath = "/ListUserPoliciesResponse/ListUserPoliciesResult/PolicyNames/member",
DataType = [{policy_name, "String"}],
iam_query(Config, "ListUserPolicies", [{"UserName", UserName}], ItemPath, DataType).
-spec list_user_policies_all(string()) -> {ok, proplist()} | {error, any()}.
list_user_policies_all(UserName) ->
list_user_policies_all(UserName, default_config()).
-spec list_user_policies_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_user_policies_all(UserName, #aws_config{} = Config) ->
ItemPath = "/ListUserPoliciesResponse/ListUserPoliciesResult/PolicyNames/member",
DataType = [{policy_name, "String"}],
iam_query_all(Config, "ListUserPolicies", [{"UserName", UserName}], ItemPath, DataType).
-spec get_user_policy(string(), string()) -> {ok, proplist()} | {error, any()}.
get_user_policy(UserName, PolicyName) ->
get_user_policy(UserName, PolicyName, default_config()).
-spec get_user_policy(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_user_policy(UserName, PolicyName, #aws_config{} = Config) ->
ItemPath = "/GetUserPolicyResponse/GetUserPolicyResult",
Params = [{"UserName", UserName}, {"PolicyName", PolicyName}],
iam_query(Config, "GetUserPolicy", Params, ItemPath, data_type("UserPolicyList")).
-spec list_attached_user_policies(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_user_policies(UserName) ->
list_attached_user_policies(UserName, "/", default_config()).
-spec list_attached_user_policies(string(), string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_user_policies(UserName, #aws_config{} = Config) ->
list_attached_user_policies(UserName, "/", Config);
list_attached_user_policies(UserName, PathPrefix)
when is_list(UserName), is_list(PathPrefix) ->
list_attached_user_policies(UserName, PathPrefix, default_config()).
-spec list_attached_user_policies(string(), string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_user_policies(UserName, [], Config) ->
list_attached_user_policies(UserName, "/", Config);
list_attached_user_policies(UserName, PathPrefix, #aws_config{} = Config)
when is_list(UserName), is_list(PathPrefix) ->
ItemPath = "/ListAttachedUserPoliciesResponse/ListAttachedUserPoliciesResult/AttachedPolicies/member",
Params = [{"UserName", UserName}, {"PathPrefix", PathPrefix}],
iam_query(Config, "ListAttachedUserPolicies", Params, ItemPath, data_type("AttachedPolicy")).
-spec list_attached_user_policies_all(string()) -> {ok, proplist()} | {error, any()}.
list_attached_user_policies_all(UserName) ->
list_attached_user_policies_all(UserName, "/", default_config()).
-spec list_attached_user_policies_all(string(), string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_attached_user_policies_all(UserName, #aws_config{} = Config) ->
list_attached_user_policies_all(UserName, "/", Config);
list_attached_user_policies_all(UserName, PathPrefix)
when is_list(UserName), is_list(PathPrefix) ->
list_attached_user_policies_all(UserName, PathPrefix, default_config()).
-spec list_attached_user_policies_all(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_attached_user_policies_all(UserName, [], Config) ->
list_attached_user_policies_all(UserName, "/", Config);
list_attached_user_policies_all(UserName, PathPrefix, #aws_config{} = Config)
when is_list(UserName), is_list(PathPrefix) ->
ItemPath = "/ListAttachedUserPoliciesResponse/ListAttachedUserPoliciesResult/AttachedPolicies/member",
Params = [{"UserName", UserName}, {"PathPrefix", PathPrefix}],
iam_query_all(Config, "ListAttachedUserPolicies", Params, ItemPath, data_type("AttachedPolicy")).
-spec get_login_profile(string()) -> {ok, proplist()} | {error, any()}.
get_login_profile(UserName) ->
get_login_profile(UserName, default_config()).
-spec get_login_profile(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_login_profile(UserName, #aws_config{} = Config) ->
ItemPath = "/GetLoginProfileResponse/GetLoginProfileResult/LoginProfile",
iam_query(Config, "GetLoginProfile", [{"UserName", UserName}], ItemPath, data_type("LoginProfile")).
%
% Groups API
%
-spec get_group(string()) -> {ok, proplist()} | {error, any()}.
get_group(GroupName) when is_list(GroupName)->
get_group(GroupName, default_config()).
-spec get_group(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_group(GroupName, Config) ->
get_group_impl([{"GroupName", GroupName}], Config).
get_group_impl(GroupNameParam, #aws_config{} = Config) ->
ItemPath = "/GetGroupResponse/GetGroupResult/Group",
case iam_query(Config, "GetGroup", GroupNameParam, ItemPath, data_type("Group")) of
{ok, [Group]} -> {ok, Group};
{error, _} = Error -> Error
end.
-spec list_groups() -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_groups() -> list_groups([]).
-spec list_groups(string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_groups(#aws_config{} = Config) ->
list_groups("/", Config);
list_groups(PathPrefix) ->
list_groups(PathPrefix, default_config()).
-spec list_groups(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_groups(PathPrefix, Config)
when is_list(PathPrefix) ->
ItemPath = "/ListGroupsResponse/ListGroupsResult/Groups/member",
iam_query(Config, "ListGroups", [{"PathPrefix", PathPrefix}], ItemPath, data_type("Group")).
-spec list_groups_all() -> {ok, proplist()} | {error, any()}.
list_groups_all() -> list_groups_all([]).
-spec list_groups_all(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_groups_all(#aws_config{} = Config) ->
list_groups_all("/", Config);
list_groups_all(PathPrefix) ->
list_groups_all(PathPrefix, default_config()).
-spec list_groups_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_groups_all(PathPrefix, Config)
when is_list(PathPrefix) ->
ItemPath = "/ListGroupsResponse/ListGroupsResult/Groups/member",
iam_query_all(Config, "ListGroups", [{"PathPrefix", PathPrefix}], ItemPath, data_type("Group")).
-spec list_group_policies(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_group_policies(GroupName) ->
list_group_policies(GroupName, default_config()).
-spec list_group_policies(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_group_policies(GroupName, #aws_config{} = Config) ->
ItemPath = "/ListGroupPoliciesResponse/ListGroupPoliciesResult/PolicyNames/member",
DataTypeDef = [{policy_name, "String"}],
iam_query(Config, "ListGroupPolicies", [{"GroupName", GroupName}], ItemPath, DataTypeDef).
-spec list_group_policies_all(string()) -> {ok, proplist()} | {error, any()}.
list_group_policies_all(GroupName) ->
list_group_policies_all(GroupName, default_config()).
-spec list_group_policies_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_group_policies_all(GroupName, #aws_config{} = Config) ->
ItemPath = "/ListGroupPoliciesResponse/ListGroupPoliciesResult/PolicyNames/member",
DataTypeDef = [{policy_name, "String"}],
iam_query_all(Config, "ListGroupPolicies", [{"GroupName", GroupName}], ItemPath, DataTypeDef).
-spec get_group_policy(string(), string()) -> {ok, proplist()} | {error, any()}.
get_group_policy(GroupName, PolicyName) ->
get_group_policy(GroupName, PolicyName, default_config()).
-spec get_group_policy(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_group_policy(GroupName, PolicyName, #aws_config{} = Config) ->
ItemPath = "/GetGroupPolicyResponse/GetGroupPolicyResult",
Params = [{"GroupName", GroupName}, {"PolicyName", PolicyName}],
iam_query(Config, "GetGroupPolicy", Params, ItemPath, data_type("GroupPolicyList")).
-spec list_attached_group_policies(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_group_policies(GroupName) ->
list_attached_group_policies(GroupName, "/", default_config()).
-spec list_attached_group_policies(string(), string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_group_policies(GroupName, #aws_config{} = Config) ->
list_attached_group_policies(GroupName, "/", Config);
list_attached_group_policies(GroupName, PathPrefix)
when is_list(GroupName), is_list(PathPrefix) ->
list_attached_group_policies(GroupName, PathPrefix, default_config()).
-spec list_attached_group_policies(string(), string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_group_policies(GroupName, PathPrefix, #aws_config{} = Config)
when is_list(GroupName), is_list(PathPrefix) ->
ItemPath = "/ListAttachedGroupPoliciesResponse/ListAttachedGroupPoliciesResult/AttachedPolicies/member",
Params = [{"GroupName", GroupName}, {"PathPrefix", PathPrefix}],
iam_query(Config, "ListAttachedGroupPolicies", Params, ItemPath, data_type("AttachedPolicy")).
-spec list_attached_group_policies_all(string()) -> {ok, proplist()} | {error, any()}.
list_attached_group_policies_all(GroupName) ->
list_attached_group_policies_all(GroupName, "/", default_config()).
-spec list_attached_group_policies_all(string(), string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_attached_group_policies_all(GroupName, #aws_config{} = Config) ->
list_attached_group_policies_all(GroupName, "/", Config);
list_attached_group_policies_all(GroupName, PathPrefix)
when is_list(GroupName), is_list(PathPrefix) ->
list_attached_group_policies_all(GroupName, PathPrefix, default_config()).
-spec list_attached_group_policies_all(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_attached_group_policies_all(GroupName, PathPrefix, #aws_config{} = Config)
when is_list(GroupName), is_list(PathPrefix) ->
ItemPath = "/ListAttachedGroupPoliciesResponse/ListAttachedGroupPoliciesResult/AttachedPolicies/member",
Params = [{"GroupName", GroupName}, {"PathPrefix", PathPrefix}],
iam_query_all(Config, "ListAttachedGroupPolicies", Params, ItemPath, data_type("AttachedPolicy")).
%
% Roles API
%
-spec get_role(string()) -> {ok, proplist()} | {error, any()}.
get_role(RoleName) when is_list(RoleName) ->
get_role(RoleName, default_config()).
-spec get_role(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_role(RoleName, Config) ->
get_role_impl([{"RoleName", RoleName}], Config).
get_role_impl(RoleNameParam, #aws_config{} = Config) ->
ItemPath = "/GetRoleResponse/GetRoleResult/Role",
case iam_query(Config, "GetRole", RoleNameParam, ItemPath, data_type("Role")) of
{ok, [Role]} -> {ok, Role};
{error, _} = Error -> Error
end.
-spec list_roles() -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_roles() -> list_roles([]).
-spec list_roles(string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_roles(#aws_config{} = Config) ->
list_roles("/", Config);
list_roles(PathPrefix) ->
list_roles(PathPrefix, default_config()).
-spec list_roles(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_roles(PathPrefix, #aws_config{} = Config)
when is_list(PathPrefix) ->
ItemPath = "/ListRolesResponse/ListRolesResult/Roles/member",
iam_query(Config, "ListRoles", [{"PathPrefix", PathPrefix}], ItemPath, data_type("Role")).
-spec list_roles_all() -> {ok, proplist()} | {error, any()}.
list_roles_all() -> list_roles([]).
-spec list_roles_all(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_roles_all(#aws_config{} = Config) ->
list_roles_all("/", Config);
list_roles_all(PathPrefix) ->
list_roles_all(PathPrefix, default_config()).
-spec list_roles_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_roles_all(PathPrefix, #aws_config{} = Config)
when is_list(PathPrefix) ->
ItemPath = "/ListRolesResponse/ListRolesResult/Roles/member",
iam_query_all(Config, "ListRoles", [{"PathPrefix", PathPrefix}], ItemPath, data_type("Role")).
-spec list_role_policies(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_role_policies(RoleName) ->
list_role_policies(RoleName, default_config()).
-spec list_role_policies(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_role_policies(RoleName, #aws_config{} = Config) ->
ItemPath = "/ListRolePoliciesResponse/ListRolePoliciesResult/PolicyNames/member",
DataTypeDef = [{policy_name, "String"}],
iam_query(Config, "ListRolePolicies", [{"RoleName", RoleName}], ItemPath, DataTypeDef).
-spec list_role_policies_all(string()) -> {ok, proplist()} | {error, any()}.
list_role_policies_all(RoleName) ->
list_role_policies_all(RoleName, default_config()).
-spec list_role_policies_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_role_policies_all(RoleName, #aws_config{} = Config) ->
ItemPath = "/ListRolePoliciesResponse/ListRolePoliciesResult/PolicyNames/member",
DataTypeDef = [{policy_name, "String"}],
iam_query_all(Config, "ListRolePolicies", [{"RoleName", RoleName}], ItemPath, DataTypeDef).
-spec get_role_policy(string(), string()) -> {ok, proplist()} | {error, any()}.
get_role_policy(RoleName, PolicyName) ->
get_role_policy(RoleName, PolicyName, default_config()).
-spec get_role_policy(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_role_policy(RoleName, PolicyName, #aws_config{} = Config) ->
ItemPath = "/GetRolePolicyResponse/GetRolePolicyResult",
Params = [{"RoleName", RoleName}, {"PolicyName", PolicyName}],
iam_query(Config, "GetRolePolicy", Params, ItemPath, data_type("RolePolicyList")).
-spec list_attached_role_policies(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_role_policies(RoleName) ->
list_attached_role_policies(RoleName, "/", default_config()).
-spec list_attached_role_policies(string(), string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_role_policies(RoleName, #aws_config{} = Config) ->
list_attached_role_policies(RoleName, "/", Config);
list_attached_role_policies(RoleName, PathPrefix)
when is_list(RoleName), is_list(PathPrefix) ->
list_attached_role_policies(RoleName, PathPrefix, default_config()).
-spec list_attached_role_policies(string(), string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_attached_role_policies(RoleName, PathPrefix, #aws_config{} = Config)
when is_list(RoleName), is_list(PathPrefix) ->
ItemPath = "/ListAttachedRolePoliciesResponse/ListAttachedRolePoliciesResult/AttachedPolicies/member",
Params = [{"RoleName", RoleName}, {"PathPrefix", PathPrefix}],
iam_query(Config, "ListAttachedRolePolicies", Params, ItemPath, data_type("AttachedPolicy")).
-spec list_attached_role_policies_all(string()) -> {ok, proplist()} | {error, any()}.
list_attached_role_policies_all(RoleName) ->
list_attached_role_policies_all(RoleName, "/", default_config()).
-spec list_attached_role_policies_all(string(), string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_attached_role_policies_all(RoleName, #aws_config{} = Config) ->
list_attached_role_policies_all(RoleName, "/", Config);
list_attached_role_policies_all(RoleName, PathPrefix)
when is_list(RoleName), is_list(PathPrefix) ->
list_attached_role_policies_all(RoleName, PathPrefix, default_config()).
-spec list_attached_role_policies_all(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_attached_role_policies_all(RoleName, PathPrefix, #aws_config{} = Config)
when is_list(RoleName), is_list(PathPrefix) ->
ItemPath = "/ListAttachedRolePoliciesResponse/ListAttachedRolePoliciesResult/AttachedPolicies/member",
Params = [{"RoleName", RoleName}, {"PathPrefix", PathPrefix}],
iam_query_all(Config, "ListAttachedRolePolicies", Params, ItemPath, data_type("AttachedPolicy")).
%
% Policies API
%
-spec list_policies() -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_policies() ->
list_policies("/").
-spec list_policies(string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_policies(#aws_config{} = Config) ->
list_policies("/", Config);
list_policies(PathPrefix) ->
list_policies(PathPrefix, default_config()).
-spec list_policies(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_policies(PathPrefix, #aws_config{} = Config) ->
list_policies(PathPrefix, [], Config).
-spec list_policies(string(), list(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_policies(PathPrefix, ReqParams, #aws_config{} = Config)
when is_list(PathPrefix), is_list(ReqParams) ->
ItemPath = "/ListPoliciesResponse/ListPoliciesResult/Policies/member",
iam_query(Config, "ListPolicies", [{"PathPrefix", PathPrefix} | ReqParams], ItemPath, data_type("Policy")).
-spec list_policies_all() -> {ok, proplist()} | {error, any()}.
list_policies_all() ->
list_policies_all("/").
-spec list_policies_all(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_policies_all(#aws_config{} = Config) ->
list_policies_all("/", Config);
list_policies_all(PathPrefix) ->
list_policies_all(PathPrefix, default_config()).
-spec list_policies_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_policies_all(PathPrefix, #aws_config{} = Config) ->
list_policies_all(PathPrefix, [], Config).
-spec list_policies_all(string(), list(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_policies_all(PathPrefix, ReqParams, #aws_config{} = Config)
when is_list(PathPrefix), is_list(ReqParams) ->
ItemPath = "/ListPoliciesResponse/ListPoliciesResult/Policies/member",
iam_query_all(Config, "ListPolicies", [{"PathPrefix", PathPrefix} | ReqParams], ItemPath, data_type("Policy")).
-spec list_entities_for_policy(string()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_entities_for_policy(PolicyArn) ->
list_entities_for_policy(PolicyArn, default_config()).
-spec list_entities_for_policy(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_entities_for_policy(PolicyArn, #aws_config{} = Config) ->
list_entities_for_policy(PolicyArn, "/", Config).
-spec list_entities_for_policy(string(), string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_entities_for_policy(PolicyArn, PathPrefix, #aws_config{} = Config) ->
list_entities_for_policy(PolicyArn, PathPrefix, [], Config).
-spec list_entities_for_policy(string(), string(), list(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_entities_for_policy(PolicyArn, PathPrefix, ReqParams, #aws_config{} = Config)
when is_list(PathPrefix), is_list(PolicyArn), is_list(ReqParams) ->
ItemPath = "/ListEntitiesForPolicyResponse/ListEntitiesForPolicyResult",
Params = [{"PathPrefix", PathPrefix} , {"PolicyArn", PolicyArn} | ReqParams],
iam_query(Config, "ListEntitiesForPolicy", Params, ItemPath, data_type("EntitiesPolicyList")).
-spec list_entities_for_policy_all(string()) -> {ok, proplist()} | {error, any()}.
list_entities_for_policy_all(PolicyArn) ->
list_entities_for_policy_all(PolicyArn, default_config()).
-spec list_entities_for_policy_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_entities_for_policy_all(PolicyArn, #aws_config{} = Config) ->
list_entities_for_policy_all(PolicyArn, "/", Config).
-spec list_entities_for_policy_all(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_entities_for_policy_all(PolicyArn, PathPrefix, #aws_config{} = Config) ->
list_entities_for_policy_all(PolicyArn, PathPrefix, [], Config).
-spec list_entities_for_policy_all(string(), string(), list(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_entities_for_policy_all(PolicyArn, PathPrefix, ReqParams, #aws_config{} = Config)
when is_list(PathPrefix), is_list(PolicyArn), is_list(ReqParams) ->
ItemPath = "/ListEntitiesForPolicyResponse/ListEntitiesForPolicyResult",
Params = [{"PathPrefix", PathPrefix} , {"PolicyArn", PolicyArn} | ReqParams],
iam_query_all(Config, "ListEntitiesForPolicy", Params, ItemPath, data_type("EntitiesPolicyList")).
-spec get_policy(string()) -> {ok, proplist()} | {error, any()}.
get_policy(PolicyArn) -> get_policy(PolicyArn, default_config()).
-spec get_policy(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_policy(PolicyArn, #aws_config{} = Config)
when is_list(PolicyArn) ->
ItemPath = "/GetPolicyResponse/GetPolicyResult/Policy",
iam_query(Config, "GetPolicy", [{"PolicyArn", PolicyArn}], ItemPath, data_type("Policy")).
-spec get_policy_version(string(), string()) -> {ok, proplist()} | {error, any()}.
get_policy_version(PolicyArn, VersionId) ->
get_policy_version(PolicyArn, VersionId, default_config()).
-spec get_policy_version(string(), string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_policy_version(PolicyArn, VersionId, #aws_config{} = Config)
when is_list(PolicyArn), is_list(VersionId) ->
ItemPath = "/GetPolicyVersionResponse/GetPolicyVersionResult/PolicyVersion",
iam_query(Config, "GetPolicyVersion", [{"PolicyArn", PolicyArn}, {"VersionId", VersionId}], ItemPath, data_type("PolicyVersion")).
%
% InstanceProfile
%
-spec list_instance_profiles() -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_instance_profiles() ->
list_instance_profiles(default_config()).
-spec list_instance_profiles(string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_instance_profiles(#aws_config{} = Config) ->
list_instance_profiles("/", Config);
list_instance_profiles(PathPrefix) ->
list_instance_profiles(PathPrefix, default_config()).
-spec list_instance_profiles(string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_instance_profiles(PathPrefix, #aws_config{} = Config) ->
ItemPath = "/ListInstanceProfilesResponse/ListInstanceProfilesResult/InstanceProfiles/member",
Params = [{"PathPrefix", PathPrefix}],
iam_query(Config, "ListInstanceProfiles", Params, ItemPath, data_type("InstanceProfile")).
-spec list_instance_profiles_all() -> {ok, proplist()} | {error, any()}.
list_instance_profiles_all() ->
list_instance_profiles_all(default_config()).
-spec list_instance_profiles_all(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_instance_profiles_all(#aws_config{} = Config) ->
list_instance_profiles_all("/", Config);
list_instance_profiles_all(PathPrefix) ->
list_instance_profiles_all(PathPrefix, default_config()).
-spec list_instance_profiles_all(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_instance_profiles_all(PathPrefix, #aws_config{} = Config) ->
ItemPath = "/ListInstanceProfilesResponse/ListInstanceProfilesResult/InstanceProfiles/member",
Params = [{"PathPrefix", PathPrefix}],
iam_query_all(Config, "ListInstanceProfiles", Params, ItemPath, data_type("InstanceProfile")).
-spec get_instance_profile(string()) -> {ok, proplist()} | {error, any()}.
get_instance_profile(ProfileName) ->
get_instance_profile(ProfileName, default_config()).
-spec get_instance_profile(string(), aws_config()) -> {ok, proplist()} | {error, any()}.
get_instance_profile(ProfileName, #aws_config{} = Config) ->
ItemPath = "/GetInstanceProfileResponse/GetInstanceProfileResult/InstanceProfile",
Params = [{"InstanceProfileName", ProfileName}],
iam_query(Config, "GetInstanceProfile", Params, ItemPath, data_type("InstanceProfile")).
%
% Account APIs
%
-spec get_account_authorization_details() -> {ok, proplist()} | {error, any()}.
get_account_authorization_details() ->
get_account_authorization_details(default_config()).
-spec get_account_authorization_details(aws_config()) -> {ok, proplist()} | {error, any()}.
get_account_authorization_details(#aws_config{} = Config) ->
ItemPath = "/GetAccountAuthorizationDetailsResponse/GetAccountAuthorizationDetailsResult",
DataTypeDef = data_type("AccountAuthorizationDetails"),
case iam_query(Config, "GetAccountAuthorizationDetails", [], ItemPath, DataTypeDef) of
{ok, [Summary]} ->
{ok, Summary};
{error, _} = Error -> Error
end.
-spec get_account_summary() -> {ok, proplist()} | {error, any()}.
get_account_summary() ->
get_account_summary(default_config()).
-spec get_account_summary(aws_config()) -> {ok, proplist()} | {error, any()}.
get_account_summary(#aws_config{} = Config) ->
case iam_query(Config, "GetAccountSummary", []) of
{ok, Doc} ->
Items = xmerl_xpath:string("/GetAccountSummaryResponse/GetAccountSummaryResult/SummaryMap", Doc),
{ok, [extract_account_summary(Item) || Item <- Items]};
{error, _} = Error ->
Error
end.
-spec get_account_password_policy() -> {ok, proplist()} | {error, any()}.
get_account_password_policy() ->
get_account_password_policy(default_config()).
-spec get_account_password_policy(aws_config()) -> {ok, proplist()} | {error, any()}.
get_account_password_policy(#aws_config{} = Config) ->
ItemPath = "/GetAccountPasswordPolicyResponse/GetAccountPasswordPolicyResult/PasswordPolicy",
DataTypeDef = data_type("PasswordPolicy"),
iam_query(Config, "GetAccountPasswordPolicy", [], ItemPath, DataTypeDef).
-spec generate_credential_report() -> {ok, proplist()} | {error, any()}.
generate_credential_report() ->
generate_credential_report(default_config()).
-spec generate_credential_report(aws_config()) -> {ok, proplist()} | {error, any()}.
generate_credential_report(Config) ->
ItemPath = "/GenerateCredentialReportResponse/GenerateCredentialReportResult",
DataTypeDef = [{"State", state, "String"},
{"Description", description, "String"}],
iam_query(Config, "GenerateCredentialReport", [], ItemPath, DataTypeDef).
-spec get_credential_report() -> {ok, proplist()} | {error, any()}.
get_credential_report() ->
get_credential_report(default_config()).
-spec get_credential_report(aws_config()) -> {ok, proplist()} | {error, any()}.
get_credential_report(Config) ->
ItemPath = "/GetCredentialReportResponse/GetCredentialReportResult",
DataTypeDef = [{"GeneratedTime", generated_time, "DateTime"},
{"ReportFormat", report_format, "String"},
{"Content", content, "String"}],
iam_query(Config, "GetCredentialReport", [], ItemPath, DataTypeDef).
simulate_principal_policy(PolicySourceArn, ActionNames) ->
simulate_principal_policy(PolicySourceArn, ActionNames, default_config()).
simulate_principal_policy(PolicySourceArn, ActionNames, #aws_config{} = Config)
when is_list(PolicySourceArn) andalso is_list(ActionNames) ->
ItemPath = "/SimulatePrincipalPolicyResponse/SimulatePrincipalPolicyResult/"
"EvaluationResults/member",
Params = [{"PolicySourceArn", PolicySourceArn} |
erlcloud_util:encode_list("ActionNames", ActionNames)],
iam_query_all(Config, "SimulatePrincipalPolicy", Params,
ItemPath, data_type("EvaluationResult")).
simulate_custom_policy(ActionNames, PolicyInputList) ->
simulate_custom_policy(ActionNames, PolicyInputList, default_config()).
-spec simulate_custom_policy(list(), list(), aws_config() | context_entries()) -> {ok, proplist()} | {error, any()}.
simulate_custom_policy(ActionNames, PolicyInputList, #aws_config{} = Config)
when is_list(ActionNames), is_list(PolicyInputList) ->
ItemPath = "/SimulateCustomPolicyResponse/SimulateCustomPolicyResult/"
"EvaluationResults/member",
Params = erlcloud_util:encode_list("ActionNames", ActionNames) ++
erlcloud_util:encode_list("PolicyInputList", PolicyInputList),
iam_query_all(Config, "SimulateCustomPolicy", Params,
ItemPath, data_type("EvaluationResult"));
simulate_custom_policy(ActionNames, PolicyInputList, ContextEntries) ->
simulate_custom_policy(ActionNames, PolicyInputList, ContextEntries, default_config()).
simulate_custom_policy(ActionNames, PolicyInputList, ContextEntries, #aws_config{} = Config)
when is_list(ActionNames), is_list(PolicyInputList) ->
ItemPath = "/SimulateCustomPolicyResponse/SimulateCustomPolicyResult/"
"EvaluationResults/member",
Params = erlcloud_util:encode_list("ActionNames", ActionNames) ++
erlcloud_util:encode_list("PolicyInputList", PolicyInputList) ++
encode_context_entries(ContextEntries),
iam_query_all(Config, "SimulateCustomPolicy", Params,
ItemPath, data_type("EvaluationResult")).
-spec list_virtual_mfa_devices() -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_virtual_mfa_devices() ->
list_virtual_mfa_devices(default_config()).
-spec list_virtual_mfa_devices(string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_virtual_mfa_devices(#aws_config{} = Config) ->
list_virtual_mfa_devices(undefined, undefined, undefined, Config);
list_virtual_mfa_devices(AssignmentStatus) ->
list_virtual_mfa_devices(AssignmentStatus, undefined, undefined, default_config()).
-spec list_virtual_mfa_devices(undefined | string(), string() | aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_virtual_mfa_devices(AssignmentStatus, #aws_config{} = Config) ->
list_virtual_mfa_devices(AssignmentStatus, undefined, undefined, Config);
list_virtual_mfa_devices(AssignmentStatus, Marker) ->
list_virtual_mfa_devices(AssignmentStatus, Marker, undefined, default_config()).
-spec list_virtual_mfa_devices(undefined | string(), undefined | string(), string()| aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_virtual_mfa_devices(AssignmentStatus, Marker, #aws_config{} = Config) ->
list_virtual_mfa_devices(AssignmentStatus, Marker, undefined, Config);
list_virtual_mfa_devices(AssignmentStatus, Marker, MaxItems) ->
list_virtual_mfa_devices(AssignmentStatus, Marker, MaxItems, default_config()).
-spec list_virtual_mfa_devices(undefined | string(), undefined | string(), undefined | string(), aws_config()) -> {ok, proplist()} | {ok, proplist(), string()} | {error, any()}.
list_virtual_mfa_devices(AssignmentStatus, Marker, MaxItems, #aws_config{} = Config) ->
Params = make_list_virtual_mfa_devices_params(AssignmentStatus, Marker, MaxItems),
ItemPath = "/ListVirtualMFADevicesResponse/ListVirtualMFADevicesResult/VirtualMFADevices/member",
iam_query(Config, "ListVirtualMFADevices", Params, ItemPath, data_type("VirtualMFADeviceMetadata")).
-spec list_virtual_mfa_devices_all() -> {ok, proplist()} | {error, any()}.
list_virtual_mfa_devices_all() ->
list_virtual_mfa_devices_all(default_config()).
-spec list_virtual_mfa_devices_all(string() | aws_config()) -> {ok, proplist()} | {error, any()}.
list_virtual_mfa_devices_all(#aws_config{} = Config) ->
list_virtual_mfa_devices_all(undefined, Config);
list_virtual_mfa_devices_all(AssignmentStatus) ->
list_virtual_mfa_devices_all(AssignmentStatus, default_config()).
-spec list_virtual_mfa_devices_all(undefined | string(), aws_config()) -> {ok, proplist()} | {error, any()}.
list_virtual_mfa_devices_all(AssignmentStatus, #aws_config{} = Config) ->
Params = make_list_virtual_mfa_devices_params(AssignmentStatus, undefined, undefined),
ItemPath = "/ListVirtualMFADevicesResponse/ListVirtualMFADevicesResult/VirtualMFADevices/member",
iam_query_all(Config, "ListVirtualMFADevices", Params, ItemPath, data_type("VirtualMFADeviceMetadata")).
%
% Utils
%
encode_context_entries(ContextEntries) ->
ParsedContextEntriesValues = [ [{"ContextKeyName", ContextKeyName},
{"ContextKeyType", ContextKeyType},
{"ContextKeyValues", erlcloud_util:encode_list("", ContextKeyValues)}] ||
[{context_key_name, ContextKeyName},
{context_key_type, ContextKeyType},
{context_key_values, ContextKeyValues}] <-
ContextEntries],
EncodedContextEntries = erlcloud_aws:param_list(ParsedContextEntriesValues, "ContextEntries.member"),
lists:flatten([flatten_encoded_context_value(Key, Value) || {Key, Value} <- EncodedContextEntries]).
flatten_encoded_context_value(Key, Value) ->
flatten_encoded_context_value(Key, Value, []).
flatten_encoded_context_value(_, [], Acc) ->
Acc;
flatten_encoded_context_value(Key, [{SubKey, Val} | Values], Acc) ->
Acc2 = [{Key++SubKey, Val}] ++ Acc,
flatten_encoded_context_value(Key, Values, Acc2);
flatten_encoded_context_value(Key, Val, _) ->
[{Key, Val}].
iam_query(Config, Action, Params) ->
iam_query(Config, Action, Params, ?API_VERSION).
iam_query(Config, Action, Params, ApiVersion) ->
QParams = [{"Action", Action}, {"Version", ApiVersion}|Params],
erlcloud_aws:aws_request_xml4(post, Config#aws_config.iam_host,
"/", QParams, "iam", Config).
iam_query(Config, Action, Params, ItemPath, DataTypeDef) ->
case iam_query(Config, Action, Params) of
{ok, Res} ->
Items = erlcloud_util:get_items(ItemPath, Res),
Result = [extract_values(DataTypeDef, Item) || Item <- Items],
erlcloud_util:make_response(Res, Result);
{error, _} = Error ->
Error
end.
iam_query_all(Config, Action, Params, ItemPath, DataTypeDef) ->
case erlcloud_util:query_all(fun iam_query/3, Config, Action, Params) of
{ok, Res} ->
Items = erlcloud_util:get_items(ItemPath, Res),
Result = [extract_values(DataTypeDef, Item) || Item <- Items],
{ok, Result};
{error, _} = Error ->
Error
end.
extract_values(DataTypeDef, Item) ->
extract_values(DataTypeDef, Item, []).
extract_values([{Key, AKey, [{_,_,_}|_] = DataTypeDef}|T], Item, Acc) ->
Items = xmerl_xs:select(Key, Item),
Items1 = [extract_values(DataTypeDef, I) || I <- Items],
extract_values(T, Item, [{AKey, Items1}|Acc]);
extract_values([{Key, AKey, [{_,_}|_] = DataTypeDef}|T], Item, Acc) ->
Items = xmerl_xs:select(Key, Item),
Items1 = [extract_values(DataTypeDef, I) || I <- Items],
extract_values(T, Item, [{AKey, Items1}|Acc]);
extract_values([{AKey, Type}|T], Item, Acc) ->
{Module, Fun} = data_fun(Type),
extract_values(T, Item, [{AKey, apply(Module, Fun, [Item])}|Acc]);
extract_values([{Key, AKey, Type}|T], Item, Acc) ->
{Module, Fun} = data_fun(Type),
extract_values(T, Item, [{AKey, apply(Module, Fun, [Key, Item])}|Acc]);
extract_values([], _Item, Acc) ->
Acc.
default_config() -> erlcloud_aws:default_config().
extract_account_summary(Item) ->
Entries = xmerl_xs:select("/SummaryMap/entry", Item),
Extract = [{"AccessKeysPerUserQuota", access_keys_per_user_quota, get_integer},
{"AccountMFAEnabled", account_mfa_enabled, get_bool},
{"AssumeRolePolicySizeQuota", assume_role_policy_size_quota, get_integer},
{"GroupPolicySizeQuota", group_policy_size_quota, get_integer},
{"Groups", groups, get_integer},
{"GroupsPerUserQuota", groups_per_user_quota, get_integer},
{"GroupsQuota", groups_quota, get_integer},
{"InstanceProfiles", instance_profiles, get_integer},
{"InstanceProfilesQuota", instance_profiles_quota, get_integer},
{"MFADevices", mfa_devices, get_integer},
{"MFADevicesInUse", mfa_devices_in_use, get_integer},
{"RolePolicySizeQuota", role_policy_size_quota, get_integer},
{"Roles", roles, get_integer},
{"RolesQuota", roles_quota, get_integer},
{"ServerCertificates", server_certificates, get_integer},
{"ServerCertificatesQuota", server_certificates_quota, get_integer},
{"SigningCertificatesPerUserQuota", signing_certificates_per_user_quota, get_integer},
{"UserPolicySizeQuota", user_policy_size_quota, get_integer},
{"Users", users, get_integer},
{"UsersQuota", users_quota, get_integer}],
lists:foldl(
fun(E, As) ->
Key = erlcloud_xml:get_text("key", E),
case lists:keyfind(Key, 1, Extract) of
false ->
As;
{Key, PKey, ValueFun} ->
[{PKey, apply(erlcloud_xml, ValueFun, ["value", E])}|As]
end
end, [], Entries).
data_type("VirtualMFADeviceMetadata") ->
[{"SerialNumber", serial_number, "String"},
{"EnableDate", enable_date, "DateTime"},
{"User", user, data_type("UserDetail")}];
data_type("AccountAuthorizationDetails") ->
[{"UserDetailList/member", users, data_type("UserDetail")},
{"GroupDetailList/member", groups, data_type("GroupDetail")},
{"RoleDetailList/member", roles, data_type("RoleDetail")}];
data_type("AccessKeyMetadata") ->
[{"Status", status, "String"},
{"CreateDate", create_date, "DateTime"},
{"AccessKeyId", access_key_id, "String"},
{"UserName", user_name, "String"}];
data_type("InstanceProfile") ->
[{"CreateDate", create_date, "DateTime"},
{"Arn", arn, "String"},
{"Path", path, "String"},
{"InstanceProfileName", instance_profile_name, "String"},
{"Roles/member", roles, data_type("Role")},
{"InstanceProfileId", instance_profile_id, "String"}];
data_type("Group") ->
[{"Path", path, "String"},
{"GroupName", group_name, "String"},
{"GroupId", group_id, "String"},
{"CreateDate", create_date, "DateTime"},
{"Arn", arn, "String"}];
data_type("GroupDetail") ->
[{"Path", path, "String"},
{"GroupPolicyList/member", group_policy_list, data_type("PolicyDetail")},
{"GroupName", group_name, "String"},
{"GroupId", group_id, "String"},
{"CreateDate", create_date, "DateTime"},
{"Arn", arn, "String"}];
data_type("GroupPolicyList") ->
[{"PolicyDocument", policy_document, "Uri"},
{"GroupName", group_name, "String"},
{"PolicyName", policy_name, "String"}];
data_type("LoginProfile") ->
[{"CreateDate", create_date, "DateTime"},
{"UserName", user_name, "String"}];
data_type("PasswordPolicy") ->
[{"RequireUppercaseCharacters", require_uppercase_characters, "Boolean"},
{"RequireSymbols", require_symbols, "Boolean"},
{"RequireNumbers", require_numbers, "Boolean"},
{"RequireLowercaseCharacters", require_lowercase_characters, "Boolean"},
{"PasswordReusePrevention", password_reuse_prevention, "Integer"},
{"MinimumPasswordLength", minimum_password_length, "Integer"},
{"MaxPasswordAge", max_password_age, "Integer"},
{"HardExpiry", hard_expiry, "Boolean"},
{"ExpirePasswords", expire_passwords, "Boolean"},
{"AllowUsersToChangePassword", allow_users_to_change_password, "Boolean"}];
data_type("PolicyDetail") ->
[{"PolicyName", policy_name, "String"},
{"PolicyDocument", policy_document, "Uri"}];
data_type("Role") ->
[{"Arn", arn, "String"},
{"CreateDate", create_date, "DateTime"},
{"AssumeRolePolicyDocument", assume_role_policy_doc, "Uri"},
{"RoleId", role_id, "String"},
{"RoleName", role_name, "String"},
{"Path", path, "String"}];
data_type("RoleDetail") ->
[{"RolePolicyList/member", role_policy_list, data_type("PolicyDetail")},
{"RoleName", role_name, "String"},
{"RoleId", role_id, "String"},
{"Path", path, "String"},
{"InstanceProfileList/member", instance_profiles, data_type("InstanceProfile")},
{"CreateDate", create_date, "DateTime"},
{"AssumeRolePolicyDocument", assume_role_policy_document, "Uri"},
{"Arn", arn, "String"}];
data_type("RolePolicyList") ->
[{"PolicyDocument", policy_document, "Uri"},
{"RoleName", role_name, "String"},
{"PolicyName", policy_name, "String"}];
data_type("Policy") ->
[{"PolicyName", policy_name, "String"},
{"DefaultVersionId", default_version_id, "String"},
{"PolicyId", policy_id, "String"},
{"Path", path, "String"},
{"Arn", arn, "String"},
{"AttachmentCount", attachment_count, "Integer"},
{"CreateDate", create_date, "DateTime"},
{"UpdateDate", update_date, "DateTime"}];
data_type("PolicyVersion") ->
[{"Document", policy_document, "Uri"},
{"IsDefaultVersion", is_default_version, "Boolean"},
{"VersionId", version_id, "String"},
{"CreateDate", create_date, "DateTime"}];
data_type("EntitiesPolicyList") ->
[{"PolicyRoles/member", roles_list, [{"RoleName", role_name, "String"}]},
{"PolicyGroups/member", groups_list, [{"GroupName", group_name, "String"}]},
{"PolicyUsers/member", users_list, [{"UserName", user_name, "String"}]}];
data_type("AttachedPolicy") ->
[{"PolicyName", policy_name, "String"},
{"PolicyArn", arn, "String"}];
data_type("User") ->
[{"PasswordLastUsed", password_last_used, "DateTime"},
{"CreateDate", create_date, "DateTime"},
{"Arn", arn, "String"},
{"UserId", user_id, "String"},
{"UserName", user_name, "String"},
{"Path", path, "String"}];
data_type("UserDetail") ->
[{"UserPolicyList/member", user_policy_list, data_type("PolicyDetail")},
{"UserName", user_name, "String"},
{"UserId", user_id, "String"},
{"Path", path, "String"},
{"GroupList/member", group_list, [{group_name, "String"}]},
{"CreateDate", create_date, "DateTime"},
{"Arn", arn, "String"}];
data_type("UserPolicyList") ->
[{"PolicyDocument", policy_document, "Uri"},
{"UserName", user_name, "String"},
{"PolicyName", policy_name, "String"}];
data_type("EvaluationResult") ->
[{"MatchedStatements/member", matched_statements_list,
data_type("MatchedStatement")},
{"EvalResourceName", eval_resource_name, "String"},
{"EvalDecision", eval_decision, "String"},
{"EvalActionName", eval_action_name, "String"}];
data_type("MatchedStatement") ->
[{"SourcePolicyId", source_policy_id, "String"}];
data_type("GetAccessKeyLastUsedResult") ->
[{"UserName", user_name, "String"},
{"AccessKeyLastUsed/Region", access_key_last_used_region, "String"},
{"AccessKeyLastUsed/ServiceName", access_key_last_used_service_name, "String"},
{"AccessKeyLastUsed/LastUsedDate", access_key_last_used_date, "DateTime"}].
data_fun("String") -> {erlcloud_xml, get_text};
data_fun("DateTime") -> {erlcloud_xml, get_time};
data_fun("Integer") -> {erlcloud_xml, get_integer};
data_fun("Boolean") -> {erlcloud_xml, get_bool};
data_fun("Uri") -> {?MODULE, get_uri}.
%% @doc Some things are technically not URIs (mostly in eunit tests in this repo).
%% We percent_decode them anyway.
get_uri(Key, Item) ->
Orig = erlcloud_xml:get_text(Key, Item),
case uri_string:normalize(Orig) of
{error, _, _} ->
uri_string:percent_decode(Orig);
Normalized ->
uri_string:percent_decode(Normalized)
end.
make_list_virtual_mfa_devices_params(undefined, undefined, undefined) ->
[];
make_list_virtual_mfa_devices_params(AssignmentStatus, Marker, MaxItems) ->
make_list_virtual_mfa_devices_param(AssignmentStatus, "AssignmentStatus") ++
make_list_virtual_mfa_devices_param(Marker ,"Marker") ++
make_list_virtual_mfa_devices_param(MaxItems, "MaxItems").
make_list_virtual_mfa_devices_param(undefined, _) ->
[];
make_list_virtual_mfa_devices_param(Param, ParamString) ->
[{ParamString, Param}].