Source code for stepler.baremetal.tests.test_multitenancy
"""
-----------------------------------
Ironic baremetal multitenancy tests
-----------------------------------
"""
# 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 hamcrest import assert_that, only_contains, has_property # noqa: H301
import pytest
pytestmark = pytest.mark.requires("ironic_nodes_count >= 1")
@pytest.mark.idempotent_id('caec6869-91c6-41ca-8386-ef84711a885f',
neutron_nets_for_projects={'same_cidr': False})
@pytest.mark.idempotent_id('3a0bcbb9-2a53-405e-a80f-d087d8b30b5f',
neutron_nets_for_projects={'same_cidr': True})
@pytest.mark.parametrize(
'neutron_nets_for_projects', [{
'same_cidr': False
}, {
'same_cidr': True
}],
indirect=True,
ids=['different_cidrs', 'same_cidr'])
[docs]def test_per_project_l3_isolation(multitenancy_resources):
"""Check user can't get access to other project's instance.
**Setup:**
#. Create 2 projects and 2 users
#. Create network, subnet, router on each project
#. Upload public baremetal ubuntu image
#. Create baremetal flavor
#. Create keypairs
#. Boot 2 servers on 1'st project and 1 server on 2'nd project
#. Assign Floating IPs to one server from 1'st project and server from 2'nd
project
**Steps:**
#. Check that users can see only own project's servers
#. Check that 1'nd user can't ping 2'st project server via fixed IP
#. Check that 1'nd user can ping 2'st project server via floating IP
#. Check ping between 1'st project servers
**Teardown:**
#. Delete servers
#. Delete floating ips
#. Delete networks, subnets, routers
#. Delete image
#. Delete flavor
#. Delete keypairs
#. Delete projects and users
"""
# Check cross-projects servers visibility
for resource in multitenancy_resources.resources:
server_steps = resource.server_steps
servers = server_steps.get_servers()
assert_that(servers,
only_contains(*[
has_property('name', server.name)
for server in resource.servers
])) # checker: disable
server_steps_1 = multitenancy_resources.resources[0].server_steps
server_1_1, server_1_2 = multitenancy_resources.resources[0].servers
server_1_2_fixed_ip = server_steps_1.get_fixed_ip(server_1_2)
server_steps_2 = multitenancy_resources.resources[1].server_steps
server_2 = multitenancy_resources.resources[1].servers[0]
server_2_fixed_ip = server_steps_2.get_fixed_ip(server_2)
server_2_floating_ip = server_steps_2.get_floating_ip(server_2)
# Check l3 isolation
with server_steps_1.get_server_ssh(server_1_1) as server_ssh:
server_steps_1.check_ping_for_ip(
server_2_fixed_ip, remote_from=server_ssh, must_be_success=False)
server_steps_1.check_ping_for_ip(
server_2_floating_ip, remote_from=server_ssh)
server_steps_1.check_ping_for_ip(
server_1_2_fixed_ip, remote_from=server_ssh)
@pytest.mark.idempotent_id('b8a62c00-99ce-476f-b34e-3c73311a93eb')
@pytest.mark.parametrize(
'multitenancy_networks', [{
'shared_network': True
}],
indirect=True,
ids=['shared_network'])
[docs]def test_shared_network(multitenancy_resources):
"""Check different projects with shared network connectivity.
**Setup:**
#. Create 2 projects and 2 users
#. Create shared network, subnet, router
#. Upload public baremetal ubuntu image
#. Create baremetal flavor
#. Boot 2 servers on 1'st project and 1 server on 2'nd project
#. Assign Floating IPs to one server from 1'st project and server from 2'nd
project
**Steps:**
#. Check that 1'nd user can ping 2'st project server via fixed IP
**Teardown:**
#. Delete servers
#. Delete floating ips
#. Delete network, subnet, router
#. Delete image
#. Delete flavor
#. Delete keypairs
#. Delete projects and users
"""
server_steps_1 = multitenancy_resources.resources[0].server_steps
server_1_1, server_1_2 = multitenancy_resources.resources[0].servers
server_steps_2 = multitenancy_resources.resources[1].server_steps
server_2 = multitenancy_resources.resources[1].servers[0]
server_2_fixed_ip = server_steps_2.get_fixed_ip(server_2)
with server_steps_1.get_server_ssh(server_1_1) as server_ssh:
server_steps_1.check_ping_for_ip(
server_2_fixed_ip, remote_from=server_ssh, must_be_success=True)