Skip to content

Commit 4f0dd4f

Browse files
rrverma-amzkdaily
authored andcommitted
Add --tags parameter to upload-build command
1 parent 8b1b16e commit 4f0dd4f

4 files changed

Lines changed: 128 additions & 0 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"type": "enhancement",
3+
"category": "``gamelift``",
4+
"description": "Add ``--tags`` parameter to ``upload-build`` command."
5+
}

awscli/customizations/gamelift/uploadbuild.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,19 @@
2323
from awscli.customizations.s3.utils import human_readable_size
2424

2525

26+
def parse_tags(raw_tags_list):
27+
"""Parse tags from Key=Value format to GameLift API format."""
28+
tags_list = []
29+
if raw_tags_list:
30+
for tag in raw_tags_list:
31+
if '=' in tag:
32+
key, value = tag.split('=', 1)
33+
else:
34+
key, value = tag, ''
35+
tags_list.append({'Key': key, 'Value': value})
36+
return tags_list
37+
38+
2639
class UploadBuildCommand(BasicCommand):
2740
NAME = 'upload-build'
2841
DESCRIPTION = 'Upload a new build to AWS GameLift.'
@@ -53,6 +66,12 @@ class UploadBuildCommand(BasicCommand):
5366
'required': False,
5467
'help_text': 'The operating system the build runs on',
5568
},
69+
{
70+
'name': 'tags',
71+
'required': False,
72+
'nargs': '+',
73+
'help_text': 'Tags to assign to the build. Format: Key=Value',
74+
},
5675
]
5776

5877
def _run_main(self, args, parsed_globals):
@@ -80,6 +99,8 @@ def _run_main(self, args, parsed_globals):
8099
create_build_kwargs['OperatingSystem'] = args.operating_system
81100
if args.server_sdk_version:
82101
create_build_kwargs['ServerSdkVersion'] = args.server_sdk_version
102+
if args.tags:
103+
create_build_kwargs['Tags'] = parse_tags(args.tags)
83104
response = gamelift_client.create_build(**create_build_kwargs)
84105
build_id = response['Build']['BuildId']
85106

tests/functional/gamelift/test_upload_build.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,3 +264,60 @@ def test_upload_build_with_server_sdk_version_param(self):
264264
stdout,
265265
)
266266
self.assertIn('Build ID: myid', stdout)
267+
268+
def test_upload_build_with_tags_param(self):
269+
self.files.create_file('tmpfile', 'Some contents')
270+
271+
expected_tags = [
272+
{'Key': 'Key1', 'Value': 'Value1'},
273+
{'Key': 'Key2', 'Value': 'Value2'}
274+
]
275+
276+
cmdline = self.prefix
277+
cmdline += ' --name mybuild --build-version myversion'
278+
cmdline += ' --build-root %s' % self.files.rootdir
279+
cmdline += ' --tags'
280+
for tag in expected_tags:
281+
cmdline += ' %s=%s' % (tag['Key'], tag['Value'])
282+
283+
self.parsed_responses = [
284+
{'Build': {'BuildId': 'myid'}},
285+
{'StorageLocation': {
286+
'Bucket': 'mybucket',
287+
'Key': 'mykey'},
288+
'UploadCredentials': {
289+
'AccessKeyId': 'myaccesskey',
290+
'SecretAccessKey': 'mysecretkey',
291+
'SessionToken': 'mytoken'}},
292+
{}
293+
]
294+
295+
stdout, stderr, rc = self.run_cmd(cmdline, expected_rc=0)
296+
297+
# First the build is created.
298+
self.assertEqual(len(self.operations_called), 3)
299+
self.assertEqual(self.operations_called[0][0].name, 'CreateBuild')
300+
self.assertEqual(
301+
self.operations_called[0][1],
302+
{'Name': 'mybuild', 'Version': 'myversion',
303+
'Tags': expected_tags}
304+
)
305+
306+
# Second the credentials are requested.
307+
self.assertEqual(
308+
self.operations_called[1][0].name, 'RequestUploadCredentials')
309+
self.assertEqual(
310+
self.operations_called[1][1], {'BuildId': 'myid'})
311+
312+
# The build is then uploaded to S3.
313+
self.assertEqual(self.operations_called[2][0].name, 'PutObject')
314+
self.assertEqual(
315+
self.operations_called[2][1],
316+
{'Body': mock.ANY, 'Bucket': 'mybucket', 'Key': 'mykey'}
317+
)
318+
319+
# Check the output of the command.
320+
self.assertIn(
321+
'Successfully uploaded %s to AWS GameLift' % self.files.rootdir,
322+
stdout)
323+
self.assertIn('Build ID: myid', stdout)

tests/unit/customizations/gamelift/test_uploadbuild.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,51 @@ def test_upload_build_when_server_sdk_version_is_provided(self):
246246
ServerSdkVersion=server_sdk_version,
247247
)
248248

249+
def test_upload_build_when_tags_are_provided(self):
250+
self.file_creator.create_file('tmpfile', 'Some contents')
251+
self.args = [
252+
'--name', self.build_name, '--build-version', self.build_version,
253+
'--build-root', self.build_root,
254+
'--tags', 'Environment=Production', 'Team=GameDev'
255+
]
256+
self.cmd(self.args, self.global_args)
257+
258+
self.gamelift_client.create_build.assert_called_once_with(
259+
Name=self.build_name, Version=self.build_version,
260+
Tags=[
261+
{'Key': 'Environment', 'Value': 'Production'},
262+
{'Key': 'Team', 'Value': 'GameDev'}
263+
])
264+
265+
266+
class TestParseTags(unittest.TestCase):
267+
def test_parse_tags_with_key_value_pairs(self):
268+
result = parse_tags(['Key1=Value1', 'Key2=Value2'])
269+
self.assertEqual(result, [
270+
{'Key': 'Key1', 'Value': 'Value1'},
271+
{'Key': 'Key2', 'Value': 'Value2'}
272+
])
273+
274+
def test_parse_tags_with_empty_value(self):
275+
result = parse_tags(['Key1='])
276+
self.assertEqual(result, [{'Key': 'Key1', 'Value': ''}])
277+
278+
def test_parse_tags_without_equals(self):
279+
result = parse_tags(['Key1'])
280+
self.assertEqual(result, [{'Key': 'Key1', 'Value': ''}])
281+
282+
def test_parse_tags_with_equals_in_value(self):
283+
result = parse_tags(['Key1=Value=WithEquals'])
284+
self.assertEqual(result, [{'Key': 'Key1', 'Value': 'Value=WithEquals'}])
285+
286+
def test_parse_tags_with_none(self):
287+
result = parse_tags(None)
288+
self.assertEqual(result, [])
289+
290+
def test_parse_tags_with_empty_list(self):
291+
result = parse_tags([])
292+
self.assertEqual(result, [])
293+
249294

250295
class TestZipDirectory(unittest.TestCase):
251296
def setUp(self):

0 commit comments

Comments
 (0)