Skip to content

Commit

Permalink
Merge pull request #15 from nicksanford/add-ex-aws
Browse files Browse the repository at this point in the history
Add ex_aws
  • Loading branch information
nicksanford authored Feb 7, 2019
2 parents e916d1f + 5fccf81 commit 530c68a
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 272 deletions.
2 changes: 0 additions & 2 deletions config/config.exs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,5 @@ use Mix.Config
config :peerage, via: Peerage.Via.Ec2

config :peerage_ec2,
aws_access_key_id: "example",
aws_secret_access_key: "key",
tags: [{:cluster, "cluster"}, {:service, "service"}],
timeout: 1000
56 changes: 28 additions & 28 deletions lib/peerage/via/ec2.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ defmodule Peerage.Via.Ec2 do
"""
@behaviour Peerage.Provider

alias Peerage.Via.Ec2.{SignedUrl, Xml}
alias Peerage.Via.Ec2.Xml
require Logger

@doc """
Periodically polls the metadata and EC2 API's for other nodes in the same "cluster."
Expand All @@ -24,8 +25,12 @@ defmodule Peerage.Via.Ec2 do
metadata_api = 'http://169.254.169.254/latest/meta-data/instance-id'

case request(metadata_api) do
{:ok, {{_, 200, _}, _headers, body}} -> to_string(body)
_ -> :error
{:ok, {{_, 200, _}, _headers, body}} ->
to_string(body)

error ->
Logger.error("Peerage.Via.Ec2 hit error in fetch_instance_id: #{inspect(error)}")
:error
end
end

Expand All @@ -36,22 +41,19 @@ defmodule Peerage.Via.Ec2 do
# we'll peform a signed/authenticated request to Amazon's EC2
# DescribeInstances API to retrieve the name of the `cluster`
# of instances we've tagged.
request_uri =
%{}
|> Map.put("Filter.1.Name", "instance-id")
|> Map.put("Filter.1.Value.1", instance_id)
|> describe_endpoint()
|> SignedUrl.build()
|> to_charlist()

case request(request_uri) do
{:ok, {{_, 200, _}, _headers, body}} ->
query = ExAws.EC2.describe_instances(filters: ["instance-id": [instance_id]])
response = ExAws.request(query)

case response do
{:ok, %{status_code: 200, body: body}} ->
body
|> to_charlist
|> Xml.parse()
|> Xml.first("//tagSet/item[key='#{tag_name(:cluster)}']/value")
|> Xml.text()

_ ->
error ->
Logger.error("Peerage.Via.Ec2 hit error in fetch_cluster_name: #{inspect(error)}")
:error
end
end
Expand All @@ -68,27 +70,25 @@ defmodule Peerage.Via.Ec2 do
# a running EC2 service.
#
# AWS Documentation: http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_InstanceState.html
request_uri =
%{}
|> Map.put("Filter.1.Name", "instance-state-code")
|> Map.put("Filter.1.Value.1", "16")
|> Map.put("Filter.2.Name", "tag:#{tag_name(:cluster)}")
|> Map.put("Filter.2.Value.1", cluster_name)
|> describe_endpoint()
|> SignedUrl.build()
|> to_charlist()

case request(request_uri) do
{:ok, {{_, 200, _}, _headers, body}} ->
instances = Xml.parse(body)
query =
ExAws.EC2.describe_instances(
filters: ["instance-state-code": ["16"], "tag:#{tag_name(:cluster)}": [cluster_name]]
)

response = ExAws.request(query)

case response do
{:ok, %{status_code: 200, body: body}} ->
instances = body |> to_charlist |> Xml.parse()

Enum.map(Xml.all(instances, "//instancesSet/item"), fn node ->
host = Xml.first(node, "//privateIpAddress") |> Xml.text()
service = Xml.first(node, "//tagSet/item[key='service']/value") |> Xml.text()
%{host: host, name: service}
end)

_ ->
error ->
Logger.error("Peerage.Via.Ec2 hit error in fetch_running_services: #{inspect(error)}")
:error
end
end
Expand Down
160 changes: 0 additions & 160 deletions lib/peerage/via/ec2/signed_url.ex

This file was deleted.

6 changes: 5 additions & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Peerage.Via.Ec2.Mixfile do
def project do
[
app: :peerage_ec2,
version: "1.2.0",
version: "2.0.0",
elixir: "~> 1.5",
start_permanent: Mix.env() == :prod,
deps: deps(),
Expand All @@ -30,6 +30,10 @@ defmodule Peerage.Via.Ec2.Mixfile do
# Easy Elixir clusters, pluggable discovery
[
{:peerage, "~> 1.0"},
# Deps for ex_aws - an aws client
{:ex_aws, "~> 1.1"},
{:hackney, "~> 1.9"},
{:sweet_xml, "~> 0.6"},
# ExDoc is a documentation generation tool for Elixir
{:ex_doc, "~> 0.18.1", only: :dev},
# A mocking library for the Elixir language
Expand Down
20 changes: 16 additions & 4 deletions mix.lock
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
%{"deferred_config": {:hex, :deferred_config, "0.1.1", "ec912e9ee3c99b90a8d4bdec8fbd15309f4bd6729f30789e0ff6f595d06bbce5", [:mix], [], "hexpm"},
%{
"certifi": {:hex, :certifi, "2.4.2", "75424ff0f3baaccfd34b1214184b6ef616d89e420b258bb0a5ea7d7bc628f7f0", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm"},
"deferred_config": {:hex, :deferred_config, "0.1.1", "ec912e9ee3c99b90a8d4bdec8fbd15309f4bd6729f30789e0ff6f595d06bbce5", [:mix], [], "hexpm"},
"earmark": {:hex, :earmark, "1.2.3", "206eb2e2ac1a794aa5256f3982de7a76bf4579ff91cb28d0e17ea2c9491e46a4", [:mix], [], "hexpm"},
"ex_aws": {:hex, :ex_aws, "1.1.5", "789173f385934f7e27f9ef36692a6c5f7dde06fd6e6f64d4cd92cda613d34bf9", [:mix], [{:configparser_ex, "~> 0.2.1", [hex: :configparser_ex, repo: "hexpm", optional: true]}, {:hackney, "1.6.3 or 1.6.5 or 1.7.1 or 1.8.6 or ~> 1.9", [hex: :hackney, repo: "hexpm", optional: true]}, {:jsx, "~> 2.8", [hex: :jsx, repo: "hexpm", optional: true]}, {:poison, ">= 1.2.0", [hex: :poison, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.6", [hex: :sweet_xml, repo: "hexpm", optional: true]}, {:xml_builder, "~> 0.1.0", [hex: :xml_builder, repo: "hexpm", optional: true]}], "hexpm"},
"ex_doc": {:hex, :ex_doc, "0.18.1", "37c69d2ef62f24928c1f4fdc7c724ea04aecfdf500c4329185f8e3649c915baf", [:mix], [{:earmark, "~> 1.1", [hex: :earmark, repo: "hexpm", optional: false]}], "hexpm"},
"meck": {:hex, :meck, "0.8.8", "eeb3efe811d4346e1a7f65b2738abc2ad73cbe1a2c91b5dd909bac2ea0414fa6", [], [], "hexpm"},
"mock": {:hex, :mock, "0.2.1", "bfdba786903e77f9c18772dee472d020ceb8ef000783e737725a4c8f54ad28ec", [], [{:meck, "~> 0.8.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm"},
"peerage": {:hex, :peerage, "1.0.2", "43417cae92ca93fa3065194f5c6cb0b3df2214b2009128e470482563402cc9e5", [:mix], [{:deferred_config, "~> 0.1.1", [hex: :deferred_config, repo: "hexpm", optional: false]}], "hexpm"}}
"hackney": {:hex, :hackney, "1.15.0", "287a5d2304d516f63e56c469511c42b016423bcb167e61b611f6bad47e3ca60e", [:rebar3], [{:certifi, "2.4.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "1.0.2", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.4", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm"},
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm"},
"meck": {:hex, :meck, "0.8.8", "eeb3efe811d4346e1a7f65b2738abc2ad73cbe1a2c91b5dd909bac2ea0414fa6", [:rebar3], [], "hexpm"},
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm"},
"mimerl": {:hex, :mimerl, "1.0.2", "993f9b0e084083405ed8252b99460c4f0563e41729ab42d9074fd5e52439be88", [:rebar3], [], "hexpm"},
"mock": {:hex, :mock, "0.2.1", "bfdba786903e77f9c18772dee472d020ceb8ef000783e737725a4c8f54ad28ec", [:mix], [{:meck, "~> 0.8.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm"},
"parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"},
"peerage": {:hex, :peerage, "1.0.2", "43417cae92ca93fa3065194f5c6cb0b3df2214b2009128e470482563402cc9e5", [:mix], [{:deferred_config, "~> 0.1.1", [hex: :deferred_config, repo: "hexpm", optional: false]}], "hexpm"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.4", "f0eafff810d2041e93f915ef59899c923f4568f4585904d010387ed74988e77b", [:make, :mix, :rebar3], [], "hexpm"},
"sweet_xml": {:hex, :sweet_xml, "0.6.5", "dd9cde443212b505d1b5f9758feb2000e66a14d3c449f04c572f3048c66e6697", [:mix], [], "hexpm"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm"},
}
50 changes: 0 additions & 50 deletions test/peerage/via/ec2/signed_url_test.exs

This file was deleted.

Loading

0 comments on commit 530c68a

Please sign in to comment.