def test_compare_aws_tags_equal(self): new_dict = dict(self.tag_example_dict) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict) self.assertEqual({}, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=False) self.assertEqual({}, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=True) self.assertEqual({}, keys_to_set) self.assertEqual([], keys_to_unset)
def manage_tags(module, client, resource_type, resource_id, new_tags, purge_tags): if new_tags is None: return False old_tags = get_tags(module, client, resource_type, resource_id) tags_to_set, tags_to_delete = compare_aws_tags(old_tags, new_tags, purge_tags=purge_tags) change_params = dict() if tags_to_set: change_params['AddTags'] = ansible_dict_to_boto3_tag_list(tags_to_set) if tags_to_delete: change_params['RemoveTagKeys'] = tags_to_delete if not change_params: return False if module.check_mode: return True try: client.change_tags_for_resource(ResourceType=resource_type, ResourceId=resource_id, **change_params) except (botocore.exceptions.BotoCoreError, botocore.exceptions.ClientError) as e: module.fail_json_aws( e, msg='Failed to update tags on {0}'.format(resource_type), resource_id=resource_id, change_params=change_params) return True
def test_compare_aws_tags_added(self): new_dict = dict(self.tag_example_dict) new_keys = {'add_me': 'lower case', 'Me too!': 'Contributing'} new_dict.update(new_keys) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict) self.assertEqual(new_keys, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=False) self.assertEqual(new_keys, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=True) self.assertEqual(new_keys, keys_to_set) self.assertEqual([], keys_to_unset)
def test_compare_aws_tags_removed(self): new_dict = dict(self.tag_example_dict) del new_dict['lowerCamel'] del new_dict['Normal case'] keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict) self.assertEqual({}, keys_to_set) self.assertEqual(set(['lowerCamel', 'Normal case']), set(keys_to_unset)) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=False) self.assertEqual({}, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=True) self.assertEqual({}, keys_to_set) self.assertEqual(set(['lowerCamel', 'Normal case']), set(keys_to_unset))
def test_compare_aws_tags_changed(self): new_dict = dict(self.tag_example_dict) new_keys = { 'UpperCamel': 'anotherCamelValue', 'Normal case': 'normal value' } new_dict.update(new_keys) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict) self.assertEqual(new_keys, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=False) self.assertEqual(new_keys, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=True) self.assertEqual(new_keys, keys_to_set) self.assertEqual([], keys_to_unset)
def test_compare_aws_tags_complex_update(self): # Adds 'Me too!', Changes 'UpperCamel' and removes 'Normal case' new_dict = dict(self.tag_example_dict) new_keys = { 'UpperCamel': 'anotherCamelValue', 'Me too!': 'Contributing' } new_dict.update(new_keys) del new_dict['Normal case'] keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict) self.assertEqual(new_keys, keys_to_set) self.assertEqual(['Normal case'], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=False) self.assertEqual(new_keys, keys_to_set) self.assertEqual([], keys_to_unset) keys_to_set, keys_to_unset = compare_aws_tags(self.tag_example_dict, new_dict, purge_tags=True) self.assertEqual(new_keys, keys_to_set) self.assertEqual(['Normal case'], keys_to_unset)
def set_tags(self, tags, purge_tags): if tags is None: return False changed = False # Tags are returned as a part of the metadata, but have to be updated # via dedicated tagging methods current_tags = boto3_tag_list_to_ansible_dict( self._preupdate_metadata.get('Tags', [])) # So that diff works in check mode we need to know the full target state if purge_tags: desired_tags = deepcopy(tags) else: desired_tags = deepcopy(current_tags) desired_tags.update(tags) tags_to_add, tags_to_remove = compare_aws_tags(current_tags, tags, purge_tags) if tags_to_add: self._tagging_updates['add'] = tags_to_add changed = True if tags_to_remove: self._tagging_updates['remove'] = tags_to_remove changed = True if changed: # Tags are a stored as a list, but treated like a list, the # simplisic '==' in _set_metadata_value doesn't do the comparison # properly return self._set_metadata_value( 'Tags', ansible_dict_to_boto3_tag_list(desired_tags)) return False