Source code for network.test_tags

# Copyright 2017 AT&T Corporation.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

from tempest.api.network import base
from tempest.common import utils
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib import decorators
from tempest.lib import exceptions as lib_exc

CONF = config.CONF


[docs] class TagsTest(base.BaseNetworkTest): """Tests the following operations in the tags API: Update all tags. Delete all tags. Check tag existence. Create a tag. List tags. Remove a tag. v2.0 of the Neutron API is assumed. The tag extension allows users to set tags on their networks. The extension supports networks only. """ @classmethod def skip_checks(cls): super(TagsTest, cls).skip_checks() if not utils.is_extension_enabled('tag', 'network'): msg = "tag extension not enabled." raise cls.skipException(msg) @classmethod def resource_setup(cls): super(TagsTest, cls).resource_setup() cls.network = cls.create_network()
[docs] @decorators.idempotent_id('ee76bfaf-ac94-4d74-9ecc-4bbd4c583cb1') def test_create_list_show_update_delete_tags(self): """Validate that creating a tag on a network resource works""" tag_name = data_utils.rand_name( self.__class__.__name__ + '-Tag', prefix=CONF.resource_name_prefix) self.tags_client.create_tag('networks', self.network['id'], tag_name) self.addCleanup(self.tags_client.delete_all_tags, 'networks', self.network['id']) self.tags_client.check_tag_existence('networks', self.network['id'], tag_name) # Validate that listing tags on a network resource works. retrieved_tags = self.tags_client.list_tags( 'networks', self.network['id'])['tags'] self.assertEqual([tag_name], retrieved_tags) # Generate 3 new tag names. replace_tags = [data_utils.rand_name( self.__class__.__name__ + '-Tag', prefix=CONF.resource_name_prefix) for _ in range(3)] # Replace the current tag with the 3 new tags and validate that the # network resource has the 3 new tags. updated_tags = self.tags_client.update_all_tags( 'networks', self.network['id'], replace_tags)['tags'] self.assertEqual(3, len(updated_tags)) self.assertEqual(set(replace_tags), set(updated_tags)) # Delete the first tag and check that it has been removed. self.tags_client.delete_tag( 'networks', self.network['id'], replace_tags[0]) self.assertRaises(lib_exc.NotFound, self.tags_client.check_tag_existence, 'networks', self.network['id'], replace_tags[0]) for i in range(1, 3): self.tags_client.check_tag_existence( 'networks', self.network['id'], replace_tags[i]) # Delete all the remaining tags and check that they have been removed. self.tags_client.delete_all_tags('networks', self.network['id']) for i in range(1, 3): self.assertRaises(lib_exc.NotFound, self.tags_client.check_tag_existence, 'networks', self.network['id'], replace_tags[i])
[docs] class TagsExtTest(base.BaseNetworkTest): """Tests the following operations in the tags API: Update all tags. Delete all tags. Check tag existence. Create a tag. List tags. Remove a tag. v2.0 of the Neutron API is assumed. The tag-ext or standard-attr-tag extension allows users to set tags on the following resources: subnets, ports, routers and subnetpools. from stein release the tag-ext has been renamed to standard-attr-tag """ # NOTE(felipemonteiro): The supported resource names are plural. Use # the singular case for the corresponding class resource object. SUPPORTED_RESOURCES = ['subnets', 'ports', 'routers', 'subnetpools'] @classmethod def skip_checks(cls): super(TagsExtTest, cls).skip_checks() # Added condition to support backward compatibility since # tag-ext has been renamed to standard-attr-tag if not (utils.is_extension_enabled('tag-ext', 'network') or utils.is_extension_enabled('standard-attr-tag', 'network')): msg = ("neither tag-ext nor standard-attr-tag extensions " "are enabled.") raise cls.skipException(msg) @classmethod def resource_setup(cls): super(TagsExtTest, cls).resource_setup() cls.network = cls.create_network() cls.subnet = cls.create_subnet(cls.network) cls.port = cls.create_port(cls.network) cls.router = cls.create_router() subnetpool_name = data_utils.rand_name( cls.__name__ + '-Subnetpool', prefix=CONF.resource_name_prefix) prefix = CONF.network.default_network cls.subnetpool = cls.subnetpools_client.create_subnetpool( name=subnetpool_name, prefixes=prefix)['subnetpool'] cls.addClassResourceCleanup(cls.subnetpools_client.delete_subnetpool, cls.subnetpool['id']) def _create_tags_for_each_resource(self): # Create a tag for each resource in `SUPPORTED_RESOURCES` and return # the list of tag names. tag_names = [] for resource in self.SUPPORTED_RESOURCES: tag_name = data_utils.rand_name( self.__class__.__name__ + '-Tag', prefix=CONF.resource_name_prefix) tag_names.append(tag_name) resource_object = getattr(self, resource[:-1]) self.tags_client.create_tag(resource, resource_object['id'], tag_name) self.addCleanup(self.tags_client.delete_all_tags, resource, resource_object['id']) return tag_names
[docs] @decorators.idempotent_id('c6231efa-9a89-4adf-b050-2a3156b8a1d9') def test_create_check_list_and_delete_tags(self): """Test tag operations on subnets/ports/routers/subnetpools""" tag_names = self._create_tags_for_each_resource() for i, resource in enumerate(self.SUPPORTED_RESOURCES): # Ensure that a tag was created for each resource. resource_object = getattr(self, resource[:-1]) retrieved_tags = self.tags_client.list_tags( resource, resource_object['id'])['tags'] self.assertEqual(1, len(retrieved_tags)) self.assertEqual(tag_names[i], retrieved_tags[0]) # Check that the expected tag exists for each resource. self.tags_client.check_tag_existence( resource, resource_object['id'], tag_names[i]) # Delete the tag and ensure it was deleted. self.tags_client.delete_tag( resource, resource_object['id'], tag_names[i]) retrieved_tags = self.tags_client.list_tags( resource, resource_object['id'])['tags'] self.assertEmpty(retrieved_tags)
[docs] @decorators.idempotent_id('663a90f5-f334-4b44-afe0-c5fc1d408791') def test_update_and_delete_all_tags(self): """Test update/delete all tags on subnets/ports/routers/subnetpools""" self._create_tags_for_each_resource() for resource in self.SUPPORTED_RESOURCES: # Generate 3 new tag names. replace_tags = [data_utils.rand_name( self.__class__.__name__ + '-Tag', prefix=CONF.resource_name_prefix) for _ in range(3)] # Replace the current tag with the 3 new tags and validate that the # current resource has the 3 new tags. resource_object = getattr(self, resource[:-1]) updated_tags = self.tags_client.update_all_tags( resource, resource_object['id'], replace_tags)['tags'] self.assertEqual(3, len(updated_tags)) self.assertEqual(set(replace_tags), set(updated_tags)) # Delete all the tags and check that they have been removed. self.tags_client.delete_all_tags(resource, resource_object['id']) for i in range(3): self.assertRaises( lib_exc.NotFound, self.tags_client.check_tag_existence, resource, resource_object['id'], replace_tags[i])