ソースを参照

Refactored code. Renamed SHORT_NAME to PROVIDER_ID.

Nuwan Goonasekera 10 年 前
コミット
7df9b66e22

+ 0 - 21
cloudbridge/cloud/base/helpers.py

@@ -1,21 +0,0 @@
-class TestMockHelperMixin(object):
-    """
-    A helper class that providers mock drivers can use to be notified when a
-    test setup/teardown occurs. This is useful when activating libraries
-    like HTTPretty which take over socket communications.
-    """
-
-    def setUpMock(self):
-        """
-        Called before a test is started.
-        """
-        raise NotImplementedError(
-            'TestMockHelperMixin.setUpMock not implemented')
-
-    def tearDownMock(self):
-        """
-        Called before test teardown.
-        """
-        raise NotImplementedError(
-            'TestMockHelperMixin.tearDownMock not implemented by this'
-            ' provider')

+ 15 - 15
cloudbridge/cloud/factory.py

@@ -5,8 +5,8 @@ import logging
 import pkgutil
 import pkgutil
 
 
 from cloudbridge.cloud import providers
 from cloudbridge.cloud import providers
-from cloudbridge.cloud.base.helpers import TestMockHelperMixin
 from cloudbridge.cloud.interfaces import CloudProvider
 from cloudbridge.cloud.interfaces import CloudProvider
+from cloudbridge.cloud.interfaces import TestMockHelperMixin
 
 
 
 
 log = logging.getLogger(__name__)
 log = logging.getLogger(__name__)
@@ -30,10 +30,10 @@ class CloudProviderFactory(object):
         """
         """
         Registers a provider class with the factory. The class must
         Registers a provider class with the factory. The class must
         inherit from cloudbridge.cloud.interfaces.CloudProvider
         inherit from cloudbridge.cloud.interfaces.CloudProvider
-        and also have a class attribute named SHORT_NAME.
+        and also have a class attribute named PROVIDER_ID.
 
 
-        The SHORT_NAME is a user friendly short name for the cloud provider,
-        such as 'aws'. The SHORT_NAME must also be included in the
+        The PROVIDER_ID is a user friendly name for the cloud provider,
+        such as 'aws'. The PROVIDER_ID must also be included in the
         cloudbridge.factory.ProviderList.
         cloudbridge.factory.ProviderList.
 
 
         :type  cls: class
         :type  cls: class
@@ -43,24 +43,24 @@ class CloudProviderFactory(object):
                     TestMockHelperMixin`.
                     TestMockHelperMixin`.
         """
         """
         if isinstance(cls, type) and issubclass(cls, CloudProvider):
         if isinstance(cls, type) and issubclass(cls, CloudProvider):
-            if hasattr(cls, "SHORT_NAME"):
-                short_name = getattr(cls, "SHORT_NAME")
+            if hasattr(cls, "PROVIDER_ID"):
+                provider_id = getattr(cls, "PROVIDER_ID")
                 if issubclass(cls, TestMockHelperMixin):
                 if issubclass(cls, TestMockHelperMixin):
-                    if self.provider_list.get(short_name, {}).get(
+                    if self.provider_list.get(provider_id, {}).get(
                             'mock_class'):
                             'mock_class'):
-                        log.warn("Mock provider with shortname: %s is already "
+                        log.warn("Mock provider with id: %s is already "
                                  "registered. Overriding with class: %s",
                                  "registered. Overriding with class: %s",
-                                 short_name, cls)
-                    self.provider_list[short_name]['mock_class'] = cls
+                                 provider_id, cls)
+                    self.provider_list[provider_id]['mock_class'] = cls
                 else:
                 else:
-                    if self.provider_list.get(short_name, {}).get('class'):
-                        log.warn("Provider with shortname: %s is already "
+                    if self.provider_list.get(provider_id, {}).get('class'):
+                        log.warn("Provider with id: %s is already "
                                  "registered. Overriding with class: %s",
                                  "registered. Overriding with class: %s",
-                                 short_name, cls)
-                    self.provider_list[short_name]['class'] = cls
+                                 provider_id, cls)
+                    self.provider_list[provider_id]['class'] = cls
             else:
             else:
                 log.warn("Provider class: %s implements CloudProvider but"
                 log.warn("Provider class: %s implements CloudProvider but"
-                         " does not define SHORT_NAME. Ignoring...", cls)
+                         " does not define PROVIDER_ID. Ignoring...", cls)
         else:
         else:
             log.debug("Class: %s does not implement the CloudProvider"
             log.debug("Class: %s does not implement the CloudProvider"
                       "  interface. Ignoring...", cls)
                       "  interface. Ignoring...", cls)

+ 1 - 0
cloudbridge/cloud/interfaces/__init__.py

@@ -2,6 +2,7 @@
 Public interface exports
 Public interface exports
 """
 """
 from .provider import CloudProvider  # noqa
 from .provider import CloudProvider  # noqa
+from .provider import TestMockHelperMixin  # noqa
 from .resources import CloudServiceType  # noqa
 from .resources import CloudServiceType  # noqa
 from .resources import InstanceState  # noqa
 from .resources import InstanceState  # noqa
 from .resources import InvalidConfigurationException  # noqa
 from .resources import InvalidConfigurationException  # noqa

+ 23 - 0
cloudbridge/cloud/interfaces/provider.py

@@ -165,6 +165,29 @@ class CloudProvider(object):
         pass
         pass
 
 
 
 
+class TestMockHelperMixin(object):
+    """
+    A helper class that providers mock drivers can use to be notified when a
+    test setup/teardown occurs. This is useful when activating libraries
+    like HTTPretty which take over socket communications.
+    """
+
+    def setUpMock(self):
+        """
+        Called before a test is started.
+        """
+        raise NotImplementedError(
+            'TestMockHelperMixin.setUpMock not implemented')
+
+    def tearDownMock(self):
+        """
+        Called before test teardown.
+        """
+        raise NotImplementedError(
+            'TestMockHelperMixin.tearDownMock not implemented by this'
+            ' provider')
+
+
 class ContainerProvider(object):
 class ContainerProvider(object):
 
 
     """
     """

+ 2 - 2
cloudbridge/cloud/providers/aws/provider.py

@@ -11,7 +11,7 @@ from moto.ec2 import mock_ec2
 from moto.s3 import mock_s3
 from moto.s3 import mock_s3
 
 
 from cloudbridge.cloud.base import BaseCloudProvider
 from cloudbridge.cloud.base import BaseCloudProvider
-from cloudbridge.cloud.base.helpers import TestMockHelperMixin
+from cloudbridge.cloud.interfaces import TestMockHelperMixin
 
 
 from .services import AWSBlockStoreService
 from .services import AWSBlockStoreService
 from .services import AWSComputeService
 from .services import AWSComputeService
@@ -21,7 +21,7 @@ from .services import AWSSecurityService
 
 
 class AWSCloudProvider(BaseCloudProvider):
 class AWSCloudProvider(BaseCloudProvider):
 
 
-    SHORT_NAME = 'aws'
+    PROVIDER_ID = 'aws'
 
 
     def __init__(self, config):
     def __init__(self, config):
         super(AWSCloudProvider, self).__init__(config)
         super(AWSCloudProvider, self).__init__(config)

+ 1 - 1
cloudbridge/cloud/providers/openstack/provider.py

@@ -24,7 +24,7 @@ from .services import OpenStackSecurityService
 
 
 class OpenStackCloudProvider(BaseCloudProvider):
 class OpenStackCloudProvider(BaseCloudProvider):
 
 
-    SHORT_NAME = 'openstack'
+    PROVIDER_ID = 'openstack'
 
 
     def __init__(self, config):
     def __init__(self, config):
         super(OpenStackCloudProvider, self).__init__(config)
         super(OpenStackCloudProvider, self).__init__(config)

+ 1 - 1
test/helpers.py

@@ -5,8 +5,8 @@ import unittest
 
 
 from six import reraise
 from six import reraise
 
 
-from cloudbridge.cloud.base.helpers import TestMockHelperMixin
 from cloudbridge.cloud.factory import CloudProviderFactory
 from cloudbridge.cloud.factory import CloudProviderFactory
+from cloudbridge.cloud.interfaces import TestMockHelperMixin
 
 
 
 
 def parse_bool(val):
 def parse_bool(val):

+ 25 - 7
test/test_cloud_factory.py

@@ -2,10 +2,11 @@ import unittest
 
 
 from cloudbridge.cloud import factory
 from cloudbridge.cloud import factory
 from cloudbridge.cloud import interfaces
 from cloudbridge.cloud import interfaces
-from cloudbridge.cloud.base.helpers import TestMockHelperMixin
 from cloudbridge.cloud.factory import CloudProviderFactory
 from cloudbridge.cloud.factory import CloudProviderFactory
+from cloudbridge.cloud.interfaces import TestMockHelperMixin
 from cloudbridge.cloud.interfaces.provider import CloudProvider
 from cloudbridge.cloud.interfaces.provider import CloudProvider
 from cloudbridge.cloud.providers.aws import AWSCloudProvider
 from cloudbridge.cloud.providers.aws import AWSCloudProvider
+from cloudbridge.cloud.providers.aws.provider import MockAWSCloudProvider
 import test.helpers as helpers
 import test.helpers as helpers
 
 
 
 
@@ -65,36 +66,53 @@ class CloudFactoryTestCase(unittest.TestCase):
         """
         """
         self.assertIsNone(CloudProviderFactory().get_provider_class("aws1"))
         self.assertIsNone(CloudProviderFactory().get_provider_class("aws1"))
 
 
-    def test_register_test_class_invalid(self):
+    def test_register_provider_class_invalid(self):
         """
         """
         Attempting to register an invalid test class should be ignored
         Attempting to register an invalid test class should be ignored
         """
         """
         class DummyClass(object):
         class DummyClass(object):
-            SHORT_NAME = 'aws'
+            PROVIDER_ID = 'aws'
 
 
         factory = CloudProviderFactory()
         factory = CloudProviderFactory()
         factory.register_provider_class(DummyClass)
         factory.register_provider_class(DummyClass)
         self.assertTrue(DummyClass not in
         self.assertTrue(DummyClass not in
                         factory.get_all_provider_classes(get_mock=False))
                         factory.get_all_provider_classes(get_mock=False))
 
 
-    def test_register_test_class_double(self):
+    def test_register_provider_class_double(self):
         """
         """
         Attempting to register the same class twice should register second
         Attempting to register the same class twice should register second
         instance
         instance
         """
         """
         class DummyClass(CloudProvider):
         class DummyClass(CloudProvider):
-            SHORT_NAME = 'aws'
+            PROVIDER_ID = 'aws'
 
 
         factory = CloudProviderFactory()
         factory = CloudProviderFactory()
+        factory.list_providers()
         factory.register_provider_class(DummyClass)
         factory.register_provider_class(DummyClass)
         self.assertTrue(DummyClass in
         self.assertTrue(DummyClass in
                         factory.get_all_provider_classes(get_mock=False))
                         factory.get_all_provider_classes(get_mock=False))
         self.assertTrue(AWSCloudProvider not in
         self.assertTrue(AWSCloudProvider not in
                         factory.get_all_provider_classes(get_mock=False))
                         factory.get_all_provider_classes(get_mock=False))
 
 
-    def test_register_test_class_without_shortname(self):
+    def test_register_mock_provider_class_double(self):
         """
         """
-        Attempting to register a class without a SHORT_NAME attribute
+        Attempting to register the same mock provider twice should register
+        only the second instance
+        """
+        class DummyClass(CloudProvider, TestMockHelperMixin):
+            PROVIDER_ID = 'aws'
+
+        factory = CloudProviderFactory()
+        factory.list_providers()
+        factory.register_provider_class(DummyClass)
+        self.assertTrue(DummyClass in
+                        factory.get_all_provider_classes(get_mock=True))
+        self.assertTrue(MockAWSCloudProvider not in
+                        factory.get_all_provider_classes(get_mock=True))
+
+    def test_register_provider_class_without_id(self):
+        """
+        Attempting to register a class without a PROVIDER_ID attribute
         should be ignored.
         should be ignored.
         """
         """
         class DummyClass(CloudProvider):
         class DummyClass(CloudProvider):