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