Let TempestResourcesContext implements utils.RandomNameGeneratorMixin

TempestResourcesContext calls NeutronWrapper.create_network, and it will
be called to generate random name, so it needs to implements
utils.RandomNameGeneratorMixin
Changed generate_random_name to use self.task["uuid"] or
self.verification["uuid"] as task_id
This patch also refactor test__create_network_resources to test the
logic correctly

Change-Id: I8c145073386cb7f668461e050fe8de75f4675def
Closes-Bug: #1530770
This commit is contained in:
Bo Chi 2016-01-06 06:11:53 -05:00
parent bc2c7e469c
commit aaa561853b
5 changed files with 43 additions and 15 deletions

View File

@ -231,9 +231,10 @@ class RandomNameGeneratorMixin(object):
This mixin provides one method,
``generate_random_name()``. Classes that include it must provide a
``self.task`` attribute that references a task dict. Classes that
use this mixin may set two class variables to alter the behavior
of ``generate_random_name()``:
``self.task`` attribute that references a task dict or a
``self.verification`` attribute that references a verification dict.
Classes that use this mixin may set two class variables to alter the
behavior of ``generate_random_name()``:
* ``RESOURCE_NAME_FORMAT``: A mktemp(1)-like format string that
will be used to pattern the generated random string. It must
@ -273,7 +274,10 @@ class RandomNameGeneratorMixin(object):
:returns: str, pseudo-random name
"""
task_id = self.task["uuid"]
if hasattr(self, "task"):
task_id = self.task["uuid"]
elif hasattr(self, "verification"):
task_id = self.verification["uuid"]
match = _resource_name_placeholder_re.match(self.RESOURCE_NAME_FORMAT)
if match is None:

View File

@ -267,14 +267,18 @@ class TempestConfig(utils.RandomNameGeneratorMixin):
_write_config(conf_path, self.conf)
class TempestResourcesContext(object):
class TempestResourcesContext(utils.RandomNameGeneratorMixin):
"""Context class to create/delete resources needed for Tempest."""
def __init__(self, deployment, conf_path):
RESOURCE_NAME_FORMAT = "rally_verify_XXXXXXXX_XXXXXXXX"
def __init__(self, deployment, verification, conf_path):
credential = db.deployment_get(deployment)["admin"]
self.clients = osclients.Clients(objects.Credential(**credential))
self.available_services = self.clients.services().values()
self.verification = verification
self.conf_path = conf_path
self.conf = configparser.ConfigParser()
self.conf.read(conf_path)

View File

@ -347,7 +347,8 @@ class Tempest(object):
LOG.debug("Test(s) started by the command: %s" % test_cmd)
# Create all resources needed for Tempest before running tests.
# Once tests finish, all created resources will be deleted.
with config.TempestResourcesContext(self.deployment, self.config_file):
with config.TempestResourcesContext(
self.deployment, self.verification, self.config_file):
# Run tests
subprocess.check_call(test_cmd, cwd=self.path(),
env=self.env, shell=True)

View File

@ -240,6 +240,15 @@ class RandomNameTestCase(test.TestCase):
mock_choice.side_effect = iter("blarglesdweebled")
self.assertEqual(generator.generate_random_name(), expected)
class FakeNameGenerator(utils.RandomNameGeneratorMixin):
RESOURCE_NAME_FORMAT = fmt
verification = {"uuid": task_id}
generator = FakeNameGenerator()
mock_choice.side_effect = iter("blarglesdweebled")
self.assertEqual(generator.generate_random_name(), expected)
def test_generate_random_name_bogus_name_format(self):
class FakeNameGenerator(utils.RandomNameGeneratorMixin):
RESOURCE_NAME_FORMAT = "invalid_XXX_format"

View File

@ -314,7 +314,9 @@ class TempestResourcesContextTestCase(test.TestCase):
return_value=CREDS).start()
mock.patch("rally.osclients.Clients").start()
fake_verification = {"uuid": "uuid"}
self.context = config.TempestResourcesContext("fake_deployment",
fake_verification,
"/fake/path/to/config")
self.context.conf.add_section("compute")
self.context.conf.add_section("orchestration")
@ -392,16 +394,24 @@ class TempestResourcesContextTestCase(test.TestCase):
self.assertEqual("id1", flavor.id)
self.assertEqual("id1", self.context._created_flavors[0].id)
@mock.patch("rally.plugins.openstack.wrappers."
"network.NeutronWrapper.create_network")
def test__create_network_resources(
self, mock_neutron_wrapper_create_network):
mock_neutron_wrapper_create_network.side_effect = [
fakes.FakeNetwork(id="id1")]
def test__create_network_resources(self):
client = self.context.clients.neutron()
fake_network = {
"id": "nid1",
"name": "network",
"status": "status"}
client.create_network.side_effect = [{"network": fake_network}]
client.create_router.side_effect = [{"router": {"id": "rid1"}}]
client.create_subnet.side_effect = [{"subnet": {"id": "subid1"}}]
network = self.context._create_network_resources()
self.assertEqual("id1", network.id)
self.assertEqual("id1", self.context._created_networks[0].id)
self.assertEqual("nid1", network["id"])
self.assertEqual("nid1", self.context._created_networks[0]["id"])
self.assertEqual("rid1",
self.context._created_networks[0]["router_id"])
self.assertEqual("subid1",
self.context._created_networks[0]["subnets"][0])
def test__cleanup_tempest_roles(self):
self.context._created_roles = [fakes.FakeRole(), fakes.FakeRole()]