Last active
March 18, 2018 16:47
-
-
Save fmcgeough/b9b402a872e302f889de944420eda8d7 to your computer and use it in GitHub Desktop.
Elixir paging AWS API results
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| defmodule CodeDeployInstances do | |
| @moduledoc """ | |
| Given a CodeDeploy Deployment Id return the instance ids deployed to. | |
| """ | |
| @doc """ | |
| Given a CodeDeploy Deployment Id return the instance ids deployed to. | |
| Returns `{:ok, [instance_id, ...]}` on success, or `{:error, []}` on failure. | |
| The AWS API is paged. This module takes care of the paging and returns the | |
| entire list. | |
| """ | |
| def list_instances(deployment_id, keys) do | |
| {result, instances} = aws_list_instances(deployment_id, keys) | |
| handle_paging( | |
| result, | |
| deployment_id, | |
| instances["instancesList"], | |
| instances["nextToken"], | |
| keys | |
| ) | |
| end | |
| defp handle_paging(:ok, _deploy_id, acc, nil, _keys), do: {:ok, acc} | |
| defp handle_paging(:error, _deploy_id, _acc, _next_token, _keys), do: {:error, []} | |
| defp handle_paging(:ok, deploy_id, acc, next_token, keys) do | |
| {result, instances} = aws_list_instances(deploy_id, keys, next_token: next_token) | |
| handle_paging( | |
| result, | |
| deploy_id, | |
| Enum.concat(acc, instances["instancesList"]), | |
| instances["nextToken"], | |
| keys | |
| ) | |
| end | |
| # Ease burden on paging by returning similar data for both | |
| # :ok and :error cases. | |
| defp aws_list_instances(deploy_id, keys, opts \\ []) do | |
| ExAws.CodeDeploy.list_deployment_instances(deploy_id, opts) | |
| |> ExAws.request(keys) | |
| |> case do | |
| {:ok, instances} -> {:ok, instances} | |
| _ -> {:error, %{"instancesList" => []}} | |
| end | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment