Merge "refactor glare plugin loader tests to not mock private methods of stevedore"
This commit is contained in:
commit
d86000bf2e
|
@ -12,11 +12,8 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
import pkg_resources
|
from stevedore import extension
|
||||||
import stevedore
|
|
||||||
|
|
||||||
from glance.common import exception
|
from glance.common import exception
|
||||||
from glance.common.glare import loader
|
from glance.common.glare import loader
|
||||||
|
@ -37,29 +34,28 @@ class MyArtifactOk(art1.MyArtifact):
|
||||||
|
|
||||||
class TestArtifactsLoader(utils.BaseTestCase):
|
class TestArtifactsLoader(utils.BaseTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.path = 'glance.contrib.plugins.artifacts_sample'
|
self._setup_loader([('MyArtifact', art1.MyArtifact)])
|
||||||
self._setup_loader(['MyArtifact=%s.v1.artifact:MyArtifact' %
|
|
||||||
self.path])
|
|
||||||
super(TestArtifactsLoader, self).setUp()
|
super(TestArtifactsLoader, self).setUp()
|
||||||
|
|
||||||
def _setup_loader(self, artifacts):
|
def _setup_loader(self, artifacts):
|
||||||
self.loader = None
|
self.loader = None
|
||||||
try:
|
self.extensions = [
|
||||||
# FIXME(dims) : We should not be relying on the internal class
|
extension.Extension(
|
||||||
# methods of stevedore.
|
name=a[0],
|
||||||
with mock.patch.object(stevedore.extension.ExtensionManager,
|
entry_point=mock.Mock(),
|
||||||
'_find_entry_points') as fep:
|
plugin=a[1],
|
||||||
fep.return_value = [
|
obj=None,
|
||||||
pkg_resources.EntryPoint.parse(art) for art in artifacts]
|
)
|
||||||
self.loader = loader.ArtifactsPluginLoader(
|
for a in artifacts
|
||||||
'glance.artifacts.types')
|
]
|
||||||
except AttributeError:
|
test_plugins = extension.ExtensionManager.make_test_instance(
|
||||||
with mock.patch.object(stevedore.extension.ExtensionManager,
|
extensions=self.extensions,
|
||||||
'list_entry_points') as fep:
|
propagate_map_exceptions=True,
|
||||||
fep.return_value = [
|
)
|
||||||
pkg_resources.EntryPoint.parse(art) for art in artifacts]
|
self.loader = loader.ArtifactsPluginLoader(
|
||||||
self.loader = loader.ArtifactsPluginLoader(
|
'glance.artifacts.types',
|
||||||
'glance.artifacts.types')
|
test_plugins=test_plugins,
|
||||||
|
)
|
||||||
|
|
||||||
def test_load(self):
|
def test_load(self):
|
||||||
"""
|
"""
|
||||||
|
@ -71,12 +67,11 @@ class TestArtifactsLoader(utils.BaseTestCase):
|
||||||
self.assertEqual(art1.MyArtifact,
|
self.assertEqual(art1.MyArtifact,
|
||||||
self.loader.get_class_by_endpoint('myartifact'))
|
self.loader.get_class_by_endpoint('myartifact'))
|
||||||
# entrypoint = [a, list]
|
# entrypoint = [a, list]
|
||||||
path = os.path.splitext(__file__)[0][__file__.rfind(
|
|
||||||
'glance'):].replace('/', '.')
|
|
||||||
self._setup_loader([
|
self._setup_loader([
|
||||||
'MyArtifact=%s:MyArtifactOk' % path,
|
('MyArtifact', MyArtifactOk),
|
||||||
'MyArtifact=%s.v2.artifact:MyArtifact' % self.path,
|
('MyArtifact', art2.MyArtifact),
|
||||||
'MyArtifact=%s.v1.artifact:MyArtifact' % self.path]),
|
('MyArtifact', art1.MyArtifact),
|
||||||
|
])
|
||||||
self.assertEqual(3, len(self.loader.mgr.extensions))
|
self.assertEqual(3, len(self.loader.mgr.extensions))
|
||||||
# returns the plugin with the latest version
|
# returns the plugin with the latest version
|
||||||
self.assertEqual(art2.MyArtifact,
|
self.assertEqual(art2.MyArtifact,
|
||||||
|
@ -88,8 +83,7 @@ class TestArtifactsLoader(utils.BaseTestCase):
|
||||||
def test_basic_loader_func(self):
|
def test_basic_loader_func(self):
|
||||||
"""Test public methods of PluginLoader class here"""
|
"""Test public methods of PluginLoader class here"""
|
||||||
# type_version 2 == 2.0 == 2.0.0
|
# type_version 2 == 2.0 == 2.0.0
|
||||||
self._setup_loader(
|
self._setup_loader([('MyArtifact', art2.MyArtifact)])
|
||||||
['MyArtifact=%s.v2.artifact:MyArtifact' % self.path])
|
|
||||||
self.assertEqual(art2.MyArtifact,
|
self.assertEqual(art2.MyArtifact,
|
||||||
self.loader.get_class_by_endpoint('myartifact'))
|
self.loader.get_class_by_endpoint('myartifact'))
|
||||||
self.assertEqual(art2.MyArtifact,
|
self.assertEqual(art2.MyArtifact,
|
||||||
|
@ -114,21 +108,18 @@ class TestArtifactsLoader(utils.BaseTestCase):
|
||||||
* no plugin with the same type_name and version has been already
|
* no plugin with the same type_name and version has been already
|
||||||
loaded
|
loaded
|
||||||
"""
|
"""
|
||||||
path = 'glance.contrib.plugins.artifacts_sample'
|
|
||||||
# here artifacts specific validation is checked
|
# here artifacts specific validation is checked
|
||||||
self.assertRaises(exception.ArtifactNonMatchingTypeName,
|
self.assertRaises(exception.ArtifactNonMatchingTypeName,
|
||||||
self._setup_loader,
|
self._setup_loader,
|
||||||
['non_matching_name=%s.v1.artifact:MyArtifact' %
|
[('non_matching_name', art1.MyArtifact)],
|
||||||
path])
|
)
|
||||||
# make sure this call is ok
|
# make sure this call is ok
|
||||||
self._setup_loader(['MyArtifact=%s.v1.artifact:MyArtifact' % path])
|
self._setup_loader([('MyArtifact', art1.MyArtifact)])
|
||||||
art_type = self.loader.get_class_by_endpoint('myartifact')
|
art_type = self.loader.get_class_by_endpoint('myartifact')
|
||||||
self.assertEqual('MyArtifact', art_type.metadata.type_name)
|
self.assertEqual('MyArtifact', art_type.metadata.type_name)
|
||||||
self.assertEqual('1.0.1', art_type.metadata.type_version)
|
self.assertEqual('1.0.1', art_type.metadata.type_version)
|
||||||
# now try to add duplicate artifact with the same type_name and
|
# now try to add duplicate artifact with the same type_name and
|
||||||
# type_version as already exists
|
# type_version as already exists
|
||||||
bad_art_path = os.path.splitext(__file__)[0][__file__.rfind(
|
|
||||||
'glance'):].replace('/', '.')
|
|
||||||
self.assertEqual(art_type.metadata.type_version,
|
self.assertEqual(art_type.metadata.type_version,
|
||||||
MyArtifactDuplicate.metadata.type_version)
|
MyArtifactDuplicate.metadata.type_version)
|
||||||
self.assertEqual(art_type.metadata.type_name,
|
self.assertEqual(art_type.metadata.type_name,
|
||||||
|
@ -136,14 +127,14 @@ class TestArtifactsLoader(utils.BaseTestCase):
|
||||||
# should raise an exception as (name, version) is not unique
|
# should raise an exception as (name, version) is not unique
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
exception.ArtifactDuplicateNameTypeVersion, self._setup_loader,
|
exception.ArtifactDuplicateNameTypeVersion, self._setup_loader,
|
||||||
['MyArtifact=%s.v1.artifact:MyArtifact' % path,
|
[('MyArtifact', art1.MyArtifact),
|
||||||
'MyArtifact=%s:MyArtifactDuplicate' % bad_art_path])
|
('MyArtifact', MyArtifactDuplicate)])
|
||||||
# two artifacts with the same name but different versions coexist fine
|
# two artifacts with the same name but different versions coexist fine
|
||||||
self.assertEqual('MyArtifact', MyArtifactOk.metadata.type_name)
|
self.assertEqual('MyArtifact', MyArtifactOk.metadata.type_name)
|
||||||
self.assertNotEqual(art_type.metadata.type_version,
|
self.assertNotEqual(art_type.metadata.type_version,
|
||||||
MyArtifactOk.metadata.type_version)
|
MyArtifactOk.metadata.type_version)
|
||||||
self._setup_loader(['MyArtifact=%s.v1.artifact:MyArtifact' % path,
|
self._setup_loader([('MyArtifact', art1.MyArtifact),
|
||||||
'MyArtifact=%s:MyArtifactOk' % bad_art_path])
|
('MyArtifact', MyArtifactOk)])
|
||||||
|
|
||||||
def test_check_function(self):
|
def test_check_function(self):
|
||||||
"""
|
"""
|
||||||
|
@ -156,16 +147,22 @@ class TestArtifactsLoader(utils.BaseTestCase):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
self.config(load_enabled=False)
|
self.config(load_enabled=False)
|
||||||
self.assertRaises(exception.ArtifactLoadError,
|
self._setup_loader([('MyArtifact', art1.MyArtifact)])
|
||||||
self._setup_loader,
|
checker = self.loader._gen_check_func()
|
||||||
['MyArtifact=%s.v1.artifact:MyArtifact' % self.path])
|
self.assertRaises(
|
||||||
|
exception.ArtifactLoadError,
|
||||||
|
checker,
|
||||||
|
self.extensions[0],
|
||||||
|
)
|
||||||
self.config(load_enabled=True, available_plugins=['MyArtifact-1.0.2'])
|
self.config(load_enabled=True, available_plugins=['MyArtifact-1.0.2'])
|
||||||
self.assertRaises(exception.ArtifactLoadError,
|
self._setup_loader([('MyArtifact', art1.MyArtifact)])
|
||||||
self._setup_loader,
|
checker = self.loader._gen_check_func()
|
||||||
['MyArtifact=%s.v1.artifact:MyArtifact' % self.path])
|
self.assertRaises(
|
||||||
path = os.path.splitext(__file__)[0][__file__.rfind(
|
exception.ArtifactLoadError,
|
||||||
'glance'):].replace('/', '.')
|
checker,
|
||||||
self._setup_loader(['MyArtifact=%s:MyArtifactOk' % path])
|
self.extensions[0],
|
||||||
|
)
|
||||||
|
self._setup_loader([('MyArtifact', MyArtifactOk)])
|
||||||
# make sure that plugin_map has the expected plugin
|
# make sure that plugin_map has the expected plugin
|
||||||
self.assertEqual(MyArtifactOk,
|
self.assertEqual(MyArtifactOk,
|
||||||
self.loader.get_class_by_endpoint('myartifact',
|
self.loader.get_class_by_endpoint('myartifact',
|
||||||
|
|
Loading…
Reference in New Issue