Appending new tasks/blocks to an existing job

It is possible to add new tasks or blocks to a job that has already been sent to the farm. One can do it in several manners.

JSON API

The JSON API for actions features the two following operations:

append_tasks which takes a tasks list following the very same spec as when submitting new jobs, e.g.:

{
 "action":
 {
  "user_name"  : "elie",
  "host_name"  : "my_pc",
  "type"       : "jobs",
  "ids"        : [3],
  "block_ids"  : [0],
  "operation"  :
  {
   "type"      : "append_tasks",
   "tasks"     :[
    {
        "name"    : "Extra Process A",
        "command" : "python -c \"print('Process EXTRA task A')\""
    },
    {
        "name"    : "Extra Process B",
        "command" : "python -c \"print('Process EXTRA task B')\""
    }
    ]
  }
 }
}

append_blocks which takes a blocks list also following jobs submission spec, e.g.:

{
 "action":
 {
  "user_name"  : "elie",
  "host_name"  : "my_pc",
  "type"       : "jobs",
  "ids"        : [3],
  "operation"  :
  {
   "type"      : "append_blocks",
   "blocks"    :[
    {
      "name"              : "New numeric block",
      "tasks_name"        : "frames @#@-@#@",
      "service"           : "generic",
      "parser"            : "generic",
      "flags"             : 1,
      "frame_first"       : 1,
      "frame_last"        : 100,
      "frames_per_task"   : 10,
      "frames_inc"        : 2,
      "command"           : "python -c \"print('Process frames @#@-@#@')\"",
      "working_directory" : "E:\\tmp"
    },
    {
      "name"              : "New non numeric block",
      "tasks_name"        : "frames @#@-@#@",
      "service"           : "generic",
      "parser"            : "generic",
      "working_directory" : "E:\\tmp",
      "tasks"             : [
      {
        "command" : "python -c \"print('Process task A')\""
      },
      {
        "command" : "python -c \"print('Process task B')\""
      }
      ]
    }
    ]
  }
 }
}

Python af module

Two command methods are available in the Cmd object in af.py.

appendBlocks(jobId, blocks)

Example:

import af

block = af.Block('generic', 'generic')
block.setCommand("python -c \"print('Process frames @#@-@#@')\"")
block.setNumeric(1, 100, 10)

cmd = af.Cmd()
print(cmd.appendBlocks(3, [block]))

appendTasks(jobId, blockId, tasks)

Example:

import af

task = af.Task('test')
task.setCommand("python -c \"print('Process task A')\"")

cmd = af.Cmd()
print(cmd.appendTasks(3, 0, [task]))

Python afcmd module

Job.appendBlocks(blocks)

Example:

import afcmd

block = af.Block('generic', 'generic')
block.setCommand("python -c \"print('Process frames @#@-@#@')\"")
block.setNumeric(1, 100, 10)

job = afcmd.getJob(3)
print(job.appendBlocks([block]))

blockCopy = job.blocks[0]
print(job.appendBlocks([blockCopy]))

Block.appendTasks(tasks)

Example:

import afcmd

task = af.Task('test')
task.setCommand("python -c \"print('Process task A')\"")

job = afcmd.getJob(3)
block = job.blocks[0]
print(block.appendTasks([tasks]))

Known limitations

Numeric block

It does not makes sense to append tasks to numeric blocks, only non-numeric block can have tasks appended.

afwatch

When appending new blocks to a job that is opened in afwatch, one must reopen the job window to see the update.