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:
Brad P. Crochet 2015-07-23 14:44:45 -04:00
parent 7548aca0ab
commit 77e543779f
4 changed files with 198 additions and 0 deletions

View File

@ -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")

View File

@ -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()

View File

@ -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

View File

@ -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