Added MTU network config and updated flavor_metadata test support
[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         self.assertIsNone(settings.mtu)
46
47     def test_config_with_name_only(self):
48         settings = NetworkConfig(**{'name': 'foo'})
49         self.assertEqual('foo', settings.name)
50         self.assertTrue(settings.admin_state_up)
51         self.assertIsNone(settings.shared)
52         self.assertIsNone(settings.project_name)
53         self.assertFalse(settings.external)
54         self.assertIsNone(settings.network_type)
55         self.assertIsNone(settings.segmentation_id)
56         self.assertEqual(0, len(settings.subnet_settings))
57         self.assertIsNone(settings.mtu)
58
59     def test_all(self):
60         sub_settings = SubnetConfig(name='foo-subnet', cidr='10.0.0.0/24')
61         settings = NetworkConfig(
62             name='foo', admin_state_up=False, shared=True, project_name='bar',
63             external=True, network_type='vlan', physical_network='phy',
64             segmentation_id=2366, subnet_settings=[sub_settings], mtu=999)
65         self.assertEqual('foo', settings.name)
66         self.assertFalse(settings.admin_state_up)
67         self.assertTrue(settings.shared)
68         self.assertEqual('bar', settings.project_name)
69         self.assertTrue(settings.external)
70         self.assertEqual('vlan', settings.network_type)
71         self.assertEqual('phy', settings.physical_network)
72         self.assertEqual(2366, settings.segmentation_id)
73         self.assertEqual(1, len(settings.subnet_settings))
74         self.assertEqual('foo-subnet', settings.subnet_settings[0].name)
75         self.assertEqual(999, settings.mtu)
76
77     def test_config_all(self):
78         settings = NetworkConfig(
79             **{'name': 'foo', 'admin_state_up': False, 'shared': True,
80                'project_name': 'bar', 'external': True, 'network_type': 'vlan',
81                'physical_network': 'phy',
82                'segmentation_id': 2366,
83                'subnets':
84                    [{'subnet': {'name': 'foo-subnet',
85                                 'cidr': '10.0.0.0/24'}}],
86                'mtu': 999})
87         self.assertEqual('foo', settings.name)
88         self.assertFalse(settings.admin_state_up)
89         self.assertTrue(settings.shared)
90         self.assertEqual('bar', settings.project_name)
91         self.assertTrue(settings.external)
92         self.assertEqual('vlan', settings.network_type)
93         self.assertEqual('phy', settings.physical_network)
94         self.assertEqual(2366, settings.segmentation_id)
95         self.assertEqual(1, len(settings.subnet_settings))
96         self.assertEqual('foo-subnet', settings.subnet_settings[0].name)
97         self.assertEqual(999, settings.mtu)
98
99
100 class SubnetConfigUnitTests(unittest.TestCase):
101     """
102     Tests the construction of the SubnetConfig class
103     """
104
105     def test_no_params(self):
106         with self.assertRaises(SubnetConfigError):
107             SubnetConfig()
108
109     def test_empty_config(self):
110         with self.assertRaises(SubnetConfigError):
111             SubnetConfig(**dict())
112
113     def test_name_only(self):
114         with self.assertRaises(SubnetConfigError):
115             SubnetConfig(name='foo')
116
117     def test_config_with_name_only(self):
118         with self.assertRaises(SubnetConfigError):
119             SubnetConfig(**{'name': 'foo'})
120
121     def test_name_cidr_only(self):
122         settings = SubnetConfig(name='foo', cidr='10.0.0.0/24')
123         self.assertEqual('foo', settings.name)
124         self.assertEqual('10.0.0.0/24', settings.cidr)
125         self.assertEqual(4, settings.ip_version)
126         self.assertIsNone(settings.project_name)
127         self.assertIsNone(settings.start)
128         self.assertIsNone(settings.end)
129         self.assertIsNone(settings.enable_dhcp)
130         self.assertEqual(0, len(settings.dns_nameservers))
131         self.assertIsNone(settings.host_routes)
132         self.assertIsNone(settings.destination)
133         self.assertIsNone(settings.nexthop)
134         self.assertIsNone(settings.ipv6_ra_mode)
135         self.assertIsNone(settings.ipv6_address_mode)
136
137     def test_config_with_name_cidr_only(self):
138         settings = SubnetConfig(**{'name': 'foo', 'cidr': '10.0.0.0/24'})
139         self.assertEqual('foo', settings.name)
140         self.assertEqual('10.0.0.0/24', settings.cidr)
141         self.assertEqual(4, settings.ip_version)
142         self.assertIsNone(settings.project_name)
143         self.assertIsNone(settings.start)
144         self.assertIsNone(settings.end)
145         self.assertIsNone(settings.gateway_ip)
146         self.assertIsNone(settings.enable_dhcp)
147         self.assertEqual(0, len(settings.dns_nameservers))
148         self.assertIsNone(settings.host_routes)
149         self.assertIsNone(settings.destination)
150         self.assertIsNone(settings.nexthop)
151         self.assertIsNone(settings.ipv6_ra_mode)
152         self.assertIsNone(settings.ipv6_address_mode)
153
154     def test_all_string_enums(self):
155         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
156         settings = SubnetConfig(
157             name='foo', cidr='10.0.0.0/24', ip_version=6,
158             project_name='bar-project', start='10.0.0.2', end='10.0.0.101',
159             gateway_ip='10.0.0.1', enable_dhcp=False,
160             dns_nameservers=['8.8.8.8'], host_routes=[host_routes],
161             destination='dest', nexthop='hop', ipv6_ra_mode='dhcpv6-stateful',
162             ipv6_address_mode='slaac')
163         self.assertEqual('foo', settings.name)
164         self.assertEqual('10.0.0.0/24', settings.cidr)
165         self.assertEqual(6, settings.ip_version)
166         self.assertEqual('bar-project', settings.project_name)
167         self.assertEqual('10.0.0.2', settings.start)
168         self.assertEqual('10.0.0.101', settings.end)
169         self.assertEqual('10.0.0.1', settings.gateway_ip)
170         self.assertEqual(False, settings.enable_dhcp)
171         self.assertEqual(1, len(settings.dns_nameservers))
172         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
173         self.assertEqual(1, len(settings.host_routes))
174         self.assertEqual(host_routes, settings.host_routes[0])
175         self.assertEqual('dest', settings.destination)
176         self.assertEqual('hop', settings.nexthop)
177         self.assertEqual(IPv6Mode.stateful, settings.ipv6_ra_mode)
178         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
179
180     def test_all_type_enums(self):
181         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
182         settings = SubnetConfig(
183             name='foo', cidr='10.0.0.0/24', ip_version=6,
184             project_name='bar-project', start='10.0.0.2', end='10.0.0.101',
185             gateway_ip='10.0.0.1', enable_dhcp=False,
186             dns_nameservers=['8.8.8.8'], host_routes=[host_routes],
187             destination='dest', nexthop='hop', ipv6_ra_mode=IPv6Mode.stateful,
188             ipv6_address_mode=IPv6Mode.slaac)
189         self.assertEqual('foo', settings.name)
190         self.assertEqual('10.0.0.0/24', settings.cidr)
191         self.assertEqual(6, settings.ip_version)
192         self.assertEqual('bar-project', settings.project_name)
193         self.assertEqual('10.0.0.2', settings.start)
194         self.assertEqual('10.0.0.101', settings.end)
195         self.assertEqual('10.0.0.1', settings.gateway_ip)
196         self.assertEqual(False, settings.enable_dhcp)
197         self.assertEqual(1, len(settings.dns_nameservers))
198         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
199         self.assertEqual(1, len(settings.host_routes))
200         self.assertEqual(host_routes, settings.host_routes[0])
201         self.assertEqual('dest', settings.destination)
202         self.assertEqual('hop', settings.nexthop)
203         self.assertEqual(IPv6Mode.stateful, settings.ipv6_ra_mode)
204         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
205
206     def test_config_all(self):
207         host_routes = {'destination': '0.0.0.0/0', 'nexthop': '123.456.78.9'}
208         settings = SubnetConfig(
209             **{'name': 'foo', 'cidr': '10.0.0.0/24', 'ip_version': 6,
210                'project_name': 'bar-project', 'start': '10.0.0.2',
211                'end': '10.0.0.101',
212                'gateway_ip': '10.0.0.1', 'enable_dhcp': False,
213                'dns_nameservers': ['8.8.8.8'], 'host_routes': [host_routes],
214                'destination': 'dest', 'nexthop': 'hop',
215                'ipv6_ra_mode': 'dhcpv6-stateless',
216                'ipv6_address_mode': 'slaac'})
217         self.assertEqual('foo', settings.name)
218         self.assertEqual('10.0.0.0/24', settings.cidr)
219         self.assertEqual(6, settings.ip_version)
220         self.assertEqual('bar-project', settings.project_name)
221         self.assertEqual('10.0.0.2', settings.start)
222         self.assertEqual('10.0.0.101', settings.end)
223         self.assertEqual('10.0.0.1', settings.gateway_ip)
224         self.assertEqual(False, settings.enable_dhcp)
225         self.assertEqual(1, len(settings.dns_nameservers))
226         self.assertEqual('8.8.8.8', settings.dns_nameservers[0])
227         self.assertEqual(1, len(settings.host_routes))
228         self.assertEqual(host_routes, settings.host_routes[0])
229         self.assertEqual('dest', settings.destination)
230         self.assertEqual('hop', settings.nexthop)
231         self.assertEqual(IPv6Mode.stateless, settings.ipv6_ra_mode)
232         self.assertEqual(IPv6Mode.slaac, settings.ipv6_address_mode)
233
234
235 class PortConfigUnitTests(unittest.TestCase):
236     """
237     Tests the construction of the PortConfig class
238     """
239
240     def test_no_params(self):
241         with self.assertRaises(PortConfigError):
242             PortConfig()
243
244     def test_empty_config(self):
245         with self.assertRaises(PortConfigError):
246             PortConfig(**dict())
247
248     def test_name_only(self):
249         with self.assertRaises(PortConfigError):
250             PortConfig(name='foo')
251
252     def test_config_name_only(self):
253         with self.assertRaises(PortConfigError):
254             PortConfig(**{'name': 'foo'})
255
256     def test_name_netname_only(self):
257         settings = PortConfig(name='foo', network_name='bar')
258         self.assertEqual('foo', settings.name)
259         self.assertEqual('bar', settings.network_name)
260         self.assertTrue(settings.admin_state_up)
261         self.assertIsNone(settings.project_name)
262         self.assertIsNone(settings.mac_address)
263         self.assertIsNone(settings.ip_addrs)
264         self.assertIsNone(settings.security_groups)
265         self.assertIsNone(settings.allowed_address_pairs)
266         self.assertIsNone(settings.opt_value)
267         self.assertIsNone(settings.opt_name)
268         self.assertIsNone(settings.device_owner)
269         self.assertIsNone(settings.device_id)
270
271     def test_config_with_name_netname_only(self):
272         settings = PortConfig(**{'name': 'foo', 'network_name': 'bar'})
273         self.assertEqual('foo', settings.name)
274         self.assertEqual('bar', settings.network_name)
275         self.assertTrue(settings.admin_state_up)
276         self.assertIsNone(settings.project_name)
277         self.assertIsNone(settings.mac_address)
278         self.assertIsNone(settings.ip_addrs)
279         self.assertIsNone(settings.security_groups)
280         self.assertIsNone(settings.port_security_enabled)
281         self.assertIsNone(settings.allowed_address_pairs)
282         self.assertIsNone(settings.opt_value)
283         self.assertIsNone(settings.opt_name)
284         self.assertIsNone(settings.device_owner)
285         self.assertIsNone(settings.device_id)
286
287     def test_all(self):
288         ip_addrs = [{'subnet_name', 'foo-sub', 'ip', '10.0.0.10'}]
289         allowed_address_pairs = {'10.0.0.101', '1234.5678'}
290
291         settings = PortConfig(
292             name='foo', network_name='bar', admin_state_up=False,
293             project_name='foo-project', mac_address='1234', ip_addrs=ip_addrs,
294             security_groups=['foo_grp_id'], port_security_enabled=False,
295             allowed_address_pairs=allowed_address_pairs, opt_value='opt value',
296             opt_name='opt name', device_owner='owner',
297             device_id='device number')
298         self.assertEqual('foo', settings.name)
299         self.assertEqual('bar', settings.network_name)
300         self.assertFalse(settings.admin_state_up)
301         self.assertEqual('foo-project', settings.project_name)
302         self.assertEqual('1234', settings.mac_address)
303         self.assertEqual(ip_addrs, settings.ip_addrs)
304         self.assertEqual(1, len(settings.security_groups))
305         self.assertFalse(settings.port_security_enabled)
306         self.assertEqual('foo_grp_id', settings.security_groups[0])
307         self.assertFalse(settings.port_security_enabled)
308         self.assertEqual(allowed_address_pairs, settings.allowed_address_pairs)
309         self.assertEqual('opt value', settings.opt_value)
310         self.assertEqual('opt name', settings.opt_name)
311         self.assertEqual('owner', settings.device_owner)
312         self.assertEqual('device number', settings.device_id)
313
314     def test_config_all(self):
315         ip_addrs = [{'subnet_name', 'foo-sub', 'ip', '10.0.0.10'}]
316         allowed_address_pairs = {'10.0.0.101', '1234.5678'}
317
318         settings = PortConfig(
319             **{'name': 'foo', 'network_name': 'bar', 'admin_state_up': False,
320                'project_name': 'foo-project', 'mac_address': '1234',
321                'ip_addrs': ip_addrs, 'security_groups': ['foo_grp_id'],
322                'port_security_enabled': 'false',
323                'allowed_address_pairs': allowed_address_pairs,
324                'opt_value': 'opt value', 'opt_name': 'opt name',
325                'device_owner': 'owner', 'device_id': 'device number'})
326         self.assertEqual('foo', settings.name)
327         self.assertEqual('bar', settings.network_name)
328         self.assertFalse(settings.admin_state_up)
329         self.assertEqual('foo-project', settings.project_name)
330         self.assertEqual('1234', settings.mac_address)
331         self.assertEqual(ip_addrs, settings.ip_addrs)
332         self.assertEqual(1, len(settings.security_groups))
333         self.assertFalse(settings.port_security_enabled)
334         self.assertEqual('foo_grp_id', settings.security_groups[0])
335         self.assertEqual(allowed_address_pairs, settings.allowed_address_pairs)
336         self.assertEqual('opt value', settings.opt_value)
337         self.assertEqual('opt name', settings.opt_name)
338         self.assertEqual('owner', settings.device_owner)
339         self.assertEqual('device number', settings.device_id)