1 ##############################################################################
2 # Copyright (c) 2018 Tim Rozet (trozet@redhat.com) (Red Hat)
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
10 from mock import patch
15 from apex.common import exceptions as exc
16 from apex.deployment.snapshot import SnapshotDeployment
17 from apex.settings.deploy_settings import DeploySettings
18 from apex.tests.constants import TEST_DUMMY_CONFIG
20 DUMMY_SNAP_DIR = '/tmp/dummy_cache'
23 class TestSnapshotDeployment(unittest.TestCase):
26 """This method is run once for each class before any tests are run"""
29 def teardown_class(cls):
30 """This method is run once for each class _after_ all tests are run"""
33 """This method is run once before _each_ test method is executed"""
36 """This method is run once after _each_ test method is executed"""
38 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
39 @patch('apex.deployment.snapshot.libvirt.open')
40 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
41 def test_init(self, mock_deploy_snap, mock_libvirt_open, mock_pull_snap):
43 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
44 ds = DeploySettings(ds_file)
45 d = SnapshotDeployment(deploy_settings=ds,
46 snap_cache_dir=DUMMY_SNAP_DIR,
47 fetch=True, all_in_one=False)
48 snap_dir = os.path.join(DUMMY_SNAP_DIR, 'queens', 'noha')
49 self.assertEqual(d.snap_cache_dir, snap_dir)
50 mock_pull_snap.assert_called()
51 mock_deploy_snap.assert_called()
52 self.assertEqual(d.ha_ext, 'noha')
54 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
55 @patch('apex.deployment.snapshot.libvirt.open')
56 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
57 def test_init_allinone_no_fetch(self, mock_deploy_snap, mock_libvirt_open,
60 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
61 ds = DeploySettings(ds_file)
62 d = SnapshotDeployment(deploy_settings=ds,
63 snap_cache_dir=DUMMY_SNAP_DIR,
64 fetch=False, all_in_one=True)
65 snap_dir = os.path.join(DUMMY_SNAP_DIR, 'queens', 'noha-allinone')
66 self.assertEqual(d.snap_cache_dir, snap_dir)
67 mock_pull_snap.assert_not_called()
68 mock_deploy_snap.assert_called()
69 self.assertEqual(d.ha_ext, 'noha-allinone')
71 @patch('apex.deployment.snapshot.utils.fetch_upstream_and_unpack')
72 @patch('apex.deployment.snapshot.utils.fetch_properties')
73 def test_pull_snapshot_is_latest(self, mock_fetch_props,
75 mock_fetch_props.return_value = {
76 'OPNFV_SNAP_URL': 'artifacts.opnfv.org/apex/master/noha/'
77 'apex-csit-snap-2018-08-05.tar.gz',
78 'OPNFV_SNAP_SHA512SUM': 'bb0c6fa0e675dcb39cfad11d81bb99f309d5cfc23'
79 '6e36a74d05ee813584f3e5bb92aa23dec77584631'
80 '7b75d574f8c86186c666f78a299c24fb68849897b'
83 SnapshotDeployment.pull_snapshot('http://dummy_url',
85 mock_fetch_artifact.assert_not_called()
87 @patch('apex.deployment.snapshot.utils.fetch_upstream_and_unpack')
88 @patch('apex.deployment.snapshot.utils.fetch_properties')
89 def test_pull_snapshot_fetch_props_failure(self, mock_fetch_props,
91 mock_fetch_props.side_effect = exc.FetchException
92 self.assertRaises(exc.FetchException,
93 SnapshotDeployment.pull_snapshot,
94 'http://dummy_url', TEST_DUMMY_CONFIG)
96 @patch('apex.deployment.snapshot.utils.fetch_upstream_and_unpack')
97 @patch('apex.deployment.snapshot.utils.fetch_properties')
98 def test_pull_snapshot_is_not_latest(self, mock_fetch_props,
100 mock_fetch_props.side_effect = [{
101 'OPNFV_SNAP_URL': 'artifacts.opnfv.org/apex/master/noha/'
102 'apex-csit-snap-2018-08-05.tar.gz',
103 'OPNFV_SNAP_SHA512SUM': '123c6fa0e675dcb39cfad11d81bb99f309d5cfc23'
104 '6e36a74d05ee813584f3e5bb92aa23dec77584631'
105 '7b75d574f8c86186c666f78a299c24fb68849897b'
108 'OPNFV_SNAP_URL': 'artifacts.opnfv.org/apex/master/noha/'
109 'apex-csit-snap-2018-08-05.tar.gz',
110 'OPNFV_SNAP_SHA512SUM': 'bb0c6fa0e675dcb39cfad11d81bb99f309d5cfc23'
111 '6e36a74d05ee813584f3e5bb92aa23dec77584631'
112 '7b75d574f8c86186c666f78a299c24fb68849897b'
114 SnapshotDeployment.pull_snapshot('http://dummy_url',
116 mock_fetch_artifact.assert_called()
118 @patch('apex.deployment.snapshot.OvercloudNode')
119 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
120 @patch('apex.deployment.snapshot.libvirt.open')
121 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
122 def test_create_networks(self, mock_deploy_snap, mock_libvirt_open,
123 mock_pull_snap, mock_oc_node):
124 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
125 ds = DeploySettings(ds_file)
126 d = SnapshotDeployment(deploy_settings=ds,
127 snap_cache_dir=DUMMY_SNAP_DIR,
128 fetch=False, all_in_one=False)
129 d.snap_cache_dir = TEST_DUMMY_CONFIG
130 conn = mock_libvirt_open('qemu:///system')
132 conn.networkCreateXML.assert_called()
134 @patch('apex.deployment.snapshot.OvercloudNode')
135 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
136 @patch('apex.deployment.snapshot.libvirt.open')
137 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
138 def test_create_networks_invalid_cache(self, mock_deploy_snap,
139 mock_libvirt_open, mock_pull_snap,
141 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
142 ds = DeploySettings(ds_file)
143 d = SnapshotDeployment(deploy_settings=ds,
144 snap_cache_dir=DUMMY_SNAP_DIR,
145 fetch=False, all_in_one=False)
146 d.snap_cache_dir = '/doesnotexist/'
147 self.assertRaises(exc.SnapshotDeployException, d.create_networks)
149 @patch('apex.deployment.snapshot.fnmatch')
150 @patch('apex.deployment.snapshot.OvercloudNode')
151 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
152 @patch('apex.deployment.snapshot.libvirt.open')
153 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
154 def test_create_networks_no_net_xmls(self, mock_deploy_snap,
155 mock_libvirt_open, mock_pull_snap,
156 mock_oc_node, mock_fnmatch):
157 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
158 ds = DeploySettings(ds_file)
159 d = SnapshotDeployment(deploy_settings=ds,
160 snap_cache_dir=DUMMY_SNAP_DIR,
161 fetch=False, all_in_one=False)
162 d.snap_cache_dir = '/doesnotexist/'
163 mock_fnmatch.filter.return_value = []
164 self.assertRaises(exc.SnapshotDeployException, d.create_networks)
166 @patch('apex.deployment.snapshot.OvercloudNode')
167 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
168 @patch('apex.deployment.snapshot.libvirt.open')
169 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
170 def test_parse_and_create_nodes(self, mock_deploy_snap, mock_libvirt_open,
171 mock_pull_snap, mock_oc_node):
172 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
173 ds = DeploySettings(ds_file)
174 d = SnapshotDeployment(deploy_settings=ds,
175 snap_cache_dir=DUMMY_SNAP_DIR,
176 fetch=False, all_in_one=False)
177 d.snap_cache_dir = TEST_DUMMY_CONFIG
178 node = mock_oc_node()
179 d.parse_and_create_nodes()
180 node.start.assert_called()
181 self.assertListEqual([node], d.oc_nodes)
183 @patch('apex.deployment.snapshot.utils.parse_yaml')
184 @patch('apex.deployment.snapshot.OvercloudNode')
185 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
186 @patch('apex.deployment.snapshot.libvirt.open')
187 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
188 def test_parse_and_create_nodes_invalid_node_yaml(
189 self, mock_deploy_snap, mock_libvirt_open, mock_pull_snap,
190 mock_oc_node, mock_parse_yaml):
191 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
192 ds = DeploySettings(ds_file)
193 d = SnapshotDeployment(deploy_settings=ds,
194 snap_cache_dir=DUMMY_SNAP_DIR,
195 fetch=False, all_in_one=False)
196 d.snap_cache_dir = TEST_DUMMY_CONFIG
197 node = mock_oc_node()
198 mock_parse_yaml.return_value = {'blah': 'dummy'}
199 self.assertRaises(exc.SnapshotDeployException,
200 d.parse_and_create_nodes)
201 node.start.assert_not_called()
203 @patch('apex.deployment.snapshot.OvercloudNode')
204 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
205 @patch('apex.deployment.snapshot.libvirt.open')
206 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
207 def test_get_controllers(self, mock_deploy_snap, mock_libvirt_open,
208 mock_pull_snap, mock_oc_node):
209 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
210 ds = DeploySettings(ds_file)
211 d = SnapshotDeployment(deploy_settings=ds,
212 snap_cache_dir=DUMMY_SNAP_DIR,
213 fetch=False, all_in_one=False)
214 d.snap_cache_dir = TEST_DUMMY_CONFIG
215 node = mock_oc_node()
216 node.role = 'controller'
218 self.assertListEqual(d.get_controllers(), [node])
220 @patch('apex.deployment.snapshot.OvercloudNode')
221 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
222 @patch('apex.deployment.snapshot.libvirt.open')
223 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
224 def test_get_controllers_none(self, mock_deploy_snap, mock_libvirt_open,
225 mock_pull_snap, mock_oc_node):
226 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
227 ds = DeploySettings(ds_file)
228 d = SnapshotDeployment(deploy_settings=ds,
229 snap_cache_dir=DUMMY_SNAP_DIR,
230 fetch=False, all_in_one=False)
231 d.snap_cache_dir = TEST_DUMMY_CONFIG
232 node = mock_oc_node()
233 node.role = 'compute'
235 self.assertListEqual(d.get_controllers(), [])
237 @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
238 @patch('apex.deployment.snapshot.time')
239 @patch('apex.deployment.snapshot.socket')
240 @patch('apex.deployment.snapshot.OvercloudNode')
241 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
242 @patch('apex.deployment.snapshot.libvirt.open')
243 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
244 def test_is_openstack_up(self, mock_deploy_snap, mock_libvirt_open,
245 mock_pull_snap, mock_oc_node, mock_socket,
246 mock_time, mock_get_ctrls):
247 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
248 ds = DeploySettings(ds_file)
249 d = SnapshotDeployment(deploy_settings=ds,
250 snap_cache_dir=DUMMY_SNAP_DIR,
251 fetch=False, all_in_one=False)
252 d.snap_cache_dir = TEST_DUMMY_CONFIG
253 node = mock_oc_node()
254 node.ip = '123.123.123.123'
255 node.name = 'dummy-controller-0'
256 mock_get_ctrls.return_value = [node]
257 sock = mock_socket.socket(mock_socket.AF_INET, mock_socket.SOCK_STREAM)
258 sock.connect_ex.return_value = 0
259 self.assertTrue(d.is_service_up('openstack'))
261 @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
262 @patch('apex.deployment.snapshot.time')
263 @patch('apex.deployment.snapshot.socket')
264 @patch('apex.deployment.snapshot.OvercloudNode')
265 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
266 @patch('apex.deployment.snapshot.libvirt.open')
267 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
268 def test_is_openstack_up_false(self, mock_deploy_snap, mock_libvirt_open,
269 mock_pull_snap, mock_oc_node, mock_socket,
270 mock_time, mock_get_ctrls):
271 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
272 ds = DeploySettings(ds_file)
273 d = SnapshotDeployment(deploy_settings=ds,
274 snap_cache_dir=DUMMY_SNAP_DIR,
275 fetch=False, all_in_one=False)
276 d.snap_cache_dir = TEST_DUMMY_CONFIG
277 node = mock_oc_node()
278 node.ip = '123.123.123.123'
279 node.name = 'dummy-controller-0'
280 mock_get_ctrls.return_value = [node]
281 sock = mock_socket.socket(mock_socket.AF_INET, mock_socket.SOCK_STREAM)
282 sock.connect_ex.return_value = 1
283 self.assertFalse(d.is_service_up('openstack'))
285 @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
286 @patch('apex.deployment.snapshot.time')
287 @patch('apex.deployment.snapshot.utils')
288 @patch('apex.deployment.snapshot.OvercloudNode')
289 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
290 @patch('apex.deployment.snapshot.libvirt.open')
291 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
292 def test_is_opendaylight_up(self, mock_deploy_snap, mock_libvirt_open,
293 mock_pull_snap, mock_oc_node, mock_utils,
294 mock_time, mock_get_ctrls):
295 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
296 ds = DeploySettings(ds_file)
297 d = SnapshotDeployment(deploy_settings=ds,
298 snap_cache_dir=DUMMY_SNAP_DIR,
299 fetch=False, all_in_one=False)
300 d.snap_cache_dir = TEST_DUMMY_CONFIG
301 node = mock_oc_node()
302 node.ip = '123.123.123.123'
303 node.name = 'dummy-controller-0'
304 mock_get_ctrls.return_value = [node]
305 mock_utils.open_webpage.return_value = 0
306 self.assertTrue(d.is_service_up('opendaylight'))
308 @patch('apex.deployment.snapshot.SnapshotDeployment.get_controllers')
309 @patch('apex.deployment.snapshot.time')
310 @patch('apex.deployment.snapshot.utils')
311 @patch('apex.deployment.snapshot.OvercloudNode')
312 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
313 @patch('apex.deployment.snapshot.libvirt.open')
314 @patch('apex.deployment.snapshot.SnapshotDeployment.deploy_snapshot')
315 def test_is_opendaylight_up_false(self, mock_deploy_snap,
316 mock_libvirt_open, mock_pull_snap,
317 mock_oc_node, mock_utils,
318 mock_time, mock_get_ctrls):
319 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
320 ds = DeploySettings(ds_file)
321 d = SnapshotDeployment(deploy_settings=ds,
322 snap_cache_dir=DUMMY_SNAP_DIR,
323 fetch=False, all_in_one=False)
324 d.snap_cache_dir = TEST_DUMMY_CONFIG
325 node = mock_oc_node()
326 node.ip = '123.123.123.123'
327 node.name = 'dummy-controller-0'
328 mock_get_ctrls.return_value = [node]
329 mock_utils.open_webpage.side_effect = urllib.request.URLError(
331 self.assertFalse(d.is_service_up('opendaylight'))
333 @patch('apex.deployment.snapshot.os.path.isfile')
334 @patch('apex.deployment.snapshot.SnapshotDeployment.is_service_up')
335 @patch('apex.deployment.snapshot.SnapshotDeployment'
336 '.parse_and_create_nodes')
337 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
338 @patch('apex.deployment.snapshot.libvirt.open')
339 @patch('apex.deployment.snapshot.SnapshotDeployment.create_networks')
340 def test_deploy_snapshot(self, mock_create_networks, mock_libvirt_open,
341 mock_pull_snap, mock_parse_create,
342 mock_service_up, mock_is_file):
343 mock_is_file.return_value = True
344 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
345 ds = DeploySettings(ds_file)
346 SnapshotDeployment(deploy_settings=ds, snap_cache_dir=DUMMY_SNAP_DIR,
347 fetch=False, all_in_one=False)
348 mock_parse_create.assert_called()
349 mock_create_networks.assert_called()
350 mock_service_up.assert_called()
352 @patch('apex.deployment.snapshot.os.path.isfile')
353 @patch('apex.deployment.snapshot.SnapshotDeployment.is_service_up')
354 @patch('apex.deployment.snapshot.SnapshotDeployment'
355 '.parse_and_create_nodes')
356 @patch('apex.deployment.snapshot.SnapshotDeployment.pull_snapshot')
357 @patch('apex.deployment.snapshot.libvirt.open')
358 @patch('apex.deployment.snapshot.SnapshotDeployment.create_networks')
359 def test_deploy_snapshot_services_down(self, mock_create_networks,
361 mock_pull_snap, mock_parse_create,
362 mock_service_up, mock_is_file):
363 mock_is_file.return_value = True
364 ds_file = os.path.join(TEST_DUMMY_CONFIG, 'dummy-deploy-settings.yaml')
365 ds = DeploySettings(ds_file)
366 mock_service_up.return_value = False
367 self.assertRaises(exc.SnapshotDeployException,
369 ds, DUMMY_SNAP_DIR, False, False)
371 mock_service_up.side_effect = [True, False]
372 self.assertRaises(exc.SnapshotDeployException,
374 ds, DUMMY_SNAP_DIR, False, False)