Fixes Docker image upload for master/rocky
[apex.git] / apex / tests / test_apex_deploy.py
1 ##############################################################################
2 # Copyright (c) 2016 Dan Radez (dradez@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 import argparse
11 import os
12 import unittest
13
14 from mock import patch
15 from mock import Mock
16 from mock import MagicMock
17 from mock import mock_open
18
19 from apex.common.exceptions import ApexDeployException
20 from apex.common.constants import DEFAULT_OS_VERSION
21 from apex.deploy import validate_cross_settings
22 from apex.deploy import build_vms
23 from apex.deploy import create_deploy_parser
24 from apex.deploy import validate_deploy_args
25 from apex.deploy import main
26 from apex.tests.constants import TEST_DUMMY_CONFIG
27
28 from nose.tools import (
29     assert_is_instance,
30     assert_regexp_matches,
31     assert_raises,
32     assert_equal)
33
34 a_mock_open = mock_open(read_data=None)
35
36
37 class TestDeploy(unittest.TestCase):
38     @classmethod
39     def setup_class(cls):
40         """This method is run once for each class before any tests are run"""
41
42     @classmethod
43     def teardown_class(cls):
44         """This method is run once for each class _after_ all tests are run"""
45
46     def setup(self):
47         """This method is run once before _each_ test method is executed"""
48
49     def teardown(self):
50         """This method is run once after _each_ test method is executed"""
51
52     def test_validate_cross_settings(self):
53         deploy_settings = {'deploy_options': {'dataplane': 'ovs'}}
54         net_settings = Mock()
55         net_settings.enabled_network_list = ['tenant']
56         validate_cross_settings(deploy_settings, net_settings, '')
57
58     def test_validate_cross_settings_raises(self):
59         deploy_settings = {'deploy_options': {'dataplane': 'notovs'}}
60         net_settings = Mock()
61         net_settings.enabled_network_list = []
62         assert_raises(ApexDeployException,
63                       validate_cross_settings,
64                       deploy_settings, net_settings, None)
65
66     @patch('apex.deploy.virt_utils')
67     @patch('apex.deploy.vm_lib')
68     def test_build_vms(self, mock_vm_lib, mock_virt_utils):
69         inventory = {'nodes': [{'memory': '1234',
70                                 'cpu': '4',
71                                 'mac': 'mac_addr',
72                                 'pm_port': 1234}]}
73         net_sets = Mock()
74         net_sets.enabled_network_list = []
75         build_vms(inventory, net_sets)
76
77     def test_create_deploy_parser(self):
78         assert_is_instance(create_deploy_parser(), argparse.ArgumentParser)
79
80     @patch('apex.deploy.os.path')
81     def test_validate_deploy_args(self, mock_os_path):
82         mock_os_path.isfile.return_value = True
83         args = Mock()
84         args.inventory_file = None
85         args.virtual = True
86         args.snapshot = False
87         validate_deploy_args(args)
88
89     def test_validate_snapshot_deploy_args(self):
90         args = Mock()
91         args.deploy_settings_file = os.path.join(TEST_DUMMY_CONFIG,
92                                                  'dummy-deploy-settings.yaml')
93         args.inventory_file = None
94         args.virtual = True
95         args.snapshot = True
96         validate_deploy_args(args)
97
98     def test_validate_deploy_args_no_virt_no_inv(self):
99         args = Mock()
100         args.inventory_file = 'file_name'
101         args.virtual = False
102         args.snapshot = False
103         assert_raises(ApexDeployException, validate_deploy_args, args)
104
105     @patch('apex.deploy.os.path')
106     def test_validate_deploy_args_w_virt_raises(self, mock_os_path):
107         mock_os_path.isfile.return_value = False
108         args = Mock()
109         args.inventory_file = None
110         args.virtual = True
111         args.snapshot = False
112         assert_raises(ApexDeployException, validate_deploy_args, args)
113
114     def test_validate_deploy_args_virt_and_inv_file(self):
115         args = Mock()
116         args.inventory_file = 'file_name'
117         args.virtual = True
118         args.snapshot = False
119         assert_raises(ApexDeployException, validate_deploy_args, args)
120
121     @patch('apex.deploy.c_builder')
122     @patch('apex.deploy.ApexDeployment')
123     @patch('apex.deploy.uc_builder')
124     @patch('apex.deploy.network_data.create_network_data')
125     @patch('apex.deploy.shutil')
126     @patch('apex.deploy.oc_deploy')
127     @patch('apex.deploy.uc_lib')
128     @patch('apex.deploy.build_vms')
129     @patch('apex.deploy.Inventory')
130     @patch('apex.deploy.virt_utils')
131     @patch('apex.deploy.oc_cfg')
132     @patch('apex.deploy.parsers')
133     @patch('apex.deploy.utils')
134     @patch('apex.deploy.NetworkEnvironment')
135     @patch('apex.deploy.NetworkSettings')
136     @patch('apex.deploy.DeploySettings')
137     @patch('apex.deploy.os')
138     @patch('apex.deploy.json')
139     @patch('apex.deploy.jumphost')
140     @patch('apex.deploy.validate_cross_settings')
141     @patch('apex.deploy.validate_deploy_args')
142     @patch('apex.deploy.create_deploy_parser')
143     @patch('builtins.open', a_mock_open, create=True)
144     def test_main(self, mock_parser, mock_val_args, mock_cross_sets,
145                   mock_jumphost, mock_json, mock_os,
146                   mock_deploy_sets, mock_net_sets, mock_net_env,
147                   mock_utils, mock_parsers, mock_oc_cfg,
148                   mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
149                   mock_oc_deploy, mock_shutil, mock_network_data,
150                   mock_uc_builder, mock_deployment, mock_c_builder):
151         net_sets_dict = {'networks': MagicMock(),
152                          'dns_servers': 'test'}
153         ds_opts_dict = {'global_params': MagicMock(),
154                         'deploy_options': {'gluon': False,
155                                            'congress': True,
156                                            'sdn_controller': 'opendaylight',
157                                            'dataplane': 'ovs',
158                                            'sfc': False,
159                                            'vpn': False,
160                                            'vim': 'openstack',
161                                            'yardstick': 'test',
162                                            'os_version': DEFAULT_OS_VERSION,
163                                            'containers': False}}
164         args = mock_parser.return_value.parse_args.return_value
165         args.virtual = False
166         args.quickstart = False
167         args.debug = False
168         args.snapshot = False
169         args.upstream = True
170         net_sets = mock_net_sets.return_value
171         net_sets.enabled_network_list = ['external']
172         net_sets.__getitem__.side_effect = net_sets_dict.__getitem__
173         net_sets.__contains__.side_effect = net_sets_dict.__contains__
174         deploy_sets = mock_deploy_sets.return_value
175         deploy_sets.__getitem__.side_effect = ds_opts_dict.__getitem__
176         deploy_sets.__contains__.side_effect = ds_opts_dict.__contains__
177         mock_parsers.parse_nova_output.return_value = {'testnode1': 'test'}
178         main()
179
180     @patch('apex.deploy.SnapshotDeployment')
181     @patch('apex.deploy.validate_cross_settings')
182     @patch('apex.deploy.virt_utils')
183     @patch('apex.deploy.utils')
184     @patch('apex.deploy.Inventory')
185     @patch('apex.deploy.NetworkEnvironment')
186     @patch('apex.deploy.NetworkSettings')
187     @patch('apex.deploy.DeploySettings')
188     @patch('apex.deploy.os')
189     @patch('apex.deploy.create_deploy_parser')
190     @patch('builtins.open', a_mock_open, create=True)
191     def test_main_snapshot(self, mock_parser, mock_os, mock_deploy,
192                            mock_net_sets, mock_net_env, mock_inv, mock_utils,
193                            mock_virt_utils, mock_cross, mock_snap_deployment):
194         args = mock_parser.return_value.parse_args.return_value
195         args.virtual = False
196         args.snapshot = True
197         args.debug = True
198         main()
199         mock_snap_deployment.assert_called()
200
201     @patch('apex.deploy.c_builder')
202     @patch('apex.deploy.ApexDeployment')
203     @patch('apex.deploy.uc_builder')
204     @patch('apex.deploy.network_data.create_network_data')
205     @patch('apex.deploy.shutil')
206     @patch('apex.deploy.oc_deploy')
207     @patch('apex.deploy.uc_lib')
208     @patch('apex.deploy.build_vms')
209     @patch('apex.deploy.Inventory')
210     @patch('apex.deploy.virt_utils')
211     @patch('apex.deploy.oc_cfg')
212     @patch('apex.deploy.parsers')
213     @patch('apex.deploy.utils')
214     @patch('apex.deploy.NetworkEnvironment')
215     @patch('apex.deploy.NetworkSettings')
216     @patch('apex.deploy.DeploySettings')
217     @patch('apex.deploy.os')
218     @patch('apex.deploy.json')
219     @patch('apex.deploy.jumphost')
220     @patch('apex.deploy.validate_cross_settings')
221     @patch('apex.deploy.validate_deploy_args')
222     @patch('apex.deploy.create_deploy_parser')
223     @patch('builtins.open', a_mock_open, create=True)
224     def test_main_virt(self, mock_parser, mock_val_args, mock_cross_sets,
225                        mock_jumphost, mock_json, mock_os,
226                        mock_deploy_sets, mock_net_sets, mock_net_env,
227                        mock_utils, mock_parsers, mock_oc_cfg,
228                        mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
229                        mock_oc_deploy, mock_shutil, mock_network_data,
230                        mock_uc_builder, mock_deployment, mock_c_builder):
231         # didn't work yet line 412
232         # net_sets_dict = {'networks': {'admin': {'cidr': MagicMock()}},
233         #                 'dns_servers': 'test'}
234         # net_sets_dict['networks']['admin']['cidr'].return_value.version = 6
235         ds_opts_dict = {'global_params': MagicMock(),
236                         'deploy_options': {'gluon': False,
237                                            'congress': False,
238                                            'sdn_controller': 'opendaylight',
239                                            'dataplane': 'ovs',
240                                            'sfc': False,
241                                            'vpn': False,
242                                            'vim': 'openstack',
243                                            'yardstick': 'test',
244                                            'os_version': DEFAULT_OS_VERSION,
245                                            'containers': False}}
246         args = mock_parser.return_value.parse_args.return_value
247         args.virtual = True
248         args.quickstart = False
249         args.debug = True
250         args.virt_default_ram = 10
251         args.ha_enabled = True
252         args.virt_compute_nodes = 1
253         args.virt_compute_ram = None
254         args.virt_default_ram = 12
255         args.upstream = True
256         args.snapshot = False
257         net_sets = mock_net_sets.return_value
258         net_sets.enabled_network_list = ['admin']
259         deploy_sets = mock_deploy_sets.return_value
260         deploy_sets.__getitem__.side_effect = ds_opts_dict.__getitem__
261         deploy_sets.__contains__.side_effect = ds_opts_dict.__contains__
262         main()
263         args.virt_compute_ram = 16
264         args.virt_default_ram = 10
265         main()
266
267     @patch('apex.deploy.ApexDeployment')
268     @patch('apex.deploy.c_builder')
269     @patch('apex.deploy.uc_builder')
270     @patch('apex.deploy.oc_builder')
271     @patch('apex.deploy.network_data.create_network_data')
272     @patch('apex.deploy.shutil')
273     @patch('apex.deploy.oc_deploy')
274     @patch('apex.deploy.uc_lib')
275     @patch('apex.deploy.build_vms')
276     @patch('apex.deploy.Inventory')
277     @patch('apex.deploy.virt_utils')
278     @patch('apex.deploy.oc_cfg')
279     @patch('apex.deploy.parsers')
280     @patch('apex.deploy.utils')
281     @patch('apex.deploy.NetworkEnvironment')
282     @patch('apex.deploy.NetworkSettings')
283     @patch('apex.deploy.DeploySettings')
284     @patch('apex.deploy.os')
285     @patch('apex.deploy.json')
286     @patch('apex.deploy.jumphost')
287     @patch('apex.deploy.validate_cross_settings')
288     @patch('apex.deploy.validate_deploy_args')
289     @patch('apex.deploy.create_deploy_parser')
290     @patch('builtins.open', a_mock_open, create=True)
291     def test_main_virt_containers_upstream(
292             self, mock_parser, mock_val_args, mock_cross_sets, mock_jumphost,
293             mock_json, mock_os, mock_deploy_sets, mock_net_sets, mock_net_env,
294             mock_utils, mock_parsers, mock_oc_cfg, mock_virt_utils,
295             mock_inv, mock_build_vms, mock_uc_lib, mock_oc_deploy,
296             mock_shutil, mock_network_data, mock_oc_builder,
297             mock_uc_builder, mock_c_builder, mock_deployment):
298
299         ds_opts_dict = {'global_params': MagicMock(),
300                         'deploy_options': {'gluon': False,
301                                            'congress': False,
302                                            'sdn_controller': 'opendaylight',
303                                            'dataplane': 'ovs',
304                                            'sfc': False,
305                                            'vpn': False,
306                                            'vim': 'openstack',
307                                            'yardstick': 'test',
308                                            'os_version': DEFAULT_OS_VERSION,
309                                            'containers': True}}
310         args = mock_parser.return_value.parse_args.return_value
311         args.virtual = True
312         args.quickstart = False
313         args.debug = True
314         args.virt_default_ram = 10
315         args.ha_enabled = True
316         args.virt_compute_nodes = 1
317         args.virt_compute_ram = None
318         args.virt_default_ram = 12
319         args.upstream = True
320         args.snapshot = False
321         net_sets = mock_net_sets.return_value
322         net_sets.enabled_network_list = ['admin']
323         deploy_sets = mock_deploy_sets.return_value
324         deploy_sets.__getitem__.side_effect = ds_opts_dict.__getitem__
325         deploy_sets.__contains__.side_effect = ds_opts_dict.__contains__
326         main()
327         args.virt_compute_ram = 16
328         args.virt_default_ram = 10
329         main()
330         mock_oc_deploy.prep_image.assert_called()
331         # TODO(trozet) add assertions here with arguments for functions in
332         # deploy main
333
334     @patch('apex.deploy.c_builder')
335     @patch('apex.deploy.ApexDeployment')
336     @patch('apex.deploy.uc_builder')
337     @patch('apex.deploy.network_data.create_network_data')
338     @patch('apex.deploy.shutil')
339     @patch('apex.deploy.git')
340     @patch('apex.deploy.oc_deploy')
341     @patch('apex.deploy.uc_lib')
342     @patch('apex.deploy.build_vms')
343     @patch('apex.deploy.Inventory')
344     @patch('apex.deploy.virt_utils')
345     @patch('apex.deploy.oc_cfg')
346     @patch('apex.deploy.parsers')
347     @patch('apex.deploy.utils')
348     @patch('apex.deploy.NetworkEnvironment')
349     @patch('apex.deploy.NetworkSettings')
350     @patch('apex.deploy.DeploySettings')
351     @patch('apex.deploy.os')
352     @patch('apex.deploy.json')
353     @patch('apex.deploy.jumphost')
354     @patch('apex.deploy.validate_cross_settings')
355     @patch('apex.deploy.validate_deploy_args')
356     @patch('apex.deploy.create_deploy_parser')
357     @patch('builtins.open', a_mock_open, create=True)
358     def test_main_k8s(self, mock_parser, mock_val_args, mock_cross_sets,
359                       mock_jumphost, mock_json, mock_os,
360                       mock_deploy_sets, mock_net_sets, mock_net_env,
361                       mock_utils, mock_parsers, mock_oc_cfg,
362                       mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
363                       mock_oc_deploy, mock_git, mock_shutil,
364                       mock_network_data, mock_uc_builder, mock_deployment,
365                       mock_c_builder):
366         net_sets_dict = {'networks': MagicMock(),
367                          'dns_servers': 'test'}
368         ds_opts_dict = {'global_params': MagicMock(),
369                         'deploy_options': {'gluon': False,
370                                            'congress': True,
371                                            'sdn_controller': False,
372                                            'dataplane': 'ovs',
373                                            'sfc': False,
374                                            'vpn': False,
375                                            'vim': 'k8s',
376                                            'yardstick': 'test',
377                                            'os_version': DEFAULT_OS_VERSION,
378                                            'containers': False}}
379         args = mock_parser.return_value.parse_args.return_value
380         args.virtual = False
381         args.quickstart = False
382         args.debug = False
383         args.upstream = False
384         args.snapshot = False
385         net_sets = mock_net_sets.return_value
386         net_sets.enabled_network_list = ['external']
387         net_sets.__getitem__.side_effect = net_sets_dict.__getitem__
388         net_sets.__contains__.side_effect = net_sets_dict.__contains__
389         deploy_sets = mock_deploy_sets.return_value
390         deploy_sets.__getitem__.side_effect = ds_opts_dict.__getitem__
391         deploy_sets.__contains__.side_effect = ds_opts_dict.__contains__
392         mock_parsers.parse_nova_output.return_value = {'testnode1': 'test'}
393         main()