Merge "Possibility to filter nodes only by key"

This commit is contained in:
Jenkins
2015-08-07 09:26:36 +00:00
committed by Gerrit Code Review
3 changed files with 56 additions and 11 deletions

View File

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

View File

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

View File

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