Bläddra i källkod

Improves validation

Alessandro Pilotti 9 år sedan
förälder
incheckning
fc88776b29

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

@@ -3,6 +3,8 @@
 
 from webob import exc
 
+from oslo_log import log as logging
+
 from coriolis.api import wsgi as api_wsgi
 from coriolis.api.v1.views import migration_view
 from coriolis import constants
@@ -10,6 +12,8 @@ from coriolis import exception
 from coriolis.migrations import api
 from coriolis.providers import factory
 
+LOG = logging.getLogger(__name__)
+
 
 class MigrationController(api_wsgi.Controller):
     def __init__(self):
@@ -35,33 +39,35 @@ class MigrationController(api_wsgi.Controller):
                 req.environ['coriolis.context'], include_tasks=True))
 
     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):
         # TODO: validate body
-
-        migration_body = body["migration"]
+        migration_body = body.get("migration", {})
         context = req.environ['coriolis.context']
 
         replica_id = migration_body.get("replica_id")

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

@@ -3,6 +3,8 @@
 
 from webob import exc
 
+from oslo_log import log as logging
+
 from coriolis.api import wsgi as api_wsgi
 from coriolis.api.v1.views import replica_view
 from coriolis import constants
@@ -10,6 +12,8 @@ from coriolis import exception
 from coriolis.replicas import api
 from coriolis.providers import factory
 
+LOG = logging.getLogger(__name__)
+
 
 class ReplicaController(api_wsgi.Controller):
     def __init__(self):
@@ -37,30 +41,33 @@ class ReplicaController(api_wsgi.Controller):
                 include_tasks_executions=True))
 
     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):
         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. """
         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
         # se if a secret href is provided here, we simply return on the spot:
         if "secret_ref" in connection_info:
-            return True
+            return
 
         try:
             # NOTE: attempt to register to a provider to ensure credentials
@@ -184,12 +182,8 @@ class ImportProvider(BaseImportProvider):
         except (KeyError, azure_exceptions.CloudError,
                 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):
         """ 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
         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):

+ 3 - 3
coriolis/schemas.py

@@ -5,10 +5,10 @@
 
 import json
 
-import logging
 import jinja2
 import jsonschema
 
+from oslo_log import log as logging
 
 LOG = logging.getLogger(__name__)
 
@@ -44,14 +44,14 @@ def validate_value(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
     given JSON schema.
 
     Runs silently on success or raises an exception otherwise.
     Silently passes empty schemas.
     """
-    jsonschema.validate(json.loads(string), schema)
+    validate_value(json.loads(json_string), schema)
 
 
 # Global schemas: