1fe1bb03c7d557a12787c94e4d2a759a8b0dae01
[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(1, len(settings.dns_nameservers))
126         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
127         self.assertIsNone(settings.host_routes)
128         self.assertIsNone(settings.destination)
129         self.assertIsNone(settings.nexthop)
130         self.assertIsNone(settings.ipv6_ra_mode)
131         self.assertIsNone(settings.ipv6_address_mode)
132
133     def test_config_with_name_cidr_only(self):
134         settings = SubnetConfig(**{'name': 'foo', 'cidr': '10.0.0.0/24'})
135         self.assertEqual('foo', settings.name)
136         self.assertEqual('10.0.0.0/24', settings.cidr)
137         self.assertEqual(4, settings.ip_version)
138         self.assertIsNone(settings.project_name)
139         self.assertIsNone(settings.start)
140         self.assertIsNone(settings.end)
141         self.assertIsNone(settings.gateway_ip)
142         self.assertIsNone(settings.enable_dhcp)
143         self.assertEqual(1, len(settings.dns_nameservers))
144         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
145         self.assertIsNone(settings.host_routes)
146         self.assertIsNone(settings.destination)
147         self.assertIsNone(settings.nexthop)
148         self.assertIsNone(settings.ipv6_ra_mode)
149         self.assertIsNone(settings.ipv6_address_mode)
150
151     def test_all_string_enums(self):
152         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
153         settings = SubnetConfig(
154             name='foo', cidr='10.0.0.0/24', ip_version=6,
155             project_name='bar-project', start='10.0.0.2', end='10.0.0.101',
156             gateway_ip='10.0.0.1', enable_dhcp=False,
157             dns_nameservers=['8.8.8.8'], host_routes=[host_routes],
158             destination='dest', nexthop='hop', ipv6_ra_mode='dhcpv6-stateful',
159             ipv6_address_mode='slaac')
160         self.assertEqual('foo', settings.name)
161         self.assertEqual('10.0.0.0/24', settings.cidr)
162         self.assertEqual(6, settings.ip_version)
163         self.assertEqual('bar-project', settings.project_name)
164         self.assertEqual('10.0.0.2', settings.start)
165         self.assertEqual('10.0.0.101', settings.end)
166         self.assertEqual('10.0.0.1', settings.gateway_ip)
167         self.assertEqual(False, settings.enable_dhcp)
168         self.assertEqual(1, len(settings.dns_nameservers))
169         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
170         self.assertEqual(1, len(settings.host_routes))
171         self.assertEqual(host_routes, settings.host_routes[0])
172         self.assertEqual('dest', settings.destination)
173         self.assertEqual('hop', settings.nexthop)
174         self.assertEqual(IPv6Mode.stateful, settings.ipv6_ra_mode)
175         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
176
177     def test_all_type_enums(self):
178         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
179         settings = SubnetConfig(
180             name='foo', cidr='10.0.0.0/24', ip_version=6,
181             project_name='bar-project', start='10.0.0.2', end='10.0.0.101',
182             gateway_ip='10.0.0.1', enable_dhcp=False,
183             dns_nameservers=['8.8.8.8'], host_routes=[host_routes],
184             destination='dest', nexthop='hop', ipv6_ra_mode=IPv6Mode.stateful,
185             ipv6_address_mode=IPv6Mode.slaac)
186         self.assertEqual('foo', settings.name)
187         self.assertEqual('10.0.0.0/24', settings.cidr)
188         self.assertEqual(6, settings.ip_version)
189         self.assertEqual('bar-project', settings.project_name)
190         self.assertEqual('10.0.0.2', settings.start)
191         self.assertEqual('10.0.0.101', settings.end)
192         self.assertEqual('10.0.0.1', settings.gateway_ip)
193         self.assertEqual(False, settings.enable_dhcp)
194         self.assertEqual(1, len(settings.dns_nameservers))
195         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
196         self.assertEqual(1, len(settings.host_routes))
197         self.assertEqual(host_routes, settings.host_routes[0])
198         self.assertEqual('dest', settings.destination)
199         self.assertEqual('hop', settings.nexthop)
200         self.assertEqual(IPv6Mode.stateful, settings.ipv6_ra_mode)
201         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
202
203     def test_config_all(self):
204         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
205         settings = SubnetConfig(
206             **{'name': 'foo', 'cidr': '10.0.0.0/24', 'ip_version': 6,
207                'project_name': 'bar-project', 'start': '10.0.0.2',
208                'end': '10.0.0.101',
209                'gateway_ip': '10.0.0.1', 'enable_dhcp': False,
210                'dns_nameservers': ['8.8.8.8'], 'host_routes': [host_routes],
211                'destination': 'dest', 'nexthop': 'hop',
212                'ipv6_ra_mode': 'dhcpv6-stateless',
213                'ipv6_address_mode': 'slaac'})
214         self.assertEqual('foo', settings.name)
215         self.assertEqual('10.0.0.0/24', settings.cidr)
216         self.assertEqual(6, settings.ip_version)
217         self.assertEqual('bar-project', settings.project_name)
218         self.assertEqual('10.0.0.2', settings.start)
219         self.assertEqual('10.0.0.101', settings.end)
220         self.assertEqual('10.0.0.1', settings.gateway_ip)
221         self.assertEqual(False, settings.enable_dhcp)
222         self.assertEqual(1, len(settings.dns_nameservers))
223         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
224         self.assertEqual(1, len(settings.host_routes))
225         self.assertEqual(host_routes, settings.host_routes[0])
226         self.assertEqual('dest', settings.destination)
227         self.assertEqual('hop', settings.nexthop)
228         self.assertEqual(IPv6Mode.stateless, settings.ipv6_ra_mode)
229         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
230
231
232 class PortConfigUnitTests(unittest.TestCase):
233     """
234     Tests the construction of the PortConfig class
235     """
236
237     def test_no_params(self):
238         with self.assertRaises(PortConfigError):
239             PortConfig()
240
241     def test_empty_config(self):
242         with self.assertRaises(PortConfigError):
243             PortConfig(**dict())
244
245     def test_name_only(self):
246         with self.assertRaises(PortConfigError):
247             PortConfig(name='foo')
248
249     def test_config_name_only(self):
250         with self.assertRaises(PortConfigError):
251             PortConfig(**{'name': 'foo'})
252
253     def test_name_netname_only(self):
254         settings = PortConfig(name='foo', network_name='bar')
255         self.assertEqual('foo', settings.name)
256         self.assertEqual('bar', settings.network_name)
257         self.assertTrue(settings.admin_state_up)
258         self.assertIsNone(settings.project_name)
259         self.assertIsNone(settings.mac_address)
260         self.assertIsNone(settings.ip_addrs)
261         self.assertIsNone(settings.security_groups)
262         self.assertIsNone(settings.allowed_address_pairs)
263         self.assertIsNone(settings.opt_value)
264         self.assertIsNone(settings.opt_name)
265         self.assertIsNone(settings.device_owner)
266         self.assertIsNone(settings.device_id)
267
268     def test_config_with_name_netname_only(self):
269         settings = PortConfig(**{'name': 'foo', 'network_name': 'bar'})
270         self.assertEqual('foo', settings.name)
271         self.assertEqual('bar', settings.network_name)
272         self.assertTrue(settings.admin_state_up)
273         self.assertIsNone(settings.project_name)
274         self.assertIsNone(settings.mac_address)
275         self.assertIsNone(settings.ip_addrs)
276         self.assertIsNone(settings.security_groups)
277         self.assertIsNone(settings.allowed_address_pairs)
278         self.assertIsNone(settings.opt_value)
279         self.assertIsNone(settings.opt_name)
280         self.assertIsNone(settings.device_owner)
281         self.assertIsNone(settings.device_id)
282
283     def test_all(self):
284         ip_addrs = [{'subnet_name', 'foo-sub', 'ip', '10.0.0.10'}]
285         allowed_address_pairs = {'10.0.0.101', '1234.5678'}
286
287         settings = PortConfig(
288             name='foo', network_name='bar', admin_state_up=False,
289             project_name='foo-project', mac_address='1234', ip_addrs=ip_addrs,
290             security_groups=['foo_grp_id'],
291             allowed_address_pairs=allowed_address_pairs, opt_value='opt value',
292             opt_name='opt name', device_owner='owner',
293             device_id='device number')
294         self.assertEqual('foo', settings.name)
295         self.assertEqual('bar', settings.network_name)
296         self.assertFalse(settings.admin_state_up)
297         self.assertEqual('foo-project', settings.project_name)
298         self.assertEqual('1234', settings.mac_address)
299         self.assertEqual(ip_addrs, settings.ip_addrs)
300         self.assertEqual(1, len(settings.security_groups))
301         self.assertEqual('foo_grp_id', settings.security_groups[0])
302         self.assertEqual(allowed_address_pairs, settings.allowed_address_pairs)
303         self.assertEqual('opt value', settings.opt_value)
304         self.assertEqual('opt name', settings.opt_name)
305         self.assertEqual('owner', settings.device_owner)
306         self.assertEqual('device number', settings.device_id)
307
308     def test_config_all(self):
309         ip_addrs = [{'subnet_name', 'foo-sub', 'ip', '10.0.0.10'}]
310         allowed_address_pairs = {'10.0.0.101', '1234.5678'}
311
312         settings = PortConfig(
313             **{'name': 'foo', 'network_name': 'bar', 'admin_state_up': False,
314                'project_name': 'foo-project', 'mac_address': '1234',
315                'ip_addrs': ip_addrs, 'security_groups': ['foo_grp_id'],
316                'allowed_address_pairs': allowed_address_pairs,
317                'opt_value': 'opt value', 'opt_name': 'opt name',
318                'device_owner': 'owner', 'device_id': 'device number'})
319         self.assertEqual('foo', settings.name)
320         self.assertEqual('bar', settings.network_name)
321         self.assertFalse(settings.admin_state_up)
322         self.assertEqual('foo-project', settings.project_name)
323         self.assertEqual('1234', settings.mac_address)
324         self.assertEqual(ip_addrs, settings.ip_addrs)
325         self.assertEqual(1, len(settings.security_groups))
326         self.assertEqual('foo_grp_id', settings.security_groups[0])
327         self.assertEqual(allowed_address_pairs, settings.allowed_address_pairs)
328         self.assertEqual('opt value', settings.opt_value)
329         self.assertEqual('opt name', settings.opt_name)
330         self.assertEqual('owner', settings.device_owner)
331         self.assertEqual('device number', settings.device_id)