Add vm power action driver methods and get console output

Add vm power actions support including: power on, power off,
pause, unpause and get vm console output via smut backend.

Change-Id: Id032dea9dce6c157367f2320a4a373ff862fe10b
This commit is contained in:
Huang Rui 2017-12-20 18:08:15 +08:00
parent 369b0b1674
commit fab7a6c77e
2 changed files with 79 additions and 0 deletions

View File

@ -435,3 +435,47 @@ class TestZVMDriver(test.NoDBTestCase):
call.assert_any_call('guest_get_definition_info',
self._instance['name'])
@mock.patch('nova_zvm.virt.zvm.utils.zVMConnectorRequestHandler.call')
def test_instance_power_action(self, call):
call.side_effect = [['test0001', 'test0002'], None]
self.driver._instance_power_action(self._instance, 'guest_start')
call.assert_any_call('guest_list')
call.assert_any_call('guest_start', 'test0001')
@mock.patch('nova_zvm.virt.zvm.utils.zVMConnectorRequestHandler.call')
def test_instance_power_action_not_exist(self, call):
call.return_value = ['test0002', 'test0003']
self.driver._instance_power_action(self._instance, 'guest_start')
call.assert_any_call('guest_list')
@mock.patch('nova_zvm.virt.zvm.driver.ZVMDriver._instance_power_action')
def test_power_off(self, ipa):
self.driver.power_off(self._instance)
ipa.assert_called_once_with(self._instance, 'guest_softoff')
self.driver.power_off(self._instance, 60, 10)
ipa.assert_any_call(self._instance, 'guest_softoff',
timeout=60, poll_interval=10)
@mock.patch('nova_zvm.virt.zvm.driver.ZVMDriver._instance_power_action')
def test_power_on(self, ipa):
self.driver.power_on(None, self._instance, None)
ipa.assert_called_once_with(self._instance, 'guest_start')
@mock.patch('nova_zvm.virt.zvm.driver.ZVMDriver._instance_power_action')
def test_pause(self, ipa):
self.driver.pause(self._instance)
ipa.assert_called_once_with(self._instance, 'guest_pause')
@mock.patch('nova_zvm.virt.zvm.driver.ZVMDriver._instance_power_action')
def test_unpause(self, ipa):
self.driver.unpause(self._instance)
ipa.assert_called_once_with(self._instance, 'guest_unpause')
@mock.patch('nova_zvm.virt.zvm.utils.zVMConnectorRequestHandler.call')
def test_get_console_output(self, call):
call.return_value = 'console output'
outputs = self.driver.get_console_output(None, self._instance)
call.test_assert_called_once_with('guest_get_console_output',
'test0001')
self.assertEqual('console output', outputs)

View File

@ -369,3 +369,38 @@ class ZVMDriver(driver.ComputeDriver):
def get_host_uptime(self):
res = self._reqh.call('host_get_info')
return res['ipl_time']
def _instance_power_action(self, instance, action, *args, **kwargs):
inst_name = instance['name']
if self._instance_exists(inst_name):
LOG.info(_("Power action %(action)s to instance %(inst_name)s"),
action=action, inst_name=inst_name, instance=instance)
self._reqh.call(action, inst_name)
else:
LOG.warning(_('Instance %s does not exist'), inst_name,
instance=instance)
def power_off(self, instance, timeout=0, retry_interval=0):
"""Power off the specified instance."""
if timeout >= 0 and retry_interval > 0:
self._instance_power_action(instance, 'guest_softoff',
timeout=timeout,
poll_interval=retry_interval)
else:
self._instance_power_action(instance, 'guest_softoff')
def power_on(self, context, instance, network_info,
block_device_info=None):
"""Power on the specified instance."""
self._instance_power_action(instance, 'guest_start')
def pause(self, instance):
"""Pause the z/VM instance."""
self._instance_power_action(instance, 'guest_pause')
def unpause(self, instance):
"""Unpause the z/VM instance."""
self._instance_power_action(instance, 'guest_unpause')
def get_console_output(self, context, instance):
return self._reqh.call('guest_get_console_output', instance.name)