Remove BootRuncommandDeleteCustomImage scenario

Scenario 'BootRuncommandDeleteCustomImage' was removed from VMTasks
scenario class, but functionality is keeped in 'BootRuncommandDelete'
scenario

Change-Id: I9216eb772e5b553ac9a49da97ec2d2eaf008d243
This commit is contained in:
astaroverov 2016-11-08 13:36:48 +03:00 committed by Staroverov Anton
parent 7411349473
commit 4ec55097c7
9 changed files with 65 additions and 67 deletions

View File

@ -367,8 +367,6 @@
sla:
failure_rate:
max: 0
VMTasks.boot_runcommand_delete_custom_image:
-
args:
command:

View File

@ -632,8 +632,6 @@
sla:
failure_rate:
max: 0
VMTasks.boot_runcommand_delete_custom_image:
-
args:
command:

View File

@ -153,9 +153,8 @@ class BaseCustomImageGenerator(context.Context):
flavor_id = types.Flavor.transform(
clients=clients, resource_config=self.config["flavor"])
vm_scenario = vmtasks.BootRuncommandDeleteCustomImage(
self.context,
clients=clients)
vm_scenario = vmtasks.BootRuncommandDelete(self.context,
clients=clients)
glance_wrap = glance_wrapper.wrap(admin_clients.glance, self)

View File

@ -36,11 +36,13 @@ LOG = logging.getLogger(__name__)
@types.convert(image={"type": "glance_image"},
flavor={"type": "nova_flavor"})
@validation.image_valid_on_flavor("flavor", "image")
@validation.image_valid_on_flavor("flavor", "image", fail_on_404_image=False)
@validation.valid_command("command")
@validation.number("port", minval=1, maxval=65535, nullable=True,
integer_only=True)
@validation.external_network_exists("floating_network")
@validation.required_param_or_context(arg_name="image",
ctx_name="image_command_customizer")
@validation.required_services(consts.Service.NOVA, consts.Service.CINDER)
@validation.required_openstack(users=True)
@scenario.configure(context={"cleanup": ["nova", "cinder"],
@ -48,13 +50,16 @@ LOG = logging.getLogger(__name__)
name="VMTasks.boot_runcommand_delete")
class BootRuncommandDelete(vm_utils.VMScenario):
def run(self, image, flavor, username, password=None, command=None,
def run(self, flavor, username, password=None,
image=None,
command=None,
volume_args=None, floating_network=None, port=22,
use_floating_ip=True, force_delete=False, wait_for_ping=True,
max_log_length=None, **kwargs):
"""Boot a server, run script specified in command and delete server.
:param image: glance image name to use for the vm
:param image: glance image name to use for the vm. Optional
in case of specified "image_command_customizer" context
:param flavor: VM flavor name
:param username: ssh username on server, str
:param password: Password on SSH authentication
@ -137,11 +142,13 @@ class BootRuncommandDelete(vm_utils.VMScenario):
data: dict, JSON output from the script
errors: str, raw data from the script's stderr stream
"""
if volume_args:
volume = self._create_volume(volume_args["size"], imageRef=None)
kwargs["block_device_mapping"] = {"vdrally": "%s:::1" % volume.id}
if not image:
image = self.context["tenant"]["custom_image"]["id"]
server, fip = self._boot_server_with_fip(
image, flavor, use_floating_ip=use_floating_ip,
floating_network=floating_network,
@ -211,30 +218,6 @@ class BootRuncommandDelete(vm_utils.VMScenario):
self.add_output(**{chart_type: chart})
@types.convert(image={"type": "glance_image"},
flavor={"type": "nova_flavor"})
@validation.number("port", minval=1, maxval=65535, nullable=True,
integer_only=True)
@validation.valid_command("command")
@validation.external_network_exists("floating_network")
@validation.required_services(consts.Service.NOVA, consts.Service.CINDER)
@validation.required_openstack(users=True)
@validation.required_contexts("image_command_customizer")
@scenario.configure(context={"cleanup": ["nova", "cinder"],
"keypair": {}, "allow_ssh": {}},
name="VMTasks.boot_runcommand_delete_custom_image")
class BootRuncommandDeleteCustomImage(vm_utils.VMScenario):
def run(self, **kwargs):
"""Boot a server from a custom image, run a command that outputs JSON.
Example Script in rally-jobs/extra/install_benchmark.sh
"""
boot_runcommand_delete = BootRuncommandDelete(self.context)
return boot_runcommand_delete.run(
image=self.context["tenant"]["custom_image"]["id"], **kwargs)
@scenario.configure(context={"cleanup": ["nova", "heat"],
"keypair": {}, "network": {}},
name="VMTasks.runcommand_heat")

View File

@ -1,5 +1,5 @@
{
"VMTasks.boot_runcommand_delete_custom_image": [
"VMTasks.boot_runcommand_delete": [
{
"args": {
"flavor": {"name": "m1.small"},

View File

@ -1,5 +1,5 @@
---
VMTasks.boot_runcommand_delete_custom_image:
VMTasks.boot_runcommand_delete:
-
args:
command:

View File

@ -66,10 +66,10 @@ class BaseCustomImageContextVMTestCase(test.TestCase):
@mock.patch("%s.types.GlanceImage.transform" % BASE, return_value="image")
@mock.patch("%s.types.Flavor.transform" % BASE, return_value="flavor")
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
@mock.patch("%s.vmtasks.BootRuncommandDeleteCustomImage" % BASE)
@mock.patch("%s.vmtasks.BootRuncommandDelete" % BASE)
def test_create_one_image(
self, mock_scenario, mock_glance_wrap, mock_flavor_transform,
mock_glance_image_transform, mock_clients
self, mock_boot_runcommand_delete, mock_glance_wrap,
mock_flavor_transform, mock_glance_image_transform, mock_clients
):
ip = {"ip": "foo_ip", "id": "foo_id", "is_floating": True}
fake_server = mock.Mock()
@ -77,7 +77,7 @@ class BaseCustomImageContextVMTestCase(test.TestCase):
fake_image = mock.MagicMock(
to_dict=mock.MagicMock(return_value={"id": "image"}))
scenario = mock_scenario.return_value = mock.MagicMock(
scenario = mock_boot_runcommand_delete.return_value = mock.MagicMock(
_create_image=mock.MagicMock(return_value=fake_image),
_boot_server_with_fip=mock.MagicMock(
return_value=(fake_server, ip))
@ -103,7 +103,7 @@ class BaseCustomImageContextVMTestCase(test.TestCase):
mock_glance_image_transform.assert_called_once_with(
clients=mock_clients.return_value,
resource_config={"name": "image"})
mock_scenario.assert_called_once_with(
mock_boot_runcommand_delete.assert_called_once_with(
self.context, clients=mock_clients.return_value)
scenario._boot_server_with_fip.assert_called_once_with(
@ -132,10 +132,10 @@ class BaseCustomImageContextVMTestCase(test.TestCase):
@mock.patch("%s.types.Flavor.transform" % BASE,
return_value="flavor")
@mock.patch("rally.plugins.openstack.wrappers.glance.wrap")
@mock.patch("%s.vmtasks.BootRuncommandDeleteCustomImage" % BASE)
@mock.patch("%s.vmtasks.BootRuncommandDelete" % BASE)
def test_create_one_image_cleanup(
self, mock_scenario, mock_glance_wrap, mock_flavor_transform,
mock_glance_image_transform, mock_clients
self, mock_boot_runcommand_delete, mock_glance_wrap,
mock_flavor_transform, mock_glance_image_transform, mock_clients
):
ip = {"ip": "foo_ip", "id": "foo_id", "is_floating": True}
fake_server = mock.Mock()
@ -143,7 +143,7 @@ class BaseCustomImageContextVMTestCase(test.TestCase):
fake_image = mock.MagicMock(
to_dict=mock.MagicMock(return_value={"id": "image"}))
scenario = mock_scenario.return_value = mock.MagicMock(
scenario = mock_boot_runcommand_delete.return_value = mock.MagicMock(
_create_image=mock.MagicMock(return_value=fake_image),
_boot_server_with_fip=mock.MagicMock(
return_value=(fake_server, ip)),

View File

@ -124,7 +124,8 @@ class VMScenarioTestCase(test.ScenarioTestCase):
"interpreter": "bar"})
mock_sshutils_ssh.assert_called_once_with(
"username", "1.2.3.4", port=22, pkey="ssh", password="password")
"username", "1.2.3.4",
port=22, pkey="ssh", password="password")
mock_sshutils_ssh.return_value.wait.assert_called_once_with(120, 1)
mock_vm_scenario__run_command_over_ssh.assert_called_once_with(
mock_sshutils_ssh.return_value,

View File

@ -49,7 +49,7 @@ class VMTasksTestCase(test.ScenarioTestCase):
scenario = self.create_env(vmtasks.BootRuncommandDelete(self.context))
scenario._run_command = mock.MagicMock(
return_value=(0, "{\"foo\": 42}", "foo_err"))
scenario.run("foo_image", "foo_flavor",
scenario.run("foo_flavor", image="foo_image",
command={"script_file": "foo_script",
"interpreter": "foo_interpreter"},
username="foo_username",
@ -100,7 +100,9 @@ class VMTasksTestCase(test.ScenarioTestCase):
scenario = self.create_env(vmtasks.BootRuncommandDelete(self.context))
scenario._run_command.return_value = output
kwargs = {"command": {"remote_path": "foo"},
kwargs = {"flavor": "foo_flavor",
"image": "foo_image",
"command": {"remote_path": "foo"},
"username": "foo_username",
"password": "foo_password",
"use_floating_ip": "use_fip",
@ -109,11 +111,10 @@ class VMTasksTestCase(test.ScenarioTestCase):
"volume_args": {"size": 16},
"foo_arg": "foo_value"}
if raises:
self.assertRaises(raises, scenario.run,
"foo_image", "foo_flavor", **kwargs)
self.assertRaises(raises, scenario.run, **kwargs)
self.assertFalse(scenario.add_output.called)
else:
scenario.run("foo_image", "foo_flavor", **kwargs)
scenario.run(**kwargs)
calls = [mock.call(**kw) for kw in expected]
scenario.add_output.assert_has_calls(calls, any_order=True)
@ -136,7 +137,7 @@ class VMTasksTestCase(test.ScenarioTestCase):
scenario._run_command.side_effect = exceptions.SSHTimeout()
self.assertRaises(exceptions.SSHTimeout,
scenario.run,
"foo_image", "foo_flavor", "foo_interpreter",
"foo_flavor", "foo_image", "foo_interpreter",
"foo_script", "foo_username")
scenario._delete_server_with_fip.assert_called_once_with(
"foo_server", self.ip, force_delete=False)
@ -179,31 +180,49 @@ class VMTasksTestCase(test.ScenarioTestCase):
"foo_server", self.ip, force_delete=False)
self.assertFalse(scenario.add_output.called)
@mock.patch("%s.BootRuncommandDelete.run" % BASE)
def test_boot_runcommand_delete_custom_image(self, mock_scenario):
def test_boot_runcommand_delete_custom_image(self):
context = {
"user": {
"tenant_id": "tenant_id",
"keypair": {"name": "foo_keypair_name"},
"credential": mock.Mock()
},
"tenant": {
"custom_image": {"id": "image_id"}
}
}
scenario = vmtasks.BootRuncommandDeleteCustomImage(context)
scenario.run(flavor="flavor_id",
command={
"script_file": "foo_script",
"interpreter": "bar_interpreter"},
username="username")
scenario = self.create_env(vmtasks.BootRuncommandDelete(context))
scenario._run_command = mock.MagicMock(
return_value=(0, "{\"foo\": 42}", "foo_err"))
scenario.run("foo_flavor",
command={"script_file": "foo_script",
"interpreter": "foo_interpreter"},
username="foo_username",
password="foo_password",
use_floating_ip="use_fip",
floating_network="ext_network",
force_delete="foo_force",
volume_args={"size": 16},
foo_arg="foo_value")
mock_scenario.assert_called_once_with(
image="image_id", flavor="flavor_id", username="username",
command={
"script_file": "foo_script",
"interpreter": "bar_interpreter"}
)
scenario._create_volume.assert_called_once_with(16, imageRef=None)
scenario._boot_server_with_fip.assert_called_once_with(
"image_id", "foo_flavor", key_name="foo_keypair_name",
use_floating_ip="use_fip", floating_network="ext_network",
block_device_mapping={"vdrally": "foo_volume:::1"},
foo_arg="foo_value")
scenario._wait_for_ping.assert_called_once_with("foo_ip")
scenario._run_command.assert_called_once_with(
"foo_ip", 22, "foo_username", "foo_password",
command={"script_file": "foo_script",
"interpreter": "foo_interpreter"})
scenario._delete_server_with_fip.assert_called_once_with(
"foo_server", self.ip, force_delete="foo_force")
scenario.add_output.assert_called_once_with(
additive={"title": "Command output", "chart_plugin": "Lines",
"data": [["foo", 42.0]]})
@mock.patch("%s.heat" % BASE)
@mock.patch("%s.sshutils" % BASE)