Group together tests that create server and require network resources

Group together tests that create a server and require network resources
so as to reduce overhead with creating a server and improving gate
stability. While these tests could also be grouped with
test_server_misc_policy_actions.py, those tests don't require network
resources, so it makes sense to separate out the network resource tests
into a separate class.

This commit groups together the tests from the following files:

  * test_attach_interfaces_rbac
  * test_ips_rbac
  * test_multinic_rbac

into a shared class (MiscPolicyActionsNetworkRbacTest) inside
test_server_misc_policy_actions_rbac.py.

Closes-Bug: #1699421
Related-Bug: #1699415
Change-Id: I01c5e635028a6696331b1dc1401e274543db2716
This commit is contained in:
Felipe Monteiro 2017-07-07 04:48:30 +01:00
parent 25569dc76b
commit a7d9425c26
4 changed files with 126 additions and 219 deletions

View File

@ -1,92 +0,0 @@
# 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.common import waiters
from tempest import config
from tempest.lib.common.utils import test_utils
from tempest.lib import decorators
from tempest import test
from patrole_tempest_plugin import rbac_rule_validation
from patrole_tempest_plugin.tests.api.compute import rbac_base
CONF = config.CONF
class AttachInterfacesRbacTest(rbac_base.BaseV2ComputeRbacTest):
@classmethod
def skip_checks(cls):
super(AttachInterfacesRbacTest, cls).skip_checks()
if not test.is_extension_enabled('os-attach-interfaces', 'compute'):
msg = ("%s skipped as os-attach-interfaces not "
"enabled." % cls.__name__)
raise cls.skipException(msg)
if not CONF.compute_feature_enabled.interface_attach:
raise cls.skipException(
"%s skipped as interface attachment is not available"
% cls.__name__)
if not CONF.service_available.neutron:
raise cls.skipException(
'%s skipped as Neutron is required' % cls.__name__)
@classmethod
def setup_credentials(cls):
cls.prepare_instance_network()
super(AttachInterfacesRbacTest, cls).setup_credentials()
@classmethod
def resource_setup(cls):
super(AttachInterfacesRbacTest, cls).resource_setup()
cls.server = cls.create_test_server(wait_until='ACTIVE')
def _attach_interface_to_server(self):
interface = self.interfaces_client.create_interface(
self.server['id'])['interfaceAttachment']
waiters.wait_for_interface_status(
self.interfaces_client, self.server['id'], interface['port_id'],
'ACTIVE')
self.addCleanup(
test_utils.call_and_ignore_notfound_exc,
self.os_admin.interfaces_client.delete_interface,
self.server['id'], interface['port_id'])
return interface
@decorators.idempotent_id('ddf53cb6-4a0a-4e5a-91e3-6c32aaa3b9b6')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:os-attach-interfaces")
def test_list_interfaces(self):
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.interfaces_client.list_interfaces(
self.server['id'])['interfaceAttachments']
@decorators.idempotent_id('d2d3a24d-4738-4bce-a287-36d664746cde')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:os-attach-interfaces:create")
def test_create_interface(self):
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self._attach_interface_to_server()
@decorators.idempotent_id('55b05692-ed44-4608-a84c-cd4219c82799')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:os-attach-interfaces:delete")
def test_delete_interface(self):
interface = self._attach_interface_to_server()
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.interfaces_client.delete_interface(self.server['id'],
interface['port_id'])

View File

@ -1,66 +0,0 @@
# 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 import config
from tempest.lib import decorators
from tempest import test
from patrole_tempest_plugin import rbac_rule_validation
from patrole_tempest_plugin.tests.api.compute import rbac_base
CONF = config.CONF
class IpsRbacTest(rbac_base.BaseV2ComputeRbacTest):
@classmethod
def skip_checks(cls):
super(IpsRbacTest, cls).skip_checks()
if not test.is_extension_enabled('os-ips', 'compute'):
msg = "%s skipped as os-ips not enabled." % cls.__name__
raise cls.skipException(msg)
if not CONF.service_available.neutron:
raise cls.skipException(
'%s skipped as Neutron is required' % cls.__name__)
@classmethod
def setup_credentials(cls):
cls.prepare_instance_network()
super(IpsRbacTest, cls).setup_credentials()
@classmethod
def resource_setup(cls):
super(IpsRbacTest, cls).resource_setup()
cls.server = cls.create_test_server(wait_until='ACTIVE')
@decorators.idempotent_id('6886d360-0d86-4760-b1a3-882d81fbebcc')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:ips:index")
def test_list_addresses(self):
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.servers_client.list_addresses(self.server['id'])['addresses']
@decorators.idempotent_id('fa43e7e5-0db9-48eb-9c6b-c11eb766b8e4')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:ips:show")
def test_list_addresses_by_network(self):
addresses = self.servers_client.list_addresses(
self.server['id'])['addresses']
address = next(iter(addresses))
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.servers_client.list_addresses_by_network(
self.server['id'], address)[address]

View File

@ -1,61 +0,0 @@
# 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 import config
from tempest.lib import decorators
from patrole_tempest_plugin import rbac_rule_validation
from patrole_tempest_plugin.tests.api.compute import rbac_base
CONF = config.CONF
class MultinicRbacTest(rbac_base.BaseV2ComputeRbacTest):
@classmethod
def skip_checks(cls):
super(MultinicRbacTest, cls).skip_checks()
if not CONF.service_available.neutron:
raise cls.skipException("Neutron is required")
if not CONF.compute_feature_enabled.interface_attach:
raise cls.skipException("Interface attachment is not available.")
@classmethod
def setup_credentials(cls):
# This test class requires network and subnet
cls.set_network_resources(network=True, subnet=True)
super(MultinicRbacTest, cls).setup_credentials()
@classmethod
def resource_setup(cls):
super(MultinicRbacTest, cls).resource_setup()
cls.server = cls.create_test_server(wait_until='ACTIVE')
@rbac_rule_validation.action(
service="nova", rule="os_compute_api:os-multinic")
@decorators.idempotent_id('bd3e2c74-130a-40f0-8085-124d93fe67da')
def test_add_fixed_ip(self):
"""Add fixed IP to server."""
interfaces = (self.interfaces_client.list_interfaces(self.server['id'])
['interfaceAttachments'])
if interfaces:
network_id = interfaces[0]['net_id']
else:
network_id = self.interfaces_client.create_interface(
self.server['id'])['interfaceAttachment']['net_id']
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.servers_client.add_fixed_ip(self.server['id'],
networkId=network_id)

View File

@ -18,6 +18,7 @@ import testtools
from tempest.common import waiters
from tempest import config
from tempest.lib.common.utils import data_utils
from tempest.lib.common.utils import test_utils
from tempest.lib import decorators
from tempest.lib import exceptions as lib_exc
from tempest import test
@ -246,3 +247,128 @@ class MiscPolicyActionsRbacTest(rbac_base.BaseV2ComputeRbacTest):
self.servers_client.resume_server(self.server_id)
waiters.wait_for_server_status(
self.os_admin.servers_client, self.server_id, 'ACTIVE')
class MiscPolicyActionsNetworkRbacTest(rbac_base.BaseV2ComputeRbacTest):
"""Test multiple policy actions that require a server to be created.
Only applies to:
* policy "families" that require server creation
* small policy "families" -- i.e. containing one to three policies
* tests that require network resources
"""
@classmethod
def skip_checks(cls):
super(MiscPolicyActionsNetworkRbacTest, cls).skip_checks()
# All tests below require Neutron availability.
if not CONF.service_available.neutron:
raise cls.skipException(
'%s skipped as Neutron is required' % cls.__name__)
@classmethod
def setup_credentials(cls):
cls.prepare_instance_network()
super(MiscPolicyActionsNetworkRbacTest, cls).setup_credentials()
@classmethod
def resource_setup(cls):
super(MiscPolicyActionsNetworkRbacTest, cls).resource_setup()
cls.server = cls.create_test_server(wait_until='ACTIVE')
def _attach_interface_to_server(self):
interface = self.interfaces_client.create_interface(
self.server['id'])['interfaceAttachment']
waiters.wait_for_interface_status(
self.os_admin.interfaces_client, self.server['id'],
interface['port_id'], 'ACTIVE')
self.addCleanup(
test_utils.call_and_ignore_notfound_exc,
self.interfaces_client.delete_interface,
self.server['id'], interface['port_id'])
return interface
@testtools.skipUnless(CONF.compute_feature_enabled.interface_attach,
"Interface attachment is not available.")
@test.requires_ext(extension='os-attach-interfaces', service='compute')
@decorators.idempotent_id('ddf53cb6-4a0a-4e5a-91e3-6c32aaa3b9b6')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:os-attach-interfaces")
def test_list_interfaces(self):
"""Test list interfaces, part of os-attach-interfaces."""
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.interfaces_client.list_interfaces(
self.server['id'])['interfaceAttachments']
@testtools.skipUnless(CONF.compute_feature_enabled.interface_attach,
"Interface attachment is not available.")
@test.requires_ext(extension='os-attach-interfaces', service='compute')
@decorators.idempotent_id('d2d3a24d-4738-4bce-a287-36d664746cde')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:os-attach-interfaces:create")
def test_create_interface(self):
"""Test create interface, part of os-attach-interfaces."""
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self._attach_interface_to_server()
@testtools.skipUnless(CONF.compute_feature_enabled.interface_attach,
"Interface attachment is not available.")
@test.requires_ext(extension='os-attach-interfaces', service='compute')
@decorators.idempotent_id('55b05692-ed44-4608-a84c-cd4219c82799')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:os-attach-interfaces:delete")
def test_delete_interface(self):
"""Test delete interface, part of os-attach-interfaces."""
interface = self._attach_interface_to_server()
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.interfaces_client.delete_interface(self.server['id'],
interface['port_id'])
@decorators.idempotent_id('6886d360-0d86-4760-b1a3-882d81fbebcc')
@test.requires_ext(extension='os-ips', service='compute')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:ips:index")
def test_list_addresses(self):
"""Test list server addresses, part of ips policy family."""
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.servers_client.list_addresses(self.server['id'])['addresses']
@decorators.idempotent_id('fa43e7e5-0db9-48eb-9c6b-c11eb766b8e4')
@test.requires_ext(extension='os-ips', service='compute')
@rbac_rule_validation.action(
service="nova",
rule="os_compute_api:ips:show")
def test_list_addresses_by_network(self):
"""Test list server addresses by network, part of ips policy family."""
addresses = self.servers_client.list_addresses(self.server['id'])[
'addresses']
address = next(iter(addresses))
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.servers_client.list_addresses_by_network(
self.server['id'], address)[address]
@testtools.skipUnless(CONF.compute_feature_enabled.interface_attach,
"Interface attachment is not available.")
@test.requires_ext(extension='os-multinic', service='compute')
@rbac_rule_validation.action(
service="nova", rule="os_compute_api:os-multinic")
@decorators.idempotent_id('bd3e2c74-130a-40f0-8085-124d93fe67da')
def test_add_fixed_ip(self):
"""Test add fixed ip to server network, part of os-multinic."""
interfaces = (self.interfaces_client.list_interfaces(self.server['id'])
['interfaceAttachments'])
if interfaces:
network_id = interfaces[0]['net_id']
else:
network_id = self.interfaces_client.create_interface(
self.server['id'])['interfaceAttachment']['net_id']
self.rbac_utils.switch_role(self, toggle_rbac_role=True)
self.servers_client.add_fixed_ip(self.server['id'],
networkId=network_id)