Merge "Option '--labels-all' for node label DELETE method"

This commit is contained in:
Jenkins
2015-08-12 12:05:27 +00:00
committed by Gerrit Code Review
4 changed files with 89 additions and 32 deletions

View File

@@ -188,7 +188,8 @@ class NodeLabelSet(NodeMixIn, base.BaseCommand):
parser = super(NodeLabelSet, self).get_parser(prog_name)
parser.add_argument(
'labels',
'-l',
'--labels',
nargs='+',
help='List of labels for create or update')
@@ -220,10 +221,16 @@ class NodeLabelDelete(NodeMixIn, base.BaseCommand):
def get_parser(self, prog_name):
parser = super(NodeLabelDelete, self).get_parser(prog_name)
parser.add_argument(
'labels_keys',
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
'-l',
'--labels',
nargs='+',
help='List of labels keys for delete')
group.add_argument(
'--labels-all',
action='store_true',
help='Delete all labels for node')
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
@@ -234,14 +241,16 @@ class NodeLabelDelete(NodeMixIn, base.BaseCommand):
group.add_argument(
'--nodes-all',
action='store_true',
help='Create or update labels for all nodes')
help='Delete labels for all nodes')
return parser
def take_action(self, parsed_args):
nodes_ids = None if parsed_args.nodes_all else parsed_args.nodes
labels = None if parsed_args.labels_all \
else parsed_args.labels
data = self.client.delete_labels_for_nodes(
labels_keys=parsed_args.labels_keys, node_ids=nodes_ids)
labels=labels, node_ids=nodes_ids)
msg = "Labels have been deleted on nodes: {0} \n".format(
','.join(data))
self.app.stdout.write(msg)

View File

@@ -146,7 +146,7 @@ class TestNodeCommand(test_engine.BaseCLITest):
def test_node_label_set_for_all_nodes(self):
labels = ['key_1=val_1', 'key_2=val_2']
args = 'node label set {labels} --nodes-all'.format(
args = 'node label set -l {labels} --nodes-all'.format(
labels=' '.join(labels))
self.exec_command(args)
@@ -158,7 +158,7 @@ class TestNodeCommand(test_engine.BaseCLITest):
def test_node_label_set_for_specific_nodes(self):
labels = ['key_1=val_1', 'key_2=val_2']
node_ids = ['42', '43']
args = 'node label set {labels} --nodes {node_ids}'.format(
args = 'node label set -l {labels} --nodes {node_ids}'.format(
labels=' '.join(labels), node_ids=' '.join(node_ids))
self.exec_command(args)
@@ -167,25 +167,45 @@ class TestNodeCommand(test_engine.BaseCLITest):
self.m_client.set_labels_for_nodes.assert_called_once_with(
labels=labels, node_ids=node_ids)
def test_node_label_delete_for_all_nodes(self):
labels_keys = ['key_1', 'key_2']
args = 'node label delete {labels_keys} --nodes-all'.format(
labels_keys=' '.join(labels_keys))
def test_node_delete_specific_labels_for_all_nodes(self):
labels = ['key_1', 'key_2']
args = 'node label delete -l {labels} --nodes-all'.format(
labels=' '.join(labels))
self.exec_command(args)
self.m_get_client.assert_called_once_with('node', mock.ANY)
self.m_client.delete_labels_for_nodes.assert_called_once_with(
labels_keys=labels_keys, node_ids=None)
labels=labels, node_ids=None)
def test_node_label_delete_for_specific_nodes(self):
def test_node_delete_specific_labels_for_specific_nodes(self):
labels_keys = ['key_1', 'key_2']
node_ids = ['42', '43']
args = 'node label delete {labels_keys} --nodes {node_ids}'.format(
labels_keys=' '.join(labels_keys), node_ids=' '.join(node_ids))
args = 'node label delete -l {labels} --nodes {node_ids}'.format(
labels=' '.join(labels_keys), node_ids=' '.join(node_ids))
self.exec_command(args)
self.m_get_client.assert_called_once_with('node', mock.ANY)
self.m_client.delete_labels_for_nodes.assert_called_once_with(
labels_keys=labels_keys, node_ids=node_ids)
labels=labels_keys, node_ids=node_ids)
def test_node_delete_all_labels_for_all_nodes(self):
args = 'node label delete --labels-all --nodes-all'
self.exec_command(args)
self.m_get_client.assert_called_once_with('node', mock.ANY)
self.m_client.delete_labels_for_nodes.assert_called_once_with(
labels=None, node_ids=None)
def test_node_delete_all_labels_for_specific_nodes(self):
node_ids = ['42', '43']
args = 'node label delete --labels-all --nodes {node_ids}'.format(
node_ids=' '.join(node_ids))
self.exec_command(args)
self.m_get_client.assert_called_once_with('node', mock.ANY)
self.m_client.delete_labels_for_nodes.assert_called_once_with(
labels=None, node_ids=node_ids)

View File

@@ -146,29 +146,28 @@ class TestNodeFacade(test_api.BaseLibTest):
matcher_get = self.m_request.get(expected_uri, json=self.fake_node)
matcher_put = self.m_request.put(expected_uri, json=data)
self.client.set_labels_for_nodes(
labels=labels, node_ids=node_ids)
self.client.set_labels_for_nodes(labels=labels, node_ids=node_ids)
self.assertTrue(matcher_get.called)
self.assertTrue(matcher_put.called)
self.assertEqual(data, matcher_put.last_request.json())
def test_delete_labels_for_all_nodes(self):
labels_keys = ['key_1', ' key_3 ']
def test_delete_specific_labels_for_all_nodes(self):
labels = ['key_1', ' key_3 ']
data = {'labels': {'key_2': None}}
expected_uri = self.get_object_uri(self.res_uri, 42)
matcher_get = self.m_request.get(self.res_uri, json=self.fake_nodes)
matcher_put = self.m_request.put(expected_uri, json=data)
self.client.delete_labels_for_nodes(labels_keys=labels_keys)
self.client.delete_labels_for_nodes(labels=labels)
self.assertTrue(matcher_get.called)
self.assertTrue(matcher_put.called)
self.assertEqual(data, matcher_put.last_request.json())
def test_delete_labels_for_specific_nodes(self):
labels_keys = ['key_2']
def test_delete_specific_labels_for_specific_nodes(self):
labels = ['key_2']
node_ids = ['42']
data = {'labels': {'key_1': 'val_1', 'key_3': 'val_3'}}
expected_uri = self.get_object_uri(self.res_uri, 42)
@@ -176,8 +175,34 @@ class TestNodeFacade(test_api.BaseLibTest):
matcher_get = self.m_request.get(expected_uri, json=self.fake_node)
matcher_put = self.m_request.put(expected_uri, json=data)
self.client.delete_labels_for_nodes(
labels_keys=labels_keys, node_ids=node_ids)
self.client.delete_labels_for_nodes(labels=labels, node_ids=node_ids)
self.assertTrue(matcher_get.called)
self.assertTrue(matcher_put.called)
self.assertEqual(data, matcher_put.last_request.json())
def test_delete_all_labels_for_all_nodes(self):
data = {'labels': {}}
expected_uri = self.get_object_uri(self.res_uri, 42)
matcher_get = self.m_request.get(self.res_uri, json=self.fake_nodes)
matcher_put = self.m_request.put(expected_uri, json=data)
self.client.delete_labels_for_nodes(labels=None)
self.assertTrue(matcher_get.called)
self.assertTrue(matcher_put.called)
self.assertEqual(data, matcher_put.last_request.json())
def test_delete_all_labels_for_specific_nodes(self):
node_ids = ['42']
data = {'labels': {}}
expected_uri = self.get_object_uri(self.res_uri, 42)
matcher_get = self.m_request.get(expected_uri, json=self.fake_node)
matcher_put = self.m_request.put(expected_uri, json=data)
self.client.delete_labels_for_nodes(labels=None, node_ids=node_ids)
self.assertTrue(matcher_get.called)
self.assertTrue(matcher_put.called)

View File

@@ -133,7 +133,7 @@ class NodeClient(base_v1.BaseV1Client):
return data_to_return
def delete_labels_for_nodes(self, labels_keys=None, node_ids=None):
def delete_labels_for_nodes(self, labels=None, node_ids=None):
"""Delete labels data from nodes labels. If node_ids are
empty list then labels will be deleted on all nodes
@@ -149,7 +149,7 @@ class NodeClient(base_v1.BaseV1Client):
for node_id in node_ids:
node = self._entity_wrapper(obj_id=node_id)
updated_labels = self._labels_after_delete(
node.labels, labels_keys)
node.labels, labels)
result = self.update(node_id, **{'labels': updated_labels})
data_to_return.append(str(result.get('id')))
@@ -157,7 +157,7 @@ class NodeClient(base_v1.BaseV1Client):
nodes = self._entity_wrapper.get_all_data()
for node in nodes:
updated_labels = self._labels_after_delete(
node['labels'], labels_keys)
node['labels'], labels)
result = self.update(node['id'], **{'labels': updated_labels})
data_to_return.append(str(result.get('id')))
@@ -179,11 +179,14 @@ class NodeClient(base_v1.BaseV1Client):
return any(checking_list)
@staticmethod
def _labels_after_delete(labels, labels_keys):
def _labels_after_delete(labels, labels_to_delete):
if not labels_to_delete:
return {}
db_labels = copy.deepcopy(labels)
for label_key in labels_keys:
label_key = label_key.strip()
db_labels.pop(label_key, None)
for label in labels_to_delete:
label = label.strip()
db_labels.pop(label, None)
return db_labels