Generalization of recursive function
[apex.git] / apex / tests / test_apex_network_settings.py
1 ##############################################################################
2 # Copyright (c) 2016 Dan Radez (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 os
11
12 from nose.tools import (
13     assert_equal,
14     assert_is_instance,
15     assert_raises
16 )
17
18 from apex.common.constants import (
19     EXTERNAL_NETWORK,
20     STORAGE_NETWORK,
21     ADMIN_NETWORK,
22 )
23 from apex import NetworkSettings
24 from apex.settings.network_settings import NetworkSettingsException
25 from apex.tests.constants import TEST_CONFIG_DIR
26
27 files_dir = os.path.join(TEST_CONFIG_DIR, 'network')
28
29
30 class TestNetworkSettings:
31     @classmethod
32     def setup_class(cls):
33         """This method is run once for each class before any tests are run"""
34
35     @classmethod
36     def teardown_class(cls):
37         """This method is run once for each class _after_ all tests are run"""
38
39     def setup(self):
40         """This method is run once before _each_ test method is executed"""
41
42     def teardown(self):
43         """This method is run once after _each_ test method is executed"""
44
45     def test_init(self):
46         assert_is_instance(
47             NetworkSettings(os.path.join(files_dir, 'network_settings.yaml')),
48             NetworkSettings)
49
50     def test_init_vlans(self):
51         assert_is_instance(
52             NetworkSettings(os.path.join(files_dir,
53                                          'network_settings_vlans.yaml')),
54             NetworkSettings)
55
56 # TODO, v6 test is stuck
57     # def test_init_v6(self):
58     #     assert_is_instance(
59     #         NetworkSettings(files_dir+'network_settings_v6.yaml', True),
60     #         NetworkSettings)
61
62     def test_init_admin_disabled_or_missing(self):
63         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
64         # remove admin, apex section will re-add it
65         ns['networks'].pop('admin', None)
66         assert_raises(NetworkSettingsException, NetworkSettings, ns)
67         # remove admin and apex
68         ns.pop('apex', None)
69         ns['networks'].pop('admin', None)
70         assert_raises(NetworkSettingsException, NetworkSettings, ns)
71
72     def test_init_collapse_storage(self):
73         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
74         # remove storage
75         ns['networks'].pop('storage', None)
76         assert_is_instance(NetworkSettings(ns), NetworkSettings)
77
78     def test_init_missing_dns_domain(self):
79         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
80         # remove storage
81         ns.pop('dns-domain', None)
82         assert_is_instance(NetworkSettings(ns), NetworkSettings)
83
84     def test_get_network_settings(self):
85         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
86         assert_is_instance(ns, NetworkSettings)
87         for role in ['controller', 'compute']:
88             nic_index = 0
89             print(ns.nics)
90             for network in ns.enabled_network_list:
91                 nic = 'eth' + str(nic_index)
92                 assert_equal(ns.nics[role][network], nic)
93                 nic_index += 1
94
95     def test_get_enabled_networks(self):
96         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
97         assert_is_instance(ns.enabled_network_list, list)
98
99     def test_invalid_nic_members(self):
100         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
101         storage_net_nicmap = ns['networks'][STORAGE_NETWORK]['nic_mapping']
102         # set duplicate nic
103         storage_net_nicmap['controller']['members'][0] = 'eth0'
104         assert_raises(NetworkSettingsException, NetworkSettings, ns)
105         # remove nic members
106         storage_net_nicmap['controller']['members'] = []
107         assert_raises(NetworkSettingsException, NetworkSettings, ns)
108
109     def test_missing_vlan(self):
110         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
111         storage_net_nicmap = ns['networks'][STORAGE_NETWORK]['nic_mapping']
112         # remove vlan from storage net
113         storage_net_nicmap['compute'].pop('vlan', None)
114         assert_is_instance(NetworkSettings(ns), NetworkSettings)
115
116 # TODO
117 # need to manipulate interfaces some how
118 # maybe for ip_utils to return something to pass this
119 #    def test_admin_auto_detect(self):
120 #        ns = NetworkSettings(files_dir+'network_settings.yaml')
121 #        # remove cidr to force autodetection
122 #        ns['networks'][ADMIN_NETWORK].pop('cidr', None)
123 #        assert_is_instance(NetworkSettings(ns), NetworkSettings)
124
125     def test_admin_fail_auto_detect(self):
126         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
127         # remove cidr and installer_vm to fail autodetect
128         ns['networks'][ADMIN_NETWORK].pop('cidr', None)
129         ns['networks'][ADMIN_NETWORK].pop('installer_vm', None)
130         assert_raises(NetworkSettingsException, NetworkSettings, ns)
131
132     def test_exception(self):
133         e = NetworkSettingsException("test")
134         print(e)
135         assert_is_instance(e, NetworkSettingsException)
136
137     def test_config_ip(self):
138         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
139         # set the provisioner ip to None to force _gen_ip to generate one
140         ns['networks'][ADMIN_NETWORK]['installer_vm']['ip'] = None
141         ns['networks'][EXTERNAL_NETWORK][0]['installer_vm']['ip'] = None
142         # Now rebuild network settings object and check for repopulated values
143         ns = NetworkSettings(ns)
144         assert_equal(ns['networks'][ADMIN_NETWORK]['installer_vm']['ip'],
145                      '192.0.2.1')
146         assert_equal(ns['networks'][EXTERNAL_NETWORK][0]['installer_vm']['ip'],
147                      '192.168.37.1')
148
149     def test_config_gateway(self):
150         ns = NetworkSettings(os.path.join(files_dir, 'network_settings.yaml'))
151         # set the gateway ip to None to force _config_gateway to generate one
152         ns['networks'][EXTERNAL_NETWORK][0]['gateway'] = None
153         # Now rebuild network settings object and check for a repopulated value
154         ns = NetworkSettings(ns)
155         assert_equal(ns['networks'][EXTERNAL_NETWORK][0]['gateway'],
156                      '192.168.37.1')