Add provision state commands
baremetal node abort baremetal node clean baremetal node deploy baremetal node inspect baremetal node manage baremetal node provide baremetal node rebuild baremetal node undeploy Change-Id: I82f17397c69edc973e79d9c5ae543d9ccbb0325a Partial-Bug: #1526479
This commit is contained in:
parent
7548aca0ab
commit
77e543779f
|
@ -14,6 +14,7 @@
|
|||
# under the License.
|
||||
#
|
||||
|
||||
import argparse
|
||||
import itertools
|
||||
import logging
|
||||
|
||||
|
@ -28,6 +29,82 @@ from ironicclient import exc
|
|||
from ironicclient.v1 import resource_fields as res_fields
|
||||
|
||||
|
||||
class ProvisionStateBaremetalNode(command.Command):
|
||||
"""Base provision state class"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".ProvisionStateBaremetalNode")
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(ProvisionStateBaremetalNode, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument(
|
||||
'node',
|
||||
metavar='<node>',
|
||||
help="Name or UUID of the node."
|
||||
)
|
||||
parser.add_argument(
|
||||
'--provision-state',
|
||||
default=self.PROVISION_STATE,
|
||||
required=False,
|
||||
choices=[self.PROVISION_STATE],
|
||||
help=argparse.SUPPRESS)
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
self.log.debug("take_action(%s)", parsed_args)
|
||||
|
||||
baremetal_client = self.app.client_manager.baremetal
|
||||
|
||||
baremetal_client.node.set_provision_state(
|
||||
parsed_args.node,
|
||||
parsed_args.provision_state)
|
||||
|
||||
|
||||
class AbortBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'abort'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".AbortBaremetalNode")
|
||||
PROVISION_STATE = 'abort'
|
||||
|
||||
|
||||
class CleanBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'clean'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".CleanBaremetalNode")
|
||||
PROVISION_STATE = 'clean'
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(CleanBaremetalNode, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument(
|
||||
'--clean-steps',
|
||||
metavar='<clean-steps>',
|
||||
required=True,
|
||||
default=None,
|
||||
help=("The clean steps in JSON format. May be the path to a file "
|
||||
"containing the clean steps; OR '-', with the clean steps "
|
||||
"being read from standard input; OR a string. The value "
|
||||
"should be a list of clean-step dictionaries; each "
|
||||
"dictionary should have keys 'interface' and 'step', and "
|
||||
"optional key 'args'."))
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
self.log.debug("take_action(%s)", parsed_args)
|
||||
|
||||
baremetal_client = self.app.client_manager.baremetal
|
||||
|
||||
clean_steps = parsed_args.clean_steps
|
||||
if parsed_args.clean_steps == '-':
|
||||
clean_steps = utils.get_from_stdin('clean steps')
|
||||
if clean_steps:
|
||||
clean_steps = utils.handle_json_or_file_arg(clean_steps)
|
||||
baremetal_client.node.set_provision_state(
|
||||
parsed_args.node,
|
||||
parsed_args.provision_state,
|
||||
cleansteps=clean_steps)
|
||||
|
||||
|
||||
class CreateBaremetalNode(show.ShowOne):
|
||||
"""Register a new node with the baremetal service"""
|
||||
|
||||
|
@ -153,6 +230,45 @@ class DeleteBaremetal(DeleteBaremetalNode):
|
|||
super(DeleteBaremetal, self).take_action(parsed_args)
|
||||
|
||||
|
||||
class DeployBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'deploy'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".DeployBaremetalNode")
|
||||
PROVISION_STATE = 'active'
|
||||
|
||||
def get_parser(self, prog_name):
|
||||
parser = super(DeployBaremetalNode, self).get_parser(prog_name)
|
||||
|
||||
parser.add_argument(
|
||||
'--config-drive',
|
||||
metavar='<config-drive>',
|
||||
default=None,
|
||||
help=("A gzipped, base64-encoded configuration drive string OR "
|
||||
"the path to the configuration drive file OR the path to a "
|
||||
"directory containing the config drive files. In case it's "
|
||||
"a directory, a config drive will be generated from it. "))
|
||||
return parser
|
||||
|
||||
def take_action(self, parsed_args):
|
||||
self.log.debug("take_action(%s)", parsed_args)
|
||||
|
||||
baremetal_client = self.app.client_manager.baremetal
|
||||
|
||||
configdrive = (parsed_args.config_drive if parsed_args.config_drive
|
||||
else None)
|
||||
baremetal_client.node.set_provision_state(
|
||||
parsed_args.node,
|
||||
parsed_args.provision_state,
|
||||
configdrive=configdrive)
|
||||
|
||||
|
||||
class InspectBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'inspect'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".InspectBaremetalNode")
|
||||
PROVISION_STATE = 'inspect'
|
||||
|
||||
|
||||
class ListBaremetalNode(lister.Lister):
|
||||
"""List baremetal nodes"""
|
||||
|
||||
|
@ -279,6 +395,13 @@ class ListBaremetal(ListBaremetalNode):
|
|||
return super(ListBaremetal, self).take_action(parsed_args)
|
||||
|
||||
|
||||
class ManageBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'manage'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".ManageBaremetalNode")
|
||||
PROVISION_STATE = 'manage'
|
||||
|
||||
|
||||
class PowerBaremetalNode(command.Command):
|
||||
"""Set power state of baremetal node"""
|
||||
|
||||
|
@ -309,6 +432,13 @@ class PowerBaremetalNode(command.Command):
|
|||
parsed_args.node, parsed_args.power_state)
|
||||
|
||||
|
||||
class ProvideBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'provide'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".ProvideBaremetalNode")
|
||||
PROVISION_STATE = 'provide'
|
||||
|
||||
|
||||
class RebootBaremetalNode(command.Command):
|
||||
"""Reboot baremetal node"""
|
||||
|
||||
|
@ -333,6 +463,13 @@ class RebootBaremetalNode(command.Command):
|
|||
parsed_args.node, 'reboot')
|
||||
|
||||
|
||||
class RebuildBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'rebuild'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".RebuildBaremetalNode")
|
||||
PROVISION_STATE = 'rebuild'
|
||||
|
||||
|
||||
class SetBaremetalNode(command.Command):
|
||||
"""Set baremetal properties"""
|
||||
|
||||
|
@ -505,6 +642,13 @@ class ShowBaremetal(ShowBaremetalNode):
|
|||
return super(ShowBaremetal, self).take_action(parsed_args)
|
||||
|
||||
|
||||
class UndeployBaremetalNode(ProvisionStateBaremetalNode):
|
||||
"""Set provision state of baremetal node to 'deleted'"""
|
||||
|
||||
log = logging.getLogger(__name__ + ".UndeployBaremetalNode")
|
||||
PROVISION_STATE = 'deleted'
|
||||
|
||||
|
||||
class UnsetBaremetalNode(command.Command):
|
||||
"""Unset baremetal properties"""
|
||||
log = logging.getLogger(__name__ + ".UnsetBaremetalNode")
|
||||
|
|
|
@ -551,6 +551,42 @@ class TestBaremetalPower(TestBaremetal):
|
|||
'node_uuid', 'off')
|
||||
|
||||
|
||||
class TestDeployBaremetalProvisionState(TestBaremetal):
|
||||
def setUp(self):
|
||||
super(TestDeployBaremetalProvisionState, self).setUp()
|
||||
|
||||
# Get the command object to test
|
||||
self.cmd = baremetal_node.DeployBaremetalNode(self.app, None)
|
||||
|
||||
def test_deploy_baremetal_provision_state_active_and_configdrive(self):
|
||||
arglist = ['node_uuid',
|
||||
'--config-drive', 'path/to/drive']
|
||||
verifylist = [
|
||||
('node', 'node_uuid'),
|
||||
('provision_state', 'active'),
|
||||
('config_drive', 'path/to/drive'),
|
||||
]
|
||||
|
||||
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||
|
||||
self.cmd.take_action(parsed_args)
|
||||
|
||||
self.baremetal_mock.node.set_provision_state.assert_called_once_with(
|
||||
'node_uuid', 'active', configdrive='path/to/drive')
|
||||
|
||||
def test_deploy_baremetal_provision_state_mismatch(self):
|
||||
arglist = ['node_uuid',
|
||||
'--provision-state', 'abort']
|
||||
verifylist = [
|
||||
('node', 'node_uuid'),
|
||||
('provision_state', 'active'),
|
||||
]
|
||||
|
||||
self.assertRaises(oscutils.ParserException,
|
||||
self.check_parser,
|
||||
self.cmd, arglist, verifylist)
|
||||
|
||||
|
||||
class TestBaremetalReboot(TestBaremetal):
|
||||
def setUp(self):
|
||||
super(TestBaremetalReboot, self).setUp()
|
||||
|
|
|
@ -2,18 +2,28 @@
|
|||
features:
|
||||
- |
|
||||
Extend the OpenStackClient plugin with new commands:
|
||||
|
||||
* openstack baremetal node abort
|
||||
* openstack baremetal node clean
|
||||
* openstack baremetal node create
|
||||
* openstack baremetal node delete - Supports deleting multiple nodes
|
||||
* openstack baremetal node deploy
|
||||
* openstack baremetal node inspect
|
||||
* openstack baremetal node list
|
||||
* openstack baremetal node manage
|
||||
* openstack baremetal node power
|
||||
* openstack baremetal node provide
|
||||
* openstack baremetal node reboot
|
||||
* openstack baremetal node rebuild
|
||||
* openstack baremetal node set
|
||||
* openstack baremetal node show
|
||||
* openstack baremetal node undeploy
|
||||
* openstack baremetal node unset
|
||||
* openstack baremetal port create
|
||||
deprecations:
|
||||
- |
|
||||
Deprecating the following commands in favor of the new commands:
|
||||
|
||||
* openstack baremetal create
|
||||
* openstack baremetal delete
|
||||
* openstack baremetal list
|
||||
|
|
|
@ -31,13 +31,21 @@ openstack.baremetal.v1 =
|
|||
baremetal_create = ironicclient.osc.v1.baremetal_node:CreateBaremetal
|
||||
baremetal_delete = ironicclient.osc.v1.baremetal_node:DeleteBaremetal
|
||||
baremetal_list = ironicclient.osc.v1.baremetal_node:ListBaremetal
|
||||
baremetal_node_abort = ironicclient.osc.v1.baremetal_node:AbortBaremetalNode
|
||||
baremetal_node_clean = ironicclient.osc.v1.baremetal_node:CleanBaremetalNode
|
||||
baremetal_node_create = ironicclient.osc.v1.baremetal_node:CreateBaremetalNode
|
||||
baremetal_node_delete = ironicclient.osc.v1.baremetal_node:DeleteBaremetalNode
|
||||
baremetal_node_deploy = ironicclient.osc.v1.baremetal_node:DeployBaremetalNode
|
||||
baremetal_node_inspect = ironicclient.osc.v1.baremetal_node:InspectBaremetalNode
|
||||
baremetal_node_list = ironicclient.osc.v1.baremetal_node:ListBaremetalNode
|
||||
baremetal_node_manage = ironicclient.osc.v1.baremetal_node:ManageBaremetalNode
|
||||
baremetal_node_power = ironicclient.osc.v1.baremetal_node:PowerBaremetalNode
|
||||
baremetal_node_provide = ironicclient.osc.v1.baremetal_node:ProvideBaremetalNode
|
||||
baremetal_node_reboot = ironicclient.osc.v1.baremetal_node:RebootBaremetalNode
|
||||
baremetal_node_rebuild = ironicclient.osc.v1.baremetal_node:RebuildBaremetalNode
|
||||
baremetal_node_set = ironicclient.osc.v1.baremetal_node:SetBaremetalNode
|
||||
baremetal_node_show = ironicclient.osc.v1.baremetal_node:ShowBaremetalNode
|
||||
baremetal_node_undeploy = ironicclient.osc.v1.baremetal_node:UndeployBaremetalNode
|
||||
baremetal_node_unset = ironicclient.osc.v1.baremetal_node:UnsetBaremetalNode
|
||||
baremetal_port_create = ironicclient.osc.v1.baremetal_port:CreateBaremetalPort
|
||||
baremetal_set = ironicclient.osc.v1.baremetal_node:SetBaremetal
|
||||
|
|
Loading…
Reference in New Issue