Browse Source

Add 'scenario' fields to /replicas API paths.

Signed-off-by: Nashwan Azhari <nazhari@cloudbasesolutions.com>
Nashwan Azhari 2 years ago
parent
commit
3d5e6ea4cd
1 changed files with 30 additions and 5 deletions
  1. 30 5
      coriolis/api/v1/replicas.py

+ 30 - 5
coriolis/api/v1/replicas.py

@@ -5,8 +5,9 @@ from coriolis.api.v1 import utils as api_utils
 from coriolis.api.v1.views import replica_tasks_execution_view
 from coriolis.api.v1.views import replica_view
 from coriolis.api import wsgi as api_wsgi
-from coriolis.endpoints import api as endpoints_api
+from coriolis import constants
 from coriolis import exception
+from coriolis.endpoints import api as endpoints_api
 from coriolis.policies import replicas as replica_policies
 from coriolis.replicas import api
 
@@ -25,6 +26,10 @@ CONF.register_opts(REPLICA_API_OPTS, 'api')
 
 LOG = logging.getLogger(__name__)
 
+SUPPORTED_REPLICA_SCENARIOS = [
+    constants.REPLICA_SCENARIO_REPLICA,
+    constants.REPLICA_SCENARIO_LIVE_MIGRATION]
+
 
 class ReplicaController(api_wsgi.Controller):
     def __init__(self):
@@ -66,6 +71,19 @@ class ReplicaController(api_wsgi.Controller):
     def _validate_create_body(self, context, body):
         replica = body["replica"]
 
+        scenario = replica.get("scenario", "")
+        if scenario:
+            if scenario not in SUPPORTED_REPLICA_SCENARIOS:
+                raise exc.HTTPBadRequest(
+                    explanation=f"Unsupported Replica creation scenario "
+                                f"'{scenario}', must be one of: "
+                                f"{SUPPORTED_REPLICA_SCENARIOS}")
+        else:
+            scenario = constants.REPLICA_SCENARIO_REPLICA
+            LOG.warn(
+                "No Replica 'scenario' field set in Replica body, "
+                f"defaulting to: '{scenario}'")
+
         origin_endpoint_id = replica["origin_endpoint_id"]
         destination_endpoint_id = replica["destination_endpoint_id"]
         destination_environment = replica.get(
@@ -118,7 +136,7 @@ class ReplicaController(api_wsgi.Controller):
 
         destination_environment['storage_mappings'] = storage_mappings
 
-        return (origin_endpoint_id, destination_endpoint_id,
+        return (scenario, origin_endpoint_id, destination_endpoint_id,
                 source_environment, destination_environment, instances,
                 network_map, storage_mappings, notes,
                 origin_minion_pool_id, destination_minion_pool_id,
@@ -128,7 +146,7 @@ class ReplicaController(api_wsgi.Controller):
         context = req.environ["coriolis.context"]
         context.can(replica_policies.get_replicas_policy_label("create"))
 
-        (origin_endpoint_id, destination_endpoint_id,
+        (scenario, origin_endpoint_id, destination_endpoint_id,
          source_environment, destination_environment, instances, network_map,
          storage_mappings, notes, origin_minion_pool_id,
          destination_minion_pool_id,
@@ -136,7 +154,7 @@ class ReplicaController(api_wsgi.Controller):
             self._validate_create_body(context, body))
 
         return replica_view.single(self._replica_api.create(
-            context, origin_endpoint_id, destination_endpoint_id,
+            context, scenario, origin_endpoint_id, destination_endpoint_id,
             origin_minion_pool_id, destination_minion_pool_id,
             instance_osmorphing_minion_pool_mappings, source_environment,
             destination_environment, instances, network_map,
@@ -288,8 +306,15 @@ class ReplicaController(api_wsgi.Controller):
 
     @api_utils.format_keyerror_message(resource='replica', method='update')
     def _validate_update_body(self, id, context, body):
-
         replica = self._replica_api.get_replica(context, id)
+
+        scenario = body.get("scenario", "")
+        if scenario and scenario != replica["scenario"]:
+            raise exc.HTTPBadRequest(
+                explanation=f"Changing Replica creation scenario is not "
+                            f"supported (original scenario is "
+                            f"{replica['scenario']}, received '{scenario}')")
+
         replica_body = body['replica']
         origin_endpoint_id = replica_body.get('origin_endpoint_id', None)
         destination_endpoint_id = replica_body.get(