Set lock_path correctly.
[openstack-build/neutron-build.git] / neutron / tests / unit / agent / l3 / test_namespace_manager.py
1 # Copyright (c) 2015 Rackspace
2 # All Rights Reserved.
3 #
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
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, WITHOUT
12 #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 #    License for the specific language governing permissions and limitations
14 #    under the License.
15
16 import mock
17 from oslo_utils import uuidutils
18
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
25
26 _uuid = uuidutils.generate_uuid
27
28
29 class NamespaceManagerTestCaseFramework(base.BaseTestCase):
30
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)
35
36
37 class TestNamespaceManager(NamespaceManagerTestCaseFramework):
38
39     def setUp(self):
40         super(TestNamespaceManager, self).setUp()
41         self.ns_manager = self._create_namespace_manager()
42
43     def test_get_prefix_and_id(self):
44         router_id = _uuid()
45
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)
50
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)
55
56         ns_name = 'dhcp-' + router_id
57         self.assertIsNone(self.ns_manager.get_prefix_and_id(ns_name))
58
59     def test_is_managed(self):
60         router_id = _uuid()
61
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))
66
67         ext_net_id = _uuid()
68         router_ns_name = dvr_fip_ns.FIP_NS_PREFIX + ext_net_id
69         self.assertTrue(self.ns_manager.is_managed(router_ns_name))
70
71         self.assertFalse(self.ns_manager.is_managed('dhcp-' + router_id))
72
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(),
77                     'dhcp-' + _uuid(), ]
78
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)
87
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)
93
94     def test_ensure_router_cleanup(self):
95         router_id = _uuid()
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)