|
|
@@ -102,6 +102,7 @@ def parent_tasks_execution_synchronized(func):
|
|
|
@functools.wraps(func)
|
|
|
def wrapper(self, ctxt, task_id, *args, **kwargs):
|
|
|
task = db_api.get_task(ctxt, task_id)
|
|
|
+
|
|
|
@lockutils.synchronized(
|
|
|
constants.EXECUTION_LOCK_NAME_FORMAT % task.execution_id,
|
|
|
external=True)
|
|
|
@@ -696,7 +697,7 @@ class ConductorServerEndpoint(object):
|
|
|
p for p in task_cls.get_required_task_info_properties()
|
|
|
if p not in instance_task_info_keys]
|
|
|
if missing_params:
|
|
|
- raise exception.CoriolisException(
|
|
|
+ raise exception.TaskParametersException(
|
|
|
"The following task parameters for instance '%s' "
|
|
|
"are missing from the task_info for task '%s' of "
|
|
|
"type '%s': %s" % (
|
|
|
@@ -727,7 +728,7 @@ class ConductorServerEndpoint(object):
|
|
|
if dep_id not in tasks_to_process and (
|
|
|
dep_id not in processed_tasks)]
|
|
|
if missing_deps:
|
|
|
- raise exception.CoriolisException(
|
|
|
+ raise exception.TaskDependencyException(
|
|
|
"Task '%s' (type '%s') for instance '%s' "
|
|
|
"has non-existent tasks referenced as "
|
|
|
"dependencies: %s" % (
|
|
|
@@ -738,9 +739,9 @@ class ConductorServerEndpoint(object):
|
|
|
for dep_id in task.depends_on]):
|
|
|
queued_tasks.append(task)
|
|
|
else:
|
|
|
- raise exception.CoriolisException(
|
|
|
+ raise exception.InvalidTaskState(
|
|
|
"Invalid initial state '%s' for task '%s' "
|
|
|
- "of type '%s'."% (
|
|
|
+ "of type '%s'." % (
|
|
|
task.status, task.id, task.task_type))
|
|
|
|
|
|
# check if nothing was left queued:
|
|
|
@@ -751,7 +752,7 @@ class ConductorServerEndpoint(object):
|
|
|
processed_tasks_type_map = {
|
|
|
tid: t.task_type
|
|
|
for tid, t in processed_tasks.items()}
|
|
|
- raise exception.CoriolisException(
|
|
|
+ raise exception.ExecutionDeadlockException(
|
|
|
"Execution '%s' (type '%s') is bound to be deadlocked:"
|
|
|
" there are leftover tasks for instance '%s' which "
|
|
|
"will never get queued. Already processed tasks are: "
|
|
|
@@ -779,7 +780,7 @@ class ConductorServerEndpoint(object):
|
|
|
modified_fields_by_queued_tasks.items())
|
|
|
if len(tasks) > 1}
|
|
|
if conflicting_fields:
|
|
|
- raise exception.CoriolisException(
|
|
|
+ raise exception.TaskFieldsConflict(
|
|
|
"There are fields which will encounter a state "
|
|
|
"conflict following the parallelized execution of "
|
|
|
"tasks for execution '%s' (type '%s') for instance "
|
|
|
@@ -839,17 +840,17 @@ class ConductorServerEndpoint(object):
|
|
|
if instance not in replica.info:
|
|
|
replica.info[instance] = {'volumes_info': []}
|
|
|
elif replica.info[instance].get('volumes_info') is None:
|
|
|
- replica.info[instance]['volumes_info'] = []
|
|
|
+ replica.info[instance]['volumes_info'] = []
|
|
|
# NOTE: we update all of the param values before triggering an
|
|
|
# execution to ensure that the latest parameters are used:
|
|
|
replica.info[instance].update({
|
|
|
"source_environment": replica.source_environment,
|
|
|
"target_environment": dest_env})
|
|
|
- # TODO(aznashwan): have these passed separately to the relevant
|
|
|
- # provider methods (they're currently passed directly inside
|
|
|
- # dest-env by the API service when accepting the call)
|
|
|
- # "network_map": network_map,
|
|
|
- # "storage_mappings": storage_mappings,
|
|
|
+ # TODO(aznashwan): have these passed separately to the relevant
|
|
|
+ # provider methods (they're currently passed directly inside
|
|
|
+ # dest-env by the API service when accepting the call)
|
|
|
+ # "network_map": network_map,
|
|
|
+ # "storage_mappings": storage_mappings,
|
|
|
|
|
|
validate_replica_source_inputs_task = self._create_task(
|
|
|
instance,
|
|
|
@@ -1339,11 +1340,11 @@ class ConductorServerEndpoint(object):
|
|
|
migration.info[instance].update({
|
|
|
"source_environment": migration.source_environment,
|
|
|
"target_environment": dest_env})
|
|
|
- # TODO(aznashwan): have these passed separately to the relevant
|
|
|
- # provider methods (they're currently passed directly inside
|
|
|
- # dest-env by the API service when accepting the call)
|
|
|
- # "network_map": network_map,
|
|
|
- # "storage_mappings": storage_mappings,
|
|
|
+ # TODO(aznashwan): have these passed separately to the relevant
|
|
|
+ # provider methods (they're currently passed directly inside
|
|
|
+ # dest-env by the API service when accepting the call)
|
|
|
+ # "network_map": network_map,
|
|
|
+ # "storage_mappings": storage_mappings,
|
|
|
|
|
|
validate_replica_deployment_inputs_task = self._create_task(
|
|
|
instance,
|
|
|
@@ -1755,11 +1756,11 @@ class ConductorServerEndpoint(object):
|
|
|
# NOTE: we must explicitly set this in each VM's info
|
|
|
# to prevent the Replica disks from being cloned:
|
|
|
"clone_disks": False}
|
|
|
- # TODO(aznashwan): have these passed separately to the relevant
|
|
|
- # provider methods (they're currently passed directly inside
|
|
|
- # dest-env by the API service when accepting the call)
|
|
|
- # "network_map": network_map,
|
|
|
- # "storage_mappings": storage_mappings,
|
|
|
+ # TODO(aznashwan): have these passed separately to the relevant
|
|
|
+ # provider methods (they're currently passed directly inside
|
|
|
+ # dest-env by the API service when accepting the call)
|
|
|
+ # "network_map": network_map,
|
|
|
+ # "storage_mappings": storage_mappings,
|
|
|
|
|
|
get_instance_info_task = self._create_task(
|
|
|
instance,
|
|
|
@@ -2694,7 +2695,7 @@ class ConductorServerEndpoint(object):
|
|
|
if all([
|
|
|
dep_stat == constants.TASK_STATUS_COMPLETED
|
|
|
for dep_stat in (
|
|
|
- parent_task_statuses.values())]):
|
|
|
+ parent_task_statuses.values())]):
|
|
|
LOG.info(
|
|
|
"Starting task '%s' as all dependencies have "
|
|
|
"completed successfully: %s",
|
|
|
@@ -2735,7 +2736,7 @@ class ConductorServerEndpoint(object):
|
|
|
"no non-error parents to directly depend on, "
|
|
|
"but one or more on-error tasks have completed"
|
|
|
" successfully: %s",
|
|
|
- task.id, parent_task_statuses)
|
|
|
+ task.id, parent_task_statuses)
|
|
|
task_statuses[task.id] = _start_task(task)
|
|
|
# start on-error tasks only if at least one non-error
|
|
|
# parent task has completed successfully:
|
|
|
@@ -3433,7 +3434,7 @@ class ConductorServerEndpoint(object):
|
|
|
ctxt, replica_id, schedule_id, expired=expired)
|
|
|
if not schedule:
|
|
|
raise exception.NotFound(
|
|
|
- "Schedule with ID '%s' for Replica '%s' not found." % (
|
|
|
+ "Schedule with ID '%s' for Replica '%s' not found." % (
|
|
|
schedule_id, replica_id))
|
|
|
return schedule
|
|
|
|