Add find_min_match()
find_min_match() is used to filter a list of resources according to the minimum value of one or more attributes. For example, to locate a server flavor that has at least 4 VCPUs and 1GB RAM. Also make TestUtils.get_test_items private and fix a typo or two. Change-Id: Ie524b41ba0716d6ac94aeea9367be414724d99e6
This commit is contained in:
parent
226d369607
commit
5c72e23877
|
@ -42,13 +42,73 @@ class FakeOddballResource(fakes.FakeResource):
|
||||||
|
|
||||||
class TestUtils(test_utils.TestCase):
|
class TestUtils(test_utils.TestCase):
|
||||||
|
|
||||||
def get_test_items(self):
|
def _get_test_items(self):
|
||||||
item1 = {'a': 1, 'b': 2}
|
item1 = {'a': 1, 'b': 2}
|
||||||
item2 = {'a': 1, 'b': 3}
|
item2 = {'a': 1, 'b': 3}
|
||||||
item3 = {'a': 2, 'b': 2}
|
item3 = {'a': 2, 'b': 2}
|
||||||
item4 = {'a': 2, 'b': 1}
|
item4 = {'a': 2, 'b': 1}
|
||||||
return [item1, item2, item3, item4]
|
return [item1, item2, item3, item4]
|
||||||
|
|
||||||
|
def test_find_min_match_no_sort(self):
|
||||||
|
items = self._get_test_items()
|
||||||
|
sort_str = None
|
||||||
|
flair = {}
|
||||||
|
expect_items = items
|
||||||
|
self.assertEqual(
|
||||||
|
expect_items,
|
||||||
|
list(utils.find_min_match(items, sort_str, **flair)),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_find_min_match_no_flair(self):
|
||||||
|
items = self._get_test_items()
|
||||||
|
sort_str = 'b'
|
||||||
|
flair = {}
|
||||||
|
expect_items = [items[3], items[0], items[2], items[1]]
|
||||||
|
self.assertEqual(
|
||||||
|
expect_items,
|
||||||
|
utils.find_min_match(items, sort_str, **flair),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_find_min_match_a2(self):
|
||||||
|
items = self._get_test_items()
|
||||||
|
sort_str = 'b'
|
||||||
|
flair = {'a': 2}
|
||||||
|
expect_items = [items[3], items[2]]
|
||||||
|
self.assertEqual(
|
||||||
|
expect_items,
|
||||||
|
utils.find_min_match(items, sort_str, **flair),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_find_min_match_b2(self):
|
||||||
|
items = self._get_test_items()
|
||||||
|
sort_str = 'b'
|
||||||
|
flair = {'b': 2}
|
||||||
|
expect_items = [items[0], items[2], items[1]]
|
||||||
|
self.assertEqual(
|
||||||
|
expect_items,
|
||||||
|
utils.find_min_match(items, sort_str, **flair),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_find_min_match_b5(self):
|
||||||
|
items = self._get_test_items()
|
||||||
|
sort_str = 'b'
|
||||||
|
flair = {'b': 5}
|
||||||
|
expect_items = []
|
||||||
|
self.assertEqual(
|
||||||
|
expect_items,
|
||||||
|
utils.find_min_match(items, sort_str, **flair),
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_find_min_match_a2_b2(self):
|
||||||
|
items = self._get_test_items()
|
||||||
|
sort_str = 'b'
|
||||||
|
flair = {'a': 2, 'b': 2}
|
||||||
|
expect_items = [items[2]]
|
||||||
|
self.assertEqual(
|
||||||
|
expect_items,
|
||||||
|
utils.find_min_match(items, sort_str, **flair),
|
||||||
|
)
|
||||||
|
|
||||||
def test_get_password_good(self):
|
def test_get_password_good(self):
|
||||||
with mock.patch("getpass.getpass", return_value=PASSWORD):
|
with mock.patch("getpass.getpass", return_value=PASSWORD):
|
||||||
mock_stdin = mock.Mock()
|
mock_stdin = mock.Mock()
|
||||||
|
@ -82,25 +142,25 @@ class TestUtils(test_utils.TestCase):
|
||||||
mock_stdin)
|
mock_stdin)
|
||||||
|
|
||||||
def test_sort_items_with_one_key(self):
|
def test_sort_items_with_one_key(self):
|
||||||
items = self.get_test_items()
|
items = self._get_test_items()
|
||||||
sort_str = 'b'
|
sort_str = 'b'
|
||||||
expect_items = [items[3], items[0], items[2], items[1]]
|
expect_items = [items[3], items[0], items[2], items[1]]
|
||||||
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
||||||
|
|
||||||
def test_sort_items_with_multiple_keys(self):
|
def test_sort_items_with_multiple_keys(self):
|
||||||
items = self.get_test_items()
|
items = self._get_test_items()
|
||||||
sort_str = 'a,b'
|
sort_str = 'a,b'
|
||||||
expect_items = [items[0], items[1], items[3], items[2]]
|
expect_items = [items[0], items[1], items[3], items[2]]
|
||||||
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
||||||
|
|
||||||
def test_sort_items_all_with_direction(self):
|
def test_sort_items_all_with_direction(self):
|
||||||
items = self.get_test_items()
|
items = self._get_test_items()
|
||||||
sort_str = 'a:desc,b:desc'
|
sort_str = 'a:desc,b:desc'
|
||||||
expect_items = [items[2], items[3], items[1], items[0]]
|
expect_items = [items[2], items[3], items[1], items[0]]
|
||||||
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
||||||
|
|
||||||
def test_sort_items_some_with_direction(self):
|
def test_sort_items_some_with_direction(self):
|
||||||
items = self.get_test_items()
|
items = self._get_test_items()
|
||||||
sort_str = 'a,b:desc'
|
sort_str = 'a,b:desc'
|
||||||
expect_items = [items[1], items[0], items[2], items[3]]
|
expect_items = [items[1], items[0], items[2], items[3]]
|
||||||
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
||||||
|
@ -116,21 +176,21 @@ class TestUtils(test_utils.TestCase):
|
||||||
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
self.assertEqual(expect_items, utils.sort_items(items, sort_str))
|
||||||
|
|
||||||
def test_sort_items_with_empty_key(self):
|
def test_sort_items_with_empty_key(self):
|
||||||
items = self.get_test_items()
|
items = self._get_test_items()
|
||||||
sort_srt = ''
|
sort_srt = ''
|
||||||
self.assertEqual(items, utils.sort_items(items, sort_srt))
|
self.assertEqual(items, utils.sort_items(items, sort_srt))
|
||||||
sort_srt = None
|
sort_srt = None
|
||||||
self.assertEqual(items, utils.sort_items(items, sort_srt))
|
self.assertEqual(items, utils.sort_items(items, sort_srt))
|
||||||
|
|
||||||
def test_sort_items_with_invalid_key(self):
|
def test_sort_items_with_invalid_key(self):
|
||||||
items = self.get_test_items()
|
items = self._get_test_items()
|
||||||
sort_str = 'c'
|
sort_str = 'c'
|
||||||
self.assertRaises(exceptions.CommandError,
|
self.assertRaises(exceptions.CommandError,
|
||||||
utils.sort_items,
|
utils.sort_items,
|
||||||
items, sort_str)
|
items, sort_str)
|
||||||
|
|
||||||
def test_sort_items_with_invalid_direction(self):
|
def test_sort_items_with_invalid_direction(self):
|
||||||
items = self.get_test_items()
|
items = self._get_test_items()
|
||||||
sort_str = 'a:bad_dir'
|
sort_str = 'a:bad_dir'
|
||||||
self.assertRaises(exceptions.CommandError,
|
self.assertRaises(exceptions.CommandError,
|
||||||
utils.sort_items,
|
utils.sort_items,
|
||||||
|
@ -204,7 +264,7 @@ class TestUtils(test_utils.TestCase):
|
||||||
mock_sleep.assert_not_called()
|
mock_sleep.assert_not_called()
|
||||||
|
|
||||||
@mock.patch.object(time, 'sleep')
|
@mock.patch.object(time, 'sleep')
|
||||||
def test_wait_for_status_ok__with_overrides(self, mock_sleep):
|
def test_wait_for_status_ok_with_overrides(self, mock_sleep):
|
||||||
# Tests the normal flow that the resource is status=complete
|
# Tests the normal flow that the resource is status=complete
|
||||||
resource = mock.MagicMock(my_status='COMPLETE')
|
resource = mock.MagicMock(my_status='COMPLETE')
|
||||||
status_f = mock.Mock(return_value=resource)
|
status_f = mock.Mock(return_value=resource)
|
||||||
|
|
|
@ -48,6 +48,27 @@ def env(*vars, **kwargs):
|
||||||
return kwargs.get('default', '')
|
return kwargs.get('default', '')
|
||||||
|
|
||||||
|
|
||||||
|
def find_min_match(items, sort_attr, **kwargs):
|
||||||
|
"""Find all resources meeting the given minimum constraints
|
||||||
|
|
||||||
|
:param items: A List of objects to consider
|
||||||
|
:param sort_attr: Attribute to sort the resulting list
|
||||||
|
:param kwargs: A dict of attributes and their minimum values
|
||||||
|
:rtype: A list of resources osrted by sort_attr that meet the minimums
|
||||||
|
"""
|
||||||
|
|
||||||
|
def minimum_pieces_of_flair(item):
|
||||||
|
"""Find lowest value greater than the minumum"""
|
||||||
|
|
||||||
|
result = True
|
||||||
|
for k in kwargs:
|
||||||
|
# AND together all of the given attribute results
|
||||||
|
result = result and kwargs[k] <= get_field(item, k)
|
||||||
|
return result
|
||||||
|
|
||||||
|
return sort_items(filter(minimum_pieces_of_flair, items), sort_attr)
|
||||||
|
|
||||||
|
|
||||||
def find_resource(manager, name_or_id, **kwargs):
|
def find_resource(manager, name_or_id, **kwargs):
|
||||||
"""Helper for the _find_* methods.
|
"""Helper for the _find_* methods.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue