Преглед изворни кода

Add `BaseProviderSetupExtraLibsMixin` base provider class.

The `BaseProviderSetupExtraLibsMixin` and the
`get_shared_library_directories` abstract method may be implemented by
provider plugins which require additional shared libraries to be
available in the worker process spawned to execute a task.
Nashwan Azhari пре 7 година
родитељ
комит
9c88c68ace
3 измењених фајлова са 22 додато и 4 уклоњено
  1. 1 0
      coriolis/constants.py
  2. 12 0
      coriolis/providers/base.py
  3. 9 4
      coriolis/providers/factory.py

+ 1 - 0
coriolis/constants.py

@@ -56,6 +56,7 @@ PROVIDER_TYPE_OS_MORPHING = 64
 PROVIDER_TYPE_ENDPOINT_NETWORKS = 128
 PROVIDER_TYPE_INSTANCE_FLAVOR = 256
 PROVIDER_TYPE_ENDPOINT_OPTIONS = 512
+PROVIDER_TYPE_SETUP_LIBS = 1024
 
 DISK_FORMAT_VMDK = 'vmdk'
 DISK_FORMAT_RAW = 'raw'

+ 12 - 0
coriolis/providers/base.py

@@ -54,6 +54,18 @@ class BaseEndpointNetworksProvider(object, with_metaclass(abc.ABCMeta)):
         raise NotImplementedError()
 
 
+class BaseProviderSetupExtraLibsMixin(object, with_metaclass(abc.ABCMeta)):
+    """ ABC mixin for providers which require extra libraries loaded. """
+
+    @abc.abstractmethod
+    def get_shared_library_directories(self, ctxt, connection_info):
+        """ Should return a list of string paths to directories somewhere in
+        the worker filesystem where extra libraries required for the provider
+        are located.
+        """
+        return []
+
+
 class BaseEndpointDestinationOptionsProvider(
         object, with_metaclass(abc.ABCMeta)):
     @abc.abstractmethod

+ 9 - 4
coriolis/providers/factory.py

@@ -31,6 +31,7 @@ PROVIDER_TYPE_MAP = {
         base.BaseEndpointNetworksProvider,
     constants.PROVIDER_TYPE_OS_MORPHING: base.BaseImportInstanceProvider,
     constants.PROVIDER_TYPE_INSTANCE_FLAVOR: base.BaseInstanceFlavorProvider,
+    constants.PROVIDER_TYPE_SETUP_LIBS: base.BaseProviderSetupExtraLibsMixin
 }
 
 
@@ -51,13 +52,17 @@ def get_available_providers():
     return providers
 
 
-def get_provider(platform_name, provider_type, event_handler):
+def get_provider(
+        platform_name, provider_type, event_handler, raise_if_not_found=True):
     for provider in CONF.providers:
         cls = utils.load_class(provider)
         if (cls.platform == platform_name and
                 issubclass(cls, PROVIDER_TYPE_MAP[provider_type])):
             return cls(event_handler)
 
-    raise exception.NotFound(
-        "Provider not found for: %(platform_name)s, %(provider_type)s" %
-        {"platform_name": platform_name, "provider_type": provider_type})
+    if raise_if_not_found:
+        raise exception.NotFound(
+            "Provider not found for: %(platform_name)s, %(provider_type)s" %
+            {"platform_name": platform_name, "provider_type": provider_type})
+
+    return None