Skip to content

Commit 630837c

Browse files
authored
Merge pull request #221 from itamm15/chore/add-support-for-endpoint-env
chore: add support for endpoint env
2 parents 84a0aff + 43c42fa commit 630837c

File tree

2 files changed

+167
-18
lines changed

2 files changed

+167
-18
lines changed

lib/aws/client.ex

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,16 @@ defmodule AWS.Client do
5252
Check `put_endpoint/2` for more details.
5353
"""
5454
@type endpoint_config :: binary() | {:keep_prefixes, binary()} | (map() -> binary()) | nil
55+
@type access_key_id :: binary()
56+
@type secret_access_key :: binary()
57+
@type token :: binary() | nil
58+
@type region :: binary()
5559

5660
@type t :: %__MODULE__{
57-
access_key_id: binary() | nil,
58-
secret_access_key: binary() | nil,
59-
session_token: binary() | nil,
60-
region: binary() | nil,
61+
access_key_id: access_key_id() | nil,
62+
secret_access_key: secret_access_key() | nil,
63+
session_token: token() | nil,
64+
region: region() | nil,
6165
service: binary() | nil,
6266
endpoint: endpoint_config(),
6367
proto: binary(),
@@ -72,6 +76,7 @@ defmodule AWS.Client do
7276
@aws_access_key_id "AWS_ACCESS_KEY_ID"
7377
@aws_secret_access_key "AWS_SECRET_ACCESS_KEY"
7478
@aws_session_token "AWS_SESSION_TOKEN"
79+
@aws_endpoint "AWS_ENDPOINT"
7580
@aws_default_region "AWS_DEFAULT_REGION"
7681

7782
@doc """
@@ -82,6 +87,17 @@ defmodule AWS.Client do
8287
"""
8388
def default_endpoint, do: @aws_default_endpoint
8489

90+
@spec create() :: t()
91+
@spec create(region()) :: t()
92+
@spec create(access_key_id(), secret_access_key(), region()) :: t()
93+
@spec create(access_key_id(), secret_access_key(), token(), region()) :: t()
94+
@spec create(
95+
access_key_id(),
96+
secret_access_key(),
97+
token() | nil,
98+
region(),
99+
endpoint_config() | nil
100+
) :: t()
85101
def create() do
86102
case System.get_env(@aws_default_region) do
87103
nil -> raise RuntimeError, "missing default region"
@@ -91,35 +107,33 @@ defmodule AWS.Client do
91107

92108
def create(region) do
93109
case {System.get_env(@aws_access_key_id), System.get_env(@aws_secret_access_key),
94-
System.get_env(@aws_session_token)} do
95-
{nil, _, _} ->
110+
System.get_env(@aws_session_token), System.get_env(@aws_endpoint)} do
111+
{nil, _secret_key, _session_token, _endpoint} ->
96112
raise RuntimeError, "missing access key id"
97113

98-
{_, nil, _} ->
114+
{_access_key, nil, _session_token, _endpoint} ->
99115
raise RuntimeError, "missing secret access key"
100116

101-
{access_key_id, secret_access_key, nil} ->
102-
create(access_key_id, secret_access_key, region)
103-
104-
{access_key_id, secret_access_key, token} ->
105-
create(access_key_id, secret_access_key, token, region)
117+
{access_key_id, secret_access_key, token, endpoint} ->
118+
create(access_key_id, secret_access_key, token, region, endpoint)
106119
end
107120
end
108121

109122
def create(access_key_id, secret_access_key, region) do
110-
%AWS.Client{
111-
access_key_id: access_key_id,
112-
secret_access_key: secret_access_key,
113-
region: region
114-
}
123+
create(access_key_id, secret_access_key, nil, region, nil)
115124
end
116125

117126
def create(access_key_id, secret_access_key, token, region) do
127+
create(access_key_id, secret_access_key, token, region, nil)
128+
end
129+
130+
def create(access_key_id, secret_access_key, token, region, endpoint) do
118131
%AWS.Client{
119132
access_key_id: access_key_id,
120133
secret_access_key: secret_access_key,
121134
session_token: token,
122-
region: region
135+
region: region,
136+
endpoint: endpoint
123137
}
124138
end
125139

test/aws/client_test.exs

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,5 +122,140 @@ defmodule AWS.ClientTest do
122122
end
123123
end
124124

125+
describe "create/n" do
126+
setup :prune_envs
127+
128+
test "create/0 reads region from AWS_DEFAULT_REGION and builds client" do
129+
System.put_env("AWS_ACCESS_KEY_ID", "AK")
130+
System.put_env("AWS_SECRET_ACCESS_KEY", "SK")
131+
System.put_env("AWS_DEFAULT_REGION", "us-east-1")
132+
133+
client = AWS.Client.create()
134+
135+
assert %AWS.Client{
136+
access_key_id: "AK",
137+
secret_access_key: "SK",
138+
session_token: nil,
139+
region: "us-east-1",
140+
endpoint: nil
141+
} == client
142+
end
143+
144+
test "create/0 raises when AWS_DEFAULT_REGION missing" do
145+
System.put_env("AWS_ACCESS_KEY_ID", "AK")
146+
System.put_env("AWS_SECRET_ACCESS_KEY", "SK")
147+
148+
assert_raise RuntimeError, "missing default region", fn ->
149+
AWS.Client.create()
150+
end
151+
end
152+
153+
test "create/1 reads credentials, token and endpoint from env" do
154+
System.put_env("AWS_ACCESS_KEY_ID", "AK")
155+
System.put_env("AWS_SECRET_ACCESS_KEY", "SK")
156+
System.put_env("AWS_SESSION_TOKEN", "TOK")
157+
System.put_env("AWS_ENDPOINT", "example.com")
158+
159+
client = AWS.Client.create("us-west-2")
160+
161+
assert %AWS.Client{
162+
access_key_id: "AK",
163+
secret_access_key: "SK",
164+
session_token: "TOK",
165+
region: "us-west-2",
166+
endpoint: "example.com"
167+
} == client
168+
end
169+
170+
test "create/1 without token uses nil and endpoint from env" do
171+
System.put_env("AWS_ACCESS_KEY_ID", "AK")
172+
System.put_env("AWS_SECRET_ACCESS_KEY", "SK")
173+
System.put_env("AWS_ENDPOINT", "example.com")
174+
175+
client = AWS.Client.create("eu-west-1")
176+
177+
assert %AWS.Client{
178+
access_key_id: "AK",
179+
secret_access_key: "SK",
180+
session_token: nil,
181+
region: "eu-west-1",
182+
endpoint: "example.com"
183+
} == client
184+
end
185+
186+
test "create/1 raises when access key is missing" do
187+
System.put_env("AWS_SECRET_ACCESS_KEY", "SK")
188+
189+
assert_raise RuntimeError, "missing access key id", fn ->
190+
AWS.Client.create("us-east-2")
191+
end
192+
end
193+
194+
test "create/1 raises when secret access key is missing" do
195+
System.put_env("AWS_ACCESS_KEY_ID", "AK")
196+
197+
assert_raise RuntimeError, "missing secret access key", fn ->
198+
AWS.Client.create("us-east-2")
199+
end
200+
end
201+
202+
test "create/3 sets fields without token or endpoint" do
203+
client = AWS.Client.create("AK", "SK", "eu-north-1")
204+
205+
assert %AWS.Client{
206+
access_key_id: "AK",
207+
secret_access_key: "SK",
208+
session_token: nil,
209+
region: "eu-north-1",
210+
endpoint: nil
211+
} == client
212+
end
213+
214+
test "create/4 sets token and leaves endpoint nil" do
215+
client = AWS.Client.create("AK", "SK", "TOKEN", "ap-south-1")
216+
217+
assert %AWS.Client{
218+
access_key_id: "AK",
219+
secret_access_key: "SK",
220+
session_token: "TOKEN",
221+
region: "ap-south-1",
222+
endpoint: nil
223+
} == client
224+
end
225+
226+
test "create/5 sets token and endpoint" do
227+
client = AWS.Client.create("AK", "SK", "TOKEN", "sa-east-1", "custom.local")
228+
229+
assert %AWS.Client{
230+
access_key_id: "AK",
231+
secret_access_key: "SK",
232+
session_token: "TOKEN",
233+
region: "sa-east-1",
234+
endpoint: "custom.local"
235+
} == client
236+
end
237+
238+
test "create/3 equals create/5 with nil token and endpoint" do
239+
c3 = AWS.Client.create("AK", "SK", "us-east-1")
240+
c5 = AWS.Client.create("AK", "SK", nil, "us-east-1", nil)
241+
assert c3 == c5
242+
end
243+
end
244+
245+
defp prune_envs(_context) do
246+
keys =
247+
[
248+
"AWS_ACCESS_KEY_ID",
249+
"AWS_SECRET_ACCESS_KEY",
250+
"AWS_SESSION_TOKEN",
251+
"AWS_ENDPOINT",
252+
"AWS_DEFAULT_REGION"
253+
]
254+
255+
on_exit(fn -> Enum.each(keys, &System.delete_env/1) end)
256+
257+
:ok
258+
end
259+
125260
defp url(bypass), do: "http://localhost:#{bypass.port}/"
126261
end

0 commit comments

Comments
 (0)