Add OpenstackClient plugin for cluster node update

This change implements the "openstack cluster node update" command
  Based on the existing senlin command: senlin node-update

Change-Id: I199a54bfb89cd3b0830a48ad73325ea875a959ac
Blueprint: senlin-support-python-openstackclient
This commit is contained in:
dixiaoli
2016-02-20 15:13:31 +08:00
parent 56e447bc9d
commit 874a57f98d
3 changed files with 121 additions and 0 deletions

View File

@@ -216,3 +216,62 @@ class CreateNode(show.ShowOne):
node = senlin_client.create_node(**attrs)
return _show_node(senlin_client, node.id)
class UpdateNode(show.ShowOne):
"""Update the node."""
log = logging.getLogger(__name__ + ".UpdateNode")
def get_parser(self, prog_name):
parser = super(UpdateNode, self).get_parser(prog_name)
parser.add_argument(
'--name',
metavar='<name>',
help=_('New name for the node')
)
parser.add_argument(
'--profile',
metavar='<profile_id>',
help=_('ID of new profile to use')
)
parser.add_argument(
'--role',
metavar='<role>',
help=_('Role for this node in the specific cluster')
)
parser.add_argument(
'--metadata',
metavar='<key1=value1;key2=value2...>',
help=_('Metadata values to be attached to the node. '
'Metadata can be specified multiple times, or once with '
'key-value pairs separated by a semicolon'),
action='append'
)
parser.add_argument(
'node',
metavar='<node>',
help=_('Name or ID of node to update')
)
return parser
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
senlin_client = self.app.client_manager.clustering
# Find the node first, we need its UUID
try:
node = senlin_client.get_node(parsed_args.node)
except sdk_exc.ResourceNotFound:
raise exc.CommandError(_('Node not found: %s') % parsed_args.node)
attrs = {
'name': parsed_args.name,
'role': parsed_args.role,
'profile_id': parsed_args.profile,
'metadata': senlin_utils.format_parameters(parsed_args.metadata),
}
senlin_client.update_node(parsed_args.node, **attrs)
return _show_node(senlin_client, node.id)

View File

@@ -266,3 +266,64 @@ class TestNodeCreate(TestNode):
parsed_args = self.check_parser(self.cmd, arglist, [])
self.cmd.take_action(parsed_args)
self.mock_client.create_node.assert_called_with(**kwargs)
class TestNodeUpdate(TestNode):
response = {"node": {
"action": "2366d440-c73e-4961-9254-6d1c3af7c167",
"cluster_id": None,
"created_at": None,
"data": {},
"domain": None,
"id": "0df0931b-e251-4f2e-8719-4ebfda3627ba",
"index": -1,
"init_time": "2015-03-05T08:53:15",
"metadata": {},
"name": "my_node",
"physical_id": "",
"profile_id": "edc63d0a-2ca4-48fa-9854-27926da76a4a",
"profile_name": "mystack",
"project": "6e18cc2bdbeb48a5b3cad2dc499f6804",
"role": "master",
"status": "INIT",
"status_reason": "Initializing",
"updated_at": None,
"user": "5e5bf8027826429c96af157f68dc9072"
}}
defaults = {
"name": "new_node",
"metadata": {
"nk1": "nv1",
"nk2": "nv2",
},
"profile_id": "new_profile",
"role": "new_role"
}
def setUp(self):
super(TestNodeUpdate, self).setUp()
self.cmd = osc_node.UpdateNode(self.app, None)
self.mock_client.update_node = mock.Mock(
return_value=sdk_node.Node(None, self.response))
self.mock_client.get_node = mock.Mock(
return_value=sdk_node.Node(None, self.response))
def test_node_update_defaults(self):
arglist = ['--name', 'new_node', '--metadata', 'nk1=nv1;nk2=nv2',
'--profile', 'new_profile', '--role', 'new_role',
'c6b8b252']
parsed_args = self.check_parser(self.cmd, arglist, [])
self.cmd.take_action(parsed_args)
self.mock_client.update_node.assert_called_with('c6b8b252',
**self.defaults)
def test_node_update_not_found(self):
arglist = ['--name', 'new_node', '--metadata', 'nk1=nv1;nk2=nv2',
'--profile', 'new_profile', '--role', 'new_role',
'c6b8b252']
parsed_args = self.check_parser(self.cmd, arglist, [])
self.mock_client.get_node.side_effect = sdk_exc.ResourceNotFound()
error = self.assertRaises(exc.CommandError, self.cmd.take_action,
parsed_args)
self.assertIn('Node not found: c6b8b252', str(error))

View File

@@ -33,6 +33,7 @@ openstack.clustering.v1 =
cluster_node_create = senlinclient.osc.v1.node:CreateNode
cluster_node_list = senlinclient.osc.v1.node:ListNode
cluster_node_show = senlinclient.osc.v1.node:ShowNode
cluster_node_update = senlinclient.osc.v1.node:UpdateNode
cluster_profile_create = senlinclient.osc.v1.profile:CreateProfile
cluster_profile_delete = senlinclient.osc.v1.profile:DeleteProfile
cluster_profile_list = senlinclient.osc.v1.profile:ListProfile