Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)
Beispiel #6
0
    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)
Beispiel #7
0
    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)
Beispiel #8
0
    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)
Beispiel #9
0
    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)
Beispiel #10
0
    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)
Beispiel #11
0
 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)
Beispiel #12
0
 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)