Skip to content

Commit cf90abd

Browse files
authored
Revert "PYTHON-5157 Convert aws tests to use python scripts" (#623)
1 parent 1bc841f commit cf90abd

File tree

6 files changed

+111
-95
lines changed

6 files changed

+111
-95
lines changed

.evergreen/auth_aws/aws_setup.sh

Lines changed: 88 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,108 @@
66
# . ./aws_setup.sh <test-name>
77
#
88
# Handles AWS credential setup and exports relevant environment variables.
9-
# Sets up secrets if they have not already been set up.
9+
# Assumes you have already set up secrets.
1010
set -eu
1111

1212
SCRIPT_DIR=$(dirname ${BASH_SOURCE[0]})
1313
. $SCRIPT_DIR/../handle-paths.sh
1414
pushd $SCRIPT_DIR
1515

16+
# Ensure that secrets have already been set up.
17+
if [ ! -f "secrets-export.sh" ]; then
18+
echo "ERROR: please run './setup-secrets.sh' in this folder"
19+
fi
20+
1621
# Activate the venv and source the secrets file.
1722
. ./activate-authawsvenv.sh
23+
source secrets-export.sh
1824

19-
# Ensure that secrets have already been set up.
20-
if [ ! -f "./secrets-export.sh" ]; then
21-
bash ./setup-secrets.sh
25+
if [ "$1" == "web-identity" ]; then
26+
export AWS_WEB_IDENTITY_TOKEN_FILE="./token_file.txt"
27+
fi
28+
29+
# Handle the test setup if not using env variables.
30+
case $1 in
31+
session-creds)
32+
echo "Running aws_tester.py with assume-role"
33+
# Set up credentials with assume-role to create user in MongoDB and write AWS credentials.
34+
python aws_tester.py "assume-role"
35+
;;
36+
env-creds)
37+
echo "Running aws_tester.py with regular"
38+
# Set up credentials with regular to create user in MongoDB and write AWS credentials.
39+
python aws_tester.py "regular"
40+
;;
41+
*)
42+
python aws_tester.py "$1"
43+
;;
44+
esac
45+
46+
# If this is ecs, exit now.
47+
if [ "$1" == "ecs" ]; then
48+
exit 0
2249
fi
2350

24-
# Remove any AWS creds that might be set in the parent env.
25-
unset AWS_ACCESS_KEY_ID
26-
unset AWS_SECRET_ACCESS_KEY
27-
unset AWS_SESSION_TOKEN
51+
# Convenience functions.
52+
urlencode () {
53+
python -c "import sys, urllib.parse as ulp; sys.stdout.write(ulp.quote_plus(sys.argv[1]))" "$1"
54+
}
2855

29-
source ./secrets-export.sh
56+
jsonkey () {
57+
python -c "import json,sys;sys.stdout.write(json.load(sys.stdin)[sys.argv[1]])" "$1" < ./creds.json
58+
}
3059

31-
if [ -f $SCRIPT_DIR/test-env.sh ]; then
32-
rm $SCRIPT_DIR/test-env.sh
60+
# Handle extra vars based on auth type.
61+
USER=""
62+
case $1 in
63+
assume-role)
64+
USER=$(jsonkey AccessKeyId)
65+
USER=$(urlencode "$USER")
66+
PASS=$(jsonkey SecretAccessKey)
67+
PASS=$(urlencode "$PASS")
68+
SESSION_TOKEN=$(jsonkey SessionToken)
69+
SESSION_TOKEN=$(urlencode "$SESSION_TOKEN")
70+
;;
71+
72+
session-creds)
73+
AWS_ACCESS_KEY_ID=$(jsonkey AccessKeyId)
74+
AWS_SECRET_ACCESS_KEY=$(jsonkey SecretAccessKey)
75+
AWS_SESSION_TOKEN=$(jsonkey SessionToken)
76+
77+
export AWS_ACCESS_KEY_ID
78+
export AWS_SECRET_ACCESS_KEY
79+
export AWS_SESSION_TOKEN
80+
;;
81+
82+
web-identity)
83+
export AWS_ROLE_ARN=$IAM_AUTH_ASSUME_WEB_ROLE_NAME
84+
export AWS_WEB_IDENTITY_TOKEN_FILE="$SCRIPT_DIR/$AWS_WEB_IDENTITY_TOKEN_FILE"
85+
;;
86+
87+
regular)
88+
USER=$(urlencode "${IAM_AUTH_ECS_ACCOUNT}")
89+
PASS=$(urlencode "${IAM_AUTH_ECS_SECRET_ACCESS_KEY}")
90+
;;
91+
92+
env-creds)
93+
export AWS_ACCESS_KEY_ID=$IAM_AUTH_ECS_ACCOUNT
94+
export AWS_SECRET_ACCESS_KEY=$IAM_AUTH_ECS_SECRET_ACCESS_KEY
95+
;;
96+
esac
97+
98+
# Handle the URI.
99+
if [ -n "$USER" ]; then
100+
MONGODB_URI="mongodb://$USER:$PASS@localhost"
101+
export USER
102+
export PASS
103+
else
104+
MONGODB_URI="mongodb://localhost"
105+
fi
106+
MONGODB_URI="${MONGODB_URI}/aws?authMechanism=MONGODB-AWS"
107+
if [[ -n ${SESSION_TOKEN:-} ]]; then
108+
MONGODB_URI="${MONGODB_URI}&authMechanismProperties=AWS_SESSION_TOKEN:${SESSION_TOKEN}"
33109
fi
34110

35-
python aws_tester.py "$1"
36-
source $SCRIPT_DIR/test-env.sh
111+
export MONGODB_URI="$MONGODB_URI"
37112

38113
popd

.evergreen/auth_aws/aws_tester.py

Lines changed: 11 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,23 @@
55

66
import argparse
77
import json
8-
import logging
98
import os
109
import subprocess
1110
import sys
1211
from functools import partial
13-
from pathlib import Path
1412
from urllib.parse import quote_plus
1513

1614
from pymongo import MongoClient
1715
from pymongo.errors import OperationFailure
1816

19-
HERE = Path(__file__).absolute().parent
20-
LOGGER = logging.getLogger(__name__)
21-
logging.basicConfig(level=logging.INFO, format="%(levelname)-8s %(message)s")
17+
HERE = os.path.abspath(os.path.dirname(__file__))
2218

2319

2420
def join(*parts):
2521
return os.path.join(*parts).replace(os.sep, "/")
2622

2723

28-
sys.path.insert(0, str(HERE / "lib"))
24+
sys.path.insert(0, join(HERE, "lib"))
2925
from aws_assign_instance_profile import _assign_instance_policy
3026
from aws_assume_role import _assume_role
3127
from aws_assume_web_role import _assume_role_with_web_identity
@@ -39,7 +35,7 @@ def join(*parts):
3935
_USE_AWS_SECRETS = False
4036

4137
try:
42-
with (HERE / "aws_e2e_setup.json").open() as fid:
38+
with open(join(HERE, "aws_e2e_setup.json")) as fid:
4339
CONFIG = json.load(fid)
4440
get_key = partial(_get_key, uppercase=False)
4541
except FileNotFoundError:
@@ -55,7 +51,7 @@ def run(args, env):
5551

5652
def create_user(user, kwargs):
5753
"""Create a user and verify access."""
58-
LOGGER.info("Creating user %s", user)
54+
print("Creating user", user)
5955
client = MongoClient(username="bob", password="pwd123")
6056
db = client["$external"]
6157
try:
@@ -80,7 +76,7 @@ def setup_assume_role():
8076

8177
role_name = CONFIG[get_key("iam_auth_assume_role_name")]
8278
creds = _assume_role(role_name, quiet=True)
83-
with (HERE / "creds.json").open("w") as fid:
79+
with open(join(HERE, "creds.json"), "w") as fid:
8480
json.dump(creds, fid)
8581

8682
# Create the user.
@@ -91,11 +87,6 @@ def setup_assume_role():
9187
authmechanismproperties=f"AWS_SESSION_TOKEN:{token}",
9288
)
9389
create_user(ASSUMED_ROLE, kwargs)
94-
return dict(
95-
USER=kwargs["username"],
96-
PASS=kwargs["password"],
97-
SESSION_TOKEN=creds["SessionToken"],
98-
)
9990

10091

10192
def setup_ec2():
@@ -104,7 +95,6 @@ def setup_ec2():
10495
os.environ.pop("AWS_ACCESS_KEY_ID", None)
10596
os.environ.pop("AWS_SECRET_ACCESS_KEY", None)
10697
create_user(AWS_ACCOUNT_ARN, dict())
107-
return dict()
10898

10999

110100
def setup_ecs():
@@ -148,8 +138,6 @@ def setup_ecs():
148138
# Run the test in a container
149139
subprocess.check_call(["/bin/sh", "-c", run_test_command], env=env)
150140

151-
return dict()
152-
153141

154142
def setup_regular():
155143
# Create the user.
@@ -159,8 +147,6 @@ def setup_regular():
159147
)
160148
create_user(CONFIG[get_key("iam_auth_ecs_account_arn")], kwargs)
161149

162-
return dict(USER=kwargs["username"], PASS=kwargs["password"])
163-
164150

165151
def setup_web_identity():
166152
# Unassign the instance profile.
@@ -175,7 +161,7 @@ def setup_web_identity():
175161
raise RuntimeError("Request limit exceeded for AWS API")
176162

177163
if ret != 0:
178-
LOGGER.debug("return code was %s", ret)
164+
print("ret was", ret)
179165
raise RuntimeError(
180166
"Failed to unassign an instance profile from the current machine"
181167
)
@@ -200,11 +186,10 @@ def setup_web_identity():
200186

201187
# Assume the web role to get temp credentials.
202188
os.environ["AWS_WEB_IDENTITY_TOKEN_FILE"] = token_file
203-
role_arn = CONFIG[get_key("iam_auth_assume_web_role_name")]
204-
os.environ["AWS_ROLE_ARN"] = role_arn
189+
os.environ["AWS_ROLE_ARN"] = CONFIG[get_key("iam_auth_assume_web_role_name")]
205190

206191
creds = _assume_role_with_web_identity(True)
207-
with (HERE / "creds.json").open("w") as fid:
192+
with open(join(HERE, "creds.json"), "w") as fid:
208193
json.dump(creds, fid)
209194

210195
# Create the user.
@@ -216,39 +201,12 @@ def setup_web_identity():
216201
)
217202
create_user(ASSUMED_WEB_ROLE, kwargs)
218203

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-
244204

245205
def main():
246206
parser = argparse.ArgumentParser(description="MONGODB-AWS tester.")
247207
sub = parser.add_subparsers(title="Tester subcommands", help="sub-command help")
248208

249-
run_assume_role_cmd = sub.add_parser(
250-
"assume-role", aliases=["session-creds"], help="Assume role test"
251-
)
209+
run_assume_role_cmd = sub.add_parser("assume-role", help="Assume role test")
252210
run_assume_role_cmd.set_defaults(func=setup_assume_role)
253211

254212
run_ec2_cmd = sub.add_parser("ec2", help="EC2 test")
@@ -257,20 +215,14 @@ def main():
257215
run_ecs_cmd = sub.add_parser("ecs", help="ECS test")
258216
run_ecs_cmd.set_defaults(func=setup_ecs)
259217

260-
run_regular_cmd = sub.add_parser(
261-
"regular", aliases=["env-creds"], help="Regular credentials test"
262-
)
218+
run_regular_cmd = sub.add_parser("regular", help="Regular credentials test")
263219
run_regular_cmd.set_defaults(func=setup_regular)
264220

265221
run_web_identity_cmd = sub.add_parser("web-identity", help="Web identity test")
266222
run_web_identity_cmd.set_defaults(func=setup_web_identity)
267223

268224
args = parser.parse_args()
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)
225+
args.func()
274226

275227

276228
if __name__ == "__main__":

.evergreen/auth_aws/lib/aws_assign_instance_profile.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,23 @@ def _get_local_instance_id():
3333
def _has_instance_profile():
3434
base_url = "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
3535
try:
36-
LOGGER.info("Reading: " + base_url)
36+
print("Reading: " + base_url)
3737
iam_role = urllib.request.urlopen(base_url).read().decode()
3838
except urllib.error.HTTPError as e:
39+
print(e)
3940
if e.code == 404:
4041
return False
41-
LOGGER.error(e)
4242
raise e
4343

4444
try:
4545
url = base_url + iam_role
46-
LOGGER.info("Reading: " + url)
46+
print("Reading: " + url)
4747
_ = urllib.request.urlopen(url)
48-
LOGGER.info("Assigned " + iam_role)
48+
print("Assigned " + iam_role)
4949
except urllib.error.HTTPError as e:
50+
print(e)
5051
if e.code == 404:
5152
return False
52-
LOGGER.error(e)
5353
raise e
5454

5555
return True
@@ -85,7 +85,7 @@ def _handle_config():
8585
)
8686
return CONFIG[get_key("iam_auth_ec2_instance_profile")]
8787
except Exception as e:
88-
LOGGER.error(e)
88+
print(e)
8989
return ""
9090

9191

@@ -94,7 +94,7 @@ def _handle_config():
9494

9595
def _assign_instance_policy(iam_instance_arn=DEFAULT_ARN):
9696
if _has_instance_profile():
97-
LOGGER.warning(
97+
print(
9898
"IMPORTANT: Found machine already has instance profile, skipping the assignment"
9999
)
100100
return
@@ -112,14 +112,14 @@ def _assign_instance_policy(iam_instance_arn=DEFAULT_ARN):
112112
InstanceId=instance_id,
113113
)
114114

115-
LOGGER.debug(response)
115+
print(response)
116116

117117
# Wait for the instance profile to be assigned by polling the local instance metadata service
118118
_wait_instance_profile()
119119

120120
except botocore.exceptions.ClientError as ce:
121121
if ce.response["Error"]["Code"] == "RequestLimitExceeded":
122-
LOGGER.warning("WARNING: RequestLimitExceeded, exiting with error code 2")
122+
print("WARNING: RequestLimitExceeded, exiting with error code 2")
123123
sys.exit(2)
124124
raise
125125

0 commit comments

Comments
 (0)