1# Copyright (c) 2016 IBM
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7#    http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15from openstack.cloud import exc
16from openstack.tests.functional import base
17
18
19class TestRangeSearch(base.BaseFunctionalTest):
20
21    def _filter_m1_flavors(self, results):
22        """The m1 flavors are the original devstack flavors"""
23        new_results = []
24        for flavor in results:
25            if flavor['name'].startswith("m1."):
26                new_results.append(flavor)
27        return new_results
28
29    def test_range_search_bad_range(self):
30        flavors = self.user_cloud.list_flavors(get_extra=False)
31        self.assertRaises(
32            exc.OpenStackCloudException,
33            self.user_cloud.range_search, flavors, {"ram": "<1a0"})
34
35    def test_range_search_exact(self):
36        flavors = self.user_cloud.list_flavors(get_extra=False)
37        result = self.user_cloud.range_search(flavors, {"ram": "4096"})
38        self.assertIsInstance(result, list)
39        # should only be 1 m1 flavor with 4096 ram
40        result = self._filter_m1_flavors(result)
41        self.assertEqual(1, len(result))
42        self.assertEqual("m1.medium", result[0]['name'])
43
44    def test_range_search_min(self):
45        flavors = self.user_cloud.list_flavors(get_extra=False)
46        result = self.user_cloud.range_search(flavors, {"ram": "MIN"})
47        self.assertIsInstance(result, list)
48        self.assertEqual(1, len(result))
49        # older devstack does not have cirros256
50        self.assertIn(result[0]['name'], ('cirros256', 'm1.tiny'))
51
52    def test_range_search_max(self):
53        flavors = self.user_cloud.list_flavors(get_extra=False)
54        result = self.user_cloud.range_search(flavors, {"ram": "MAX"})
55        self.assertIsInstance(result, list)
56        self.assertEqual(1, len(result))
57        self.assertEqual("m1.xlarge", result[0]['name'])
58
59    def test_range_search_lt(self):
60        flavors = self.user_cloud.list_flavors(get_extra=False)
61        result = self.user_cloud.range_search(flavors, {"ram": "<1024"})
62        self.assertIsInstance(result, list)
63        # should only be 1 m1 flavor with <1024 ram
64        result = self._filter_m1_flavors(result)
65        self.assertEqual(1, len(result))
66        self.assertEqual("m1.tiny", result[0]['name'])
67
68    def test_range_search_gt(self):
69        flavors = self.user_cloud.list_flavors(get_extra=False)
70        result = self.user_cloud.range_search(flavors, {"ram": ">4096"})
71        self.assertIsInstance(result, list)
72        # should only be 2 m1 flavors with >4096 ram
73        result = self._filter_m1_flavors(result)
74        self.assertEqual(2, len(result))
75        flavor_names = [r['name'] for r in result]
76        self.assertIn("m1.large", flavor_names)
77        self.assertIn("m1.xlarge", flavor_names)
78
79    def test_range_search_le(self):
80        flavors = self.user_cloud.list_flavors(get_extra=False)
81        result = self.user_cloud.range_search(flavors, {"ram": "<=4096"})
82        self.assertIsInstance(result, list)
83        # should only be 3 m1 flavors with <=4096 ram
84        result = self._filter_m1_flavors(result)
85        self.assertEqual(3, len(result))
86        flavor_names = [r['name'] for r in result]
87        self.assertIn("m1.tiny", flavor_names)
88        self.assertIn("m1.small", flavor_names)
89        self.assertIn("m1.medium", flavor_names)
90
91    def test_range_search_ge(self):
92        flavors = self.user_cloud.list_flavors(get_extra=False)
93        result = self.user_cloud.range_search(flavors, {"ram": ">=4096"})
94        self.assertIsInstance(result, list)
95        # should only be 3 m1 flavors with >=4096 ram
96        result = self._filter_m1_flavors(result)
97        self.assertEqual(3, len(result))
98        flavor_names = [r['name'] for r in result]
99        self.assertIn("m1.medium", flavor_names)
100        self.assertIn("m1.large", flavor_names)
101        self.assertIn("m1.xlarge", flavor_names)
102
103    def test_range_search_multi_1(self):
104        flavors = self.user_cloud.list_flavors(get_extra=False)
105        result = self.user_cloud.range_search(
106            flavors, {"ram": "MIN", "vcpus": "MIN"})
107        self.assertIsInstance(result, list)
108        self.assertEqual(1, len(result))
109        # older devstack does not have cirros256
110        self.assertIn(result[0]['name'], ('cirros256', 'm1.tiny'))
111
112    def test_range_search_multi_2(self):
113        flavors = self.user_cloud.list_flavors(get_extra=False)
114        result = self.user_cloud.range_search(
115            flavors, {"ram": "<1024", "vcpus": "MIN"})
116        self.assertIsInstance(result, list)
117        result = self._filter_m1_flavors(result)
118        self.assertEqual(1, len(result))
119        flavor_names = [r['name'] for r in result]
120        self.assertIn("m1.tiny", flavor_names)
121
122    def test_range_search_multi_3(self):
123        flavors = self.user_cloud.list_flavors(get_extra=False)
124        result = self.user_cloud.range_search(
125            flavors, {"ram": ">=4096", "vcpus": "<6"})
126        self.assertIsInstance(result, list)
127        result = self._filter_m1_flavors(result)
128        self.assertEqual(2, len(result))
129        flavor_names = [r['name'] for r in result]
130        self.assertIn("m1.medium", flavor_names)
131        self.assertIn("m1.large", flavor_names)
132
133    def test_range_search_multi_4(self):
134        flavors = self.user_cloud.list_flavors(get_extra=False)
135        result = self.user_cloud.range_search(
136            flavors, {"ram": ">=4096", "vcpus": "MAX"})
137        self.assertIsInstance(result, list)
138        self.assertEqual(1, len(result))
139        # This is the only result that should have max vcpu
140        self.assertEqual("m1.xlarge", result[0]['name'])
141