62ce0671d21a7a06a5d70c7602e9dd6afe3bf070
[snaps.git] / snaps / config / tests / network_tests.py
1 # Copyright (c) 2017 Cable Television Laboratories, Inc. ("CableLabs")
2 #                    and others.  All rights reserved.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at:
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 import unittest
16
17 from snaps.config.network import (
18     NetworkConfigError, NetworkConfig, SubnetConfig, SubnetConfigError,
19     IPv6Mode, PortConfig, PortConfigError)
20
21
22 class NetworkConfigUnitTests(unittest.TestCase):
23     """
24     Tests the construction of the NetworkConfig class
25     """
26
27     def test_no_params(self):
28         with self.assertRaises(NetworkConfigError):
29             NetworkConfig()
30
31     def test_empty_config(self):
32         with self.assertRaises(NetworkConfigError):
33             NetworkConfig(**dict())
34
35     def test_name_only(self):
36         settings = NetworkConfig(name='foo')
37         self.assertEqual('foo', settings.name)
38         self.assertTrue(settings.admin_state_up)
39         self.assertIsNone(settings.shared)
40         self.assertIsNone(settings.project_name)
41         self.assertFalse(settings.external)
42         self.assertIsNone(settings.network_type)
43         self.assertIsNone(settings.segmentation_id)
44         self.assertEqual(0, len(settings.subnet_settings))
45
46     def test_config_with_name_only(self):
47         settings = NetworkConfig(**{'name': 'foo'})
48         self.assertEqual('foo', settings.name)
49         self.assertTrue(settings.admin_state_up)
50         self.assertIsNone(settings.shared)
51         self.assertIsNone(settings.project_name)
52         self.assertFalse(settings.external)
53         self.assertIsNone(settings.network_type)
54         self.assertIsNone(settings.segmentation_id)
55         self.assertEqual(0, len(settings.subnet_settings))
56
57     def test_all(self):
58         sub_settings = SubnetConfig(name='foo-subnet', cidr='10.0.0.0/24')
59         settings = NetworkConfig(
60             name='foo', admin_state_up=False, shared=True, project_name='bar',
61             external=True, network_type='vlan', physical_network='phy',
62             segmentation_id=2366, subnet_settings=[sub_settings])
63         self.assertEqual('foo', settings.name)
64         self.assertFalse(settings.admin_state_up)
65         self.assertTrue(settings.shared)
66         self.assertEqual('bar', settings.project_name)
67         self.assertTrue(settings.external)
68         self.assertEqual('vlan', settings.network_type)
69         self.assertEqual('phy', settings.physical_network)
70         self.assertEqual(2366, settings.segmentation_id)
71         self.assertEqual(1, len(settings.subnet_settings))
72         self.assertEqual('foo-subnet', settings.subnet_settings[0].name)
73
74     def test_config_all(self):
75         settings = NetworkConfig(
76             **{'name': 'foo', 'admin_state_up': False, 'shared': True,
77                'project_name': 'bar', 'external': True, 'network_type': 'vlan',
78                'physical_network': 'phy',
79                'segmentation_id': 2366,
80                'subnets':
81                    [{'subnet': {'name': 'foo-subnet',
82                                 'cidr': '10.0.0.0/24'}}]})
83         self.assertEqual('foo', settings.name)
84         self.assertFalse(settings.admin_state_up)
85         self.assertTrue(settings.shared)
86         self.assertEqual('bar', settings.project_name)
87         self.assertTrue(settings.external)
88         self.assertEqual('vlan', settings.network_type)
89         self.assertEqual('phy', settings.physical_network)
90         self.assertEqual(2366, settings.segmentation_id)
91         self.assertEqual(1, len(settings.subnet_settings))
92         self.assertEqual('foo-subnet', settings.subnet_settings[0].name)
93
94
95 class SubnetConfigUnitTests(unittest.TestCase):
96     """
97     Tests the construction of the SubnetConfig class
98     """
99
100     def test_no_params(self):
101         with self.assertRaises(SubnetConfigError):
102             SubnetConfig()
103
104     def test_empty_config(self):
105         with self.assertRaises(SubnetConfigError):
106             SubnetConfig(**dict())
107
108     def test_name_only(self):
109         with self.assertRaises(SubnetConfigError):
110             SubnetConfig(name='foo')
111
112     def test_config_with_name_only(self):
113         with self.assertRaises(SubnetConfigError):
114             SubnetConfig(**{'name': 'foo'})
115
116     def test_name_cidr_only(self):
117         settings = SubnetConfig(name='foo', cidr='10.0.0.0/24')
118         self.assertEqual('foo', settings.name)
119         self.assertEqual('10.0.0.0/24', settings.cidr)
120         self.assertEqual(4, settings.ip_version)
121         self.assertIsNone(settings.project_name)
122         self.assertIsNone(settings.start)
123         self.assertIsNone(settings.end)
124         self.assertIsNone(settings.enable_dhcp)
125         self.assertEqual(0, len(settings.dns_nameservers))
126         self.assertIsNone(settings.host_routes)
127         self.assertIsNone(settings.destination)
128         self.assertIsNone(settings.nexthop)
129         self.assertIsNone(settings.ipv6_ra_mode)
130         self.assertIsNone(settings.ipv6_address_mode)
131
132     def test_config_with_name_cidr_only(self):
133         settings = SubnetConfig(**{'name': 'foo', 'cidr': '10.0.0.0/24'})
134         self.assertEqual('foo', settings.name)
135         self.assertEqual('10.0.0.0/24', settings.cidr)
136         self.assertEqual(4, settings.ip_version)
137         self.assertIsNone(settings.project_name)
138         self.assertIsNone(settings.start)
139         self.assertIsNone(settings.end)
140         self.assertIsNone(settings.gateway_ip)
141         self.assertIsNone(settings.enable_dhcp)
142         self.assertEqual(0, len(settings.dns_nameservers))
143         self.assertIsNone(settings.host_routes)
144         self.assertIsNone(settings.destination)
145         self.assertIsNone(settings.nexthop)
146         self.assertIsNone(settings.ipv6_ra_mode)
147         self.assertIsNone(settings.ipv6_address_mode)
148
149     def test_all_string_enums(self):
150         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
151         settings = SubnetConfig(
152             name='foo', cidr='10.0.0.0/24', ip_version=6,
153             project_name='bar-project', start='10.0.0.2', end='10.0.0.101',
154             gateway_ip='10.0.0.1', enable_dhcp=False,
155             dns_nameservers=['8.8.8.8'], host_routes=[host_routes],
156             destination='dest', nexthop='hop', ipv6_ra_mode='dhcpv6-stateful',
157             ipv6_address_mode='slaac')
158         self.assertEqual('foo', settings.name)
159         self.assertEqual('10.0.0.0/24', settings.cidr)
160         self.assertEqual(6, settings.ip_version)
161         self.assertEqual('bar-project', settings.project_name)
162         self.assertEqual('10.0.0.2', settings.start)
163         self.assertEqual('10.0.0.101', settings.end)
164         self.assertEqual('10.0.0.1', settings.gateway_ip)
165         self.assertEqual(False, settings.enable_dhcp)
166         self.assertEqual(1, len(settings.dns_nameservers))
167         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
168         self.assertEqual(1, len(settings.host_routes))
169         self.assertEqual(host_routes, settings.host_routes[0])
170         self.assertEqual('dest', settings.destination)
171         self.assertEqual('hop', settings.nexthop)
172         self.assertEqual(IPv6Mode.stateful, settings.ipv6_ra_mode)
173         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
174
175     def test_all_type_enums(self):
176         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
177         settings = SubnetConfig(
178             name='foo', cidr='10.0.0.0/24', ip_version=6,
179             project_name='bar-project', start='10.0.0.2', end='10.0.0.101',
180             gateway_ip='10.0.0.1', enable_dhcp=False,
181             dns_nameservers=['8.8.8.8'], host_routes=[host_routes],
182             destination='dest', nexthop='hop', ipv6_ra_mode=IPv6Mode.stateful,
183             ipv6_address_mode=IPv6Mode.slaac)
184         self.assertEqual('foo', settings.name)
185         self.assertEqual('10.0.0.0/24', settings.cidr)
186         self.assertEqual(6, settings.ip_version)
187         self.assertEqual('bar-project', settings.project_name)
188         self.assertEqual('10.0.0.2', settings.start)
189         self.assertEqual('10.0.0.101', settings.end)
190         self.assertEqual('10.0.0.1', settings.gateway_ip)
191         self.assertEqual(False, settings.enable_dhcp)
192         self.assertEqual(1, len(settings.dns_nameservers))
193         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
194         self.assertEqual(1, len(settings.host_routes))
195         self.assertEqual(host_routes, settings.host_routes[0])
196         self.assertEqual('dest', settings.destination)
197         self.assertEqual('hop', settings.nexthop)
198         self.assertEqual(IPv6Mode.stateful, settings.ipv6_ra_mode)
199         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
200
201     def test_config_all(self):
202         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
203         settings = SubnetConfig(
204             **{'name': 'foo', 'cidr': '10.0.0.0/24', 'ip_version': 6,
205                'project_name': 'bar-project', 'start': '10.0.0.2',
206                'end': '10.0.0.101',
207                'gateway_ip': '10.0.0.1', 'enable_dhcp': False,
208                'dns_nameservers': ['8.8.8.8'], 'host_routes': [host_routes],
209                'destination': 'dest', 'nexthop': 'hop',
210                'ipv6_ra_mode': 'dhcpv6-stateless',
211                'ipv6_address_mode': 'slaac'})
212         self.assertEqual('foo', settings.name)
213         self.assertEqual('10.0.0.0/24', settings.cidr)
214         self.assertEqual(6, settings.ip_version)
215         self.assertEqual('bar-project', settings.project_name)
216         self.assertEqual('10.0.0.2', settings.start)
217         self.assertEqual('10.0.0.101', settings.end)
218         self.assertEqual('10.0.0.1', settings.gateway_ip)
219         self.assertEqual(False, settings.enable_dhcp)
220         self.assertEqual(1, len(settings.dns_nameservers))
221         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
222         self.assertEqual(1, len(settings.host_routes))
223         self.assertEqual(host_routes, settings.host_routes[0])
224         self.assertEqual('dest', settings.destination)
225         self.assertEqual('hop', settings.nexthop)
226         self.assertEqual(IPv6Mode.stateless, settings.ipv6_ra_mode)
227         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
228
229
230 class PortConfigUnitTests(unittest.TestCase):
231     """
232     Tests the construction of the PortConfig class
233     """
234
235     def test_no_params(self):
236         with self.assertRaises(PortConfigError):
237             PortConfig()
238
239     def test_empty_config(self):
240         with self.assertRaises(PortConfigError):
241             PortConfig(**dict())
242
243     def test_name_only(self):
244         with self.assertRaises(PortConfigError):
245             PortConfig(name='foo')
246
247     def test_config_name_only(self):
248         with self.assertRaises(PortConfigError):
249             PortConfig(**{'name': 'foo'})
250
251     def test_name_netname_only(self):
252         settings = PortConfig(name='foo', network_name='bar')
253         self.assertEqual('foo', settings.name)
254         self.assertEqual('bar', settings.network_name)
255         self.assertTrue(settings.admin_state_up)
256         self.assertIsNone(settings.project_name)
257         self.assertIsNone(settings.mac_address)
258         self.assertIsNone(settings.ip_addrs)
259         self.assertIsNone(settings.security_groups)
260         self.assertIsNone(settings.allowed_address_pairs)
261         self.assertIsNone(settings.opt_value)
262         self.assertIsNone(settings.opt_name)
263         self.assertIsNone(settings.device_owner)
264         self.assertIsNone(settings.device_id)
265
266     def test_config_with_name_netname_only(self):
267         settings = PortConfig(**{'name': 'foo', 'network_name': 'bar'})
268         self.assertEqual('foo', settings.name)
269         self.assertEqual('bar', settings.network_name)
270         self.assertTrue(settings.admin_state_up)
271         self.assertIsNone(settings.project_name)
272         self.assertIsNone(settings.mac_address)
273         self.assertIsNone(settings.ip_addrs)
274         self.assertIsNone(settings.security_groups)
275         self.assertIsNone(settings.port_security_enabled)
276         self.assertIsNone(settings.allowed_address_pairs)
277         self.assertIsNone(settings.opt_value)
278         self.assertIsNone(settings.opt_name)
279         self.assertIsNone(settings.device_owner)
280         self.assertIsNone(settings.device_id)
281
282     def test_all(self):
283         ip_addrs = [{'subnet_name', 'foo-sub', 'ip', '10.0.0.10'}]
284         allowed_address_pairs = {'10.0.0.101', '1234.5678'}
285
286         settings = PortConfig(
287             name='foo', network_name='bar', admin_state_up=False,
288             project_name='foo-project', mac_address='1234', ip_addrs=ip_addrs,
289             security_groups=['foo_grp_id'], port_security_enabled=False,
290             allowed_address_pairs=allowed_address_pairs, opt_value='opt value',
291             opt_name='opt name', device_owner='owner',
292             device_id='device number')
293         self.assertEqual('foo', settings.name)
294         self.assertEqual('bar', settings.network_name)
295         self.assertFalse(settings.admin_state_up)
296         self.assertEqual('foo-project', settings.project_name)
297         self.assertEqual('1234', settings.mac_address)
298         self.assertEqual(ip_addrs, settings.ip_addrs)
299         self.assertEqual(1, len(settings.security_groups))
300         self.assertFalse(settings.port_security_enabled)
301         self.assertEqual('foo_grp_id', settings.security_groups[0])
302         self.assertFalse(settings.port_security_enabled)
303         self.assertEqual(allowed_address_pairs, settings.allowed_address_pairs)
304         self.assertEqual('opt value', settings.opt_value)
305         self.assertEqual('opt name', settings.opt_name)
306         self.assertEqual('owner', settings.device_owner)
307         self.assertEqual('device number', settings.device_id)
308
309     def test_config_all(self):
310         ip_addrs = [{'subnet_name', 'foo-sub', 'ip', '10.0.0.10'}]
311         allowed_address_pairs = {'10.0.0.101', '1234.5678'}
312
313         settings = PortConfig(
314             **{'name': 'foo', 'network_name': 'bar', 'admin_state_up': False,
315                'project_name': 'foo-project', 'mac_address': '1234',
316                'ip_addrs': ip_addrs, 'security_groups': ['foo_grp_id'],
317                'port_security_enabled': 'false',
318                'allowed_address_pairs': allowed_address_pairs,
319                'opt_value': 'opt value', 'opt_name': 'opt name',
320                'device_owner': 'owner', 'device_id': 'device number'})
321         self.assertEqual('foo', settings.name)
322         self.assertEqual('bar', settings.network_name)
323         self.assertFalse(settings.admin_state_up)
324         self.assertEqual('foo-project', settings.project_name)
325         self.assertEqual('1234', settings.mac_address)
326         self.assertEqual(ip_addrs, settings.ip_addrs)
327         self.assertEqual(1, len(settings.security_groups))
328         self.assertFalse(settings.port_security_enabled)
329         self.assertEqual('foo_grp_id', settings.security_groups[0])
330         self.assertEqual(allowed_address_pairs, settings.allowed_address_pairs)
331         self.assertEqual('opt value', settings.opt_value)
332         self.assertEqual('opt name', settings.opt_name)
333         self.assertEqual('owner', settings.device_owner)
334         self.assertEqual('device number', settings.device_id)