Using Neutron names in Sahara

Sahara Cluster benchmarks and Cluster context now works with
Neutron network name.

A resource type added to handle name to id conversion.

Some minor improvements are also done to test and context classes.

Change-Id: I8e567747c28630bc7c1efeb834947bf778c03e49
This commit is contained in:
Nikita Konovalov 2014-10-08 17:42:14 +04:00
parent 3230a3a89b
commit 2ed0cf0266
6 changed files with 88 additions and 11 deletions

View File

@ -18,6 +18,7 @@ from oslo.config import cfg
from rally.benchmark.context import base from rally.benchmark.context import base
from rally.benchmark.context.cleanup import utils as cleanup_utils from rally.benchmark.context.cleanup import utils as cleanup_utils
from rally.benchmark.scenarios.sahara import utils from rally.benchmark.scenarios.sahara import utils
from rally.benchmark import types
from rally.benchmark import utils as bench_utils from rally.benchmark import utils as bench_utils
from rally.openstack.common import log as logging from rally.openstack.common import log as logging
from rally import osclients from rally import osclients
@ -43,7 +44,7 @@ class SaharaCluster(base.Context):
"type": "string" "type": "string"
}, },
"hadoop_version": { "hadoop_version": {
"enum": ["1.2.1", "2.3.0", "2.4.1"] "type": "string",
}, },
"node_count": { "node_count": {
"type": "integer", "type": "integer",
@ -55,7 +56,7 @@ class SaharaCluster(base.Context):
"floating_ip_pool": { "floating_ip_pool": {
"type": "string", "type": "string",
}, },
"neutron_net_id": { "neutron_net": {
"type": "string", "type": "string",
}, },
"volumes_per_node": { "volumes_per_node": {
@ -96,6 +97,24 @@ class SaharaCluster(base.Context):
image_id = self.context["sahara_images"][tenant_id] image_id = self.context["sahara_images"][tenant_id]
neutron_net = self.config.get("neutron_net")
if not neutron_net:
# Skipping fixed network config
neutron_net_id = None
else:
network_cfg = {"name": neutron_net}
neutron_net_id = (types.NeutronNetworkResourceType
.transform(clients, network_cfg))
floating_ip_pool = self.config.get("floating_ip_pool")
if not floating_ip_pool:
# Skipping floating network config
floating_ip_pool_id = None
else:
network_cfg = {"name": floating_ip_pool}
floating_ip_pool_id = (types.NeutronNetworkResourceType
.transform(clients, network_cfg))
cluster = utils.SaharaScenario( cluster = utils.SaharaScenario(
context=self.context, clients=clients)._launch_cluster( context=self.context, clients=clients)._launch_cluster(
plugin_name=self.config["plugin_name"], plugin_name=self.config["plugin_name"],
@ -103,8 +122,8 @@ class SaharaCluster(base.Context):
flavor_id=self.config["flavor_id"], flavor_id=self.config["flavor_id"],
node_count=self.config["node_count"], node_count=self.config["node_count"],
image_id=image_id, image_id=image_id,
floating_ip_pool=self.config.get("floating_ip_pool"), floating_ip_pool=floating_ip_pool_id,
neutron_net_id=self.config.get("neutron_net_id"), neutron_net_id=neutron_net_id,
volumes_per_node=self.config.get("volumes_per_node"), volumes_per_node=self.config.get("volumes_per_node"),
volumes_size=self.config.get("volumes_size", 1), volumes_size=self.config.get("volumes_size", 1),
node_configs=self.config.get("node_configs"), node_configs=self.config.get("node_configs"),

View File

@ -25,7 +25,9 @@ LOG = logging.getLogger(__name__)
class SaharaClusters(utils.SaharaScenario): class SaharaClusters(utils.SaharaScenario):
@types.set(flavor=types.FlavorResourceType) @types.set(flavor=types.FlavorResourceType,
neutron_net=types.NeutronNetworkResourceType,
floating_ip_pool=types.NeutronNetworkResourceType)
@validation.flavor_exists('flavor') @validation.flavor_exists('flavor')
@validation.required_contexts("users", "sahara_image") @validation.required_contexts("users", "sahara_image")
@validation.number("node_count", minval=2, integer_only=True) @validation.number("node_count", minval=2, integer_only=True)
@ -34,7 +36,7 @@ class SaharaClusters(utils.SaharaScenario):
@base.scenario(context={"cleanup": ["sahara"]}) @base.scenario(context={"cleanup": ["sahara"]})
def create_and_delete_cluster(self, flavor, node_count, plugin_name, def create_and_delete_cluster(self, flavor, node_count, plugin_name,
hadoop_version, floating_ip_pool=None, hadoop_version, floating_ip_pool=None,
neutron_net_id=None, volumes_per_node=None, neutron_net=None, volumes_per_node=None,
volumes_size=None, node_configs=None, volumes_size=None, node_configs=None,
cluster_configs=None): cluster_configs=None):
"""Test the Sahara Cluster launch and delete commands. """Test the Sahara Cluster launch and delete commands.
@ -52,7 +54,7 @@ class SaharaClusters(utils.SaharaScenario):
IPs will be allocated. Sahara will determine automatically how to treat IPs will be allocated. Sahara will determine automatically how to treat
this depending on it's own configurations. Defaults to None because in this depending on it's own configurations. Defaults to None because in
some cases Sahara may work w/o Floating IPs. some cases Sahara may work w/o Floating IPs.
:param neutron_net_id: The id of a Neutron network that :param neutron_net: The id or name of a Neutron network that
will be used for fixed IPs. This parameter is ignored when Nova Network will be used for fixed IPs. This parameter is ignored when Nova Network
is set up. is set up.
:param volumes_per_node: The number of Cinder volumes that will be :param volumes_per_node: The number of Cinder volumes that will be
@ -76,7 +78,7 @@ class SaharaClusters(utils.SaharaScenario):
plugin_name=plugin_name, plugin_name=plugin_name,
hadoop_version=hadoop_version, hadoop_version=hadoop_version,
floating_ip_pool=floating_ip_pool, floating_ip_pool=floating_ip_pool,
neutron_net_id=neutron_net_id, neutron_net_id=neutron_net,
volumes_per_node=volumes_per_node, volumes_per_node=volumes_per_node,
volumes_size=volumes_size, volumes_size=volumes_size,
node_configs=node_configs, node_configs=node_configs,

View File

@ -189,7 +189,7 @@ class SaharaScenario(base.Scenario):
:param floating_ip_pool: The floating ip pool name from which Floating :param floating_ip_pool: The floating ip pool name from which Floating
IPs will be allocated IPs will be allocated
:param neutron_net_id: The network id to allocate Fixed IPs :param neutron_net_id: The network id to allocate Fixed IPs
from when Neutron is enabled for networking from, when Neutron is enabled for networking
:param volumes_per_node: The number of Cinder volumes that will be :param volumes_per_node: The number of Cinder volumes that will be
attached to every cluster node attached to every cluster node
:param volumes_size: The size of each Cinder volume in GB :param volumes_size: The size of each Cinder volume in GB
@ -251,7 +251,6 @@ class SaharaScenario(base.Scenario):
# cluster_configs parameter can override it # cluster_configs parameter can override it
merged_cluster_configs = self._merge_configs(replication_config, merged_cluster_configs = self._merge_configs(replication_config,
cluster_configs) cluster_configs)
cluster_object = self.clients("sahara").clusters.create( cluster_object = self.clients("sahara").clusters.create(
name=name, name=name,
plugin_name=plugin_name, plugin_name=plugin_name,

View File

@ -177,3 +177,28 @@ class VolumeTypeResourceType(ResourceType):
volume_types.list(), volume_types.list(),
typename='volume_type') typename='volume_type')
return resource_id return resource_id
class NeutronNetworkResourceType(ResourceType):
@classmethod
def transform(cls, clients, resource_config):
"""Transform the resource config to id.
:param clients: openstack admin client handles
:param resource_config: scenario config with `id`, `name` or `regex`
:returns: id matching resource
"""
resource_id = resource_config.get('id')
if resource_id:
return resource_id
else:
neutronclient = clients.neutron()
for net in neutronclient.list_networks()["networks"]:
if net["name"] == resource_config.get("name"):
return net["id"]
raise exceptions.InvalidScenarioArgument(
"Neutron network with name '{name}' not found".format(
name=resource_config.get("name")))

View File

@ -22,7 +22,7 @@ SAHARA_CLUSTERS = "rally.benchmark.scenarios.sahara.clusters.SaharaClusters"
SAHARA_UTILS = 'rally.benchmark.scenarios.sahara.utils' SAHARA_UTILS = 'rally.benchmark.scenarios.sahara.utils'
class SaharaNodeGroupTemplatesTestCase(test.TestCase): class SaharaClustersTestCase(test.TestCase):
@mock.patch(SAHARA_CLUSTERS + "._delete_cluster") @mock.patch(SAHARA_CLUSTERS + "._delete_cluster")
@mock.patch(SAHARA_CLUSTERS + "._launch_cluster", @mock.patch(SAHARA_CLUSTERS + "._launch_cluster",

View File

@ -169,6 +169,38 @@ class VolumeTypeResourceTypeTestCase(test.TestCase):
self.clients, resource_config) self.clients, resource_config)
class NeutronNetworkResourceTypeTestCase(test.TestCase):
def setUp(self):
super(NeutronNetworkResourceTypeTestCase, self).setUp()
self.clients = fakes.FakeClients()
net1_data = {"network": {
"name": "net1"
}}
network1 = self.clients.neutron().create_network(net1_data)
self.net1_id = network1["network"]["id"]
def test_transform_by_id(self):
resource_config = {"id": self.net1_id}
network_id = types.NeutronNetworkResourceType.transform(
clients=self.clients,
resource_config=resource_config)
self.assertEqual(network_id, self.net1_id)
def test_transform_by_name(self):
resource_config = {"name": "net1"}
network_id = types.NeutronNetworkResourceType.transform(
clients=self.clients,
resource_config=resource_config)
self.assertEqual(network_id, self.net1_id)
def test_transform_by_name_no_match(self):
resource_config = {"name": "nomatch-1"}
self.assertRaises(exceptions.InvalidScenarioArgument,
types.NeutronNetworkResourceType.transform,
self.clients, resource_config)
class PreprocessTestCase(test.TestCase): class PreprocessTestCase(test.TestCase):
@mock.patch("rally.benchmark.types.base.Scenario.meta") @mock.patch("rally.benchmark.types.base.Scenario.meta")