Skip to content

Commit 2aaef05

Browse files
committed
Support the option to add tags to newly created Detective graphs
1 parent ff55798 commit 2aaef05

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

enableDetective.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,14 @@ def _master_account_type(val: str, pattern: str = r'[0-9]{12}'):
4242
raise argparse.ArgumentTypeError
4343
return val
4444

45-
# Setup command line arguments
45+
class ParseCommaSeparatedKeyValuePairsAction(argparse.Action):
46+
def __call__(self, parser, namespace, values, option_string=None):
47+
setattr(namespace, self.dest, dict())
48+
for kv_pairs in values.split(","):
49+
key, value = kv_pairs.split('=', 1)
50+
getattr(namespace, self.dest)[key] = value
51+
52+
# Setup command line arguments
4653
parser = argparse.ArgumentParser(description=('Link AWS Accounts to central '
4754
'Detective Account.'))
4855
parser.add_argument('--master_account', type=_master_account_type,
@@ -57,6 +64,9 @@ def _master_account_type(val: str, pattern: str = r'[0-9]{12}'):
5764
parser.add_argument('--enabled_regions', type=str,
5865
help=('Regions to enable Detective. If not specified, '
5966
'all available regions enabled.'))
67+
parser.add_argument('--tags',
68+
action=ParseCommaSeparatedKeyValuePairsAction,
69+
help="Tags to be added to any newly enabled Detective graphs.")
6070
return parser.parse_args(args)
6171

6272

@@ -286,15 +296,15 @@ def accept_invitations(role: str, accounts: typing.Set[str], graph: str, region:
286296
except Exception as e:
287297
logging.exception(f'error accepting invitation {e.args}')
288298

289-
def enable_detective(d_client: botocore.client.BaseClient, region: str):
299+
def enable_detective(d_client: botocore.client.BaseClient, region: str, tags: dict = None):
290300
graphs = get_graphs(d_client)
291301

292302
if not graphs:
293303
confirm = input('Should Amazon Detective be enabled in {}? Enter [Y/N]: '.format(region))
294304

295305
if confirm == 'Y' or confirm == 'y':
296-
logging.info(f'Enabling Amazon Detective in {region}')
297-
graphs = [d_client.create_graph()['GraphArn']]
306+
logging.info(f'Enabling Amazon Detective in {region}' + (f'with tags {tags}' if tags else ''))
307+
graphs = [d_client.create_graph(Tags=tags)['GraphArn']]
298308
else:
299309
logging.info(f'Skipping {region}')
300310
return None
@@ -326,7 +336,7 @@ def enable_detective(d_client: botocore.client.BaseClient, region: str):
326336
for region in detective_regions:
327337
try:
328338
d_client = master_session.client('detective', region_name=region)
329-
graphs = enable_detective(d_client, region)
339+
graphs = enable_detective(d_client, region, args.tags)
330340

331341
if graphs is None:
332342
continue

tests/test_scripts.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ def test_setup_command_line_enableDetective():
2424

2525
args = enableDetective.setup_command_line(['--master_account', '000000000001', '--assume_role', 'detectiveAdmin', '--enabled_regions', 'us-east-1,us-east-2,us-west-2,ap-northeast-1,eu-west-1', '--input_file', 'accounts.csv'])
2626
assert args.master_account == '000000000001'
27+
assert args.tags == None
28+
29+
args = enableDetective.setup_command_line("--master_account 123456789012 --assume_role detectiveAdmin --input_file accounts.csv --tags TagKey1=TagValue1,TagKey2=TagValue2,TagKey3=TagValue3".split(" "))
30+
assert args.tags == {
31+
"TagKey1": "TagValue1",
32+
"TagKey2": "TagValue2",
33+
"TagKey3": "TagValue3",
34+
}
2735

2836
# Wrong master account
2937
# The internal function _master_account_type() should raise argparse.ArgumentTypeError, however this exception gets supressed by argparse, and SystemExit is raised instead.

0 commit comments

Comments
 (0)