300332614632eb2c171f3a697bec8fd90470ff64
[snaps.git] / snaps / domain / test / 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
16 import unittest
17 from snaps.domain.network import (
18     Port, SecurityGroup, SecurityGroupRule, Router, InterfaceRouter, Network,
19     Subnet)
20
21
22 class NetworkObjectTests(unittest.TestCase):
23     """
24     Tests the construction of the snaps.domain.network.Network class
25     """
26
27     def test_construction_kwargs_1(self):
28         subnet = Subnet(
29             **{'name': 'foo', 'id': 'bar', 'network_id': 'foo-bar'})
30         network = Network(
31             **{'name': 'foo', 'id': 'bar', 'provider:network_type': 'flat',
32                'admin_state_up': False, 'shared': True,
33                'router:external': False, 'subnets': [subnet]})
34         self.assertEqual('foo', network.name)
35         self.assertEqual('bar', network.id)
36         self.assertEqual('flat', network.type)
37         self.assertFalse(network.admin_state_up)
38         self.assertFalse(network.external)
39         self.assertTrue(network.shared)
40         self.assertEqual([subnet], network.subnets)
41
42     def test_construction_kwargs_2(self):
43         subnet = Subnet(
44             **{'name': 'foo', 'id': 'bar', 'network_id': 'foo-bar'})
45         network = Network(
46             **{'name': 'foo', 'id': 'bar', 'type': 'flat',
47                'admin_state_up': False, 'shared': True, 'external': False,
48                'subnets': [subnet]})
49         self.assertEqual('foo', network.name)
50         self.assertEqual('bar', network.id)
51         self.assertEqual('flat', network.type)
52         self.assertFalse(network.admin_state_up)
53         self.assertFalse(network.external)
54         self.assertTrue(network.shared)
55         self.assertEqual([subnet], network.subnets)
56
57     def test_construction_named(self):
58         subnet = Subnet(
59             **{'name': 'foo', 'id': 'bar', 'network_id': 'foo-bar'})
60         network = Network(
61             name='foo', id='bar', type='flat', admin_state_up=False,
62             shared=True, external=False, subnets=[subnet])
63         self.assertEqual('foo', network.name)
64         self.assertEqual('bar', network.id)
65         self.assertEqual('flat', network.type)
66         self.assertFalse(network.admin_state_up)
67         self.assertFalse(network.external)
68         self.assertTrue(network.shared)
69         self.assertEqual([subnet], network.subnets)
70
71
72 class SubnetObjectTests(unittest.TestCase):
73     """
74     Tests the construction of the snaps.domain.network.Subnet class
75     """
76
77     def test_construction_kwargs(self):
78         subnet = Subnet(
79             **{'name': 'foo', 'id': 'bar', 'cidr': '10.0.0.0/24',
80                'ip_version': 4, 'gateway_ip': '10.0.0.1', 'enable_dhcp': True,
81                'dns_nameservers': ['8.8.8.8'], 'host_routes': list(),
82                'ipv6_ra_mode': 'hello', 'ipv6_address_mode': 'world'})
83         self.assertEqual('foo', subnet.name)
84         self.assertEqual('bar', subnet.id)
85         self.assertEqual('10.0.0.0/24', subnet.cidr)
86         self.assertEqual(4, subnet.ip_version)
87         self.assertEqual('10.0.0.1', subnet.gateway_ip)
88         self.assertTrue(subnet.enable_dhcp)
89         self.assertEqual(1, len(subnet.dns_nameservers))
90         self.assertEqual('8.8.8.8', subnet.dns_nameservers[0])
91         self.assertEqual(list(), subnet.host_routes)
92         self.assertEqual('hello', subnet.ipv6_ra_mode)
93         self.assertEqual('world', subnet.ipv6_address_mode)
94
95     def test_construction_named(self):
96         subnet = Subnet(
97             name='foo', id='bar', cidr='10.0.0.0/24',
98             ip_version=4, gateway_ip='10.0.0.1', enable_dhcp=True,
99             dns_nameservers=['8.8.8.8'], host_routes=list(),
100             ipv6_ra_mode='hello', ipv6_address_mode='world')
101         self.assertEqual('foo', subnet.name)
102         self.assertEqual('bar', subnet.id)
103         self.assertEqual('10.0.0.0/24', subnet.cidr)
104         self.assertEqual(4, subnet.ip_version)
105         self.assertEqual('10.0.0.1', subnet.gateway_ip)
106         self.assertTrue(subnet.enable_dhcp)
107         self.assertEqual(1, len(subnet.dns_nameservers))
108         self.assertEqual('8.8.8.8', subnet.dns_nameservers[0])
109         self.assertEqual(list(), subnet.host_routes)
110         self.assertEqual('hello', subnet.ipv6_ra_mode)
111         self.assertEqual('world', subnet.ipv6_address_mode)
112
113
114 class PortDomainObjectTests(unittest.TestCase):
115     """
116     Tests the construction of the snaps.domain.network.Port class
117     """
118
119     def test_construction_ips_kwargs(self):
120         ips = ['10', '11']
121         port = Port(
122             **{'name': 'foo', 'id': 'bar', 'description': 'test desc',
123                'ips': ips, 'mac_address': 'abc123',
124                'allowed_address_pairs': list(), 'admin_state_up': False,
125                'device_id': 'def456', 'device_owner': 'joe',
126                'network_id': 'ghi789', 'port_security_enabled': False,
127                'security_groups': list(), 'tenant_id': 'jkl098'})
128         self.assertEqual('foo', port.name)
129         self.assertEqual('bar', port.id)
130         self.assertEqual('test desc', port.description)
131         self.assertEqual(ips, port.ips)
132         self.assertEqual('abc123', port.mac_address)
133         self.assertEqual(list(), port.allowed_address_pairs)
134         self.assertFalse(port.admin_state_up)
135         self.assertEqual('def456', port.device_id)
136         self.assertEqual('joe', port.device_owner)
137         self.assertEqual('ghi789', port.network_id)
138         self.assertFalse(port.port_security_enabled)
139         self.assertEqual(list(), port.security_groups)
140         self.assertEqual(list(), port.security_groups)
141
142     def test_construction_fixed_ips_kwargs(self):
143         ips = ['10', '11']
144         port = Port(
145             **{'name': 'foo', 'id': 'bar', 'description': 'test desc',
146                'fixed_ips': ips, 'mac_address': 'abc123',
147                'allowed_address_pairs': list(), 'admin_state_up': False,
148                'device_id': 'def456', 'device_owner': 'joe',
149                'network_id': 'ghi789', 'port_security_enabled': False,
150                'security_groups': list(), 'tenant_id': 'jkl098'})
151         self.assertEqual('foo', port.name)
152         self.assertEqual('bar', port.id)
153         self.assertEqual('test desc', port.description)
154         self.assertEqual(ips, port.ips)
155         self.assertEqual('abc123', port.mac_address)
156         self.assertEqual(list(), port.allowed_address_pairs)
157         self.assertFalse(port.admin_state_up)
158         self.assertEqual('def456', port.device_id)
159         self.assertEqual('joe', port.device_owner)
160         self.assertEqual('ghi789', port.network_id)
161         self.assertFalse(port.port_security_enabled)
162         self.assertEqual(list(), port.security_groups)
163         self.assertEqual(list(), port.security_groups)
164
165     def test_construction_named_ips(self):
166         ips = ['10', '11']
167         port = Port(
168             mac_address='abc123', description='test desc', ips=ips, id='bar',
169             name='foo', allowed_address_pairs=list(), admin_state_up=False,
170             device_id='def456', device_owner='joe', network_id='ghi789',
171             port_security_enabled=False, security_groups=list(),
172             tenant_id='jkl098')
173         self.assertEqual('foo', port.name)
174         self.assertEqual('bar', port.id)
175         self.assertEqual('test desc', port.description)
176         self.assertEqual(ips, port.ips)
177         self.assertEqual('abc123', port.mac_address)
178         self.assertEqual(list(), port.allowed_address_pairs)
179         self.assertFalse(port.admin_state_up)
180         self.assertEqual('def456', port.device_id)
181         self.assertEqual('joe', port.device_owner)
182         self.assertEqual('ghi789', port.network_id)
183         self.assertFalse(port.port_security_enabled)
184         self.assertEqual(list(), port.security_groups)
185         self.assertEqual(list(), port.security_groups)
186
187     def test_construction_named_fixed_ips(self):
188         ips = ['10', '11']
189         port = Port(
190             mac_address='abc123', description='test desc', fixed_ips=ips,
191             id='bar', name='foo', allowed_address_pairs=list(),
192             admin_state_up=False, device_id='def456', device_owner='joe',
193             network_id='ghi789', port_security_enabled=False,
194             security_groups=list(), tenant_id='jkl098')
195         self.assertEqual('foo', port.name)
196         self.assertEqual('bar', port.id)
197         self.assertEqual('test desc', port.description)
198         self.assertEqual(ips, port.ips)
199         self.assertEqual('abc123', port.mac_address)
200         self.assertEqual(list(), port.allowed_address_pairs)
201         self.assertFalse(port.admin_state_up)
202         self.assertEqual('def456', port.device_id)
203         self.assertEqual('joe', port.device_owner)
204         self.assertEqual('ghi789', port.network_id)
205         self.assertFalse(port.port_security_enabled)
206         self.assertEqual(list(), port.security_groups)
207         self.assertEqual(list(), port.security_groups)
208
209
210 class RouterDomainObjectTests(unittest.TestCase):
211     """
212     Tests the construction of the snaps.domain.network.Router class
213     """
214
215     def test_construction_kwargs(self):
216         router = Router(
217             **{'name': 'name', 'id': 'id', 'status': 'hello',
218                'tenant_id': '1234', 'admin_state_up': 'yes',
219                'external_gateway_info': 'no'})
220         self.assertEqual('name', router.name)
221         self.assertEqual('id', router.id)
222         self.assertEqual('hello', router.status)
223         self.assertEqual('1234', router.tenant_id)
224         self.assertEqual('yes', router.admin_state_up)
225         self.assertIsNone(router.external_fixed_ips)
226         self.assertIsNone(router.external_network_id)
227
228     def test_construction_named(self):
229         router = Router(
230             external_gateway_info='no', admin_state_up='yes', tenant_id='1234',
231             status='hello', id='id', name='name')
232         self.assertEqual('name', router.name)
233         self.assertEqual('id', router.id)
234         self.assertEqual('hello', router.status)
235         self.assertEqual('1234', router.tenant_id)
236         self.assertEqual('yes', router.admin_state_up)
237         self.assertIsNone(router.external_fixed_ips)
238         self.assertIsNone(router.external_network_id)
239
240     def test_ext_gateway_named(self):
241         router = Router(
242             external_fixed_ips=['456', '789'], external_network_id='123',
243             admin_state_up='yes', tenant_id='1234', status='hello', id='id',
244             name='name')
245         self.assertEqual('name', router.name)
246         self.assertEqual('id', router.id)
247         self.assertEqual('hello', router.status)
248         self.assertEqual('1234', router.tenant_id)
249         self.assertEqual('yes', router.admin_state_up)
250         self.assertEqual(['456', '789'], router.external_fixed_ips)
251         self.assertEqual('123', router.external_network_id)
252
253     def test_ext_net_ips_named(self):
254         ext_gateway = {'network_id': '123',
255                        'external_fixed_ips': ['456', '789']}
256         router = Router(
257             external_gateway_info=ext_gateway, admin_state_up='yes',
258             tenant_id='1234', status='hello', id='id', name='name')
259         self.assertEqual('name', router.name)
260         self.assertEqual('id', router.id)
261         self.assertEqual('hello', router.status)
262         self.assertEqual('1234', router.tenant_id)
263         self.assertEqual('yes', router.admin_state_up)
264         self.assertEqual(['456', '789'], router.external_fixed_ips)
265         self.assertEqual('123', router.external_network_id)
266
267
268 class InterfaceRouterDomainObjectTests(unittest.TestCase):
269     """
270     Tests the construction of the snaps.domain.network.InterfaceRouter class
271     """
272
273     def test_construction_kwargs(self):
274         intf_router = InterfaceRouter(
275             **{'id': 'id', 'subnet_id': 'foo', 'port_id': 'bar'})
276         self.assertEqual('id', intf_router.id)
277         self.assertEqual('foo', intf_router.subnet_id)
278         self.assertEqual('bar', intf_router.port_id)
279
280     def test_construction_named(self):
281         intf_router = InterfaceRouter(port_id='bar', subnet_id='foo', id='id')
282         self.assertEqual('id', intf_router.id)
283         self.assertEqual('foo', intf_router.subnet_id)
284         self.assertEqual('bar', intf_router.port_id)
285
286
287 class SecurityGroupDomainObjectTests(unittest.TestCase):
288     """
289     Tests the construction of the snaps.domain.network.SecurityGroup class
290     """
291
292     def test_construction_proj_id_kwargs(self):
293         sec_grp = SecurityGroup(
294             **{'name': 'name', 'id': 'id', 'project_id': 'foo',
295                'description': 'test desc',
296                'rules': [
297                     {'id': 'id', 'security_group_id': 'grp_id',
298                      'description': 'desc', 'direction': 'dir',
299                      'ethertype': 'eType', 'port_range_min': '10.0.0.100',
300                      'port_range_max': '10.0.0.200', 'protocol': 'proto',
301                      'remote_group_id': 'group_id',
302                      'remote_ip_prefix': 'ip_prefix'}
303                ]})
304         self.assertEqual('name', sec_grp.name)
305         self.assertEqual('id', sec_grp.id)
306         self.assertEqual('test desc', sec_grp.description)
307         self.assertEqual('foo', sec_grp.project_id)
308
309         self.assertEqual(1, len(sec_grp.rules))
310         rule = sec_grp.rules[0]
311         self.assertEqual('id', rule.id)
312         self.assertEqual('grp_id', rule.security_group_id)
313         self.assertEqual('desc', rule.description)
314         self.assertEqual('dir', rule.direction)
315         self.assertEqual('eType', rule.ethertype)
316         self.assertEqual('10.0.0.100', rule.port_range_min)
317         self.assertEqual('10.0.0.200', rule.port_range_max)
318         self.assertEqual('proto', rule.protocol)
319         self.assertEqual('group_id', rule.remote_group_id)
320         self.assertEqual('ip_prefix', rule.remote_ip_prefix)
321
322     def test_construction_tenant_id_kwargs(self):
323         sec_grp = SecurityGroup(
324             **{'name': 'name', 'id': 'id',
325                'tenant_id': 'foo'})
326         self.assertEqual('name', sec_grp.name)
327         self.assertEqual('id', sec_grp.id)
328         self.assertEqual('foo', sec_grp.project_id)
329         self.assertIsNone(sec_grp.description)
330         self.assertEqual(0, len(sec_grp.rules))
331
332     def test_construction_named(self):
333         rules = [SecurityGroupRule(
334             **{'id': 'id', 'security_group_id': 'grp_id',
335                'description': 'desc', 'direction': 'dir',
336                'ethertype': 'eType', 'port_range_min': '10.0.0.100',
337                'port_range_max': '10.0.0.200', 'protocol': 'proto',
338                'remote_group_id': 'group_id',
339                'remote_ip_prefix': 'ip_prefix'}
340         )]
341         sec_grp = SecurityGroup(description='test desc', tenant_id='foo',
342                                 id='id', name='name', rules=rules)
343         self.assertEqual('name', sec_grp.name)
344         self.assertEqual('id', sec_grp.id)
345         self.assertEqual('test desc', sec_grp.description)
346         self.assertEqual('foo', sec_grp.project_id)
347
348         self.assertEqual(1, len(sec_grp.rules))
349         rule = sec_grp.rules[0]
350         self.assertEqual('id', rule.id)
351         self.assertEqual('grp_id', rule.security_group_id)
352         self.assertEqual('desc', rule.description)
353         self.assertEqual('dir', rule.direction)
354         self.assertEqual('eType', rule.ethertype)
355         self.assertEqual('10.0.0.100', rule.port_range_min)
356         self.assertEqual('10.0.0.200', rule.port_range_max)
357         self.assertEqual('proto', rule.protocol)
358         self.assertEqual('group_id', rule.remote_group_id)
359         self.assertEqual('ip_prefix', rule.remote_ip_prefix)
360
361
362 class SecurityGroupRuleDomainObjectTests(unittest.TestCase):
363     """
364     Tests the construction of the snaps.domain.network.SecurityGroupRule class
365     """
366
367     def test_construction_kwargs(self):
368         sec_grp_rule = SecurityGroupRule(
369             **{'id': 'id', 'security_group_id': 'grp_id',
370                'description': 'desc', 'direction': 'dir', 'ethertype': 'eType',
371                'port_range_min': '10.0.0.100', 'port_range_max': '10.0.0.200',
372                'protocol': 'proto', 'remote_group_id': 'group_id',
373                'remote_ip_prefix': 'ip_prefix'})
374         self.assertEqual('id', sec_grp_rule.id)
375         self.assertEqual('grp_id', sec_grp_rule.security_group_id)
376         self.assertEqual('desc', sec_grp_rule.description)
377         self.assertEqual('dir', sec_grp_rule.direction)
378         self.assertEqual('eType', sec_grp_rule.ethertype)
379         self.assertEqual('10.0.0.100', sec_grp_rule.port_range_min)
380         self.assertEqual('10.0.0.200', sec_grp_rule.port_range_max)
381         self.assertEqual('proto', sec_grp_rule.protocol)
382         self.assertEqual('group_id', sec_grp_rule.remote_group_id)
383         self.assertEqual('ip_prefix', sec_grp_rule.remote_ip_prefix)
384
385     def test_construction_named(self):
386         sec_grp_rule = SecurityGroupRule(
387             remote_ip_prefix='ip_prefix', remote_group_id='group_id',
388             protocol='proto', port_range_min='10.0.0.100',
389             port_range_max='10.0.0.200', ethertype='eType',
390             direction='dir', description='desc', security_group_id='grp_id',
391             id='id')
392         self.assertEqual('id', sec_grp_rule.id)
393         self.assertEqual('grp_id', sec_grp_rule.security_group_id)
394         self.assertEqual('desc', sec_grp_rule.description)
395         self.assertEqual('dir', sec_grp_rule.direction)
396         self.assertEqual('eType', sec_grp_rule.ethertype)
397         self.assertEqual('10.0.0.100', sec_grp_rule.port_range_min)
398         self.assertEqual('10.0.0.200', sec_grp_rule.port_range_max)
399         self.assertEqual('proto', sec_grp_rule.protocol)
400         self.assertEqual('group_id', sec_grp_rule.remote_group_id)
401         self.assertEqual('ip_prefix', sec_grp_rule.remote_ip_prefix)