Add NovaServerGroups.create_and_delete_server_group

Create a server group, then delete it.

Measure the "nova server-group-create" and "nova server-group-delete"
command performance.

Change-Id: I47cea5651f68dfb3d0b3e8bcb7889700d5087657
This commit is contained in:
maxinjian
2017-02-21 15:09:03 -05:00
parent 6615873983
commit 0127c51f6b
11 changed files with 239 additions and 63 deletions

View File

@@ -185,8 +185,7 @@
{% for s in (["affinity"], ["anti-affinity"]) %} {% for s in (["affinity"], ["anti-affinity"]) %}
- -
args: args:
kwargs: policies: {{s}}
policies: {{s}}
runner: runner:
type: "constant" type: "constant"
times: 4 times: 4
@@ -204,8 +203,7 @@
{% for s in (["affinity"], ["anti-affinity"]) %} {% for s in (["affinity"], ["anti-affinity"]) %}
- -
args: args:
kwargs: policies: {{s}}
policies: {{s}}
all_projects: false all_projects: false
runner: runner:
type: "constant" type: "constant"
@@ -220,6 +218,24 @@
max: 0 max: 0
{% endfor %} {% endfor %}
NovaServerGroups.create_and_delete_server_group:
{% for s in (["affinity"], ["anti-affinity"]) %}
-
args:
policies: {{s}}
runner:
type: "constant"
times: 4
concurrency: 2
context:
users:
tenants: 2
users_per_tenant: 2
sla:
failure_rate:
max: 0
{% endfor %}
NovaServers.suspend_and_resume_server: NovaServers.suspend_and_resume_server:
- -
args: args:

View File

@@ -13,12 +13,16 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from rally.common import logging
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.nova import utils from rally.plugins.openstack.scenarios.nova import utils
from rally.task import validation from rally.task import validation
LOG = logging.getLogger(__name__)
"""Scenarios for Nova Group servers.""" """Scenarios for Nova Group servers."""
@@ -29,17 +33,26 @@ from rally.task import validation
platform="openstack") platform="openstack")
class CreateAndListServerGroups(utils.NovaScenario): class CreateAndListServerGroups(utils.NovaScenario):
def run(self, all_projects=False, kwargs=None): def run(self, policies=None, all_projects=False, kwargs=None):
"""Create a server group, then list all server groups. """Create a server group, then list all server groups.
Measure the "nova server-group-create" and "nova server-group-list" Measure the "nova server-group-create" and "nova server-group-list"
command performance. command performance.
:param policies: Server group policy
:param all_projects: If True, display server groups from all :param all_projects: If True, display server groups from all
projects(Admin only) projects(Admin only)
:param kwargs: Server group name and policy :param kwargs: The server group specifications to add.
DEPRECATED, specify arguments explicitly.
""" """
kwargs["name"] = self.generate_random_name() if kwargs is None:
kwargs = {
"policies": policies
}
else:
LOG.warning("The argument `kwargs` is deprecated since"
" Rally 0.10.0. Specify all arguments from it"
" explicitly.")
server_group = self._create_server_group(**kwargs) server_group = self._create_server_group(**kwargs)
msg = ("Server Groups isn't created") msg = ("Server Groups isn't created")
self.assertTrue(server_group, err_msg=msg) self.assertTrue(server_group, err_msg=msg)
@@ -59,18 +72,59 @@ class CreateAndListServerGroups(utils.NovaScenario):
platform="openstack") platform="openstack")
class CreateAndGetServerGroup(utils.NovaScenario): class CreateAndGetServerGroup(utils.NovaScenario):
def run(self, kwargs=None): def run(self, policies=None, kwargs=None):
"""Create a server group, then get its detailed information. """Create a server group, then get its detailed information.
Measure the "nova server-group-create" and "nova server-group-get" Measure the "nova server-group-create" and "nova server-group-get"
command performance. command performance.
:param kwargs: Server group name and policy :param policies: Server group policy
:param kwargs: The server group specifications to add.
DEPRECATED, specify arguments explicitly.
""" """
kwargs["name"] = self.generate_random_name() if kwargs is None:
kwargs = {
"policies": policies
}
else:
LOG.warning("The argument `kwargs` is deprecated since"
" Rally 0.10.0. Specify all arguments from it"
" explicitly.")
server_group = self._create_server_group(**kwargs) server_group = self._create_server_group(**kwargs)
msg = ("Server Groups isn't created") msg = ("Server Groups isn't created")
self.assertTrue(server_group, err_msg=msg) self.assertTrue(server_group, err_msg=msg)
server_group_info = self._get_server_group(server_group.id) server_group_info = self._get_server_group(server_group.id)
self.assertEqual(server_group.id, server_group_info.id) self.assertEqual(server_group.id, server_group_info.id)
@validation.add("required_services", services=[consts.Service.NOVA])
@validation.add("required_platform", platform="openstack", users=True)
@scenario.configure(context={"cleanup": ["nova"]},
name="NovaServerGroups.create_and_delete_server_group",
platform="openstack")
class CreateAndDeleteServerGroup(utils.NovaScenario):
def run(self, policies=None, kwargs=None):
"""Create a server group, then delete it.
Measure the "nova server-group-create" and "nova server-group-delete"
command performance.
:param policies: Server group policy
:param kwargs: The server group specifications to add.
DEPRECATED, specify arguments explicitly.
"""
if kwargs is None:
kwargs = {
"policies": policies
}
else:
LOG.warning("The argument `kwargs` is deprecated since"
" Rally 0.10.0. Specify all arguments from it"
" explicitly.")
server_group = self._create_server_group(**kwargs)
msg = ("Server Group isn't created")
self.assertTrue(server_group, err_msg=msg)
self._delete_server_group(server_group.id)

View File

@@ -418,11 +418,13 @@ class NovaScenario(scenario.OpenStackScenario):
def _create_server_group(self, **kwargs): def _create_server_group(self, **kwargs):
"""Create (allocate) a server group. """Create (allocate) a server group.
:param kwargs: Server group name and policy :param kwargs: Optional additional arguments for Server group creating
:returns: Nova server group :returns: Nova server group
""" """
return self.clients("nova").server_groups.create(**kwargs) group_name = self.generate_random_name()
return self.clients("nova").server_groups.create(name=group_name,
**kwargs)
@atomic.action_timer("nova.get_server_group") @atomic.action_timer("nova.get_server_group")
def _get_server_group(self, id): def _get_server_group(self, id):
@@ -448,6 +450,16 @@ class NovaScenario(scenario.OpenStackScenario):
else: else:
return self.clients("nova").server_groups.list(all_projects) return self.clients("nova").server_groups.list(all_projects)
@atomic.action_timer("nova.delete_server_group")
def _delete_server_group(self, group_id):
"""Delete a specific server group.
:param id: The ID of the :class:`ServerGroup` to delete
:returns: An instance of novaclient.base.TupleWithMeta
"""
return self.clients("nova").server_groups.delete(group_id)
@atomic.action_timer("nova.delete_image") @atomic.action_timer("nova.delete_image")
def _delete_image(self, image): def _delete_image(self, image):
"""Delete the given image. """Delete the given image.

View File

@@ -0,0 +1,27 @@
{
"NovaServerGroups.create_and_delete_server_group": [
{
"args": {
"policies": [
"affinity"
]
},
"context": {
"users": {
"tenants": 2,
"users_per_tenant": 2
}
},
"runner": {
"concurrency": 2,
"times": 4,
"type": "constant"
},
"sla": {
"failure_rate": {
"max": 0
}
}
}
]
}

View File

@@ -0,0 +1,15 @@
NovaServerGroups.create_and_delete_server_group:
-
args:
policies: ["affinity"]
runner:
type: "constant"
times: 4
concurrency: 2
context:
users:
tenants: 2
users_per_tenant: 2
sla:
failure_rate:
max: 0

View File

@@ -2,11 +2,9 @@
"NovaServerGroups.create_and_get_server_group": [ "NovaServerGroups.create_and_get_server_group": [
{ {
"args": { "args": {
"kwargs": { "policies": [
"policies": [ "affinity"
"affinity" ]
]
}
}, },
"runner": { "runner": {
"type": "constant", "type": "constant",

View File

@@ -1,8 +1,7 @@
NovaServerGroups.create_and_get_server_group: NovaServerGroups.create_and_get_server_group:
- -
args: args:
kwargs: policies: ["affinity"]
policies: ["affinity"]
runner: runner:
type: "constant" type: "constant"
times: 4 times: 4

View File

@@ -2,11 +2,9 @@
"NovaServerGroups.create_and_list_server_groups": [ "NovaServerGroups.create_and_list_server_groups": [
{ {
"args": { "args": {
"kwargs": { "policies": [
"policies": [ "affinity"
"affinity" ],
]
},
"all_projects": false "all_projects": false
}, },
"runner": { "runner": {

View File

@@ -1,8 +1,7 @@
NovaServerGroups.create_and_list_server_groups: NovaServerGroups.create_and_list_server_groups:
- -
args: args:
kwargs: policies: ["affinity"]
policies: ["affinity"]
all_projects: false all_projects: false
runner: runner:
type: "constant" type: "constant"

View File

@@ -29,92 +29,136 @@ class NovaServerGroupsTestCase(test.ScenarioTestCase):
def test_create_and_list_server_groups(self): def test_create_and_list_server_groups(self):
scenario = server_groups.CreateAndListServerGroups(self.context) scenario = server_groups.CreateAndListServerGroups(self.context)
gen_name = mock.MagicMock()
scenario.generate_random_name = gen_name
all_projects = False
create_args = {"policies": ["fake_policy"]}
fake_server_group = mock.MagicMock() fake_server_group = mock.MagicMock()
all_projects = False
scenario._create_server_group = mock.MagicMock() scenario._create_server_group = mock.MagicMock()
scenario._list_server_groups = mock.MagicMock() scenario._list_server_groups = mock.MagicMock()
scenario._list_server_groups.return_value = [mock.MagicMock(), scenario._list_server_groups.return_value = [mock.MagicMock(),
fake_server_group, fake_server_group,
mock.MagicMock()] mock.MagicMock()]
# Positive case # Positive case and kwargs is None
scenario._create_server_group.return_value = fake_server_group scenario._create_server_group.return_value = fake_server_group
scenario.run(kwargs=create_args) scenario.run(policies="fake_policy", all_projects=False, kwargs=None)
scenario._create_server_group.assert_called_once_with(**create_args) kwargs = {
"policies": "fake_policy"
}
scenario._create_server_group.assert_called_once_with(**kwargs)
scenario._list_server_groups.assert_called_once_with(all_projects) scenario._list_server_groups.assert_called_once_with(all_projects)
# Positive case and kwargs is not None
foo_kwargs = {
"policies": "fake_policy"
}
scenario._create_server_group.return_value = fake_server_group
scenario.run(policies=None, all_projects=False,
kwargs=foo_kwargs)
scenario._create_server_group.assert_called_with(**foo_kwargs)
scenario._list_server_groups.assert_called_with(all_projects)
# Negative case1: server group isn't created # Negative case1: server group isn't created
scenario._create_server_group.return_value = None scenario._create_server_group.return_value = None
self.assertRaises(rally_exceptions.RallyAssertionError, self.assertRaises(rally_exceptions.RallyAssertionError,
scenario.run, scenario.run,
kwargs=create_args) **kwargs)
scenario._create_server_group.assert_called_with(**create_args) scenario._create_server_group.assert_called_with(**kwargs)
# Negative case2: server group not in the list of available server # Negative case2: server group not in the list of available server
# groups # groups
scenario._create_server_group.return_value = mock.MagicMock() scenario._create_server_group.return_value = mock.MagicMock()
self.assertRaises(rally_exceptions.RallyAssertionError, self.assertRaises(rally_exceptions.RallyAssertionError,
scenario.run, scenario.run,
kwargs=create_args) **kwargs)
scenario._create_server_group.assert_called_with(**create_args) scenario._create_server_group.assert_called_with(**kwargs)
scenario._list_server_groups.assert_called_with(all_projects) scenario._list_server_groups.assert_called_with(all_projects)
@ddt.data( def test_create_and_get_server_group_positive(self):
{},
{"create_args": {"policies": ["fake_policy"]}}
)
@ddt.unpack
def test_create_and_get_server_group_positive(self, create_args=None):
scenario = server_groups.CreateAndGetServerGroup(self.context) scenario = server_groups.CreateAndGetServerGroup(self.context)
gen_name = mock.MagicMock()
scenario.generate_random_name = gen_name
fake_server_group = mock.MagicMock() fake_server_group = mock.MagicMock()
fake_server_group_info = mock.MagicMock() fake_server_group_info = mock.MagicMock()
fake_server_group.id = 123 fake_server_group.id = 123
fake_server_group_info.id = 123 fake_server_group_info.id = 123
scenario._create_server_group = mock.MagicMock() scenario._create_server_group = mock.MagicMock()
scenario._get_server_group = mock.MagicMock() scenario._get_server_group = mock.MagicMock()
create_args = create_args or {} # Positive case and kwargs is None
# Positive case kwargs = {
"policies": "fake_policy"
}
scenario._create_server_group.return_value = fake_server_group scenario._create_server_group.return_value = fake_server_group
scenario._get_server_group.return_value = fake_server_group_info scenario._get_server_group.return_value = fake_server_group_info
scenario.run(create_args) scenario.run(policies="fake_policy", kwargs=None)
scenario._create_server_group.assert_called_once_with(**create_args) scenario._create_server_group.assert_called_once_with(**kwargs)
scenario._get_server_group.assert_called_once_with( scenario._get_server_group.assert_called_once_with(
fake_server_group.id) fake_server_group.id)
@ddt.data( # Positive case and kwargs is not None
{}, scenario._create_server_group.return_value = fake_server_group
{"create_args": {"policies": ["fake_policy"]}} scenario._get_server_group.return_value = fake_server_group_info
) foo_kwargs = {
@ddt.unpack "policies": "fake_policy"
def test_create_and_get_server_group_negative(self, create_args=None): }
scenario.run(policies=None, kwargs=foo_kwargs)
scenario._create_server_group.assert_called_with(**foo_kwargs)
scenario._get_server_group.assert_called_with(
fake_server_group.id)
def test_create_and_get_server_group_negative(self):
scenario = server_groups.CreateAndGetServerGroup(self.context) scenario = server_groups.CreateAndGetServerGroup(self.context)
gen_name = mock.MagicMock()
scenario.generate_random_name = gen_name
fake_server_group = mock.MagicMock() fake_server_group = mock.MagicMock()
fake_server_group_info = mock.MagicMock() fake_server_group_info = mock.MagicMock()
fake_server_group.id = 123 fake_server_group.id = 123
fake_server_group_info.id = 123 fake_server_group_info.id = 123
kwargs = {
"policies": "fake_policy"
}
scenario._create_server_group = mock.MagicMock() scenario._create_server_group = mock.MagicMock()
scenario._get_server_group = mock.MagicMock() scenario._get_server_group = mock.MagicMock()
create_args = create_args or {}
# Negative case1: server group isn't created # Negative case1: server group isn't created
scenario._create_server_group.return_value = None scenario._create_server_group.return_value = None
self.assertRaises(rally_exceptions.RallyAssertionError, self.assertRaises(rally_exceptions.RallyAssertionError,
scenario.run, scenario.run,
create_args) **kwargs)
scenario._create_server_group.assert_called_with(**create_args) scenario._create_server_group.assert_called_with(**kwargs)
# Negative case2: server group to get information not the created one # Negative case2: server group to get information not the created one
fake_server_group_info.id = 456 fake_server_group_info.id = 456
scenario._create_server_group.return_value = fake_server_group scenario._create_server_group.return_value = fake_server_group
self.assertRaises(rally_exceptions.RallyAssertionError, self.assertRaises(rally_exceptions.RallyAssertionError,
scenario.run, scenario.run,
create_args) **kwargs)
scenario._create_server_group.assert_called_with(**create_args) scenario._create_server_group.assert_called_with(**kwargs)
scenario._get_server_group.assert_called_with( scenario._get_server_group.assert_called_with(
fake_server_group.id) fake_server_group.id)
def test_create_and_delete_server_group(self):
scenario = server_groups.CreateAndDeleteServerGroup(self.context)
fake_server_group = mock.MagicMock()
scenario._create_server_group = mock.MagicMock()
scenario._delete_server_group = mock.MagicMock()
# Positive case and kwargs is None
kwargs = {
"policies": "fake_policy"
}
scenario._create_server_group.return_value = fake_server_group
scenario.run(policies="fake_policy", kwargs=None)
scenario._create_server_group.assert_called_once_with(**kwargs)
scenario._delete_server_group.assert_called_once_with(
fake_server_group.id)
# Positive case and kwargs is not None
scenario._create_server_group.return_value = fake_server_group
foo_kwargs = {
"policies": "fake_policy"
}
scenario.run(policies=None, kwargs=foo_kwargs)
scenario._create_server_group.assert_called_with(**foo_kwargs)
scenario._delete_server_group.assert_called_with(
fake_server_group.id)
# Negative case: server group isn't created
scenario._create_server_group.return_value = None
self.assertRaises(rally_exceptions.RallyAssertionError,
scenario.run,
**kwargs)
scenario._create_server_group.assert_called_with(**kwargs)

View File

@@ -767,15 +767,29 @@ class NovaScenarioTestCase(test.ScenarioTestCase):
def test__create_server_group(self): def test__create_server_group(self):
nova_scenario = utils.NovaScenario() nova_scenario = utils.NovaScenario()
nova_scenario.generate_random_name = mock.Mock(
return_value="random_name")
result = nova_scenario._create_server_group(fakeargs="fakeargs") result = nova_scenario._create_server_group(fakeargs="fakeargs")
self.assertEqual( self.assertEqual(
self.clients("nova").server_groups.create.return_value, self.clients("nova").server_groups.create.return_value,
result) result)
self.clients("nova").server_groups.create.assert_called_once_with( self.clients("nova").server_groups.create.assert_called_once_with(
fakeargs="fakeargs") name="random_name", fakeargs="fakeargs")
self._test_atomic_action_timer(nova_scenario.atomic_actions(), self._test_atomic_action_timer(nova_scenario.atomic_actions(),
"nova.create_server_group") "nova.create_server_group")
def test__delete_server_group(self):
nova_scenario = utils.NovaScenario()
fakeid = 12345
result = nova_scenario._delete_server_group(fakeid)
self.assertEqual(
self.clients("nova").server_groups.delete.return_value,
result)
self.clients("nova").server_groups.delete.assert_called_once_with(
fakeid)
self._test_atomic_action_timer(nova_scenario.atomic_actions(),
"nova.delete_server_group")
def test__list_server_groups(self): def test__list_server_groups(self):
nova_scenario = utils.NovaScenario() nova_scenario = utils.NovaScenario()
result1 = nova_scenario._list_server_groups(all_projects=False) result1 = nova_scenario._list_server_groups(all_projects=False)