def test_populate_delete_list__whitespace_inside_key_is_preserved(self):
        expected_delete_list = ['key 10']

        taglist = TagList(self.current_list)
        tag_keys_to_delete = 'key 10'

        taglist.populate_delete_list(tag_keys_to_delete)
        self.assertEqual(expected_delete_list, taglist.deletions)
    def test_populate_delete_list__whitespace_around_commas_is_stripped(self):
        expected_delete_list = ['key10', 'key11']

        taglist = TagList(self.current_list)
        tag_keys_to_delete = '"key10 , key11'

        taglist.populate_delete_list(tag_keys_to_delete)
        self.assertEqual(expected_delete_list, taglist.deletions)
    def test_populate_delete_list__successfully_adds_one_key_to_delete_list(
            self):
        taglist = TagList(self.current_list)

        deletion_string = 'myuniquekey'

        taglist.populate_delete_list(deletion_string)

        self.assertEqual(['myuniquekey'], taglist.deletions)
    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 test_validate_deletion__attempt_to_delete_non_existent_tag__raises_exception(
            self):
        taglist = TagList(self.current_list)
        taglist.populate_delete_list("key2")

        with self.assertRaises(
                tagops.InvalidAttemptToModifyTagsError) as context_manager:
            tagops.validate_deletions(taglist)

        expected_error_message = "Tags with the following keys can't be deleted because they don't exist:{0}{0}  key2{0}".format(
            linesep)
        self.assertEqual(expected_error_message,
                         context_manager.exception.message)
    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)
示例#7
0
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('')
示例#8
0
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_deletion__attempt_to_delete_existing_tag__passes_validation(
            self):
        taglist = TagList(self.current_list)
        taglist.populate_delete_list("key1")

        tagops.validate_deletions(taglist)