Fix metaclasses assignment

'metaclass' with 'six' module should be added only using decorator for 'target'-class,
instead of attr assignment else 'target'-class won't see our custom metaclass.

this is fix after merged following commit:
8c1a574de3

Also added basic unittests.

Change-Id: I27cdddf32ec81c72a5f71ce8dca04f643a425b67
Closes-Bug: #1343207
This commit is contained in:
vponomaryov 2014-07-17 13:48:27 +03:00
parent 8c1a574de3
commit 85fee205ef
4 changed files with 101 additions and 18 deletions

View File

@ -127,8 +127,8 @@ class ManagerMeta(type):
cls._ticks_to_skip[name] = task._ticks_between_runs
@six.add_metaclass(ManagerMeta)
class Manager(base.Base):
six.add_metaclass(ManagerMeta)
def __init__(self, host=None, db_driver=None):
if not host:

View File

@ -38,8 +38,8 @@ CONF = cfg.CONF
CONF.register_opts(OPTS)
@six.add_metaclass(abc.ABCMeta)
class LinuxInterfaceDriver(object):
six.add_metaclass(abc.ABCMeta)
# from linux IF_NAMESIZE
DEV_NAME_LEN = 14

View File

@ -14,6 +14,7 @@
# under the License.
import mock
import six
from manila.network.linux import interface
from manila.network.linux import ip_lib
@ -31,22 +32,22 @@ class BaseChild(interface.LinuxInterfaceDriver):
FakeSubnet = {
'cidr': '192.168.1.1/24',
}
'cidr': '192.168.1.1/24',
}
FakeAllocation = {
'subnet': FakeSubnet,
'ip_address': '192.168.1.2',
'ip_version': 4,
}
'subnet': FakeSubnet,
'ip_address': '192.168.1.2',
'ip_version': 4,
}
FakePort = {
'id': 'abcdef01-1234-5678-90ab-ba0987654321',
'fixed_ips': [FakeAllocation],
'device_id': 'cccccccc-cccc-cccc-cccc-cccccccccccc',
}
'id': 'abcdef01-1234-5678-90ab-ba0987654321',
'fixed_ips': [FakeAllocation],
'device_id': 'cccccccc-cccc-cccc-cccc-cccccccccccc',
}
class TestBase(test.TestCase):
@ -60,15 +61,27 @@ class TestBase(test.TestCase):
self.ip = self.ip_p.start()
self.device_exists_p = mock.patch.object(ip_lib, 'device_exists')
self.device_exists = self.device_exists_p.start()
def tearDown(self):
self.ip_dev_p.stop()
self.ip_p.stop()
self.device_exists_p.stop()
super(TestBase, self).tearDown()
self.addCleanup(self.ip_dev_p.stop)
self.addCleanup(self.ip_p.stop)
self.addCleanup(self.device_exists_p.stop)
class TestABCDriver(TestBase):
def test_verify_abs_class_has_abs_methods(self):
class ICanNotBeInstancetiated(interface.LinuxInterfaceDriver):
pass
try:
fake = ICanNotBeInstancetiated()
except TypeError:
pass
except Exception as e:
self.fail("Unexpected exception thrown: '%s'" % six.text_type(e))
else:
self.fail("ExpectedException 'TypeError' not thrown.")
def test_get_device_name(self):
bc = BaseChild()
device_name = bc.get_device_name(FakePort)

View File

@ -0,0 +1,70 @@
# Copyright 2014 Mirantis Inc.
# 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.
"""Test of Base Manager for Manila."""
import mock
from manila import manager
from manila.openstack.common import importutils
from manila import test
class ManagerTestCase(test.TestCase):
@mock.patch.object(importutils, 'import_module', mock.Mock())
def test_verify_manager_instance(self):
host = 'fake_host'
db_driver = 'fake_driver'
fake_manager = manager.Manager(host, db_driver)
self.assertTrue(hasattr(fake_manager, '_periodic_tasks'))
self.assertTrue(hasattr(fake_manager, '_ticks_to_skip'))
self.assertTrue(hasattr(fake_manager, 'additional_endpoints'))
self.assertTrue(hasattr(fake_manager, 'host'))
self.assertTrue(hasattr(fake_manager, 'periodic_tasks'))
self.assertTrue(hasattr(fake_manager, 'init_host'))
self.assertTrue(hasattr(fake_manager, 'service_version'))
self.assertTrue(hasattr(fake_manager, 'service_config'))
self.assertEqual(fake_manager.host, host)
importutils.import_module.assert_called_once_with(db_driver)
class SchedulerDependentManagerTestCase(test.TestCase):
@mock.patch.object(importutils, 'import_module', mock.Mock())
def test_verify_scheduler_dependent_manager_instance(self):
host = 'fake_host'
db_driver = 'fake_driver'
service_name = 'fake_service_name'
fake_sched_manager = manager.SchedulerDependentManager(
host, db_driver, service_name)
self.assertTrue(hasattr(fake_sched_manager, '_periodic_tasks'))
self.assertTrue(hasattr(fake_sched_manager, '_ticks_to_skip'))
self.assertTrue(hasattr(fake_sched_manager, 'additional_endpoints'))
self.assertTrue(hasattr(fake_sched_manager, 'host'))
self.assertTrue(hasattr(fake_sched_manager, 'periodic_tasks'))
self.assertTrue(hasattr(fake_sched_manager, 'init_host'))
self.assertTrue(hasattr(fake_sched_manager, 'service_version'))
self.assertTrue(hasattr(fake_sched_manager, 'service_config'))
self.assertTrue(hasattr(fake_sched_manager, 'last_capabilities'))
self.assertTrue(hasattr(fake_sched_manager, 'service_name'))
self.assertTrue(hasattr(fake_sched_manager, 'scheduler_rpcapi'))
self.assertTrue(hasattr(fake_sched_manager,
'update_service_capabilities'))
self.assertTrue(hasattr(fake_sched_manager,
'_publish_service_capabilities'))
self.assertEqual(fake_sched_manager.host, host)
self.assertEqual(fake_sched_manager.service_name, service_name)
importutils.import_module.assert_called_once_with(db_driver)