Merge "Option '--labels-all' for node label DELETE method"
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user