Parcourir la source

Save index of task in DB.

Nashwan Azhari il y a 6 ans
Parent
commit
92eddb1a04

+ 4 - 12
coriolis/api/v1/views/replica_tasks_execution_view.py

@@ -42,18 +42,10 @@ def _sort_tasks(tasks):
                         constants.TASK_STATUS_ON_ERROR_ONLY and
                         t not in non_error_only_tasks]
 
-    sorted_tasks = []
-    try:
-        sorted_tasks = utils.topological_graph_sorting(
-            non_error_only_tasks, sort_key="task_type")
-        sorted_tasks += utils.topological_graph_sorting(
-            error_only_tasks, sort_key="task_type")
-    except ValueError:
-        LOG.warn(
-            "Failed to sort tasks. Returning them in random order. "
-            "Exception was: %s" % utils.get_exception_details())
-        sorted_tasks = non_error_only_tasks
-        sorted_tasks += error_only_tasks
+    sorted_tasks = sorted(
+        non_error_only_tasks, key=lambda t: t.get('index', 0))
+    sorted_tasks.extend(sorted(
+        error_only_tasks, key=lambda t: t.get('index', 0)))
 
     return sorted_tasks
 

+ 1 - 0
coriolis/conductor/rpc/server.py

@@ -272,6 +272,7 @@ class ConductorServerEndpoint(object):
         task.task_type = task_type
         task.depends_on = depends_on
         task.on_error = on_error
+        task.index = len(task.execution.tasks) + 1
 
         if not on_error:
             task.status = constants.TASK_STATUS_PENDING

+ 14 - 0
coriolis/db/sqlalchemy/migrate_repo/versions/013_adds_task_index.py

@@ -0,0 +1,14 @@
+import sqlalchemy
+from sqlalchemy import types
+
+
+def upgrade(migrate_engine):
+    meta = sqlalchemy.MetaData()
+    meta.bind = migrate_engine
+
+    task = sqlalchemy.Table('task', meta, autoload=True)
+
+    index = sqlalchemy.Column(
+        "index", sqlalchemy.Integer, default=0, nullable=False)
+
+    task.create_column(index)

+ 1 - 0
coriolis/db/sqlalchemy/models.py

@@ -59,6 +59,7 @@ class Task(BASE, models.TimestampMixin, models.SoftDeleteMixin,
     task_type = sqlalchemy.Column(sqlalchemy.String(100), nullable=False)
     exception_details = sqlalchemy.Column(sqlalchemy.Text, nullable=True)
     depends_on = sqlalchemy.Column(types.List, nullable=True)
+    index = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
     on_error = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False)
     # TODO(alexpilotti): Add soft delete filter
     events = orm.relationship(TaskEvent, cascade="all,delete",

+ 1 - 1
coriolis/providers/factory.py

@@ -77,7 +77,7 @@ def get_provider(
         parent = PROVIDER_TYPE_MAP.get(provider_type)
         if not parent:
             continue
-        if (cls.platform == platform_name and issubclass(cls, base)):
+        if (cls.platform == platform_name and issubclass(cls, parent)):
             return cls(event_handler)
 
     if raise_if_not_found: