2
0
Эх сурвалжийг харах

Added support for mock drivers.

nuwan_ag 10 жил өмнө
parent
commit
61f9fca4e1

+ 1 - 0
cloudbridge/providers/aws/__init__.py

@@ -3,4 +3,5 @@ Exports from this provider
 """
 
 from .impl import AWSCloudProviderV1
+from .impl import MockAWSCloudProvider
 from .resources import AWSInstance

+ 12 - 0
cloudbridge/providers/aws/impl.py

@@ -8,6 +8,8 @@ import boto
 from boto.ec2.regioninfo import RegionInfo
 
 from cloudbridge.providers.base import BaseCloudProvider
+from moto.ec2 import mock_ec2
+from moto.s3 import mock_s3
 
 from .services import AWSBlockStoreService
 from .services import AWSComputeService
@@ -90,3 +92,13 @@ class AWSCloudProviderV1(BaseCloudProvider):
         s3_conn = boto.connect_s3(aws_access_key_id=self.a_key,
                                   aws_secret_access_key=self.s_key)
         return s3_conn
+
+
+class MockAWSCloudProvider(AWSCloudProviderV1):
+
+    def __init__(self, config):
+        ec2mock = mock_ec2()
+        ec2mock.start()
+        s3mock = mock_s3()
+        s3mock.start()
+        super(MockAWSCloudProvider, self).__init__(config)

+ 54 - 18
cloudbridge/providers/factory.py

@@ -24,17 +24,20 @@ class CloudProviderFactory(object):
         :rtype: list
         :return: A list of available providers and their interface versions.
         """
-        return [{"name": ProviderList.OPENSTACK,
-                 "implementations":
-                 [{"class":
-                   "cloudbridge.providers.openstack.OpenStackCloudProviderV1",
-                   "version": 1}]},
-                {"name": ProviderList.AWS,
-                 "implementations":
-                 [{"class": "cloudbridge.providers.aws.AWSCloudProviderV1",
-                   "version": 1}]}]
-
-    def find_provider_impl(self, name, version=None):
+        return [
+            {"name": ProviderList.OPENSTACK,
+             "implementations":
+                [{"class":
+                  "cloudbridge.providers.openstack.OpenStackCloudProviderV1",
+                  "version": 1}]},
+            {"name": ProviderList.AWS,
+             "implementations":
+                [{"class": "cloudbridge.providers.aws.AWSCloudProviderV1",
+                  "mock_class":
+                  "cloudbridge.providers.aws.MockAWSCloudProvider",
+                  "version": 1}]}]
+
+    def find_provider_impl(self, name, version=None, get_mock=False):
         """
         Finds a provider implementation class given its name.
 
@@ -46,6 +49,10 @@ class CloudProviderFactory(object):
                         version is not specified, return the latest available
                         version.
 
+        :type get_mock: ``bool``
+        :param get_mock: If True, returns a mock version of the provider
+        if available, or the real version if not.
+
         :rtype: ``None`` or str
         :return: If found, return a module (including class name) of the
                  provider or ``None`` if the provider was not found.
@@ -56,14 +63,21 @@ class CloudProviderFactory(object):
                     match = [item for item in provider["implementations"]
                              if item["version"] == version]
                     if match:
-                        return match[0]["class"]
+                        if get_mock and match[0].get("mock_class"):
+                            return match[0]["mock_class"]
+                        else:
+                            return match[0]["class"]
                     else:
                         return None
                 else:
                     # Return latest available version
-                    return sorted(
+                    latest_version = sorted(
                         (item for item in provider["implementations"]),
-                        key=lambda x: x["version"])[-1]["class"]
+                        key=lambda x: x["version"])[-1]
+                    if get_mock and latest_version.get("mock_class"):
+                        return latest_version["mock_class"]
+                    else:
+                        return latest_version["class"]
         return None
 
     def create_provider(self, name, config, version=None):
@@ -98,25 +112,47 @@ class CloudProviderFactory(object):
                                  class_name)
         return provider_class
 
-    def get_provider_class(self, name, version=None):
+    def get_provider_class(self, name, version=None, get_mock=False):
         """
         Return a class for the requested provider.
 
+        :type get_mock: ``bool``
+        :param get_mock: If True, returns a mock version of the provider
+        if available, or the real version if not.
+
         :rtype: provider class or ``None``
         :return: A class corresponding to the requested provider or ``None``
                  if the provider was not found.
         """
-        provider_class = self.find_provider_impl(name, version)
+        provider_class = self.find_provider_impl(
+            name,
+            version,
+            get_mock=get_mock)
         if provider_class:
             return self._get_provider_class(provider_class)
         return None
 
-    def get_all_provider_classes(self):
+    def get_all_provider_classes(self, get_mock=False):
         """
         Returns a list of classes for all available provider implementations
+
+        :type get_mock: ``bool``
+        :param get_mock: If True, returns a mock version of the provider
+        if available, or the real version if not.
+
+        :rtype: type ``class`` or ``None``
+        :return: A list of all available provider classes or an empty list
+        if none found.
         """
         all_providers = []
         for provider in self.list_providers():
             for impl in provider["implementations"]:
-                all_providers.append(self._get_provider_class(impl["class"]))
+                if get_mock and impl.get("mock_class"):
+                    all_providers.append(
+                        self._get_provider_class(
+                            impl["mock_class"]))
+                else:
+                    all_providers.append(
+                        self._get_provider_class(
+                            impl["class"]))
         return all_providers

+ 7 - 3
setup.py

@@ -13,9 +13,13 @@ setup(name='cloudbridge',
       author='Galaxy and GVL Projects',
       author_email='support@genome.edu.au',
       url='http://cloudbridge.readthedocs.org/',
-      install_requires=['bunch>=1.00', 'six>=1.9.0', 'python-keystoneclient',
-                        'python-novaclient', 'python-cinderclient',
-                        'python-swiftclient', 'boto', 'retrying'] + backports,
+      install_requires=[
+          'bunch>=1.00', 'six>=1.9.0', 'python-keystoneclient',
+          'python-novaclient', 'python-cinderclient',
+          'python-swiftclient', 'boto', 'retrying', 'moto>=0.4.15'] + backports,
+      dependency_links=[
+          "git+git://github.com/gvlproject/moto.git@1.4.15#egg=moto-1.4.15"
+      ],
       packages=find_packages(),
       license='MIT',
       classifiers=[

+ 9 - 2
test/helpers.py

@@ -6,6 +6,8 @@ from six import reraise
 
 from cloudbridge.providers.factory import CloudProviderFactory
 
+TEST_WAIT_INTERVAL = 1
+
 
 @contextmanager
 def exception_action(cleanup_func):
@@ -146,15 +148,20 @@ class ProviderTestCaseGenerator():
         combinations
         """
         factory = CloudProviderFactory()
+        use_mock_drivers = os.environ.get("CB_USE_MOCK_DRIVERS", True)
         provider_name = os.environ.get("CB_TEST_PROVIDER", None)
         if provider_name:
-            provider_classes = [factory.get_provider_class(provider_name)]
+            provider_classes = [
+                factory.get_provider_class(
+                    provider_name,
+                    get_mock=use_mock_drivers)]
             if not provider_classes[0]:
                 raise ValueError(
                     "Could not find specified test provider %s" %
                     provider_name)
         else:
-            provider_classes = factory.get_all_provider_classes()
+            provider_classes = factory.get_all_provider_classes(
+                get_mock=use_mock_drivers)
         suite = unittest.TestSuite()
         suites = map(self.generate_test_suite_for_provider, provider_classes)
         map(suite.addTest, suites)

+ 1 - 1
tox.ini

@@ -8,7 +8,7 @@ envlist = py27, py33, py34, pypy
 
 [testenv]
 commands = {envpython} setup.py test
-passenv = AWS_ACCESS_KEY AWS_SECRET_KEY OS_AUTH_URL OS_PASSWORD OS_TENANT_NAME OS_USERNAME OS_REGION_NAME NOVA_SERVICE_NAME CB_AMI CB_INSTANCE_TYPE CB_IMAGE CB_FLAVOR CB_TEST_PROVIDER
+passenv = AWS_ACCESS_KEY AWS_SECRET_KEY OS_AUTH_URL OS_PASSWORD OS_TENANT_NAME OS_USERNAME OS_REGION_NAME NOVA_SERVICE_NAME CB_IMAGE_AWS CB_INSTANCE_TYPE_AWS CB_PLACEMENT_AWS CB_IMAGE_OS CB_INSTANCE_TYPE_OS CB_PLACEMENT_OS CB_TEST_PROVIDER CB_USE_MOCK_DRIVERS
 
 # Run coverage for python27 - omit interfaces.py since it's a behaviour spec only.
 [testenv:py27]