Support soft reboot and soft power off with timeout for OSC

This patch enhances OSC to support soft reboot and soft power off with
power control timeout option.

Partial-Bug: #1526226
Change-Id: Ibf63d55754610769bf201f1766ddb6f9a0ce8971
This commit is contained in:
Naohiro Tamura
2016-08-19 14:54:50 +09:00
committed by Dmitry Tantsur
parent 625f45d699
commit 808a4cbfa4
3 changed files with 147 additions and 9 deletions

View File

@@ -714,6 +714,21 @@ class PowerBaremetalNode(command.Command):
metavar='<node>', metavar='<node>',
help="Name or UUID of the node." help="Name or UUID of the node."
) )
parser.add_argument(
'--soft',
dest='soft',
action='store_true',
default=False,
help=_("Request graceful power-off.")
)
parser.add_argument(
'--power-timeout',
metavar='<power-timeout>',
default=None,
type=int,
help=_("Timeout (in seconds, positive integer) to wait for the "
"target power state before erroring out.")
)
return parser return parser
def take_action(self, parsed_args): def take_action(self, parsed_args):
@@ -722,7 +737,8 @@ class PowerBaremetalNode(command.Command):
baremetal_client = self.app.client_manager.baremetal baremetal_client = self.app.client_manager.baremetal
baremetal_client.node.set_power_state( baremetal_client.node.set_power_state(
parsed_args.node, parsed_args.power_state) parsed_args.node, parsed_args.power_state, parsed_args.soft,
timeout=parsed_args.power_timeout)
class ProvideBaremetalNode(ProvisionStateBaremetalNode): class ProvideBaremetalNode(ProvisionStateBaremetalNode):
@@ -743,7 +759,23 @@ class RebootBaremetalNode(command.Command):
parser.add_argument( parser.add_argument(
'node', 'node',
metavar='<node>', metavar='<node>',
help="Name or UUID of the node.") help="Name or UUID of the node."
)
parser.add_argument(
'--soft',
dest='soft',
action='store_true',
default=False,
help=_("Request Graceful reboot.")
)
parser.add_argument(
'--power-timeout',
metavar='<power-timeout>',
default=None,
type=int,
help=_("Timeout (in seconds, positive integer) to wait for the "
"target power state before erroring out.")
)
return parser return parser
@@ -753,7 +785,8 @@ class RebootBaremetalNode(command.Command):
baremetal_client = self.app.client_manager.baremetal baremetal_client = self.app.client_manager.baremetal
baremetal_client.node.set_power_state( baremetal_client.node.set_power_state(
parsed_args.node, 'reboot') parsed_args.node, 'reboot', parsed_args.soft,
timeout=parsed_args.power_timeout)
class RebuildBaremetalNode(ProvisionStateBaremetalNode): class RebuildBaremetalNode(ProvisionStateBaremetalNode):

View File

@@ -893,26 +893,86 @@ class TestBaremetalPower(TestBaremetal):
def test_baremetal_power_on(self): def test_baremetal_power_on(self):
arglist = ['on', 'node_uuid'] arglist = ['on', 'node_uuid']
verifylist = [('power_state', 'on'), verifylist = [('power_state', 'on'),
('node', 'node_uuid')] ('node', 'node_uuid'),
('soft', False),
('power_timeout', None)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with( self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'on') 'node_uuid', 'on', False, timeout=None)
def test_baremetal_power_on_timeout(self):
arglist = ['on', 'node_uuid', '--power-timeout', '2']
verifylist = [('power_state', 'on'),
('node', 'node_uuid'),
('soft', False),
('power_timeout', 2)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'on', False, timeout=2)
def test_baremetal_power_off(self): def test_baremetal_power_off(self):
arglist = ['off', 'node_uuid'] arglist = ['off', 'node_uuid']
verifylist = [('power_state', 'off'), verifylist = [('power_state', 'off'),
('node', 'node_uuid')] ('node', 'node_uuid'),
('soft', False),
('power_timeout', None)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with( self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'off') 'node_uuid', 'off', False, timeout=None)
def test_baremetal_power_off_timeout(self):
arglist = ['off', 'node_uuid', '--power-timeout', '2']
verifylist = [('power_state', 'off'),
('node', 'node_uuid'),
('soft', False),
('power_timeout', 2)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'off', False, timeout=2)
def test_baremetal_soft_power_off(self):
arglist = ['off', 'node_uuid', '--soft']
verifylist = [('power_state', 'off'),
('node', 'node_uuid'),
('soft', True),
('power_timeout', None)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'off', True, timeout=None)
def test_baremetal_soft_power_off_timeout(self):
arglist = ['off', 'node_uuid', '--soft', '--power-timeout', '2']
verifylist = [('power_state', 'off'),
('node', 'node_uuid'),
('soft', True),
('power_timeout', 2)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'off', True, timeout=2)
class TestDeployBaremetalProvisionState(TestBaremetal): class TestDeployBaremetalProvisionState(TestBaremetal):
@@ -969,14 +1029,55 @@ class TestBaremetalReboot(TestBaremetal):
def test_baremetal_reboot_uuid_only(self): def test_baremetal_reboot_uuid_only(self):
arglist = ['node_uuid'] arglist = ['node_uuid']
verifylist = [('node', 'node_uuid')] verifylist = [('node', 'node_uuid'),
('soft', False),
('power_timeout', None)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist) parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args) self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with( self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'reboot') 'node_uuid', 'reboot', False, timeout=None)
def test_baremetal_reboot_timeout(self):
arglist = ['node_uuid', '--power-timeout', '2']
verifylist = [('node', 'node_uuid'),
('soft', False),
('power_timeout', 2)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'reboot', False, timeout=2)
def test_baremetal_soft_reboot(self):
arglist = ['node_uuid', '--soft']
verifylist = [('node', 'node_uuid'),
('soft', True),
('power_timeout', None)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'reboot', True, timeout=None)
def test_baremetal_soft_reboot_timeout(self):
arglist = ['node_uuid', '--soft', '--power-timeout', '2']
verifylist = [('node', 'node_uuid'),
('soft', True),
('power_timeout', 2)]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
self.cmd.take_action(parsed_args)
self.baremetal_mock.node.set_power_state.assert_called_once_with(
'node_uuid', 'reboot', True, timeout=2)
class TestBaremetalSet(TestBaremetal): class TestBaremetalSet(TestBaremetal):

View File

@@ -0,0 +1,4 @@
---
features:
- Enhances OSC to support soft reboot and soft power off with
power control timeout option.