Merge "Add INFO.yaml file"
[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 import mock
22 import conductor.data.plugins.inventory_provider.aai as aai
23 from conductor.data.plugins.inventory_provider.aai import AAI
24 from oslo_config import cfg
25
26 class TestAAI(unittest.TestCase):
27
28     def setUp(self):
29
30         CONF = cfg.CONF
31         CONF.register_opts(aai.AAI_OPTS, group='aai')
32         self.conf = CONF
33         self.aai_ep = AAI()
34
35     def tearDown(self):
36         mock.patch.stopall()
37
38     def test_get_version_from_string(self):
39
40         self.assertEqual("2.5", self.aai_ep._get_version_from_string("AAI2.5"))
41         self.assertEqual("3.0", self.aai_ep._get_version_from_string("AAI3.0"))
42
43     def test_aai_versioned_path(self):
44
45         self.assertEqual('/{}/cloud-infrastructure/cloud-regions/?depth=0'.format(self.conf.aai.server_url_version),
46                          self.aai_ep._aai_versioned_path("/cloud-infrastructure/cloud-regions/?depth=0"))
47         self.assertEqual('/{}/query?format=id'.format(self.conf.aai.server_url_version),
48                          self.aai_ep._aai_versioned_path("/query?format=id"))
49
50
51     def test_resolve_clli_location(self):
52
53         req_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_clli_location.json'
54         req_json = json.loads(open(req_json_file).read())
55
56         response = mock.MagicMock()
57         response.status_code = 200
58         response.ok = True
59         response.json.return_value = req_json
60
61         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
62         self.mock_get_request.start()
63         self.assertEqual({'country': u'USA', 'latitude': u'40.39596', 'longitude': u'-74.135342'} ,
64                         self.aai_ep.resolve_clli_location("clli_code"))
65
66     def test_get_inventory_group_pair(self):
67
68         req_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_inventory_group_pair.json'
69         req_json = json.loads(open(req_json_file).read())
70
71         response = mock.MagicMock()
72         response.status_code = 200
73         response.ok = True
74         response.json.return_value = req_json
75
76         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
77         self.mock_get_request.start()
78         self.assertEqual([[u'instance-1', u'instance-2']] ,
79                         self.aai_ep.get_inventory_group_pairs("service_description"))
80
81     def test_resolve_host_location(self):
82
83         req_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_host_name.json'
84         req_json = json.loads(open(req_json_file).read())
85
86         req_response = mock.MagicMock()
87         req_response.status_code = 200
88         req_response.ok = True
89         req_response.json.return_value = req_json
90
91         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_get_complex.json'
92         complex_json = json.loads(open(complex_json_file).read())
93
94         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=req_response)
95         self.mock_get_request.start()
96
97         self.mock_get_complex = mock.patch.object(AAI, '_get_complex', return_value=complex_json)
98         self.mock_get_complex.start()
99
100         self.assertEqual({'country': u'USA', 'latitude': u'28.543251', 'longitude': u'-81.377112'} ,
101                          self.aai_ep.resolve_host_location("host_name"))
102
103     def test_resolve_demands(self):
104
105         self.assertEqual({}, self.aai_ep.resolve_demands(dict()))
106
107         demands_list_file = './conductor/tests/unit/data/plugins/inventory_provider/demand_list.json'
108         demands_list = json.loads(open(demands_list_file).read())
109
110         generic_vnf_list_file = './conductor/tests/unit/data/plugins/inventory_provider/generic_vnf_list.json'
111         generic_vnf_list = json.loads(open(generic_vnf_list_file).read())
112
113         regions_response_file = './conductor/tests/unit/data/plugins/inventory_provider/regions.json'
114         regions_response = json.loads(open(regions_response_file).read())
115
116         demand_service_response_file = './conductor/tests/unit/data/plugins/inventory_provider/resolve_demand_service_response.json'
117         demand_service_response = json.loads(open(demand_service_response_file).read())
118
119         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_get_complex.json'
120         complex_json = json.loads(open(complex_json_file).read())
121
122         req_response = mock.MagicMock()
123         req_response.status_code = 200
124         req_response.ok = True
125         req_response.json.return_value = demand_service_response
126
127         self.mock_first_level_service_call = mock.patch.object(AAI, 'first_level_service_call', return_value=generic_vnf_list)
128         self.mock_first_level_service_call.start()
129
130         self.mock_get_regions = mock.patch.object(AAI, '_get_regions', return_value=regions_response)
131         self.mock_get_regions.start()
132
133         self.mock_get_regions = mock.patch.object(AAI, '_request', return_value=req_response)
134         self.mock_get_regions.start()
135
136         self.mock_get_complex = mock.patch.object(AAI, '_get_complex', return_value=complex_json)
137         self.mock_get_complex.start()
138
139         self.maxDiff = None
140         self.assertEqual({u'demand_name': [{'candidate_id': u'service-instance-id','city': None,'cloud_owner': u'cloud-owner','cloud_region_version': '','complex_name': None,'cost': 1.0,'country': u'USA','existing_placement': 'false','host_id': u'vnf-name','inventory_provider': 'aai','inventory_type': 'service','latitude': u'28.543251','location_id': u'cloud-region-id','location_type': 'att_aic','longitude': u'-81.377112','physical_location_id': 'test-id','region': u'SE','service_resource_id': '','sriov_automation': 'false','state': None},{'candidate_id': u'region-name','city': u'Middletown','cloud_owner': u'cloud-owner','cloud_region_version': u'1.0','complex_name': u'complex-name','cost': 2.0,'country': u'USA','existing_placement': 'false','inventory_provider': 'aai','inventory_type': 'cloud','latitude': u'50.34','location_id': u'region-name','location_type': 'att_aic','longitude': u'30.12','physical_location_id': u'complex-id','region': u'USA','service_resource_id': u'service-resource-id-123','sriov_automation': 'false','state': u'NJ'}]} ,
141                        self.aai_ep.resolve_demands(demands_list))
142
143     def test_get_complex(self):
144
145         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_get_complex.json'
146         complex_json = json.loads(open(complex_json_file).read())
147
148         response = mock.MagicMock()
149         response.status_code = 200
150         response.ok = True
151         response.json.return_value = complex_json
152
153         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
154         self.mock_get_request.start()
155
156         self.assertEqual({u'city': u'Middletown', u'latitude': u'28.543251', u'longitude': u'-81.377112', u'country': u'USA', u'region': u'SE'} ,
157                          self.aai_ep._get_complex("/v10/complex/complex_id", "complex_id"))
158
159
160     def test_check_network_roles(self):
161
162         network_role_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_network_role.json'
163         network_role_json = json.loads(open(network_role_json_file).read())
164
165         response = mock.MagicMock()
166         response.status_code = 200
167         response.ok = True
168         response.json.return_value = network_role_json
169
170         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
171         self.mock_get_request.start()
172         self.assertEqual(set(['test-cloud-value']) ,
173                         self.aai_ep.check_network_roles("network_role_id"))
174
175
176     def test_check_candidate_role(self):
177
178         candidate_role_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_request_candidate_role.json'
179         candidate_role_json = json.loads(open(candidate_role_json_file).read())
180
181         response = mock.MagicMock()
182         response.status_code = 200
183         response.ok = True
184         response.json.return_value = candidate_role_json
185
186         self.mock_get_request = mock.patch.object(AAI, '_request', return_value=response)
187         self.mock_get_request.start()
188
189         self.assertEqual("test-role",
190                          self.aai_ep.check_candidate_role("candidate_host_id"))
191
192     def test_match_inventory_attributes(self):
193         template_attributes = dict()
194         template_attributes['attr-1'] = ['attr-1-value1', 'attr-1-value2']
195
196         inventory_attributes = dict()
197         inventory_attributes['attr-1'] = 'attr-1-value1'
198
199         self.assertEqual(True,
200                          self.aai_ep.match_inventory_attributes(template_attributes, inventory_attributes, "candidate-id"))
201
202         template_attributes['attr-1'] = {
203             'not': ['attr-1-value2']
204         }
205         self.assertEqual(True,
206                          self.aai_ep.match_inventory_attributes(template_attributes, inventory_attributes,
207                                                                 "candidate-id"))
208
209         template_attributes['attr-1'] = {
210             'not': ['attr-1-value1']
211         }
212         self.assertEqual(False,
213                          self.aai_ep.match_inventory_attributes(template_attributes, inventory_attributes,
214                                                                 "candidate-id"))
215
216     def test_refresh_cache(self):
217         regions_response_file = './conductor/tests/unit/data/plugins/inventory_provider/cache_regions.json'
218         regions_response = json.loads(open(regions_response_file).read())
219
220         complex_json_file = './conductor/tests/unit/data/plugins/inventory_provider/_get_complex.json'
221         complex_json = json.loads(open(complex_json_file).read())
222
223         response = mock.MagicMock()
224         response.status_code = 200
225         response.ok = True
226         response.json.return_value = regions_response
227
228         self.mock_get_regions = mock.patch.object(AAI, '_request', return_value=response)
229         self.mock_get_regions.start()
230
231         self.mock_get_complex = mock.patch.object(AAI, '_get_complex', return_value=complex_json)
232         self.mock_get_complex.start()
233
234         self.assertEqual(None,
235                          self.aai_ep._refresh_cache())