Add neutron trunk port scenarios

This commit adds scenarios for testing neutron trunk ports.

Change-Id: Ica1f0a7acd521f860cebd2f92fa4dfafa90b45a2
This commit is contained in:
Sai Sindhur Malleni 2018-09-06 23:26:55 -04:00 committed by Andrey Kurilin
parent 4201363727
commit 4e4bfc5918
11 changed files with 222 additions and 0 deletions

View File

@ -3,3 +3,8 @@
parent: rally-task-at-devstack parent: rally-task-at-devstack
vars: vars:
rally_task: rally-jobs/neutron.yaml rally_task: rally-jobs/neutron.yaml
devstack_plugins:
rally-openstack: https://git.openstack.org/openstack/rally-openstack
neutron: https://git.openstack.org/openstack/neutron
devstack_services:
neutron-trunk: true

View File

@ -16,6 +16,14 @@ Changelog
.. Release notes for existing releases are MUTABLE! If there is something that .. Release notes for existing releases are MUTABLE! If there is something that
was missed or can be improved, feel free to change it! was missed or can be improved, feel free to change it!
unreleased
----------
Added
~~~~~
* Added neutron trunk scenarios
[1.3.0] - 2018-10-08 [1.3.0] - 2018-10-08
-------------------- --------------------

View File

@ -617,6 +617,28 @@
failure_rate: failure_rate:
max: 20 max: 20
NeutronTrunks.create_and_list_trunks:
-
args:
network_create_args: {}
subport_count: 10
runner:
type: "constant"
times: 100
concurrency: 10
context:
users:
tenants: 3
users_per_tenant: 3
quotas:
neutron:
network: -1
port: -1
trunk: -1
sla:
failure_rate:
max: 10
NeutronSubnets.delete_subnets: NeutronSubnets.delete_subnets:
- -
runner: runner:

View File

@ -59,6 +59,10 @@ class NeutronQuotas(object):
"health_monitor": { "health_monitor": {
"type": "integer", "type": "integer",
"minimum": -1 "minimum": -1
},
"trunk": {
"type": "integer",
"minimum": -1
} }
} }
} }

View File

@ -604,3 +604,34 @@ class DeleteSubnets(utils.NeutronScenario):
# delete one of subnets based on the user sequential number # delete one of subnets based on the user sequential number
subnet_id = network["subnets"][number] subnet_id = network["subnets"][number]
self._delete_subnet({"subnet": {"id": subnet_id}}) self._delete_subnet({"subnet": {"id": subnet_id}})
@validation.add("number", param_name="subport_count", minval=1,
integer_only=True)
@validation.add("required_services", services=[consts.Service.NEUTRON])
@validation.add("required_platform", platform="openstack", users=True)
@scenario.configure(context={"cleanup@openstack": ["neutron"]},
name="NeutronTrunks.create_and_list_trunks")
class CreateAndListTrunks(utils.NeutronScenario):
def run(self, network_create_args=None, subport_count=10):
"""Create and a given number of trunks with subports and list all trunks
:param network_create_args: dict, POST /v2.0/networks request
options. Deprecated.
:param trunk_count: int, number of trunk ports
:param subport_count: int, number of subports per trunk
"""
net = self._create_network(network_create_args or {})
ports = [self._create_port(net, {}) for _ in range(subport_count)]
parent, subports = ports[0], ports[1:]
subport_payload = [{"port_id": p["port"]["id"],
"segmentation_type": "vlan",
"segmentation_id": seg_id}
for seg_id, p in enumerate(subports, start=1)]
trunk_payload = {"port_id": parent["port"]["id"],
"sub_ports": subport_payload}
self._create_trunk(trunk_payload)
self._update_port(parent, {"device_id": "sometrunk"})
self._list_trunks()
self._list_ports_by_device_id("sometrunk")

View File

@ -877,3 +877,19 @@ class NeutronScenario(scenario.OpenStackScenario):
""" """
self.clients("neutron").delete_security_group_rule( self.clients("neutron").delete_security_group_rule(
security_group_rule) security_group_rule)
@atomic.action_timer("neutron.delete_trunk")
def _delete_trunk(self, trunk_port):
self.clients("neutron").delete_trunk(trunk_port["port_id"])
@atomic.action_timer("neutron.create_trunk")
def _create_trunk(self, trunk_payload):
return self.clients("neutron").create_trunk({"trunk": trunk_payload})
@atomic.optional_action_timer("neutron.list_trunks")
def _list_trunks(self, **kwargs):
return self.clients("neutron").list_trunks(**kwargs)["trunks"]
@atomic.optional_action_timer("neutron.list_ports_by_device_id")
def _list_ports_by_device_id(self, device_id):
return self.clients("neutron").list_ports(device_id=device_id)

View File

@ -0,0 +1,33 @@
{
"NeutronTrunks.create_and_list_trunks": [
{
"args": {
"network_create_args": {},
"subport_count": 10
},
"runner": {
"type": "constant",
"times": 100,
"concurrency": 10
},
"context": {
"users": {
"tenants": 3,
"users_per_tenant": 3
},
"quotas": {
"neutron": {
"network": -1,
"port": -1,
"trunk": -1
}
}
},
"sla": {
"failure_rate": {
"max": 0
}
}
}
]
}

View File

@ -0,0 +1,23 @@
---
NeutronTrunks.create_and_list_trunks:
-
args:
network_create_args: {}
subport_count: 10
runner:
type: "constant"
times: 100
concurrency: 10
context:
users:
tenants: 3
users_per_tenant: 3
quotas:
neutron:
network: -1
port: -1
trunk: -1
sla:
failure_rate:
max: 0

View File

@ -260,3 +260,21 @@
subnets_per_network: 15 subnets_per_network: 15
dualstack: True dualstack: True
router: {} router: {}
NeutronTrunks.create_and_list_trunks:
-
args:
network_create_args: {}
subport_count: 10
context:
{% call user_context(tenants_amount, users_amount, use_existing_users) %}
quotas:
neutron:
network: -1
port: -1
trunk: -1
{% endcall %}
runner:
{{ constant_runner(concurrency=2*controllers_amount, times=8*controllers_amount, is_smoke=smoke) }}
sla:
{{ no_failures_sla() }}

View File

@ -596,3 +596,24 @@ class NeutronNetworksTestCase(test.ScenarioTestCase):
mock.call({"subnet": {"id": "subnet-5"}}) mock.call({"subnet": {"id": "subnet-5"}})
], ],
mock__delete_subnet.call_args_list) mock__delete_subnet.call_args_list)
def test_create_and_list_trunks(self):
subport_count = 10
network_create_args = {}
net = mock.MagicMock()
scenario = network.CreateAndListTrunks(self.context)
scenario._create_network = mock.Mock(return_value=net)
scenario._create_port = mock.MagicMock()
scenario._create_trunk = mock.MagicMock()
scenario._update_port = mock.Mock()
scenario._list_ports_by_device_id = mock.Mock()
scenario.run(network_create_args=network_create_args,
subport_count=subport_count)
scenario._create_network.assert_called_once_with(
network_create_args)
scenario._create_port.assert_has_calls(
[mock.call(net, {})
for _ in range(subport_count)])
self.assertEqual(1, scenario._create_trunk.call_count)
self.assertEqual(1, scenario._update_port.call_count)
self.assertEqual(1, scenario._list_ports_by_device_id.call_count)

View File

@ -1292,6 +1292,47 @@ class NeutronScenarioTestCase(test.ScenarioTestCase):
self._test_atomic_action_timer(self.scenario.atomic_actions(), self._test_atomic_action_timer(self.scenario.atomic_actions(),
"neutron.list_bgpvpn_router_assocs") "neutron.list_bgpvpn_router_assocs")
def test__delete_trunk(self):
trunk_port = {"trunk": {"port_id": "fake-id"}}
self.scenario._delete_trunk(trunk_port["trunk"])
self.clients("neutron").delete_trunk.assert_called_once_with(
trunk_port["trunk"]["port_id"])
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"neutron.delete_trunk")
def test__create_trunk(self):
port_id = "port-id"
subport_payload = [{"port_id": "subport-port-id",
"segmentation_type": "vlan",
"segmentation_id": 1}]
trunk_payload = {
"port_id": port_id,
"name": self.scenario.generate_random_name.return_value,
"sub_ports": subport_payload
}
expected_trunk_args = {
"trunk": trunk_payload
}
self.scenario._create_trunk(trunk_payload)
self.clients("neutron").create_trunk.assert_called_once_with(
expected_trunk_args)
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"neutron.create_trunk")
def test__list_trunks(self):
trunks = [{"name": "trunk1"}, {"name": "trunk2"}]
self.clients("neutron").list_trunks.return_value = {"trunks": trunks}
self.assertEqual(trunks, self.scenario._list_trunks())
self._test_atomic_action_timer(self.scenario.atomic_actions(),
"neutron.list_trunks")
def test__list_ports_by_device_id(self):
device_id = "device-id"
self.scenario._list_ports_by_device_id(device_id)
self.clients("neutron").list_ports.assert_called_once_with(
device_id=device_id)
class NeutronScenarioFunctionalTestCase(test.FakeClientsScenarioTestCase): class NeutronScenarioFunctionalTestCase(test.FakeClientsScenarioTestCase):