Merge "Add Neutron LoadBalancer v1 create and list vips"
This commit is contained in:
commit
20cbd5fb0d
@ -163,6 +163,29 @@
|
|||||||
failure_rate:
|
failure_rate:
|
||||||
max: 0
|
max: 0
|
||||||
|
|
||||||
|
NeutronLoadbalancerV1.create_and_list_vips:
|
||||||
|
-
|
||||||
|
args:
|
||||||
|
vip_create_args: {}
|
||||||
|
runner:
|
||||||
|
type: "constant"
|
||||||
|
times: 20
|
||||||
|
concurrency: 10
|
||||||
|
context:
|
||||||
|
users:
|
||||||
|
tenants: 5
|
||||||
|
users_per_tenant: 4
|
||||||
|
network: {}
|
||||||
|
quotas:
|
||||||
|
neutron:
|
||||||
|
network: -1
|
||||||
|
subnet: -1
|
||||||
|
pool: -1
|
||||||
|
vip: -1
|
||||||
|
sla:
|
||||||
|
failure_rate:
|
||||||
|
max: 0
|
||||||
|
|
||||||
NeutronNetworks.create_and_update_networks:
|
NeutronNetworks.create_and_update_networks:
|
||||||
-
|
-
|
||||||
args:
|
args:
|
||||||
|
@ -56,6 +56,10 @@ class NeutronQuotas(object):
|
|||||||
"pool": {
|
"pool": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"minimum": -1
|
"minimum": -1
|
||||||
|
},
|
||||||
|
"vip": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
from rally import consts
|
from rally import consts
|
||||||
from rally.plugins.openstack import scenario
|
from rally.plugins.openstack import scenario
|
||||||
from rally.plugins.openstack.scenarios.neutron import utils
|
from rally.plugins.openstack.scenarios.neutron import utils
|
||||||
|
from rally.task import atomic
|
||||||
from rally.task import validation
|
from rally.task import validation
|
||||||
|
|
||||||
|
|
||||||
@ -85,3 +86,30 @@ class NeutronLoadbalancerV1(utils.NeutronScenario):
|
|||||||
pools = self._create_v1_pools(networks, **pool_create_args)
|
pools = self._create_v1_pools(networks, **pool_create_args)
|
||||||
for pool in pools:
|
for pool in pools:
|
||||||
self._update_v1_pool(pool, **pool_update_args)
|
self._update_v1_pool(pool, **pool_update_args)
|
||||||
|
|
||||||
|
@validation.restricted_parameters(["pool_id", "subnet_id"],
|
||||||
|
subdict="vip_create_args")
|
||||||
|
@validation.required_neutron_extensions("lbaas")
|
||||||
|
@validation.required_services(consts.Service.NEUTRON)
|
||||||
|
@validation.required_openstack(admin=True)
|
||||||
|
@validation.required_contexts("network")
|
||||||
|
@scenario.configure(context={"cleanup": ["neutron"]})
|
||||||
|
def create_and_list_vips(self, pool_create_args=None,
|
||||||
|
vip_create_args=None):
|
||||||
|
"""Create a vip(v1) and then list vips(v1).
|
||||||
|
|
||||||
|
Measure the "neutron lb-vip-create" and "neutron lb-vip-list" command
|
||||||
|
performance. The scenario creates a vip for every pool created and
|
||||||
|
then lists vips.
|
||||||
|
|
||||||
|
:param vip_create_args: dict, POST /lb/vips request options
|
||||||
|
:param pool_create_args: dict, POST /lb/pools request options
|
||||||
|
"""
|
||||||
|
vip_create_args = vip_create_args or {}
|
||||||
|
pool_create_args = pool_create_args or {}
|
||||||
|
networks = self.context.get("tenant", {}).get("networks", [])
|
||||||
|
pools = self._create_v1_pools(networks, **pool_create_args)
|
||||||
|
with atomic.ActionTimer(self, "neutron.create_%s_vips" % len(pools)):
|
||||||
|
for pool in pools:
|
||||||
|
self._create_v1_vip(pool, **vip_create_args)
|
||||||
|
self._list_v1_vips()
|
||||||
|
@ -31,6 +31,7 @@ class NeutronScenario(scenario.OpenStackScenario):
|
|||||||
# TODO(rkiran): modify in case LBaaS-v2 requires
|
# TODO(rkiran): modify in case LBaaS-v2 requires
|
||||||
LB_METHOD = "ROUND_ROBIN"
|
LB_METHOD = "ROUND_ROBIN"
|
||||||
LB_PROTOCOL = "HTTP"
|
LB_PROTOCOL = "HTTP"
|
||||||
|
LB_PROTOCOL_PORT = 80
|
||||||
|
|
||||||
def _warn_about_deprecated_name_kwarg(self, resource, kwargs):
|
def _warn_about_deprecated_name_kwarg(self, resource, kwargs):
|
||||||
"""Warn about use of a deprecated 'name' kwarg and replace it.
|
"""Warn about use of a deprecated 'name' kwarg and replace it.
|
||||||
@ -347,3 +348,23 @@ class NeutronScenario(scenario.OpenStackScenario):
|
|||||||
self._warn_about_deprecated_name_kwarg(pool, pool_update_args)
|
self._warn_about_deprecated_name_kwarg(pool, pool_update_args)
|
||||||
body = {"pool": pool_update_args}
|
body = {"pool": pool_update_args}
|
||||||
return self.clients("neutron").update_pool(pool["pool"]["id"], body)
|
return self.clients("neutron").update_pool(pool["pool"]["id"], body)
|
||||||
|
|
||||||
|
def _create_v1_vip(self, pool, **vip_create_args):
|
||||||
|
"""Create VIP(v1)
|
||||||
|
|
||||||
|
:parm pool: dict, neutron lb-pool
|
||||||
|
:parm vip_create_args: dict, POST /lb/vips request options
|
||||||
|
:returns: dict, neutron lb vip
|
||||||
|
"""
|
||||||
|
args = {"protocol": self.LB_PROTOCOL,
|
||||||
|
"protocol_port": self.LB_PROTOCOL_PORT,
|
||||||
|
"name": self._generate_random_name("rally_vip_"),
|
||||||
|
"pool_id": pool["pool"]["id"],
|
||||||
|
"subnet_id": pool["pool"]["subnet_id"]}
|
||||||
|
args.update(vip_create_args)
|
||||||
|
return self.clients("neutron").create_vip({"vip": args})
|
||||||
|
|
||||||
|
@atomic.action_timer("neutron.list_vips")
|
||||||
|
def _list_v1_vips(self, **kwargs):
|
||||||
|
"""Return user lb vip list(v1)."""
|
||||||
|
return self.clients("neutron").list_vips(**kwargs)
|
||||||
|
@ -1035,6 +1035,7 @@ class FakeNeutronClient(object):
|
|||||||
self.__routers = {}
|
self.__routers = {}
|
||||||
self.__ports = {}
|
self.__ports = {}
|
||||||
self.__pools = {}
|
self.__pools = {}
|
||||||
|
self.__vips = {}
|
||||||
self.__tenant_id = kwargs.get("tenant_id", generate_uuid())
|
self.__tenant_id = kwargs.get("tenant_id", generate_uuid())
|
||||||
|
|
||||||
self.format = "json"
|
self.format = "json"
|
||||||
@ -1098,6 +1099,23 @@ class FakeNeutronClient(object):
|
|||||||
self.__pools[pool_id] = pool
|
self.__pools[pool_id] = pool
|
||||||
return {"pool": pool}
|
return {"pool": pool}
|
||||||
|
|
||||||
|
def create_vip(self, data):
|
||||||
|
vip = setup_dict(data["vip"],
|
||||||
|
required=["protocol_port", "protocol", "subnet_id",
|
||||||
|
"pool_id"],
|
||||||
|
defaults={"name": generate_name("vip_"),
|
||||||
|
"admin_state_up": True})
|
||||||
|
if (vip["subnet_id"] not in self.__subnets) or (vip["pool_id"] not in
|
||||||
|
self.__pools):
|
||||||
|
raise neutron_exceptions.NeutronClientException
|
||||||
|
vip_id = generate_uuid()
|
||||||
|
|
||||||
|
vip.update({"id": vip_id,
|
||||||
|
"status": "PENDING_CREATE",
|
||||||
|
"tenant_id": self.__tenant_id})
|
||||||
|
self.__vips[vip_id] = vip
|
||||||
|
return {"vip": vip}
|
||||||
|
|
||||||
def create_port(self, data):
|
def create_port(self, data):
|
||||||
port = setup_dict(data["port"],
|
port = setup_dict(data["port"],
|
||||||
required=["network_id"],
|
required=["network_id"],
|
||||||
@ -1234,6 +1252,10 @@ class FakeNeutronClient(object):
|
|||||||
pools = self._filter(self.__pools.values(), search_opts)
|
pools = self._filter(self.__pools.values(), search_opts)
|
||||||
return {"pools": pools}
|
return {"pools": pools}
|
||||||
|
|
||||||
|
def list_vips(self, **search_opts):
|
||||||
|
vips = self._filter(self.__vips.values(), search_opts)
|
||||||
|
return {"vips": vips}
|
||||||
|
|
||||||
def list_ports(self, **search_opts):
|
def list_ports(self, **search_opts):
|
||||||
ports = self._filter(self.__ports.values(), search_opts)
|
ports = self._filter(self.__ports.values(), search_opts)
|
||||||
return {"ports": ports}
|
return {"ports": ports}
|
||||||
|
@ -125,3 +125,36 @@ class NeutronLoadbalancerv1TestCase(test.TestCase):
|
|||||||
for pool in pools:
|
for pool in pools:
|
||||||
neutron_scenario._update_v1_pool.assert_called_once_with(
|
neutron_scenario._update_v1_pool.assert_called_once_with(
|
||||||
pool, **pool_update_args)
|
pool, **pool_update_args)
|
||||||
|
|
||||||
|
@ddt.data(
|
||||||
|
{},
|
||||||
|
{"vip_create_args": None},
|
||||||
|
{"vip_create_args": {}},
|
||||||
|
{"vip_create_args": {"name": "given-vip-name"}},
|
||||||
|
{"pool_create_args": None},
|
||||||
|
{"pool_create_args": {}},
|
||||||
|
{"pool_create_args": {"name": "given-pool-name"}},
|
||||||
|
)
|
||||||
|
@ddt.unpack
|
||||||
|
def test_create_and_list_vips(self, pool_create_args=None,
|
||||||
|
vip_create_args=None):
|
||||||
|
neutron_scenario = loadbalancer_v1.NeutronLoadbalancerV1(
|
||||||
|
self._get_context())
|
||||||
|
pools = [{
|
||||||
|
"pool": {
|
||||||
|
"id": "pool-id"
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
vip_data = vip_create_args or {}
|
||||||
|
pool_data = pool_create_args or {}
|
||||||
|
networks = self._get_context()["tenant"]["networks"]
|
||||||
|
neutron_scenario._create_v1_pools = mock.Mock(return_value=pools)
|
||||||
|
neutron_scenario._create_v1_vip = mock.Mock()
|
||||||
|
neutron_scenario._list_v1_vips = mock.Mock()
|
||||||
|
neutron_scenario.create_and_list_vips(
|
||||||
|
pool_create_args=pool_create_args, vip_create_args=vip_create_args)
|
||||||
|
neutron_scenario._create_v1_pools.assert_called_once_with(
|
||||||
|
networks, **pool_data)
|
||||||
|
neutron_scenario._create_v1_vip.assert_has_calls(
|
||||||
|
[mock.call(pool, **vip_data) for pool in pools])
|
||||||
|
neutron_scenario._list_v1_vips.assert_called_once_with()
|
||||||
|
@ -476,6 +476,16 @@ class NeutronScenarioTestCase(test.ScenarioTestCase):
|
|||||||
self._test_atomic_action_timer(scenario.atomic_actions(),
|
self._test_atomic_action_timer(scenario.atomic_actions(),
|
||||||
"neutron.list_pools")
|
"neutron.list_pools")
|
||||||
|
|
||||||
|
def test_list_v1_vips(self):
|
||||||
|
scenario = utils.NeutronScenario()
|
||||||
|
vips_list = []
|
||||||
|
vips_dict = {"vips": vips_list}
|
||||||
|
self.clients("neutron").list_vips.return_value = vips_dict
|
||||||
|
return_vips_dict = scenario._list_v1_vips()
|
||||||
|
self.assertEqual(vips_dict, return_vips_dict)
|
||||||
|
self._test_atomic_action_timer(scenario.atomic_actions(),
|
||||||
|
"neutron.list_vips")
|
||||||
|
|
||||||
|
|
||||||
class NeutronScenarioFunctionalTestCase(test.FakeClientsScenarioTestCase):
|
class NeutronScenarioFunctionalTestCase(test.FakeClientsScenarioTestCase):
|
||||||
|
|
||||||
@ -572,3 +582,29 @@ class NeutronLoadbalancerScenarioTestCase(test.ScenarioTestCase):
|
|||||||
if atomic_action:
|
if atomic_action:
|
||||||
self._test_atomic_action_timer(
|
self._test_atomic_action_timer(
|
||||||
neutron_scenario.atomic_actions(), "neutron.create_pool")
|
neutron_scenario.atomic_actions(), "neutron.create_pool")
|
||||||
|
|
||||||
|
@ddt.data(
|
||||||
|
{},
|
||||||
|
{"vip_create_args": {}},
|
||||||
|
{"vip_create_args": {"name": "given-name"}},
|
||||||
|
)
|
||||||
|
@ddt.unpack
|
||||||
|
def test__create_v1_vip(self, vip_create_args=None):
|
||||||
|
neutron_scenario = utils.NeutronScenario()
|
||||||
|
vip = {"vip": {"id": "vip-id"}}
|
||||||
|
pool = {"pool": {"id": "pool-id", "subnet_id": "subnet-id"}}
|
||||||
|
vip_create_args = vip_create_args or {}
|
||||||
|
if vip_create_args.get("name") is None:
|
||||||
|
neutron_scenario._generate_random_name = mock.Mock(
|
||||||
|
return_value="random_name")
|
||||||
|
self.clients("neutron").create_vip.return_value = vip
|
||||||
|
args = {"protocol_port": 80, "protocol": "HTTP", "name": "random_name",
|
||||||
|
"subnet_id": pool["pool"]["subnet_id"],
|
||||||
|
"pool_id": pool["pool"]["id"]}
|
||||||
|
args.update(vip_create_args)
|
||||||
|
expected_vip_data = {"vip": args}
|
||||||
|
resultant_vip = neutron_scenario._create_v1_vip(
|
||||||
|
pool, **vip_create_args)
|
||||||
|
self.assertEqual(resultant_vip, vip)
|
||||||
|
self.clients("neutron").create_vip.assert_called_once_with(
|
||||||
|
expected_vip_data)
|
||||||
|
Loading…
Reference in New Issue
Block a user