1 # Copyright (c) 2015 Rackspace
4 # Licensed under the Apache License, Version 2.0 (the "License"); you may
5 # not use this file except in compliance with the License. You may obtain
6 # a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 # License for the specific language governing permissions and limitations
17 from oslo_utils import uuidutils
19 from neutron.agent.l3 import dvr_fip_ns
20 from neutron.agent.l3 import dvr_snat_ns
21 from neutron.agent.l3 import namespace_manager
22 from neutron.agent.l3 import namespaces
23 from neutron.agent.linux import ip_lib
24 from neutron.tests import base
26 _uuid = uuidutils.generate_uuid
29 class NamespaceManagerTestCaseFramework(base.BaseTestCase):
31 def _create_namespace_manager(self):
32 self.agent_conf = mock.Mock()
33 self.driver = mock.Mock()
34 return namespace_manager.NamespaceManager(self.agent_conf, self.driver)
37 class TestNamespaceManager(NamespaceManagerTestCaseFramework):
40 super(TestNamespaceManager, self).setUp()
41 self.ns_manager = self._create_namespace_manager()
43 def test_get_prefix_and_id(self):
46 ns_prefix, ns_id = self.ns_manager.get_prefix_and_id(
47 namespaces.NS_PREFIX + router_id)
48 self.assertEqual(namespaces.NS_PREFIX, ns_prefix)
49 self.assertEqual(router_id, ns_id)
51 ns_prefix, ns_id = self.ns_manager.get_prefix_and_id(
52 dvr_snat_ns.SNAT_NS_PREFIX + router_id)
53 self.assertEqual(dvr_snat_ns.SNAT_NS_PREFIX, ns_prefix)
54 self.assertEqual(router_id, ns_id)
56 ns_name = 'dhcp-' + router_id
57 self.assertIsNone(self.ns_manager.get_prefix_and_id(ns_name))
59 def test_is_managed(self):
62 router_ns_name = namespaces.NS_PREFIX + router_id
63 self.assertTrue(self.ns_manager.is_managed(router_ns_name))
64 router_ns_name = dvr_snat_ns.SNAT_NS_PREFIX + router_id
65 self.assertTrue(self.ns_manager.is_managed(router_ns_name))
68 router_ns_name = dvr_fip_ns.FIP_NS_PREFIX + ext_net_id
69 self.assertTrue(self.ns_manager.is_managed(router_ns_name))
71 self.assertFalse(self.ns_manager.is_managed('dhcp-' + router_id))
73 def test_list_all(self):
74 ns_names = [namespaces.NS_PREFIX + _uuid(),
75 dvr_snat_ns.SNAT_NS_PREFIX + _uuid(),
76 dvr_fip_ns.FIP_NS_PREFIX + _uuid(),
79 # Test the normal path
80 with mock.patch.object(ip_lib.IPWrapper, 'get_namespaces',
81 return_value=ns_names):
82 retrieved_ns_names = self.ns_manager.list_all()
83 self.assertEqual(len(ns_names) - 1, len(retrieved_ns_names))
84 for i in range(len(retrieved_ns_names)):
85 self.assertIn(ns_names[i], retrieved_ns_names)
86 self.assertNotIn(ns_names[-1], retrieved_ns_names)
88 # Test path where IPWrapper raises exception
89 with mock.patch.object(ip_lib.IPWrapper, 'get_namespaces',
90 side_effect=RuntimeError):
91 retrieved_ns_names = self.ns_manager.list_all()
92 self.assertFalse(retrieved_ns_names)
94 def test_ensure_router_cleanup(self):
96 ns_names = [namespaces.NS_PREFIX + _uuid() for _ in range(5)]
97 ns_names += [dvr_snat_ns.SNAT_NS_PREFIX + _uuid() for _ in range(5)]
98 ns_names += [namespaces.NS_PREFIX + router_id,
99 dvr_snat_ns.SNAT_NS_PREFIX + router_id]
100 with mock.patch.object(ip_lib.IPWrapper, 'get_namespaces',
101 return_value=ns_names), \
102 mock.patch.object(self.ns_manager, '_cleanup') as mock_cleanup:
103 self.ns_manager.ensure_router_cleanup(router_id)
104 expected = [mock.call(namespaces.NS_PREFIX, router_id),
105 mock.call(dvr_snat_ns.SNAT_NS_PREFIX, router_id)]
106 mock_cleanup.assert_has_calls(expected, any_order=True)
107 self.assertEqual(2, mock_cleanup.call_count)