def test_populate_add_list__tag_contains_multiple_equal_to_signs__key_ends_before_first_equal_to( self): expected_add_list = [{'Key': 'key', 'Value': '10=value1'}] taglist = TagList(self.current_list) tag_keys_to_create = '"key=10=value1"' taglist.populate_add_list(tag_keys_to_create) self.assertEqual(expected_add_list, taglist.additions)
def test_populate_add_list__trailing_and_leading_whitespaces_are_stripped( self): expected_add_list = [{'Key': 'key10', 'Value': 'value10'}] taglist = TagList(self.current_list) tag_keys_to_create = ' key10=value10 ' taglist.populate_add_list(tag_keys_to_create) self.assertEqual(expected_add_list, taglist.additions)
def test_populate_add_list__key_value_pair_is_enclosed_within_double_quotes__legal_string( self): expected_add_list = [{'Key': 'key10', 'Value': 'value1'}] taglist = TagList(self.current_list) tag_keys_to_create = '"key10=value1"' taglist.populate_add_list(tag_keys_to_create) self.assertEqual(expected_add_list, taglist.additions)
def get_and_validate_tags(addition_string): if not addition_string: return [] taglist = TagList([]) taglist.populate_add_list(addition_string) validate_additions(taglist) return taglist.additions
def test_populate_delete_list__trailing_and_leading_whitespaces_are_stripped( self): expected_delete_list = ['key10'] taglist = TagList(self.current_list) tag_keys_to_delete = ' key10 ' taglist.populate_delete_list(tag_keys_to_delete) self.assertEqual(expected_delete_list, taglist.deletions)
def get_and_validate_tags(addition_string): if not addition_string: return [] taglist = TagList([]) taglist.populate_add_list(addition_string) tagops.validate_additions(taglist) return taglist.additions
def test_populate_update_list__update_one_existing_tag(self): taglist = TagList(self.current_list) update_string = 'key1=value3' taglist.populate_update_list(update_string) expected_update_list = [{'Key': 'key1', 'Value': 'value3'}] self.assertEqual(expected_update_list, taglist.updates)
def test_populate_add_list__add_one_new_tag__key_does_not_preexist__successfully_adds( self): taglist = TagList(self.current_list) addition_string = 'myuniquekey=value3' taglist.populate_add_list(addition_string) expected_additions_list = [{'Key': 'myuniquekey', 'Value': 'value3'}] self.assertEqual(expected_additions_list, taglist.additions)
def test_populate_add_list__single_character_keys_and_values_are_permitted( self): taglist = TagList(self.current_list) addition_string = 'a=b' taglist.populate_add_list(addition_string) expected_additions_list = [{'Key': 'a', 'Value': 'b'}] self.assertEqual(expected_additions_list, taglist.additions)
def test_populate_add_list__whitespace_around_commas_is_stripped(self): expected_add_list = [{ 'Key': 'key10', 'Value': 'value10' }, { 'Key': 'key11', 'Value': 'value11' }] taglist = TagList(self.current_list) tag_keys_to_create = '"key10=value10 , key11=value11"' taglist.populate_add_list(tag_keys_to_create) self.assertEqual(expected_add_list, taglist.additions)
def test_validate_update__attempt_to_update_non_existent_tag__raises_exception( self): taglist = TagList(self.current_list) taglist.populate_update_list("key2=value2") with self.assertRaises( tagops.InvalidAttemptToModifyTagsError) as context_manager: tagops.validate_updates(taglist) expected_error_message = "Tags with the following keys can't be updated because they don't exist:{0}{0} key2{0}".format( linesep) self.assertEqual(expected_error_message, context_manager.exception.message)
def test_validate_additions__attempt_to_add_preexisting_tag__raises_exception( self): taglist = TagList(self.current_list) taglist.populate_add_list("key1=value2") with self.assertRaises( tagops.InvalidAttemptToModifyTagsError) as context_manager: tagops.validate_additions(taglist) print(context_manager.exception.message) expected_error_message = "Tags with the following keys can't be added because they already exist:{0}{0} key1{0}".format( linesep) self.assertEqual(expected_error_message, context_manager.exception.message)
def test_populate_add_list__multiple_comma_separated_key_value_pairs_are_enclosed_within_double_quotes__legal_string( self): expected_add_list = [{ 'Key': 'key10', 'Value': 'value10' }, { 'Key': 'key11', 'Value': 'value11' }] taglist = TagList(self.current_list) tag_keys_to_create = '"key10=value10,key11=value11"' taglist.populate_add_list(tag_keys_to_create) self.assertEqual(expected_add_list, taglist.additions)
def test_populate_delete_list__successfully_adds_multiple_keys_to_delete_list( self): taglist = TagList(self.current_list) deletion_string = ','.join( ['myuniquekey', 'myuniquekey2', 'myuniquekey3']) taglist.populate_delete_list(deletion_string) expected_deletions_list = [ 'myuniquekey', 'myuniquekey2', 'myuniquekey3' ] self.assertEqual(expected_deletions_list, taglist.deletions)
def test_populate_updates_list__multiple_comma_separated_key_value_pairs_are_enclosed_within_single_quotes__legal_string( self): expected_update_list = [{ 'Key': 'key10', 'Value': 'value10' }, { 'Key': 'key11', 'Value': 'value11' }] taglist = TagList(self.current_list) tag_keys_to_update = "'key10=value10,key11=value11'" taglist.populate_update_list(tag_keys_to_update) self.assertEqual(expected_update_list, taglist.updates)
def test_populate_update_list__update_multiple_existing_tags(self): taglist = TagList(self.current_list) update_string = ','.join(['key1=value3', 'key2=value3']) taglist.populate_update_list(update_string) expected_update_list = [{ 'Key': 'key1', 'Value': 'value3' }, { 'Key': 'key2', 'Value': 'value3' }] self.assertEqual(expected_update_list, taglist.updates)
def test_populate_add_list__whitespace_around_equal_to_separating_key_and_value_is_stripped( self): expected_add_list = [{ 'Key': 'key10', 'Value': 'value10' }, { 'Key': 'key11', 'Value': 'value11' }, { 'Key': 'key12', 'Value': 'value12' }] taglist = TagList(self.current_list) tag_keys_to_create = 'key10= value10,key11 =value11,key12 = value12' taglist.populate_add_list(tag_keys_to_create) self.assertEqual(expected_add_list, taglist.additions)
def test_populate_add_list__add_multiple_new_tags__keys_dont_preexist__successfully_adds( self): taglist = TagList(self.current_list) addition_string = ','.join([ 'myuniquekey=value3', 'myuniquekey2=value3', 'myuniquekey3=value4' ]) taglist.populate_add_list(addition_string) expected_additions_list = [{ 'Key': 'myuniquekey', 'Value': 'value3' }, { 'Key': 'myuniquekey2', 'Value': 'value3' }, { 'Key': 'myuniquekey3', 'Value': 'value4' }] self.assertEqual(expected_additions_list, taglist.additions)
def test_get_and_validate_tags__tags_is_empty__add_multiple_new_tags(self): taglist = TagList([]) addition_string = ','.join( ['key1=value1', 'key2=value2', 'key3=value3']) expected_additions_list = [{ 'Key': 'key1', 'Value': 'value1' }, { 'Key': 'key2', 'Value': 'value2' }, { 'Key': 'key3', 'Value': 'value3' }] self.assertEqual(expected_additions_list, tagops.get_and_validate_tags(addition_string))
def retrieve_taglist(self): if self.taglist is None: self.taglist = TagList( elasticbeanstalk.list_tags_for_resource(self.env_name))
class TagOps(object): """ Tag Operations class that delegates the tasks of validating syntax and uniqueness of tags, and performing EB API calls to other classes. """ def __init__(self, env_name, verbose): self.env_name = env_name self.taglist = None self.verbose = verbose def retrieve_taglist(self): if self.taglist is None: self.taglist = TagList( elasticbeanstalk.list_tags_for_resource(self.env_name)) def list_tags(self): self.retrieve_taglist() self.taglist.print_tags(self.env_name) def update_tags(self): request_id = elasticbeanstalk.update_tags_for_resource( self.env_name, self.taglist.additions + self.taglist.updates, self.taglist.deletions) wait_for_success_events(request_id) if self.verbose: self.__communicate_changes_to_stdout() def handle_addition_string(self, addition_string): """ Passes on string of the form 'key=value,..." to TagList which will maintain a list of keys specified for addition :param addition_string: a string of the form 'key=value,...' :return: None """ self.retrieve_taglist() self.taglist.populate_add_list(addition_string) validate_additions(self.taglist) def handle_deletion_string(self, deletion_string): """ Passes on string of the form 'key,..." to TagList which will maintain a list of keys specified for deletion :param deletion_string: a string of the form 'key,...' :return: None """ self.retrieve_taglist() self.taglist.populate_delete_list(deletion_string) validate_deletions(self.taglist) def handle_update_string(self, update_string): """ Passes on string of the form 'key=value,..." to TagList which will maintain a list of keys specified for update :param update_string: a string of the form 'key=value,...' :return: None """ self.retrieve_taglist() self.taglist.populate_update_list(update_string) validate_updates(self.taglist) def __communicate_changes_to_stdout(self): """ Print changes to STDOUT. :return: None """ keys_to_update = list_of_keys_of(self.taglist.updates) additions = [ addition for addition in self.taglist.additions if addition['Key'] not in keys_to_update ] deletions = self.taglist.deletions updates = self.taglist.updates if additions: io.echo('Added Tags:') io.echo( linesep.join([ " Key: '{0}' Value: '{1}'".format( addition['Key'], addition['Value']) for addition in additions ])) io.echo('') if deletions: io.echo('Deleted Tags:') io.echo( linesep.join([ " Key: '{0}'".format(deletion) for deletion in deletions ])) io.echo('') if updates: io.echo('Updated Tags:') io.echo( linesep.join([ " Key: '{0}' Value: '{1}'".format( update['Key'], update['Value']) for update in updates ])) io.echo('')
def test_validate___attempt_to_add_new_tag__passes_validation(self): taglist = TagList(self.current_list) taglist.populate_add_list("key2=value2") tagops.validate_additions(taglist)
def test_validate_deletion__attempt_to_delete_existing_tag__passes_validation( self): taglist = TagList(self.current_list) taglist.populate_delete_list("key1") tagops.validate_deletions(taglist)
class TagOps(object): """ Tag Operations class that delegates the tasks of validating syntax and uniqueness of tags, and performing EB API calls to other classes. """ def __init__(self, env_name, verbose): self.env_name = env_name self.taglist = None self.verbose = verbose def retrieve_taglist(self): if self.taglist is None: self.taglist = TagList(elasticbeanstalk.list_tags_for_resource(self.env_name)) def list_tags(self): self.retrieve_taglist() self.taglist.print_tags(self.env_name) def update_tags(self): request_id = elasticbeanstalk.update_tags_for_resource( self.env_name, self.taglist.additions + self.taglist.updates, self.taglist.deletions ) wait_for_success_events(request_id) if self.verbose: self.__communicate_changes_to_stdout() def handle_addition_string(self, addition_string): """ Passes on string of the form 'key=value,..." to TagList which will maintain a list of keys specified for addition :param addition_string: a string of the form 'key=value,...' :return: None """ self.retrieve_taglist() self.taglist.populate_add_list(addition_string) validate_additions(self.taglist) def handle_deletion_string(self, deletion_string): """ Passes on string of the form 'key,..." to TagList which will maintain a list of keys specified for deletion :param deletion_string: a string of the form 'key,...' :return: None """ self.retrieve_taglist() self.taglist.populate_delete_list(deletion_string) validate_deletions(self.taglist) def handle_update_string(self, update_string): """ Passes on string of the form 'key=value,..." to TagList which will maintain a list of keys specified for update :param update_string: a string of the form 'key=value,...' :return: None """ self.retrieve_taglist() self.taglist.populate_update_list(update_string) validate_updates(self.taglist) def __communicate_changes_to_stdout(self): """ Print changes to STDOUT. :return: None """ keys_to_update = list_of_keys_of(self.taglist.updates) additions = [addition for addition in self.taglist.additions if addition['Key'] not in keys_to_update] deletions = self.taglist.deletions updates = self.taglist.updates if additions: io.echo('Added Tags:') io.echo(linesep.join([" Key: '{0}' Value: '{1}'".format(addition['Key'], addition['Value']) for addition in additions])) io.echo('') if deletions: io.echo('Deleted Tags:') io.echo(linesep.join([" Key: '{0}'".format(deletion) for deletion in deletions])) io.echo('') if updates: io.echo('Updated Tags:') io.echo(linesep.join([" Key: '{0}' Value: '{1}'".format(update['Key'], update['Value']) for update in updates])) io.echo('')
def retrieve_taglist(self): if self.taglist is None: self.taglist = TagList(elasticbeanstalk.list_tags_for_resource(self.env_name))
def setUp(self): self.taglist = TagList([])