Fixed bug with regards to subnet lookups.
[snaps.git] / snaps / config / tests / router_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 PortConfig
18 from snaps.config.router import RouterConfig, RouterConfigError
19
20
21 class RouterConfigUnitTests(unittest.TestCase):
22     """
23     Class for testing the RouterConfig class
24     """
25
26     def test_no_params(self):
27         with self.assertRaises(RouterConfigError):
28             RouterConfig()
29
30     def test_empty_config(self):
31         with self.assertRaises(RouterConfigError):
32             RouterConfig(**dict())
33
34     def test_bad_internal_subnets_bad_key(self):
35         with self.assertRaises(RouterConfigError):
36             RouterConfig(name='foo', internal_subnets={'foo': 'bar'})
37
38     def test_bad_internal_subnets_no_project(self):
39         with self.assertRaises(RouterConfigError):
40             RouterConfig(name='foo', internal_subnets={
41                 'subnet': {'subnet_name': 'bar', 'network_name': 'foo'}})
42
43     def test_bad_internal_subnets_no_network(self):
44         with self.assertRaises(RouterConfigError):
45             RouterConfig(name='foo', internal_subnets={
46                 'subnet': {'subnet_name': 'bar', 'project_name': 'foo'}})
47
48     def test_bad_internal_subnets_no_subnet(self):
49         with self.assertRaises(RouterConfigError):
50             RouterConfig(name='foo', internal_subnets={
51                 'subnet': {'project_name': 'bar', 'network_name': 'foo'}})
52
53     def test_name_only(self):
54         settings = RouterConfig(name='foo')
55         self.assertEqual('foo', settings.name)
56         self.assertIsNone(settings.project_name)
57         self.assertIsNone(settings.external_gateway)
58         self.assertTrue(settings.admin_state_up)
59         self.assertIsNone(settings.enable_snat)
60         self.assertIsNotNone(settings.internal_subnets)
61         self.assertTrue(isinstance(settings.internal_subnets, list))
62         self.assertEqual(0, len(settings.internal_subnets))
63         self.assertIsNotNone(settings.port_settings)
64         self.assertTrue(isinstance(settings.port_settings, list))
65         self.assertEqual(0, len(settings.port_settings))
66
67     def test_config_with_name_only(self):
68         settings = RouterConfig(**{'name': 'foo'})
69         self.assertEqual('foo', settings.name)
70         self.assertIsNone(settings.project_name)
71         self.assertIsNone(settings.external_gateway)
72         self.assertTrue(settings.admin_state_up)
73         self.assertIsNone(settings.enable_snat)
74         self.assertIsNotNone(settings.internal_subnets)
75         self.assertTrue(isinstance(settings.internal_subnets, list))
76         self.assertEqual(0, len(settings.internal_subnets))
77         self.assertIsNotNone(settings.port_settings)
78         self.assertTrue(isinstance(settings.port_settings, list))
79         self.assertEqual(0, len(settings.port_settings))
80
81     def test_all_internal_subnets_str(self):
82         port_settings = PortConfig(name='foo', network_name='bar')
83         settings = RouterConfig(
84             name='foo', project_name='bar', external_gateway='foo_gateway',
85             admin_state_up=True, enable_snat=False,
86             internal_subnets=['10.0.0.1/24'], interfaces=[port_settings])
87         self.assertEqual('foo', settings.name)
88         self.assertEqual('bar', settings.project_name)
89         self.assertEqual('foo_gateway', settings.external_gateway)
90         self.assertTrue(settings.admin_state_up)
91         self.assertFalse(settings.enable_snat)
92         self.assertIsNotNone(settings.internal_subnets)
93         self.assertTrue(isinstance(settings.internal_subnets, list))
94         self.assertEqual(1, len(settings.internal_subnets))
95         self.assertEqual(['10.0.0.1/24'], settings.internal_subnets)
96         self.assertEqual([port_settings], settings.port_settings)
97
98     def test_all_internal_subnets_dict(self):
99         port_settings = PortConfig(name='foo', network_name='bar')
100         int_subs = {'subnet': {
101             'project_name': 'proj_a', 'network_name': 'net_name',
102             'subnet_name': 'sub_name'}}
103         settings = RouterConfig(
104             name='foo', project_name='bar', external_gateway='foo_gateway',
105             admin_state_up=True, enable_snat=False,
106             internal_subnets=int_subs,
107             interfaces=[port_settings])
108         self.assertEqual('foo', settings.name)
109         self.assertEqual('bar', settings.project_name)
110         self.assertEqual('foo_gateway', settings.external_gateway)
111         self.assertTrue(settings.admin_state_up)
112         self.assertFalse(settings.enable_snat)
113         self.assertIsNotNone(settings.internal_subnets)
114         self.assertTrue(isinstance(settings.internal_subnets, dict))
115         self.assertEqual(1, len(settings.internal_subnets))
116         self.assertEqual(int_subs, settings.internal_subnets)
117         self.assertEqual([port_settings], settings.port_settings)
118
119     def test_config_all_internal_subnets_str(self):
120         int_subs = {'subnet': {
121             'project_name': 'proj_a', 'network_name': 'net_name',
122             'subnet_name': 'sub_name'}}
123         settings = RouterConfig(
124             **{'name': 'foo', 'project_name': 'bar',
125                'external_gateway': 'foo_gateway', 'admin_state_up': True,
126                'enable_snat': False,
127                'internal_subnets': int_subs,
128                'interfaces':
129                    [{'port': {'name': 'foo-port',
130                               'network_name': 'bar-net'}}]})
131         self.assertEqual('foo', settings.name)
132         self.assertEqual('bar', settings.project_name)
133         self.assertEqual('foo_gateway', settings.external_gateway)
134         self.assertTrue(settings.admin_state_up)
135         self.assertFalse(settings.enable_snat)
136         self.assertIsNotNone(settings.internal_subnets)
137         self.assertTrue(isinstance(settings.internal_subnets, dict))
138         self.assertEqual(1, len(settings.internal_subnets))
139         self.assertEqual(int_subs, settings.internal_subnets)
140         self.assertEqual([PortConfig(**{'name': 'foo-port',
141                                         'network_name': 'bar-net'})],
142                          settings.port_settings)