Revert "Updates scenario files for hunter branch"
[apex.git] / apex / tests / test_apex_deployment_snapshot.py
1 ##############################################################################
2 # Copyright (c) 2018 Tim Rozet (trozet@redhat.com) (Red Hat)
3 #
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 ##############################################################################
9
10 from mock import patch
11 import os
12 import unittest
13 import urllib.request
14
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
19
20 DUMMY_SNAP_DIR = '/tmp/dummy_cache'
21
22
23 class TestSnapshotDeployment(unittest.TestCase):
24     @classmethod
25     def setup_class(cls):
26         """This method is run once for each class before any tests are run"""
27
28     @classmethod
29     def teardown_class(cls):
30         """This method is run once for each class _after_ all tests are run"""
31
32     def setup(self):
33         """This method is run once before _each_ test method is executed"""
34
35     def teardown(self):
36         """This method is run once after _each_ test method is executed"""
37
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):
42
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')
53
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,
58                                     mock_pull_snap):
59
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')
70
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,
74                                      mock_fetch_artifact):
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'
81                                     'dd4bc'
82         }
83         SnapshotDeployment.pull_snapshot('http://dummy_url',
84                                          TEST_DUMMY_CONFIG)
85         mock_fetch_artifact.assert_not_called()
86
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,
90                                                mock_fetch_artifact):
91         mock_fetch_props.side_effect = exc.FetchException
92         self.assertRaises(exc.FetchException,
93                           SnapshotDeployment.pull_snapshot,
94                           'http://dummy_url', TEST_DUMMY_CONFIG)
95
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,
99                                          mock_fetch_artifact):
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'
106                                     'dd4bc'},
107             {
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'
113                                     'dd4bc'}]
114         SnapshotDeployment.pull_snapshot('http://dummy_url',
115                                          TEST_DUMMY_CONFIG)
116         mock_fetch_artifact.assert_called()
117
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')
131         d.create_networks()
132         conn.networkCreateXML.assert_called()
133
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,
140                                            mock_oc_node):
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)
148
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)
165
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)
182
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()
202
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'
217         d.oc_nodes = [node]
218         self.assertListEqual(d.get_controllers(), [node])
219
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'
234         d.oc_nodes = [node]
235         self.assertListEqual(d.get_controllers(), [])
236
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'))
260
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'))
284
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'))
307
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(
330             reason='blah')
331         self.assertFalse(d.is_service_up('opendaylight'))
332
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()
351
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,
360                                            mock_libvirt_open,
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,
368                           SnapshotDeployment,
369                           ds, DUMMY_SNAP_DIR, False, False)
370
371         mock_service_up.side_effect = [True, False]
372         self.assertRaises(exc.SnapshotDeployException,
373                           SnapshotDeployment,
374                           ds, DUMMY_SNAP_DIR, False, False)