[gnome-ostree] task: Split out the task metadata from the task state and code



commit 2da85b1cb3bb4b47e9479d541ee1f2a4674c2918
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Thu Jun 13 17:42:28 2013 -0400

    task: Split out the task metadata from the task state and code
    
    Some tasks have metadata that's interpreter by the runner, like
    the task's name, how many failed attempts it should retain, etc.
    Split this out into a separate object known as a "TaskDef". The
    old "TaskDef" which contains state and the code will be renamed
    to a "Task", and will contain a "TaskDef" object on its prototype.

 src/js/task.js                       |  122 ++++++++++++++++-----------------
 src/js/tasks/task-bdiff.js           |    8 ++-
 src/js/tasks/task-build.js           |    8 ++-
 src/js/tasks/task-builddisks.js      |    8 ++-
 src/js/tasks/task-dummy-delayed.js   |   10 ++-
 src/js/tasks/task-dummy-resolve.js   |    6 +-
 src/js/tasks/task-integrationtest.js |    6 +-
 src/js/tasks/task-resolve.js         |    6 +-
 src/js/tasks/task-smoketest.js       |    6 +-
 src/js/tasks/task-zdisks.js          |    8 ++-
 src/js/tasks/testbase.js             |    8 ++-
 11 files changed, 106 insertions(+), 90 deletions(-)
---
diff --git a/src/js/task.js b/src/js/task.js
index dba622c..dbaa199 100644
--- a/src/js/task.js
+++ b/src/js/task.js
@@ -28,6 +28,16 @@ const JsonDB = imports.jsondb;
 const ProcUtil = imports.procutil;
 const BuildUtil = imports.buildutil;
 
+const DefaultTaskDef = {
+    TaskName: '',
+    TaskAfter: [],
+    TaskScheduleMinSecs: 0,
+
+    PreserveStdout: true,
+    RetainFailed: 5,
+    RetainSuccess: 5,
+};
+
 var _tasksetInstance = null;
 const TaskSet = new Lang.Class({
     Name: 'TaskSet',
@@ -52,8 +62,8 @@ const TaskSet = new Lang.Class({
        denum.close(null);
     },
 
-    register: function(taskdef) {
-       this._tasks.push(taskdef);
+    register: function(task) {
+       this._tasks.push(task);
     },
 
     getAllTasks: function() {
@@ -62,28 +72,18 @@ const TaskSet = new Lang.Class({
 
     getTask: function(taskName) {
        for (let i = 0; i < this._tasks.length; i++) {
-           let taskDef = this._tasks[i];
-            let curName = taskDef.prototype.TaskName;
+           let taskConstructor = this._tasks[i];
+           let taskDef = taskConstructor.prototype.TaskDef;
+           let curName = taskDef.TaskName;
            if (curName == taskName)
-               return taskDef;
+               return taskConstructor;
        }
        throw new Error("No task definition matches " + taskName);
     },
 
-    getTasksAfter: function(taskName) {
-       let ret = [];
-       for (let i = 0; i < this._tasks.length; i++) {
-           let taskDef = this._tasks[i];
-           let after = taskDef.prototype.TaskAfter;
-           for (let j = 0; j < after.length; j++) {
-               let a = after[j];
-               if (a == taskName) {
-                   ret.push(taskDef);
-                   break;
-               }
-           }
-       }
-       return ret;
+    getTaskDef: function(taskName) {
+       let taskDef = this.getTask(taskName).prototype.TaskDef;
+       return Params.parse(taskDef, DefaultTaskDef);
     },
 
     getInstance: function() {
@@ -92,6 +92,16 @@ const TaskSet = new Lang.Class({
        return _tasksetInstance;
     }
 });
+
+const TaskData = new Lang.Class({
+    Name: 'TaskData',
+
+    _init: function(taskDef, parameters) {
+       this.name = taskDef.TaskName;
+       this.taskDef = taskDef;
+       this.parameters = parameters;
+    },
+});
     
 const TaskMaster = new Lang.Class({
     Name: 'TaskMaster',
@@ -117,20 +127,20 @@ const TaskMaster = new Lang.Class({
 
        this._taskset = TaskSet.prototype.getInstance();
 
-       // string -> [ lastExecutedSecs, [timeoutId, parameters]]
+       // string -> [ lastExecutedSecs, taskData ]
        this._scheduledTaskTimeouts = {};
     },
 
-    _pushTaskDefImmediate: function(taskDef, parameters) {
-       let instance = new taskDef(parameters);
-       this._pendingTasksList.push(instance);
+    _pushTaskDataImmediate: function(taskData) {
+       this._pendingTasksList.push(taskData);
        this._queueRecalculate();
     },
 
-    _pushTaskDef: function(taskDef, parameters) {
-       let name = taskDef.prototype.TaskName;
+    pushTask: function(name, parameters) {
+       let taskDef = this._taskset.getTaskDef(name);
+        let taskData = new TaskData(taskDef, parameters);
        if (!this._isTaskPending(name)) {
-           let scheduleMinSecs = taskDef.prototype.TaskScheduleMinSecs;
+           let scheduleMinSecs = taskDef.TaskScheduleMinSecs;
            if (scheduleMinSecs > 0) {
                let info = this._scheduledTaskTimeouts[name];
                if (!info) {
@@ -146,37 +156,31 @@ const TaskMaster = new Lang.Class({
                    print("Already scheduled task " + name + " remaining=" + delta);
                } else if (lastExecutedSecs == 0) {
                    print("Scheduled task " + name + " executing immediately");
-                   this._pushTaskDefImmediate(taskDef, parameters);
+                   this._pushTaskDataImmediate(taskData);
                    info[0] = currentTime;
                 } else {
                     let delta = (lastExecutedSecs + scheduleMinSecs) - currentTime;
                    print("Scheduled task " + name + " delta=" + delta);
                    let timeoutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT,
                                                             Math.max(delta, 0),
-                                                            Lang.bind(this, this._executeScheduledTask, 
taskDef));
+                                                            Lang.bind(this, this._executeScheduledTask, 
name));
                    info[0] = currentTime;
-                   info[1] = [ timeoutId, parameters ];
+                   info[1] = taskData;
                }
            } else {
-               this._pushTaskDefImmediate(taskDef, parameters);
+               this._pushTaskDataImmediate(taskData);
            }
        }
     },
     
-    _executeScheduledTask: function(taskDef) {
-       let name = taskDef.prototype.TaskName;
+    _executeScheduledTask: function(name) {
        print("Executing scheduled task " + name);
        let currentTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
        let info = this._scheduledTaskTimeouts[name];
+        let taskData = info[1];
        info[0] = currentTime;
-       let params = info[1][1];
        info[1] = null;
-       this._pushTaskDefImmediate(taskDef, params);
-    },
-
-    pushTask: function(taskName, parameters) {
-       let taskDef = this._taskset.getTask(taskName);
-       this._pushTaskDef(taskDef, parameters);
+       this._pushTaskDataImmediate(taskData);
     },
 
     _isTaskPending: function(taskName) {
@@ -195,7 +199,7 @@ const TaskMaster = new Lang.Class({
     isTaskExecuting: function(taskName) {
        for (let i = 0; i < this._executing.length; i++) {
            let executingRunner = this._executing[i];
-           if (executingRunner.taskDef.name == taskName)
+           if (executingRunner.taskData.name == taskName)
                return true;
        }
        return false;
@@ -254,17 +258,16 @@ const TaskMaster = new Lang.Class({
            break;
        }
        if (idx == -1)
-           throw new Error("TaskMaster: Internal error - Failed to find completed task:" + 
runner.taskDef.name);
+           throw new Error("TaskMaster: Internal error - Failed to find completed task:" + 
runner.taskData.name);
        this._executing.splice(idx, 1);
        this.emit('task-complete', runner, success, error);
        if (success && this._processAfter) {
            if (runner.changed) {
-               let tasksAfter = this._taskset.getTasksAfter(task.name);
-               for (let i = 0; i < tasksAfter.length; i++) {
-                   let after = tasksAfter[i];
-                   let name = after.prototype.TaskName;
-                   if (!this._skipTasks[name])
-                       this._pushTaskDef(tasksAfter[i], {});
+               let taskDef = runner.taskData.taskDef;
+               for (let i = 0; i < taskDef.TasksAfter.length; i++) {
+                   let taskName = taskDef.TasksAfter[i];
+                   if (!this._skipTasks[taskName])
+                       this.pushTaskDef(taskName, {});
                }
            }
        }
@@ -287,15 +290,8 @@ const TaskMaster = new Lang.Class({
 });
 Signals.addSignalMethods(TaskMaster.prototype);
 
-const TaskDef = new Lang.Class({
-    Name: 'TaskDef',
-
-    TaskAfter: [],
-    TaskScheduleMinSecs: 0,
-
-    PreserveStdout: true,
-    RetainFailed: 5,
-    RetainSuccess: 5,
+const Task = new Lang.Class({
+    Name: 'Task',
 
     DefaultParameters: {},
 
@@ -332,11 +328,11 @@ const TaskRunner = new Lang.Class({
 
     _VERSION_RE: /^(\d+\d\d\d\d)\.(\d+)$/,
 
-    _init: function(taskmaster, taskDef, onComplete) {
+    _init: function(taskmaster, taskData, onComplete) {
        this.taskmaster = taskmaster;
-       this.taskDef = taskDef;
+       this.taskData = taskData;
        this.onComplete = onComplete;
-        this.name = taskDef.name;
+        this.name = taskData.name;
 
        this.workdir = taskmaster.path.get_parent();
        BuildUtil.checkIsWorkDirectory(this.workdir);
@@ -428,13 +424,13 @@ const TaskRunner = new Lang.Class({
        GSystem.shutil_rm_rf(this._taskCwd, cancellable);
        GSystem.file_ensure_directory(this._taskCwd, true, cancellable);
 
-       let baseArgv = ['ostbuild', 'run-task', this.name, JSON.stringify(this.taskDef.parameters)];
+       let baseArgv = ['ostbuild', 'run-task', this.name, JSON.stringify(this.taskData.parameters)];
        let context = new GSystem.SubprocessContext({ argv: baseArgv });
        context.set_cwd(this._taskCwd.get_path());
        let childEnv = GLib.get_environ();
        childEnv.push('_OSTBUILD_WORKDIR=' + this.workdir.get_path());
        context.set_environment(childEnv);
-       if (this.taskDef.PreserveStdout) {
+       if (this.taskData.taskDef.PreserveStdout) {
            let outPath = this._taskCwd.get_child('output.txt');
            context.set_stdout_file_path(outPath.get_path());
            context.set_stderr_disposition(GSystem.SubprocessStreamDisposition.STDERR_MERGE);
@@ -479,13 +475,13 @@ const TaskRunner = new Lang.Class({
            target = this._failedDir.get_child(this._version);
            GSystem.file_rename(this._taskCwd, target, null);
            this._taskCwd = target;
-           this._cleanOldVersions(this._failedDir, this.taskDef.RetainFailed, null);
+           this._cleanOldVersions(this._failedDir, this.taskData.taskDef.RetainFailed, null);
            this.onComplete(success, errmsg);
        } else {
            target = this._successDir.get_child(this._version);
            GSystem.file_rename(this._taskCwd, target, null);
            this._taskCwd = target;
-           this._cleanOldVersions(this._successDir, this.taskDef.RetainSuccess, null);
+           this._cleanOldVersions(this._successDir, this.taskData.taskDef.RetainSuccess, null);
            this.onComplete(success, null);
        }
 
diff --git a/src/js/tasks/task-bdiff.js b/src/js/tasks/task-bdiff.js
index adba8d6..4b25dc0 100644
--- a/src/js/tasks/task-bdiff.js
+++ b/src/js/tasks/task-bdiff.js
@@ -35,10 +35,12 @@ const ArgParse = imports.argparse;
 
 const TaskBdiff = new Lang.Class({
     Name: "TaskBdiff",
-    Extends: Task.TaskDef,
+    Extends: Task.Task,
 
-    TaskName: "bdiff",
-    TaskAfter: ['build'],
+    TaskDef: {
+        TaskName: "bdiff",
+        TaskAfter: ['build'],
+    },
 
     _gitLogToJson: function(repoDir, specification) {
        let log = ProcUtil.runSyncGetOutputLines(['git', 'log', '--format=email', specification],
diff --git a/src/js/tasks/task-build.js b/src/js/tasks/task-build.js
index de1583c..34e8d6c 100644
--- a/src/js/tasks/task-build.js
+++ b/src/js/tasks/task-build.js
@@ -46,10 +46,12 @@ const DOC_DIRS = ['usr/share/doc', 'usr/share/gtk-doc',
 
 const TaskBuild = new Lang.Class({
     Name: "TaskBuild",
-    Extends: Task.TaskDef,
+    Extends: Task.Task,
 
-    TaskName: "build",
-    TaskAfter: ['resolve'],
+    TaskDef: {
+        TaskName: "build",
+        TaskAfter: ['resolve'],
+    },
 
     DefaultParameters: {forceComponents: []},
 
diff --git a/src/js/tasks/task-builddisks.js b/src/js/tasks/task-builddisks.js
index 9de03a9..6a0ba40 100644
--- a/src/js/tasks/task-builddisks.js
+++ b/src/js/tasks/task-builddisks.js
@@ -38,10 +38,12 @@ const IMAGE_RETAIN_COUNT = 2;
 
 const TaskBuildDisks = new Lang.Class({
     Name: 'TaskBuildDisks',
-    Extends: Task.TaskDef,
+    Extends: Task.Task,
 
-    TaskName: "builddisks",
-    TaskAfter: ['build'],
+    TaskDef: {
+        TaskName: "builddisks",
+        TaskAfter: ['build'],
+    },
 
     // Legacy
     _VERSION_RE: /^(\d+)\.(\d+)$/,
diff --git a/src/js/tasks/task-dummy-delayed.js b/src/js/tasks/task-dummy-delayed.js
index 81c5eb2..df07d74 100644
--- a/src/js/tasks/task-dummy-delayed.js
+++ b/src/js/tasks/task-dummy-delayed.js
@@ -34,11 +34,13 @@ const ArgParse = imports.argparse;
 
 const TaskDummyDelayed = new Lang.Class({
     Name: "TaskDummyDelayed",
-    Extends: Task.TaskDef,
+    Extends: Task.Task,
 
-    TaskName: "dummy-delayed",
-    TaskAfter: ['dummy-resolve'], 
-    TaskScheduleMinSecs: 5,
+    TaskDef: {
+        TaskName: "dummy-delayed",
+        TaskAfter: ['dummy-resolve'],
+        TaskScheduleMinSecs: 5,
+    },
 
     execute: function(cancellable) {
        print("delayed firing!");
diff --git a/src/js/tasks/task-dummy-resolve.js b/src/js/tasks/task-dummy-resolve.js
index 73b96e6..b4a9034 100644
--- a/src/js/tasks/task-dummy-resolve.js
+++ b/src/js/tasks/task-dummy-resolve.js
@@ -34,9 +34,11 @@ const ArgParse = imports.argparse;
 
 const TaskDummyResolve = new Lang.Class({
     Name: "TaskDummyResolve",
-    Extends: Task.TaskDef,
+    Extends: Task.Task,
 
-    TaskName: "dummy-resolve",
+    TaskDef: {
+        TaskName: "dummy-resolve",
+    },
 
     DefaultParameters: {change: false},
 
diff --git a/src/js/tasks/task-integrationtest.js b/src/js/tasks/task-integrationtest.js
index a6531d5..06b6495 100644
--- a/src/js/tasks/task-integrationtest.js
+++ b/src/js/tasks/task-integrationtest.js
@@ -36,8 +36,10 @@ const TaskIntegrationTest = new Lang.Class({
     Name: 'TaskIntegrationTest',
     Extends: TestBase.TestBase,
 
-    TaskName: "integrationtest",
-    TaskAfter: ['smoketest'],
+    TaskDef: {
+        TaskName: "integrationtest",
+        TaskAfter: ['smoketest'],
+    },
 
     RequiredMessageIDs: ["4d013788dd704743b826436c951e551d" // Tests succeeded
                         ],
diff --git a/src/js/tasks/task-resolve.js b/src/js/tasks/task-resolve.js
index 7541b60..f6ae101 100644
--- a/src/js/tasks/task-resolve.js
+++ b/src/js/tasks/task-resolve.js
@@ -34,9 +34,11 @@ const ArgParse = imports.argparse;
 
 const TaskResolve = new Lang.Class({
     Name: "TaskResolve",
-    Extends: Task.TaskDef,
+    Extends: Task.Task,
 
-    TaskName: "resolve",
+    TaskDef: {
+        TaskName: "resolve",
+    },
 
     DefaultParameters: {fetchAll: false,
                        fetchComponents: [],
diff --git a/src/js/tasks/task-smoketest.js b/src/js/tasks/task-smoketest.js
index edc22cf..a75c73f 100644
--- a/src/js/tasks/task-smoketest.js
+++ b/src/js/tasks/task-smoketest.js
@@ -36,8 +36,10 @@ const TaskSmoketest = new Lang.Class({
     Name: 'TaskSmoketest',
     Extends: TestBase.TestBase,
 
-    TaskName: "smoketest",
-    TaskAfter: ['builddisks'],
+    TaskDef: {
+        TaskName: "smoketest",
+        TaskAfter: ['builddisks'],
+    },
 
     RequiredMessageIDs: ["0ce153587afa4095832d233c17a88001" // gnome-session startup ok
                         ],
diff --git a/src/js/tasks/task-zdisks.js b/src/js/tasks/task-zdisks.js
index f81ae23..d9a45e1 100644
--- a/src/js/tasks/task-zdisks.js
+++ b/src/js/tasks/task-zdisks.js
@@ -40,9 +40,11 @@ const TaskZDisks = new Lang.Class({
     Name: 'TaskZDisks',
     Extends: BuildDisks.TaskBuildDisks,
 
-    TaskName: "zdisks",
-    TaskAfter: ['smoketest'],
-    TaskScheduleMinSecs: 3*60*60,  // Only do this every 3 hours
+    TaskDef: {
+        TaskName: "zdisks",
+        TaskAfter: ['smoketest'],
+        TaskScheduleMinSecs: 3*60*60,  // Only do this every 3 hours
+    },
 
     // Legacy
     _VERSION_RE: /^(\d+)\.(\d+)$/,
diff --git a/src/js/tasks/testbase.js b/src/js/tasks/testbase.js
index 03abd39..dd27d4d 100644
--- a/src/js/tasks/testbase.js
+++ b/src/js/tasks/testbase.js
@@ -331,10 +331,12 @@ const TestOneDisk = new Lang.Class({
 
 const TestBase = new Lang.Class({
     Name: 'TestBase',
-    Extends: Task.TaskDef,
+    Extends: Task.Task,
 
-    TaskName: "testbase",
-    TaskAfter: ['builddisks'],
+    TaskDef: {
+        TaskName: "testbase",
+        TaskAfter: ['builddisks'],
+    },
 
     BaseRequiredMessageIDs: ["39f53479d3a045ac8e11786248231fbf", // graphical.target 
                              "f77379a8490b408bbe5f6940505a777b",  // systemd-journald


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]