API

Afanasy can communicate via JSON protocol. And only JSON protocol. Any GUI, CLI or Python script (API) constructs JSON objects to send to server.

Python API

You can create jobs within Python, that exists in most common CG software. Afanasy Python module helps you to construct a valid JSON job object for server. Also it sends json data to server.

Example

# Import afanasy python module (must be in PYTHONPATH)
import af

# Create a job
job = af.Job('somejob')

# Set job depend mask
job.setDependMask('another_job_name')

# Set maximum tasks that can be executed simultaneously
job.setMaxRunningTasks(15)

# Set job hosts mask
job.setHostsMask('render.*')

# Start job paused
job.offLine()

# Create a block with provided name and service type
block = af.Block('back', 'nuke')

# Set block tasks command
block.setCommand('nuke -i -X WriteBack -x scene.nk.tmp.nk @#@,@#@')

# Set block tasks preview command arguments
block.setFiles(['jpg/img.@####@.jpg'])

# Set block to numeric type, providing first, last frame and frames per host
block.setNumeric(1, 100, 10)

# Add block to the job
job.blocks.append(block)

# Set command to execute by server after a job is deleted.
job.setCmdPost('rm /projects/test/nuke/scene.nk.tmp.nk')

# Send job to Afanasy server
job.send()

Job Class

  • Constructor:

    • job = af.Job(job_name = None)

      Takes job name as a parameter (optional).

  • Variables:

    • job.blocks = []

      Blocks list.

  • Some Functions:

    • job.offline()

      Set job to Offline state.

    • job.output(output_blocks = True)

      Print job information. If True print job blocks information too.

    • job.send()

      Send job to Afanasy server.

Block Class

  • Constructor:

    • block = af.Block(block_name, service_name)

      Construct a new block and return it.

  • Variables:

    • block.tasks = []

      Tasks list. Used for not numeric blocks.

Task Object

  • Constructor:

    • task = af.Task(task_name)

      Construct a new task and return it.

JSON Protocol

You can use afcmd CLI to send JSON objects (files) to Afanasy server:

  • afcmd json [file|pipe]: Test JSON syntax, output an error and position.
  • afcmd v json [file|pipe]: Same as previous and output parsed JSON document structure.
  • afcmd json send [file]: Send JSON data after successfully parsed.

Job

Here is an example of a minimum JSON object to send to server to construct a job:

{
    "job":
    {
        "name"                  : "job name",
        "user_name"             : "jimmy",
        "host_name"             : "host",
        "blocks":[
        {
            "name"              : "Nuke",
            "tasks_name"        : "frames @#@-@#@",
            "service"           : "nuke",
            "parser"            : "nuke",
            "frame_first"       : 1,
            "frame_last"        : 100,
            "frames_per_task"   : 10,
            "frames_inc"        : 2,
            "command"           : "nuke -F@#@,@#@ -x scene.nk -X Write1",
            "working_directory" : "/home/jimmy/work",
            "files"             : ["folder/img_L.@####@.jpg","folder/img_R.@####@.jpg"]
        }
        ]
    }
}

Get

Get request are used to get information from server.

Here are some examples:

  • Get a list with all jobs:

    {
        "get":
        {
            "type" : "jobs"
        }
    }
    
  • Get jobs list from users with specified ids:

    {
        "get":
        {
            "type" : "jobs",
            "uids" : [1,2]
        }
    }
    
  • Get renders by host names pattern:

    {
        "get":
        {
            "type" : "renders",
            "mask" : "farmhost.*"
        }
    }
    
  • Get users list with special ids:

    {
        "get":
        {
            "type" : "users",
            "ids"  : [1,2]
        }
    }
    

Actions

Actions are used to edit parameters and perform operations.

Any action should have host_name and user_name fields for logs.

Here are some examples:

  • Set render nimby

    {
        "action":
        {
            "user_name"  : "jimmy",
            "host_name"  : "pc01",
            "mask"       : "pc02",
            "type"       : "renders",
            "params"     :
            {
                "nimby"     : true
            }
        }
    }
    
  • Set user priority

    {
        "action":
        {
            "user_name"  : "jimmy",
            "host_name"  : "pc01",
            "mask"       : "bob",
            "type"       : "users",
            "params"     :
            {
                "priority"  : "50"
            }
        }
    }
    
  • Exit render

    {
        "action":
        {
            "user_name"  : "jimmy",
            "host_name"  : "pc01",
            "mask"       : "pc02",
            "type"       : "renders",
            "operation"  :
            {
                "type"      : "exit"
            }
        }
    }
    
  • Delete job

    {
        "action":
        {
            "user_name"  : "jimmy",
            "host_name"  : "pc01",
            "mask"       : "my3drender",
            "type"       : "jobs",
            "operation"  :
            {
                "type"      : "delete"
            }
        }
    }