فهرست منبع

Improves validation

Alessandro Pilotti 9 سال پیش
والد
کامیت
fc88776b29
5فایلهای تغییر یافته به همراه69 افزوده شده و 68 حذف شده
  1. 30 24
      coriolis/api/v1/migrations.py
  2. 31 24
      coriolis/api/v1/replicas.py
  3. 4 10
      coriolis/providers/azure/__init__.py
  4. 1 7
      coriolis/providers/base.py
  5. 3 3
      coriolis/schemas.py

+ 30 - 24
coriolis/api/v1/migrations.py

@@ -3,6 +3,8 @@
 
 
 from webob import exc
 from webob import exc
 
 
+from oslo_log import log as logging
+
 from coriolis.api import wsgi as api_wsgi
 from coriolis.api import wsgi as api_wsgi
 from coriolis.api.v1.views import migration_view
 from coriolis.api.v1.views import migration_view
 from coriolis import constants
 from coriolis import constants
@@ -10,6 +12,8 @@ from coriolis import exception
 from coriolis.migrations import api
 from coriolis.migrations import api
 from coriolis.providers import factory
 from coriolis.providers import factory
 
 
+LOG = logging.getLogger(__name__)
+
 
 
 class MigrationController(api_wsgi.Controller):
 class MigrationController(api_wsgi.Controller):
     def __init__(self):
     def __init__(self):
@@ -35,33 +39,35 @@ class MigrationController(api_wsgi.Controller):
                 req.environ['coriolis.context'], include_tasks=True))
                 req.environ['coriolis.context'], include_tasks=True))
 
 
     def _validate_migration_input(self, migration):
     def _validate_migration_input(self, migration):
-        origin = migration["origin"]
-        destination = migration["destination"]
-
-        export_provider = factory.get_provider(
-            origin["type"], constants.PROVIDER_TYPE_EXPORT, None)
-        if not export_provider.validate_connection_info(
-                origin.get("connection_info", {})):
-            # TODO: use a decent exception
-            raise exception.CoriolisException("Invalid connection info")
-
-        import_provider = factory.get_provider(
-            destination["type"], constants.PROVIDER_TYPE_IMPORT, None)
-        if not import_provider.validate_connection_info(
-                destination.get("connection_info", {})):
-            # TODO: use a decent exception
-            raise exception.CoriolisException("Invalid connection info")
-
-        if not import_provider.validate_target_environment(
-                destination.get("target_environment", {})):
-            raise exception.CoriolisException("Invalid target environment")
-
-        return origin, destination, migration["instances"]
+        try:
+            origin = migration["origin"]
+            destination = migration["destination"]
+
+            export_provider = factory.get_provider(
+                origin["type"], constants.PROVIDER_TYPE_EXPORT, None)
+            export_provider.validate_connection_info(
+                origin.get("connection_info", {}))
+
+            import_provider = factory.get_provider(
+                destination["type"], constants.PROVIDER_TYPE_IMPORT, None)
+            import_provider.validate_connection_info(
+                destination.get("connection_info", {}))
+
+            import_provider.validate_target_environment(
+                destination.get("target_environment", {}))
+
+            return origin, destination, migration["instances"]
+        except Exception as ex:
+            LOG.exception(ex)
+            if hasattr(ex, "message"):
+                msg = ex.message
+            else:
+                msg = str(ex)
+            raise exception.InvalidInput(msg)
 
 
     def create(self, req, body):
     def create(self, req, body):
         # TODO: validate body
         # TODO: validate body
-
-        migration_body = body["migration"]
+        migration_body = body.get("migration", {})
         context = req.environ['coriolis.context']
         context = req.environ['coriolis.context']
 
 
         replica_id = migration_body.get("replica_id")
         replica_id = migration_body.get("replica_id")

+ 31 - 24
coriolis/api/v1/replicas.py

@@ -3,6 +3,8 @@
 
 
 from webob import exc
 from webob import exc
 
 
+from oslo_log import log as logging
+
 from coriolis.api import wsgi as api_wsgi
 from coriolis.api import wsgi as api_wsgi
 from coriolis.api.v1.views import replica_view
 from coriolis.api.v1.views import replica_view
 from coriolis import constants
 from coriolis import constants
@@ -10,6 +12,8 @@ from coriolis import exception
 from coriolis.replicas import api
 from coriolis.replicas import api
 from coriolis.providers import factory
 from coriolis.providers import factory
 
 
+LOG = logging.getLogger(__name__)
+
 
 
 class ReplicaController(api_wsgi.Controller):
 class ReplicaController(api_wsgi.Controller):
     def __init__(self):
     def __init__(self):
@@ -37,30 +41,33 @@ class ReplicaController(api_wsgi.Controller):
                 include_tasks_executions=True))
                 include_tasks_executions=True))
 
 
     def _validate_create_body(self, body):
     def _validate_create_body(self, body):
-        replica = body["replica"]
-
-        origin = replica["origin"]
-        destination = replica["destination"]
-
-        export_provider = factory.get_provider(
-            origin["type"], constants.PROVIDER_TYPE_EXPORT, None)
-        if not export_provider.validate_connection_info(
-                origin.get("connection_info", {})):
-            # TODO: use a decent exception
-            raise exception.CoriolisException("Invalid connection info")
-
-        import_provider = factory.get_provider(
-            destination["type"], constants.PROVIDER_TYPE_IMPORT, None)
-        if not import_provider.validate_connection_info(
-                destination.get("connection_info", {})):
-            # TODO: use a decent exception
-            raise exception.CoriolisException("Invalid connection info")
-
-        if not import_provider.validate_target_environment(
-                destination.get("target_environment", {})):
-            raise exception.CoriolisException("Invalid target environment")
-
-        return origin, destination, replica["instances"]
+        try:
+            replica = body["replica"]
+
+            origin = replica["origin"]
+            destination = replica["destination"]
+
+            export_provider = factory.get_provider(
+                origin["type"], constants.PROVIDER_TYPE_EXPORT, None)
+            export_provider.validate_connection_info(
+                origin.get("connection_info", {}))
+
+            import_provider = factory.get_provider(
+                destination["type"], constants.PROVIDER_TYPE_IMPORT, None)
+            import_provider.validate_connection_info(
+                destination.get("connection_info", {}))
+
+            import_provider.validate_target_environment(
+                destination.get("target_environment", {}))
+
+            return origin, destination, replica["instances"]
+        except Exception as ex:
+            LOG.exception(ex)
+            if hasattr(ex, "message"):
+                msg = ex.message
+            else:
+                msg = str(ex)
+            raise exception.InvalidInput(msg)
 
 
     def create(self, req, body):
     def create(self, req, body):
         origin, destination, instances = self._validate_create_body(body)
         origin, destination, instances = self._validate_create_body(body)

+ 4 - 10
coriolis/providers/azure/__init__.py

@@ -166,14 +166,12 @@ class ImportProvider(BaseImportProvider):
         """ Validates the provided connection information. """
         """ Validates the provided connection information. """
         LOG.info("Validating connection info: %s", connection_info)
         LOG.info("Validating connection info: %s", connection_info)
 
 
-        if not super(ImportProvider, self).validate_connection_info(
-                connection_info):
-            return False
+        super(ImportProvider, self).validate_connection_info(connection_info)
 
 
         # NOTE: considering we cannot check the validity of the credentials per
         # NOTE: considering we cannot check the validity of the credentials per
         # se if a secret href is provided here, we simply return on the spot:
         # se if a secret href is provided here, we simply return on the spot:
         if "secret_ref" in connection_info:
         if "secret_ref" in connection_info:
-            return True
+            return
 
 
         try:
         try:
             # NOTE: attempt to register to a provider to ensure credentials
             # NOTE: attempt to register to a provider to ensure credentials
@@ -184,12 +182,8 @@ class ImportProvider(BaseImportProvider):
         except (KeyError, azure_exceptions.CloudError,
         except (KeyError, azure_exceptions.CloudError,
                 azexceptions.AzureOperationException) as ex:
                 azexceptions.AzureOperationException) as ex:
 
 
-            LOG.info(
-                "Invalid or incomplete Azure credentials provided: %s\n%s",
-                connection_info, ex)
-            return False
-        else:
-            return True
+            raise exception.InvalidInput(
+                "Invalid or incomplete Azure credentials provided")
 
 
     def _get_cloud_credentials(self, connection_info):
     def _get_cloud_credentials(self, connection_info):
         """ returns the msrestazure.azure_active_directory.Credentials
         """ returns the msrestazure.azure_active_directory.Credentials

+ 1 - 7
coriolis/providers/base.py

@@ -22,13 +22,7 @@ class BaseProvider(object):
         """ Checks the provided connection info and raises an exception
         """ Checks the provided connection info and raises an exception
         if it is invalid.
         if it is invalid.
         """
         """
-        try:
-            schemas.validate_value(
-                connection_info, self.connection_info_schema)
-        except:
-            return False
-
-        return True
+        schemas.validate_value(connection_info, self.connection_info_schema)
 
 
 
 
 class BaseImportProvider(BaseProvider):
 class BaseImportProvider(BaseProvider):

+ 3 - 3
coriolis/schemas.py

@@ -5,10 +5,10 @@
 
 
 import json
 import json
 
 
-import logging
 import jinja2
 import jinja2
 import jsonschema
 import jsonschema
 
 
+from oslo_log import log as logging
 
 
 LOG = logging.getLogger(__name__)
 LOG = logging.getLogger(__name__)
 
 
@@ -44,14 +44,14 @@ def validate_value(val, schema):
     jsonschema.validate(val, schema)
     jsonschema.validate(val, schema)
 
 
 
 
-def validate_string(string, schema):
+def validate_string(json_string, schema):
     """ Attempts to validate the json value provided as a string against the
     """ Attempts to validate the json value provided as a string against the
     given JSON schema.
     given JSON schema.
 
 
     Runs silently on success or raises an exception otherwise.
     Runs silently on success or raises an exception otherwise.
     Silently passes empty schemas.
     Silently passes empty schemas.
     """
     """
-    jsonschema.validate(json.loads(string), schema)
+    validate_value(json.loads(json_string), schema)
 
 
 
 
 # Global schemas:
 # Global schemas: