5
5
6
6
import argparse
7
7
import json
8
+ import logging
8
9
import os
9
10
import subprocess
10
11
import sys
11
12
from functools import partial
13
+ from pathlib import Path
12
14
from urllib .parse import quote_plus
13
15
14
16
from pymongo import MongoClient
15
17
from pymongo .errors import OperationFailure
16
18
17
- HERE = os .path .abspath (os .path .dirname (__file__ ))
19
+ HERE = Path (__file__ ).absolute ().parent
20
+ LOGGER = logging .getLogger (__name__ )
21
+ logging .basicConfig (level = logging .INFO , format = "%(levelname)-8s %(message)s" )
18
22
19
23
20
24
def join (* parts ):
21
25
return os .path .join (* parts ).replace (os .sep , "/" )
22
26
23
27
24
- sys .path .insert (0 , join (HERE , "lib" ))
28
+ sys .path .insert (0 , str (HERE / "lib" ))
25
29
from aws_assign_instance_profile import _assign_instance_policy
26
30
from aws_assume_role import _assume_role
27
31
from aws_assume_web_role import _assume_role_with_web_identity
@@ -35,7 +39,7 @@ def join(*parts):
35
39
_USE_AWS_SECRETS = False
36
40
37
41
try :
38
- with open ( join ( HERE , "aws_e2e_setup.json" )) as fid :
42
+ with ( HERE / "aws_e2e_setup.json" ). open ( ) as fid :
39
43
CONFIG = json .load (fid )
40
44
get_key = partial (_get_key , uppercase = False )
41
45
except FileNotFoundError :
@@ -51,7 +55,7 @@ def run(args, env):
51
55
52
56
def create_user (user , kwargs ):
53
57
"""Create a user and verify access."""
54
- print ("Creating user" , user )
58
+ LOGGER . info ("Creating user %s " , user )
55
59
client = MongoClient (username = "bob" , password = "pwd123" )
56
60
db = client ["$external" ]
57
61
try :
@@ -76,7 +80,7 @@ def setup_assume_role():
76
80
77
81
role_name = CONFIG [get_key ("iam_auth_assume_role_name" )]
78
82
creds = _assume_role (role_name , quiet = True )
79
- with open ( join ( HERE , "creds.json" ), "w" ) as fid :
83
+ with ( HERE / "creds.json" ). open ( "w" ) as fid :
80
84
json .dump (creds , fid )
81
85
82
86
# Create the user.
@@ -87,6 +91,11 @@ def setup_assume_role():
87
91
authmechanismproperties = f"AWS_SESSION_TOKEN:{ token } " ,
88
92
)
89
93
create_user (ASSUMED_ROLE , kwargs )
94
+ return dict (
95
+ USER = kwargs ["username" ],
96
+ PASS = kwargs ["password" ],
97
+ SESSION_TOKEN = creds ["SessionToken" ],
98
+ )
90
99
91
100
92
101
def setup_ec2 ():
@@ -95,6 +104,7 @@ def setup_ec2():
95
104
os .environ .pop ("AWS_ACCESS_KEY_ID" , None )
96
105
os .environ .pop ("AWS_SECRET_ACCESS_KEY" , None )
97
106
create_user (AWS_ACCOUNT_ARN , dict ())
107
+ return dict ()
98
108
99
109
100
110
def setup_ecs ():
@@ -138,6 +148,8 @@ def setup_ecs():
138
148
# Run the test in a container
139
149
subprocess .check_call (["/bin/sh" , "-c" , run_test_command ], env = env )
140
150
151
+ return dict ()
152
+
141
153
142
154
def setup_regular ():
143
155
# Create the user.
@@ -147,6 +159,8 @@ def setup_regular():
147
159
)
148
160
create_user (CONFIG [get_key ("iam_auth_ecs_account_arn" )], kwargs )
149
161
162
+ return dict (USER = kwargs ["username" ], PASS = kwargs ["password" ])
163
+
150
164
151
165
def setup_web_identity ():
152
166
# Unassign the instance profile.
@@ -161,7 +175,7 @@ def setup_web_identity():
161
175
raise RuntimeError ("Request limit exceeded for AWS API" )
162
176
163
177
if ret != 0 :
164
- print ( "ret was" , ret )
178
+ LOGGER . debug ( "return code was %s " , ret )
165
179
raise RuntimeError (
166
180
"Failed to unassign an instance profile from the current machine"
167
181
)
@@ -186,10 +200,11 @@ def setup_web_identity():
186
200
187
201
# Assume the web role to get temp credentials.
188
202
os .environ ["AWS_WEB_IDENTITY_TOKEN_FILE" ] = token_file
189
- os .environ ["AWS_ROLE_ARN" ] = CONFIG [get_key ("iam_auth_assume_web_role_name" )]
203
+ role_arn = CONFIG [get_key ("iam_auth_assume_web_role_name" )]
204
+ os .environ ["AWS_ROLE_ARN" ] = role_arn
190
205
191
206
creds = _assume_role_with_web_identity (True )
192
- with open ( join ( HERE , "creds.json" ), "w" ) as fid :
207
+ with ( HERE / "creds.json" ). open ( "w" ) as fid :
193
208
json .dump (creds , fid )
194
209
195
210
# Create the user.
@@ -201,12 +216,39 @@ def setup_web_identity():
201
216
)
202
217
create_user (ASSUMED_WEB_ROLE , kwargs )
203
218
219
+ return dict (AWS_WEB_IDENTITY_TOKEN_FILE = token_file , AWS_ROLE_ARN = role_arn )
220
+
221
+
222
+ def handle_creds (creds : dict ):
223
+ if "USER" in creds :
224
+ USER = quote_plus (creds ["USER" ])
225
+ PASS = quote_plus (creds ["PASS" ])
226
+ MONGODB_URI = f"mongodb://{ USER } :{ PASS } @localhost"
227
+ else :
228
+ MONGODB_URI = "mongodb://localhost"
229
+ MONGODB_URI = f"{ MONGODB_URI } /aws?authMechanism=MONGODB-AWS"
230
+ if "SESSION_TOKEN" in creds :
231
+ SESSION_TOKEN = quote_plus (creds ["SESSION_TOKEN" ])
232
+ MONGODB_URI = (
233
+ f"{ MONGODB_URI } &authMechanismProperties=AWS_SESSION_TOKEN:{ SESSION_TOKEN } "
234
+ )
235
+ with (HERE / "test-env.sh" ).open ("w" , newline = "\n " ) as fid :
236
+ fid .write ("#!/usr/bin/env bash\n \n " )
237
+ fid .write ("set +x\n " )
238
+ for key , value in creds .items ():
239
+ if key in ["USER" , "PASS" , "SESSION_TOKEN" ]:
240
+ value = quote_plus (value ) # noqa: PLW2901
241
+ fid .write (f"export { key } ={ value } \n " )
242
+ fid .write (f"export MONGODB_URI={ MONGODB_URI } \n " )
243
+
204
244
205
245
def main ():
206
246
parser = argparse .ArgumentParser (description = "MONGODB-AWS tester." )
207
247
sub = parser .add_subparsers (title = "Tester subcommands" , help = "sub-command help" )
208
248
209
- run_assume_role_cmd = sub .add_parser ("assume-role" , help = "Assume role test" )
249
+ run_assume_role_cmd = sub .add_parser (
250
+ "assume-role" , aliases = ["session-creds" ], help = "Assume role test"
251
+ )
210
252
run_assume_role_cmd .set_defaults (func = setup_assume_role )
211
253
212
254
run_ec2_cmd = sub .add_parser ("ec2" , help = "EC2 test" )
@@ -215,14 +257,20 @@ def main():
215
257
run_ecs_cmd = sub .add_parser ("ecs" , help = "ECS test" )
216
258
run_ecs_cmd .set_defaults (func = setup_ecs )
217
259
218
- run_regular_cmd = sub .add_parser ("regular" , help = "Regular credentials test" )
260
+ run_regular_cmd = sub .add_parser (
261
+ "regular" , aliases = ["env-creds" ], help = "Regular credentials test"
262
+ )
219
263
run_regular_cmd .set_defaults (func = setup_regular )
220
264
221
265
run_web_identity_cmd = sub .add_parser ("web-identity" , help = "Web identity test" )
222
266
run_web_identity_cmd .set_defaults (func = setup_web_identity )
223
267
224
268
args = parser .parse_args ()
225
- args .func ()
269
+ func_name = args .func .__name__ .replace ("setup_" , "" )
270
+ LOGGER .info ("Running aws_tester.py with %s..." , func_name )
271
+ creds = args .func ()
272
+ handle_creds (creds )
273
+ LOGGER .info ("Running aws_tester.py with %s... done." , func_name )
226
274
227
275
228
276
if __name__ == "__main__" :
0 commit comments