python-novaclient/tests/test_discover.py
melwitt aa5622147f discover extensions via entry points
Currently, nova client can only discover extensions in two ways:

1. Installing the extension in the novaclient/v1_1/contrib/ directory.
2. Installing the extension in the top-level python path or modifying
   the path to be picked up by pkgutils.iter_modules()

This patch allows a third, more flexible option of discovering
extensions via entry points. This means the extension can be
installed anywhere and entry points can be registered with python
to be picked up by pkg_resources.iter_entry_points().
To register an entry point, simply add the extension module to
the setup() call in setup.py like this:

setuptools.setup(
    name='mydistribution',
    packages=setuptools.find_packages(),
    entry_points={
        'novaclient.extension' : [
            'foo = mydistribution.mynovaclientexts.foo'
        ]
    },
)

Change-Id: Ic1e223a9173546131e742506897f585f4ac65767
2012-11-09 01:57:53 +00:00

80 lines
2.9 KiB
Python

# Copyright 2012 OpenStack LLC.
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import mock
import imp
import inspect
import pkg_resources
import novaclient.shell
from tests import utils
class DiscoverTest(utils.TestCase):
def test_discover_via_entry_points(self):
def mock_iter_entry_points(group):
if group == 'novaclient.extension':
fake_ep = mock.Mock()
fake_ep.name = 'foo'
fake_ep.module = imp.new_module('foo')
fake_ep.load.return_value = fake_ep.module
return [fake_ep]
@mock.patch.object(pkg_resources, 'iter_entry_points',
mock_iter_entry_points)
def test():
shell = novaclient.shell.OpenStackComputeShell()
for name, module in shell._discover_via_entry_points():
self.assertEqual(name, 'foo')
self.assertTrue(inspect.ismodule(module))
test()
def test_discover_extensions(self):
def mock_discover_via_python_path(self):
yield 'foo', imp.new_module('foo')
def mock_discover_via_contrib_path(self, version):
yield 'bar', imp.new_module('bar')
def mock_discover_via_entry_points(self):
yield 'baz', imp.new_module('baz')
@mock.patch.object(novaclient.shell.OpenStackComputeShell,
'_discover_via_python_path',
mock_discover_via_python_path)
@mock.patch.object(novaclient.shell.OpenStackComputeShell,
'_discover_via_contrib_path',
mock_discover_via_contrib_path)
@mock.patch.object(novaclient.shell.OpenStackComputeShell,
'_discover_via_entry_points',
mock_discover_via_entry_points)
def test():
shell = novaclient.shell.OpenStackComputeShell()
extensions = shell._discover_extensions('1.1')
self.assertEqual(len(extensions), 3)
names = sorted(['foo', 'bar', 'baz'])
sorted_extensions = sorted(extensions, key=lambda ext: ext.name)
for i in range(len(names)):
ext = sorted_extensions[i]
name = names[i]
self.assertEqual(ext.name, name)
self.assertTrue(inspect.ismodule(ext.module))
test()