def set_task_error(self, ctxt, task_id, exception_details): LOG.error("Task error: %(task_id)s - %(ex)s", { "task_id": task_id, "ex": exception_details }) db_api.set_task_status(ctxt, task_id, constants.TASK_STATUS_ERROR, exception_details) task = db_api.get_task(ctxt, task_id) execution = db_api.get_tasks_execution(ctxt, task.execution_id) with lockutils.lock(execution.action_id): self._cancel_tasks_execution(ctxt, execution)
def task_completed(self, ctxt, task_id, task_info): LOG.info("Task completed: %s", task_id) db_api.set_task_status(ctxt, task_id, constants.TASK_STATUS_COMPLETED) task = db_api.get_task(ctxt, task_id, include_migration_tasks=True) migration = task.migration has_pending_tasks = self._start_pending_tasks(ctxt, migration, task, task_info) if not has_pending_tasks: LOG.info("Migration completed: %s", migration.id) db_api.set_migration_status(ctxt, migration.id, constants.MIGRATION_STATUS_COMPLETED)
def task_completed(self, ctxt, task_id, task_info): LOG.info("Task completed: %s", task_id) db_api.set_task_status(ctxt, task_id, constants.TASK_STATUS_COMPLETED) task = db_api.get_task(ctxt, task_id) execution = db_api.get_tasks_execution(ctxt, task.execution_id) action_id = execution.action_id with lockutils.lock(action_id): LOG.info( "Setting instance %(instance)s " "action info: %(task_info)s", { "instance": task.instance, "task_info": task_info }) updated_task_info = db_api.set_transfer_action_info( ctxt, action_id, task.instance, task_info) self._handle_post_task_actions(ctxt, task, execution, updated_task_info) if execution.status == constants.EXECUTION_STATUS_RUNNING: self._start_pending_tasks(ctxt, execution, task, updated_task_info) if not [ t for t in execution.tasks if t.status in [ constants.TASK_STATUS_RUNNING, constants.TASK_STATUS_PENDING ] ]: # The execution is in error status if there's one or more # tasks in error or canceled status if [ t for t in execution.tasks if t.status in [ constants.TASK_STATUS_ERROR, constants.TASK_STATUS_CANCELED ] ]: execution_status = constants.EXECUTION_STATUS_ERROR else: execution_status = constants.EXECUTION_STATUS_COMPLETED self._set_tasks_execution_status(ctxt, execution.id, execution_status)
def _cancel_tasks_execution(self, ctxt, execution, force=False): has_running_tasks = False for task in execution.tasks: if task.status == constants.TASK_STATUS_RUNNING: self._rpc_worker_client.cancel_task(ctxt, task.host, task.id, task.process_id, force) has_running_tasks = True elif (task.status == constants.TASK_STATUS_PENDING and not task.on_error): db_api.set_task_status(ctxt, task.id, constants.TASK_STATUS_CANCELED) if not has_running_tasks: try: origin = self._get_task_origin(ctxt, execution.action) destination = self._get_task_destination( ctxt, execution.action) for task in execution.tasks: if task.status in [ constants.TASK_STATUS_PENDING, constants.TASK_STATUS_ON_ERROR_ONLY ]: if task.on_error: action = db_api.get_action(ctxt, execution.action_id) task_info = action.info.get(task.instance, {}) self._rpc_worker_client.begin_task( ctxt, server=None, task_id=task.id, task_type=task.task_type, origin=origin, destination=destination, instance=task.instance, task_info=task_info) has_running_tasks = True except exception.NotFound as ex: LOG.error("A required endpoint could not be found") LOG.exception(ex) if not has_running_tasks: self._set_tasks_execution_status(ctxt, execution.id, constants.EXECUTION_STATUS_ERROR)
def cancel_migration(self, ctxt, migration_id): migration = self._get_migration(ctxt, migration_id) if migration.status != constants.MIGRATION_STATUS_RUNNING: raise exception.InvalidMigrationState( "The migration is not running") for task in migration.tasks: if task.status in [constants.TASK_STATUS_PENDING, constants.TASK_STATUS_RUNNING]: if task.status == constants.TASK_STATUS_RUNNING: self._rpc_worker_client.cancel_task( ctxt, task.host, task.process_id) db_api.set_task_status( ctxt, task.id, constants.TASK_STATUS_CANCELED) db_api.set_migration_status( ctxt, migration_id, constants.MIGRATION_STATUS_ERROR)
def task_completed(self, ctxt, task_id, task_info): LOG.info("Task completed: %s", task_id) db_api.set_task_status( ctxt, task_id, constants.TASK_STATUS_COMPLETED) task = db_api.get_task( ctxt, task_id, include_migration_tasks=True) migration = task.migration has_pending_tasks = self._start_pending_tasks(ctxt, migration, task, task_info) if not has_pending_tasks: LOG.info("Migration completed: %s", migration.id) db_api.set_migration_status( ctxt, migration.id, constants.MIGRATION_STATUS_COMPLETED)
def set_task_error(self, ctxt, task_id, exception_details): LOG.error("Task error: %(task_id)s - %(ex)s", {"task_id": task_id, "ex": exception_details}) db_api.set_task_status( ctxt, task_id, constants.TASK_STATUS_ERROR, exception_details) task = db_api.get_task( ctxt, task_id, include_migration_tasks=True) migration = task.migration for task in migration.tasks: if task.status == constants.TASK_STATUS_PENDING: db_api.set_task_status( ctxt, task.id, constants.TASK_STATUS_CANCELED) LOG.error("Migration failed: %s", migration.id) db_api.set_migration_status( ctxt, migration.id, constants.MIGRATION_STATUS_ERROR)
def cancel_migration(self, ctxt, migration_id): migration = self._get_migration(ctxt, migration_id) if migration.status != constants.MIGRATION_STATUS_RUNNING: raise exception.InvalidParameterValue( "The migration is not running: %s" % migration_id) has_running_tasks = False for task in migration.tasks: if task.status == constants.TASK_STATUS_RUNNING: self._rpc_worker_client.cancel_task( ctxt, task.host, task.process_id) has_running_tasks = True elif task.status == constants.TASK_STATUS_PENDING: db_api.set_task_status( ctxt, task.id, constants.TASK_STATUS_CANCELED) if not has_running_tasks: db_api.set_migration_status( ctxt, migration_id, constants.MIGRATION_STATUS_ERROR)
def cancel_migration(self, ctxt, migration_id): migration = self._get_migration(ctxt, migration_id) if migration.status != constants.MIGRATION_STATUS_RUNNING: raise exception.InvalidMigrationState( "The migration is not running") for task in migration.tasks: if task.status in [ constants.TASK_STATUS_PENDING, constants.TASK_STATUS_RUNNING ]: if task.status == constants.TASK_STATUS_RUNNING: self._rpc_worker_client.cancel_task( ctxt, task.host, task.process_id) db_api.set_task_status(ctxt, task.id, constants.TASK_STATUS_CANCELED) db_api.set_migration_status(ctxt, migration_id, constants.MIGRATION_STATUS_ERROR)
def set_task_error(self, ctxt, task_id, exception_details): LOG.error("Task error: %(task_id)s - %(ex)s", { "task_id": task_id, "ex": exception_details }) db_api.set_task_status(ctxt, task_id, constants.TASK_STATUS_ERROR, exception_details) task = db_api.get_task(ctxt, task_id, include_migration_tasks=True) migration = task.migration for task in migration.tasks: if task.status == constants.TASK_STATUS_PENDING: db_api.set_task_status(ctxt, task.id, constants.TASK_STATUS_CANCELED) LOG.error("Migration failed: %s", migration.id) db_api.set_migration_status(ctxt, migration.id, constants.MIGRATION_STATUS_ERROR)
def set_task_host(self, ctxt, task_id, host, process_id): db_api.set_task_host(ctxt, task_id, host, process_id) db_api.set_task_status(ctxt, task_id, constants.TASK_STATUS_RUNNING)
def set_task_host(self, ctxt, task_id, host, process_id): db_api.set_task_host(ctxt, task_id, host, process_id) db_api.set_task_status( ctxt, task_id, constants.TASK_STATUS_RUNNING)