Merge "Possibility to filter nodes only by key"
This commit is contained in:
@@ -50,7 +50,7 @@ class TestNodeCommand(test_engine.BaseCLITest):
|
||||
environment_id=env_id, labels=None)
|
||||
|
||||
def test_node_list_with_labels(self):
|
||||
labels = ['key_1=val_1', 'key_2=val_2']
|
||||
labels = ['key_1=val_1', 'key_2=val_2', 'key3']
|
||||
args = 'node list --labels {labels}'.format(
|
||||
labels=' '.join(labels))
|
||||
|
||||
@@ -62,7 +62,7 @@ class TestNodeCommand(test_engine.BaseCLITest):
|
||||
|
||||
def test_node_list_with_env_and_labels(self):
|
||||
env_id = 42
|
||||
labels = ["key_1=val_1", "key_2=val_2"]
|
||||
labels = ['key_1=val_1', 'key_2=val_2', 'key3']
|
||||
args = 'node list --env {env} --labels {labels}'.format(
|
||||
env=env_id, labels=' '.join(labels))
|
||||
|
||||
|
||||
@@ -38,6 +38,26 @@ class TestNodeFacade(test_api.BaseLibTest):
|
||||
|
||||
self.assertTrue(matcher.called)
|
||||
|
||||
def test_node_list_with_labels(self):
|
||||
labels = ['key1']
|
||||
fake_nodes = [
|
||||
utils.get_fake_node(
|
||||
node_name='node_1', labels={'key1': 'val1'}),
|
||||
utils.get_fake_node(
|
||||
node_name='node_2', labels={'key2': 'val2'}),
|
||||
utils.get_fake_node(
|
||||
node_name='node_3', labels={'key1': 'val2', 'key3': 'val3'})
|
||||
]
|
||||
|
||||
matcher_get = self.m_request.get(self.res_uri, json=fake_nodes)
|
||||
|
||||
data = self.client.get_all(labels=labels)
|
||||
|
||||
self.assertTrue(matcher_get.called)
|
||||
self.assertEqual(len(data), 2)
|
||||
self.assertEqual(data[0]['name'], 'node_1')
|
||||
self.assertEqual(data[1]['name'], 'node_3')
|
||||
|
||||
def test_node_show(self):
|
||||
node_id = 42
|
||||
expected_uri = self.get_object_uri(self.res_uri, node_id)
|
||||
@@ -170,9 +190,10 @@ class TestNodeFacade(test_api.BaseLibTest):
|
||||
'key= value ',
|
||||
' key = value ',
|
||||
):
|
||||
name, value = self.client._split_label(label)
|
||||
name, value, has_separator = self.client._split_label(label)
|
||||
self.assertEqual(name, 'key')
|
||||
self.assertEqual(value, 'value')
|
||||
self.assertTrue(has_separator)
|
||||
|
||||
def test_get_name_and_empty_value_from_lables(self):
|
||||
for label in (
|
||||
@@ -181,9 +202,27 @@ class TestNodeFacade(test_api.BaseLibTest):
|
||||
'key= ',
|
||||
' key = ',
|
||||
):
|
||||
name, value = self.client._split_label(label)
|
||||
name, value, has_separator = self.client._split_label(label)
|
||||
self.assertEqual(name, 'key')
|
||||
self.assertIsNone(value)
|
||||
self.assertTrue(has_separator)
|
||||
|
||||
def test_get_name_without_separator(self):
|
||||
for label in (
|
||||
'key',
|
||||
' key ',
|
||||
):
|
||||
name, value, has_separator = self.client._split_label(label)
|
||||
self.assertEqual(name, 'key')
|
||||
self.assertIsNone(value)
|
||||
self.assertFalse(has_separator)
|
||||
|
||||
def test_label_with_many_separators(self):
|
||||
label = 'key1= key2 = val2'
|
||||
name, value, has_separator = self.client._split_label(label)
|
||||
self.assertEqual(name, 'key1')
|
||||
self.assertEqual(value, 'key2 = val2')
|
||||
self.assertTrue(has_separator)
|
||||
|
||||
def test_labels_after_delete(self):
|
||||
all_labels = {
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from collections import namedtuple
|
||||
import copy
|
||||
from functools import partial
|
||||
|
||||
@@ -22,6 +23,9 @@ from fuelclient import objects
|
||||
from fuelclient.v1 import base_v1
|
||||
|
||||
|
||||
SplittedLabel = namedtuple('SplittedLabel', ['key', 'value', 'has_separator'])
|
||||
|
||||
|
||||
class NodeClient(base_v1.BaseV1Client):
|
||||
|
||||
_entity_wrapper = objects.Node
|
||||
@@ -107,7 +111,7 @@ class NodeClient(base_v1.BaseV1Client):
|
||||
labels_to_update = {}
|
||||
|
||||
for label in labels:
|
||||
key, val = self._split_label(label)
|
||||
key, val, _ = self._split_label(label)
|
||||
labels_to_update[key] = val
|
||||
|
||||
if node_ids:
|
||||
@@ -164,13 +168,15 @@ class NodeClient(base_v1.BaseV1Client):
|
||||
checking_list = []
|
||||
|
||||
for label in labels:
|
||||
key, val = self._split_label(label)
|
||||
|
||||
key, val, has_separator = self._split_label(label)
|
||||
if key in item.get('labels'):
|
||||
checking_val = item['labels'][key] == val
|
||||
if not has_separator:
|
||||
checking_val = True
|
||||
else:
|
||||
checking_val = item['labels'][key] == val
|
||||
checking_list.append(checking_val)
|
||||
|
||||
return True in checking_list
|
||||
return any(checking_list)
|
||||
|
||||
@staticmethod
|
||||
def _labels_after_delete(labels, labels_keys):
|
||||
@@ -183,11 +189,11 @@ class NodeClient(base_v1.BaseV1Client):
|
||||
|
||||
@staticmethod
|
||||
def _split_label(label):
|
||||
name, value = label.split('=')
|
||||
name, separator, value = label.partition('=')
|
||||
name = name.strip()
|
||||
value = value.strip()
|
||||
value = None if value == '' else value
|
||||
return name, value
|
||||
return SplittedLabel(name, value, bool(separator))
|
||||
|
||||
|
||||
def get_client():
|
||||
|
||||
Reference in New Issue
Block a user