def test_populate_update_list__trailing_and_leading_whitespaces_are_stripped( self): expected_update_list = [{'Key': 'key10', 'Value': 'value10'}] taglist = TagList(self.current_list) tag_keys_to_update = ' key10=value10 ' taglist.populate_update_list(tag_keys_to_update) self.assertEqual(expected_update_list, taglist.updates)
def test_populate_update_list__tag_contains_multiple_equal_to_signs__key_ends_before_first_equal_to( self): expected_update_list = [{'Key': 'key', 'Value': '10=value1'}] taglist = TagList(self.current_list) tag_keys_to_update = '"key=10=value1"' taglist.populate_update_list(tag_keys_to_update) self.assertEqual(expected_update_list, taglist.updates)
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_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_populate_update_list__whitespace_around_commas_is_stripped(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_updates_list__multiple_comma_separated_key_value_pairs_are_enclosed_within_double_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_update_list__whitespace_around_equal_to_separating_key_and_value_is_stripped( self): expected_update_list = [{ 'Key': 'key10', 'Value': 'value10' }, { 'Key': 'key11', 'Value': 'value11' }, { 'Key': 'key12', 'Value': 'value12' }] taglist = TagList(self.current_list) tag_keys_to_update = 'key10= value10,key11 =value11,key12 = value12' taglist.populate_update_list(tag_keys_to_update) self.assertEqual(expected_update_list, taglist.updates)
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('')
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_update__attempt_to_update_existing_tag__passes_validation( self): taglist = TagList(self.current_list) taglist.populate_update_list("key1=value1") tagops.validate_updates(taglist)