diff --git a/rally/plugins/openstack/scenarios/nova/utils.py b/rally/plugins/openstack/scenarios/nova/utils.py index 21e579ea..758539a1 100644 --- a/rally/plugins/openstack/scenarios/nova/utils.py +++ b/rally/plugins/openstack/scenarios/nova/utils.py @@ -102,11 +102,8 @@ class NovaScenario(scenario.OpenStackScenario): nets = [net["id"] for net in ctxt.get("tenant", {}).get("networks", [])] if nets: - # NOTE(amaretskiy): Balance servers among networks: - # divmod(iteration % tenants_num, nets_num)[1] - net_idx = divmod( - (ctxt["iteration"] % ctxt["config"]["users"]["tenants"]), - len(nets))[1] + # NOTE(amaretskiy): Balance servers among networks. + net_idx = self.context["iteration"] % len(nets) return [{"net-id": nets[net_idx]}] @atomic.action_timer("nova.boot_server") diff --git a/tests/unit/plugins/openstack/scenarios/nova/test_utils.py b/tests/unit/plugins/openstack/scenarios/nova/test_utils.py index e7f2f440..a4fb19c7 100644 --- a/tests/unit/plugins/openstack/scenarios/nova/test_utils.py +++ b/tests/unit/plugins/openstack/scenarios/nova/test_utils.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import ddt import mock from oslo_config import cfg @@ -26,6 +27,7 @@ NOVA_UTILS = "rally.plugins.openstack.scenarios.nova.utils" CONF = cfg.CONF +@ddt.ddt class NovaScenarioTestCase(test.ScenarioTestCase): def setUp(self): @@ -49,8 +51,7 @@ class NovaScenarioTestCase(test.ScenarioTestCase): def test__pick_random_nic(self): context = {"tenant": {"networks": [{"id": "net_id_1"}, {"id": "net_id_2"}]}, - "iteration": 0, - "config": {"users": {"tenants": 2}}} + "iteration": 0} nova_scenario = utils.NovaScenario(context=context) nic1 = nova_scenario._pick_random_nic() self.assertEqual(nic1, [{"net-id": "net_id_1"}]) @@ -67,41 +68,33 @@ class NovaScenarioTestCase(test.ScenarioTestCase): # balance again, get net 1 self.assertEqual(nic3, [{"net-id": "net_id_1"}]) - @mock.patch(NOVA_UTILS + ".NovaScenario._generate_random_name", - return_value="foo_server_name") - def test__boot_server(self, mock__generate_random_name): + @ddt.data( + {}, + {"kwargs": {"auto_assign_nic": True}}, + {"kwargs": {"auto_assign_nic": True, "nics": [{"net-id": "baz_id"}]}}, + {"context": {"user": {"secgroup": {"name": "test"}}}}, + {"context": {"user": {"secgroup": {"name": "new"}}}, + "kwargs": {"security_groups": ["test"]}}, + {"context": {"user": {"secgroup": {"name": "test1"}}}, + "kwargs": {"security_groups": ["test1"]}}, + ) + @ddt.unpack + def test__boot_server(self, context=None, kwargs=None): self.clients("nova").servers.create.return_value = self.server - nova_scenario = utils.NovaScenario(context={}) - return_server = nova_scenario._boot_server("image_id", - "flavor_id") - self.mock_wait_for.mock.assert_called_once_with( - self.server, - is_ready=self.mock_resource_is.mock.return_value, - update_resource=self.mock_get_from_manager.mock.return_value, - check_interval=CONF.benchmark.nova_server_boot_poll_interval, - timeout=CONF.benchmark.nova_server_boot_timeout) - self.mock_resource_is.mock.assert_called_once_with("ACTIVE") - self.mock_get_from_manager.mock.assert_called_once_with() - self.assertEqual(self.mock_wait_for.mock.return_value, return_server) - self.clients("nova").servers.create.assert_called_once_with( - "foo_server_name", "image_id", "flavor_id") - self._test_atomic_action_timer(nova_scenario.atomic_actions(), - "nova.boot_server") - @mock.patch(NOVA_UTILS + ".NovaScenario._generate_random_name", - return_value="foo_server_name") - def test__boot_server_with_network(self, mock__generate_random_name): - self.clients("nova").servers.create.return_value = self.server - networks = [{"id": "foo_id", "external": False}, - {"id": "bar_id", "external": False}] - self.clients("nova").networks.list.return_value = networks - nova_scenario = utils.NovaScenario(context={ - "iteration": 3, - "config": {"users": {"tenants": 2}}, - "tenant": {"networks": networks}}) - return_server = nova_scenario._boot_server("image_id", - "flavor_id", - auto_assign_nic=True) + if context is None: + context = {} + context.setdefault("user", {}).setdefault("endpoint", mock.MagicMock()) + context.setdefault("config", {}) + + nova_scenario = utils.NovaScenario(context=context) + nova_scenario._generate_random_name = mock.Mock() + nova_scenario._pick_random_nic = mock.Mock() + if kwargs is None: + kwargs = {} + kwargs["fakearg"] = "fakearg" + return_server = nova_scenario._boot_server("image_id", "flavor_id", + **kwargs) self.mock_wait_for.mock.assert_called_once_with( self.server, is_ready=self.mock_resource_is.mock.return_value, @@ -110,10 +103,26 @@ class NovaScenarioTestCase(test.ScenarioTestCase): timeout=CONF.benchmark.nova_server_boot_timeout) self.mock_resource_is.mock.assert_called_once_with("ACTIVE") self.mock_get_from_manager.mock.assert_called_once_with() - self.clients("nova").servers.create.assert_called_once_with( - "foo_server_name", "image_id", "flavor_id", - nics=[{"net-id": "bar_id"}]) self.assertEqual(self.mock_wait_for.mock.return_value, return_server) + + expected_kwargs = {"fakearg": "fakearg"} + if "nics" in kwargs: + expected_kwargs["nics"] = kwargs["nics"] + elif "auto_assign_nic" in kwargs: + expected_kwargs["nics"] = (nova_scenario._pick_random_nic. + return_value) + + expected_secgroups = set() + if "security_groups" in kwargs: + expected_secgroups.update(kwargs["security_groups"]) + if "secgroup" in context["user"]: + expected_secgroups.add(context["user"]["secgroup"]["name"]) + if expected_secgroups: + expected_kwargs["security_groups"] = list(expected_secgroups) + + self.clients("nova").servers.create.assert_called_once_with( + nova_scenario._generate_random_name.return_value, + "image_id", "flavor_id", **expected_kwargs) self._test_atomic_action_timer(nova_scenario.atomic_actions(), "nova.boot_server") @@ -125,89 +134,6 @@ class NovaScenarioTestCase(test.ScenarioTestCase): "image_id", "flavor_id", auto_assign_nic=True) - @mock.patch(NOVA_UTILS + ".NovaScenario._generate_random_name", - return_value="foo_server_name") - def test__boot_server_with_ssh(self, mock__generate_random_name): - self.clients("nova").servers.create.return_value = self.server - nova_scenario = utils.NovaScenario(context={ - "user": { - "secgroup": {"name": "test"}, - "endpoint": mock.MagicMock() - }} - ) - return_server = nova_scenario._boot_server("image_id", "flavor_id") - self.mock_wait_for.mock.assert_called_once_with( - self.server, - is_ready=self.mock_resource_is.mock.return_value, - update_resource=self.mock_get_from_manager.mock.return_value, - check_interval=CONF.benchmark.nova_server_boot_poll_interval, - timeout=CONF.benchmark.nova_server_boot_timeout) - self.mock_resource_is.mock.assert_called_once_with("ACTIVE") - self.mock_get_from_manager.mock.assert_called_once_with() - self.assertEqual(self.mock_wait_for.mock.return_value, return_server) - self.clients("nova").servers.create.assert_called_once_with( - "foo_server_name", "image_id", "flavor_id", - security_groups=["test"]) - self._test_atomic_action_timer(nova_scenario.atomic_actions(), - "nova.boot_server") - - @mock.patch(NOVA_UTILS + ".NovaScenario._generate_random_name", - return_value="foo_server_name") - def test__boot_server_with_sec_group(self, mock__generate_random_name): - self.clients("nova").servers.create.return_value = self.server - nova_scenario = utils.NovaScenario(context={ - "user": { - "secgroup": {"name": "new"}, - "endpoint": mock.MagicMock() - } - }) - return_server = nova_scenario._boot_server( - "image_id", "flavor_id", - security_groups=["test"]) - self.mock_wait_for.mock.assert_called_once_with( - self.server, - is_ready=self.mock_resource_is.mock.return_value, - update_resource=self.mock_get_from_manager.mock.return_value, - check_interval=CONF.benchmark.nova_server_boot_poll_interval, - timeout=CONF.benchmark.nova_server_boot_timeout) - self.mock_resource_is.mock.assert_called_once_with("ACTIVE") - self.mock_get_from_manager.mock.assert_called_once_with() - self.assertEqual(self.mock_wait_for.mock.return_value, return_server) - self.clients("nova").servers.create.assert_called_once_with( - "foo_server_name", "image_id", "flavor_id", - security_groups=["test", "new"]) - self._test_atomic_action_timer(nova_scenario.atomic_actions(), - "nova.boot_server") - - @mock.patch(NOVA_UTILS + ".NovaScenario._generate_random_name", - return_value="foo_server_name") - def test__boot_server_with_similar_sec_group(self, - mock__generate_random_name): - self.clients("nova").servers.create.return_value = self.server - nova_scenario = utils.NovaScenario(context={ - "user": { - "secgroup": {"name": "test1"}, - "endpoint": mock.MagicMock() - }} - ) - return_server = nova_scenario._boot_server( - "image_id", "flavor_id", - security_groups=["test1"]) - self.mock_wait_for.mock.assert_called_once_with( - self.server, - is_ready=self.mock_resource_is.mock.return_value, - update_resource=self.mock_get_from_manager.mock.return_value, - check_interval=CONF.benchmark.nova_server_boot_poll_interval, - timeout=CONF.benchmark.nova_server_boot_timeout) - self.mock_resource_is.mock.assert_called_once_with("ACTIVE") - self.mock_get_from_manager.mock.assert_called_once_with() - self.assertEqual(self.mock_wait_for.mock.return_value, return_server) - self.clients("nova").servers.create.assert_called_once_with( - "foo_server_name", "image_id", "flavor_id", - security_groups=["test1"]) - self._test_atomic_action_timer(nova_scenario.atomic_actions(), - "nova.boot_server") - def test__suspend_server(self): nova_scenario = utils.NovaScenario() nova_scenario._suspend_server(self.server)