Merge "Accommodate Changes for Music 2.4.x"
[optf/has.git] / conductor / conductor / tests / unit / data / plugins / inventory_provider / test_aai.py
1 #
2 # -------------------------------------------------------------------------
3 #   Copyright (c) 2015-2017 AT&T Intellectual Property
4 #
5 #   Licensed under the Apache License, Version 2.0 (the "License");
6 #   you may not use this file except in compliance with the License.
7 #   You may obtain a copy of the License at
8 #
9 #       http://www.apache.org/licenses/LICENSE-2.0
10 #
11 #   Unless required by applicable law or agreed to in writing, software
12 #   distributed under the License is distributed on an "AS IS" BASIS,
13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 #   See the License for the specific language governing permissions and
15 #   limitations under the License.
16 #
17 # -------------------------------------------------------------------------
18 #
19 import json
20 import unittest
21
22 import conductor.data.plugins.inventory_provider.aai as aai
23 import mock
24 from conductor.data.plugins.inventory_provider.aai import AAI
25 from oslo_config import cfg
26
27
28 class TestAAI(unittest.TestCase):
29
30     def setUp(self):
31
32         CONF = cfg.CONF
33         CONF.register_opts(aai.AAI_OPTS, group='aai')
34         self.conf = CONF
35         self.aai_ep = AAI()
36
37     def tearDown(self):
38         mock.patch.stopall()
39
40     def test_get_version_from_string(self):
41
42         self.assertEqual("2.5", self.aai_ep._get_version_from_string("AAI2.5"))
43         self.assertEqual("3.0", self.aai_ep._get_version_from_string("AAI3.0"))
44
45     def test_aai_versioned_path(self):
46
47         self.assertEqual('/{}/cloud-infrastructure/cloud-regions/?depth=0'.format(self.conf.aai.server_url_version),
48                          self.aai_ep._aai_versioned_path("/cloud-infrastructure/cloud-regions/?depth=0"))
49         self.assertEqual('/{}/query?format=id'.format(self.conf.aai.server_url_version),
50                          self.aai_ep._aai_versioned_path("/query?format=id"))
51
52
53     def test_resolve_clli_location(self):
54
55         req_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_clli_location.json'
56         req_json = json.loads(open(req_json_file).read())
57
58         response = mock.MagicMock()
59         response.status_code = 200
60         response.ok = True
61         response.json.return_value = req_json
62
63         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
64         self.mock_get_request.start()
65         self.assertEqual({'country': u'USA', 'latitude': u'40.39596', 'longitude': u'-74.135342'} ,
66                         self.aai_ep.resolve_clli_location("clli_code"))
67
68     def test_get_inventory_group_pair(self):
69
70         req_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_inventory_group_pair.json'
71         req_json = json.loads(open(req_json_file).read())
72
73         response = mock.MagicMock()
74         response.status_code = 200
75         response.ok = True
76         response.json.return_value = req_json
77
78         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
79         self.mock_get_request.start()
80         self.assertEqual([[u'instance-1', u'instance-2']] ,
81                         self.aai_ep.get_inventory_group_pairs("service_description"))
82
83     def test_resolve_host_location(self):
84
85         req_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_host_name.json'
86         req_json = json.loads(open(req_json_file).read())
87
88         req_response = mock.MagicMock()
89         req_response.status_code = 200
90         req_response.ok = True
91         req_response.json.return_value = req_json
92
93         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_get_complex.json'
94         complex_json = json.loads(open(complex_json_file).read())
95
96         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=req_response)
97         self.mock_get_request.start()
98
99         self.mock_get_complex = mock.patch.object(AAI, '_get_complex', return_value=complex_json)
100         self.mock_get_complex.start()
101
102         self.assertEqual({'country': u'USA', 'latitude': u'28.543251', 'longitude': u'-81.377112'} ,
103                          self.aai_ep.resolve_host_location("host_name"))
104
105     def test_resolve_demands(self):
106
107         self.assertEqual({}, self.aai_ep.resolve_demands(dict()))
108
109         demands_list_file = './conductor/tests/unit/data/plugins/inventory_provider/demand_list.json'
110         demands_list = json.loads(open(demands_list_file).read())
111
112         generic_vnf_list_file = './conductor/tests/unit/data/plugins/inventory_provider/generic_vnf_list.json'
113         generic_vnf_list = json.loads(open(generic_vnf_list_file).read())
114
115         regions_response_file = './conductor/tests/unit/data/plugins/inventory_provider/regions.json'
116         regions_response = json.loads(open(regions_response_file).read())
117
118         demand_service_response_file = './conductor/tests/unit/data/plugins/inventory_provider/resolve_demand_service_response.json'
119         demand_service_response = json.loads(open(demand_service_response_file).read())
120
121         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_get_complex.json'
122         complex_json = json.loads(open(complex_json_file).read())
123
124         req_response = mock.MagicMock()
125         req_response.status_code = 200
126         req_response.ok = True
127         req_response.json.return_value = demand_service_response
128
129         self.mock_first_level_service_call = mock.patch.object(AAI, 'first_level_service_call', return_value=generic_vnf_list)
130         self.mock_first_level_service_call.start()
131
132         self.mock_get_regions = mock.patch.object(AAI, '_get_regions', return_value=regions_response)
133         self.mock_get_regions.start()
134
135         self.mock_get_regions = mock.patch.object(AAI, '_request', return_value=req_response)
136         self.mock_get_regions.start()
137
138         self.mock_get_complex = mock.patch.object(AAI, '_get_complex', return_value=complex_json)
139         self.mock_get_complex.start()
140
141         flavor_info = regions_response["region-name"]["flavors"]
142         self.maxDiff = None
143         self.assertEqual({u'demand_name': [
144             {'candidate_id': u'service-instance-id', 'city': None,
145              'cloud_owner': u'cloud-owner',
146              'vim-id': 'cloud-owner_cloud-region-id',
147              'cloud_region_version': '', 'complex_name': None, 'cost': 1.0,
148              'country': u'USA', 'existing_placement': 'false',
149              'host_id': u'vnf-name', 'inventory_provider': 'aai',
150              'inventory_type': 'service', 'latitude': u'28.543251',
151              'location_id': u'cloud-region-id', 'location_type': 'att_aic',
152              'longitude': u'-81.377112', 'physical_location_id': 'test-id',
153              'region': u'SE', 'service_resource_id': '',
154              'sriov_automation': 'false', 'state': None},
155             {'candidate_id': u'region-name', 'city': u'Middletown',
156              'cloud_owner': u'cloud-owner',
157              'vim-id': 'cloud-owner_region-name',
158              'cloud_region_version': u'1.0', 'complex_name': u'complex-name',
159              'cost': 2.0, 'country': u'USA', 'existing_placement': 'false',
160              'inventory_provider': 'aai', 'inventory_type': 'cloud',
161              'latitude': u'50.34', 'location_id': u'region-name',
162              'location_type': 'att_aic', 'longitude': u'30.12',
163              'physical_location_id': u'complex-id', 'region': u'USA',
164              'service_resource_id': u'service-resource-id-123',
165              'sriov_automation': 'false', 'state': u'NJ',
166              'flavors': flavor_info}]},
167             self.aai_ep.resolve_demands(demands_list))
168
169     def test_get_complex(self):
170
171         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_get_complex.json'
172         complex_json = json.loads(open(complex_json_file).read())
173
174         response = mock.MagicMock()
175         response.status_code = 200
176         response.ok = True
177         response.json.return_value = complex_json
178
179         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
180         self.mock_get_request.start()
181
182         self.assertEqual({u'city': u'Middletown', u'latitude': u'28.543251', u'longitude': u'-81.377112', u'country': u'USA', u'region': u'SE'} ,
183                          self.aai_ep._get_complex("/v10/complex/complex_id", "complex_id"))
184
185
186     def test_check_network_roles(self):
187
188         network_role_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_network_role.json'
189         network_role_json = json.loads(open(network_role_json_file).read())
190
191         response = mock.MagicMock()
192         response.status_code = 200
193         response.ok = True
194         response.json.return_value = network_role_json
195
196         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
197         self.mock_get_request.start()
198         self.assertEqual(set(['test-cloud-value']) ,
199                         self.aai_ep.check_network_roles("network_role_id"))
200
201
202     def test_check_candidate_role(self):
203
204         candidate_role_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_candidate_role.json'
205         candidate_role_json = json.loads(open(candidate_role_json_file).read())
206
207         response = mock.MagicMock()
208         response.status_code = 200
209         response.ok = True
210         response.json.return_value = candidate_role_json
211
212         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
213         self.mock_get_request.start()
214
215         self.assertEqual("test-role",
216                          self.aai_ep.check_candidate_role("candidate_host_id"))
217
218     def test_match_inventory_attributes(self):
219         template_attributes = dict()
220         template_attributes['attr-1'] = ['attr-1-value1', 'attr-1-value2']
221
222         inventory_attributes = dict()
223         inventory_attributes['attr-1'] = 'attr-1-value1'
224
225         self.assertEqual(True,
226                          self.aai_ep.match_inventory_attributes(template_attributes, inventory_attributes, "candidate-id"))
227
228         template_attributes['attr-1'] = {
229             'not': ['attr-1-value2']
230         }
231         self.assertEqual(True,
232                          self.aai_ep.match_inventory_attributes(template_attributes, inventory_attributes,
233                                                                 "candidate-id"))
234
235         template_attributes['attr-1'] = {
236             'not': ['attr-1-value1']
237         }
238         self.assertEqual(False,
239                          self.aai_ep.match_inventory_attributes(template_attributes, inventory_attributes,
240                                                                 "candidate-id"))
241
242     def test_refresh_cache(self):
243         regions_response_file = './conductor/tests/unit/data/plugins/inventory_provider/cache_regions.json'
244         regions_response = json.loads(open(regions_response_file).read())
245
246         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_cached_complex.json'
247         complex_json = json.loads(open(complex_json_file).read())
248
249         flavors_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_get_flavors.json'
250         flavors_json = json.loads(open(flavors_json_file).read())
251
252         response = mock.MagicMock()
253         response.status_code = 200
254         response.ok = True
255         response.json.return_value = regions_response
256
257         self.mock_get_regions = mock.patch.object(AAI, '_request', return_value=response)
258         self.mock_get_regions.start()
259
260         self.mock_get_complex = mock.patch.object(AAI, '_get_complex', return_value=complex_json)
261         self.mock_get_complex.start()
262
263         self.mock_get_flavors = mock.patch.object(AAI, '_get_flavors',
264                                                   return_value=flavors_json)
265         self.mock_get_flavors.start()
266
267         self.assertEqual(None,
268                          self.aai_ep._refresh_cache())
269
270     def test_get_aai_rel_link(self):
271
272         relatonship_response_file = './conductor/tests/unit/data/plugins/inventory_provider/relationship_list.json'
273         relatonship_response = json.loads(open(relatonship_response_file).read())
274         related_to = "service-instance"
275
276         self.assertEqual("relationship-link",
277                          self.aai_ep._get_aai_rel_link(relatonship_response, related_to))
278
279     def test_get_flavor(self):
280         flavors_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_get_flavors.json'
281         flavors_json = json.loads(open(flavors_json_file).read())
282
283         response = mock.MagicMock()
284         response.json.return_value = None
285
286         self.mock_get_request = mock.patch.object(AAI, '_request',
287                                                   return_value=response)
288         self.mock_get_request.start()
289
290         flavors_info = self.aai_ep._get_flavors("mock-cloud-owner",
291                                                 "mock-cloud-region-id")
292         self.assertEqual(None, flavors_info)
293
294         response.status_code = 200
295         response.ok = True
296         response.json.return_value = flavors_json
297
298         flavors_info = self.aai_ep._get_flavors("mock-cloud-owner",
299                                                 "mock-cloud-region-id")
300         self.assertEqual(2, len(flavors_info['flavor']))