1
# Copyright 2013 VMware, Inc. All Rights Reserved.
3
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4
# not use this file except in compliance with the License. You may obtain
5
# a copy of the License at
7
# http://www.apache.org/licenses/LICENSE-2.0
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
# License for the specific language governing permissions and limitations
15
from oslo_config import cfg
17
from neutron.common import exceptions as n_exc
18
from neutron import manager
19
from neutron.plugins.common import constants
20
from neutron.services import provider_configuration as provconf
21
from neutron.tests import base
24
class ParseServiceProviderConfigurationTestCase(base.BaseTestCase):
25
def test_default_service_provider_configuration(self):
26
providers = cfg.CONF.service_providers.service_provider
27
self.assertEqual(providers, [])
29
def test_parse_single_service_provider_opt(self):
30
cfg.CONF.set_override('service_provider',
31
[constants.LOADBALANCER +
32
':lbaas:driver_path'],
34
expected = {'service_type': constants.LOADBALANCER,
36
'driver': 'driver_path',
38
res = provconf.parse_service_provider_opt()
39
self.assertEqual(len(res), 1)
40
self.assertEqual(res, [expected])
42
def test_parse_single_default_service_provider_opt(self):
43
cfg.CONF.set_override('service_provider',
44
[constants.LOADBALANCER +
45
':lbaas:driver_path:default'],
47
expected = {'service_type': constants.LOADBALANCER,
49
'driver': 'driver_path',
51
res = provconf.parse_service_provider_opt()
52
self.assertEqual(len(res), 1)
53
self.assertEqual(res, [expected])
55
def test_parse_multi_service_provider_opt(self):
56
cfg.CONF.set_override('service_provider',
57
[constants.LOADBALANCER +
59
constants.LOADBALANCER + ':name1:path1',
60
constants.LOADBALANCER +
61
':name2:path2:default'],
63
res = provconf.parse_service_provider_opt()
64
# This parsing crosses repos if additional projects are installed,
65
# so check that at least what we expect is there; there may be more.
66
self.assertTrue(len(res) >= 3)
68
def test_parse_service_provider_opt_not_allowed_raises(self):
69
cfg.CONF.set_override('service_provider',
70
[constants.LOADBALANCER +
72
'svc_type:name1:path1'],
74
self.assertRaises(n_exc.Invalid, provconf.parse_service_provider_opt)
76
def test_parse_service_provider_invalid_format(self):
77
cfg.CONF.set_override('service_provider',
78
[constants.LOADBALANCER +
80
'svc_type:name1:path1:def'],
82
self.assertRaises(n_exc.Invalid, provconf.parse_service_provider_opt)
83
cfg.CONF.set_override('service_provider',
84
[constants.LOADBALANCER +
86
'svc_type:name1:path1:def'],
88
self.assertRaises(n_exc.Invalid, provconf.parse_service_provider_opt)
90
def test_parse_service_provider_name_too_long(self):
92
cfg.CONF.set_override('service_provider',
93
[constants.LOADBALANCER +
94
':' + name + ':driver_path',
95
'svc_type:name1:path1:def'],
97
self.assertRaises(n_exc.Invalid, provconf.parse_service_provider_opt)
100
class ProviderConfigurationTestCase(base.BaseTestCase):
102
super(ProviderConfigurationTestCase, self).setUp()
104
def test_ensure_driver_unique(self):
105
pconf = provconf.ProviderConfiguration([])
106
pconf.providers[('svctype', 'name')] = {'driver': 'driver',
108
self.assertRaises(n_exc.Invalid,
109
pconf._ensure_driver_unique, 'driver')
110
self.assertIsNone(pconf._ensure_driver_unique('another_driver1'))
112
def test_ensure_default_unique(self):
113
pconf = provconf.ProviderConfiguration([])
114
pconf.providers[('svctype', 'name')] = {'driver': 'driver',
116
self.assertRaises(n_exc.Invalid,
117
pconf._ensure_default_unique,
119
self.assertIsNone(pconf._ensure_default_unique('svctype', False))
120
self.assertIsNone(pconf._ensure_default_unique('svctype1', True))
121
self.assertIsNone(pconf._ensure_default_unique('svctype1', False))
123
def test_add_provider(self):
124
pconf = provconf.ProviderConfiguration([])
125
prov = {'service_type': constants.LOADBALANCER,
129
pconf.add_provider(prov)
130
self.assertEqual(len(pconf.providers), 1)
131
self.assertEqual(pconf.providers.keys(),
132
[(constants.LOADBALANCER, 'name')])
133
self.assertEqual(pconf.providers.values(),
134
[{'driver': 'path', 'default': False}])
136
def test_add_duplicate_provider(self):
137
pconf = provconf.ProviderConfiguration([])
138
prov = {'service_type': constants.LOADBALANCER,
142
pconf.add_provider(prov)
143
self.assertRaises(n_exc.Invalid, pconf.add_provider, prov)
144
self.assertEqual(len(pconf.providers), 1)
146
def test_get_service_providers(self):
147
provs = [{'service_type': constants.LOADBALANCER,
151
{'service_type': constants.LOADBALANCER,
155
{'service_type': 'st2',
160
{'service_type': 'st3',
164
pconf = provconf.ProviderConfiguration(provs)
166
p = pconf.get_service_providers(
167
filters={'name': [prov['name']],
168
'service_type': prov['service_type']}
170
self.assertEqual(p, [prov])
172
def test_get_service_providers_with_fields(self):
173
provs = [{'service_type': constants.LOADBALANCER,
177
{'service_type': constants.LOADBALANCER,
181
pconf = provconf.ProviderConfiguration(provs)
183
p = pconf.get_service_providers(
184
filters={'name': [prov['name']],
185
'service_type': prov['service_type']},
188
self.assertEqual(p, [{'name': prov['name']}])
191
class GetProviderDriverClassTestCase(base.BaseTestCase):
192
def test_get_provider_driver_class_hit(self):
194
expected = 'neutron.plugins.ml2.plugin.Ml2Plugin'
195
actual = provconf.get_provider_driver_class(
197
namespace=manager.CORE_PLUGINS_NAMESPACE)
198
self.assertEqual(expected, actual)
200
def test_get_provider_driver_class_miss(self):
201
retval = provconf.get_provider_driver_class('foo')
202
self.assertEqual('foo', retval)