Сервис выполнения многошаговых заданий реализован в виде RESTful грид-сервиса, поэтому взаимодействие с другими компонентами грид-сети происходит в режиме “запрос-ответ”. Далее следует описание запросов к серверу pilot-httpd. Все запросы, отправляемые на сервер, имеющие не пустое тело, должны содержать заголовок Content-MD5. Все ответы сервера, имеющие не пустое тело, всегда содержат заголовок Content-MD5. Все URL запросов из описания ниже используют префикс pilot/ для обозначения адреса реального сервера pilot-httpd. Формальное описание дается на языке JSON Schema.
Для создания новых заданий используется запрос POST к pilot/jobs/, запрос является объектом, имеющим следующие атрибуты:
Ответ на запрос соответствует ответу на запрос списка заданий. Возможные коды HTTP ответа: 201, 400, 401, 412.
{ "description": "Запрос на создание задания", "type": "object", "properties": { "definition": { "type": "string", "description": "описание задания на языке описания заданий", "format": "application/octet-stream" } }, "additionalProperties": false }
Пример запроса:
{ "definition": "# Example job\n#\nJOB A A.jt\nJOB B B.jt\nJOB C C.jt\nPARENT A CHILD B\nPARENT B CHILD C\n" }
Для получения информации о состоянии задания используется запрос GET к pilot/jobs/<jobid>/, где <jobid> — идентификатор задания.
Ответ на запрос является объектом, имеющим следующие атрибуты:
Объект состояния может так же иметь другие атрибуты, не определенные в данном списке.
Текущее состояние задания соответствует элементу с наиболее свежей датой/временем. Порядок, в котором объекты присутствуют в списке, может быть произвольным.
Объект операция может так же иметь другие атрибуты, не определенные в данном списке.
Операции обрабатываются системой в хронологическом порядке. Порядок, в котором объекты присутствуют в списке, может быть произвольным.
Возможные коды HTTP ответа: 201, 400, 401, 412.
Формальное описание (JSON Schema):
{ "description": "Задание", "type": "object", "properties": { "created": { "type": "string", "format": "date-time" }, "modified": { "type": "string", "format": "date-time", "optional": true }, "expires": { "type": "string", "format": "date-time", "description": "Дата, когда данная задача будет удалена с сервера." }, "server_time": { "type": "string", "format": "date-time", "description": "Текущие дата и время на сервере" }, "server_policy_uri": { "type": "string", "format": "uri", "description": "URI ресурса с описанием политики работы сервера" }, "owner": { "type": "string", "description": "DN пользователя, создавшего задание", "maxLength": 256 }, "state": { "type": "array", "description": "Состояние задания, со всей историей его изменений", "items": { "type": "object", "description": "Запись о состоянии задания.", "properties": { "s": { "type": "string", "description": "состояние", "enum": [ "new", "pending", "running", "paused", "finished", "aborted"] }, "ts": { "type": "string", "format": "date-time", "description": "время, когда наступило данное состояние" } }, "additionalProperties": true } }, "operation": { "type": "array", "description": "операции, которые должны быть выполнены с данным заданием", "items": { "type": "object", "description": "Операция с заданием", "properties": { "op": { "type": "string", "description": "операция", "enum": [ "start", "pause", "abort" ] }, "id": { "type": "string", "description": "id операции", "maxLength": 36 }, "created": { "type": "string", "format": "date-time", "description": "время, когда была запрошена данная операция" }, "completed": { "type": "string", "format": "date-time", "description": "время, когда была вполнена данная операция", "optional": true, "requires": "success" }, "success": { "type": "boolean", "description": "было ли выполнение операции успешным", "optional": true, "requires": "completed" }, "result": { "type": "object", "description": "результат завершения операции", "optional": true, "requires": "completed" } }, "additionalProperties": true } }, "definition": { "type": "string", "description": "описание задания на языке описания заданий", "format": "application/octet-stream" }, "tasks": { "type": "array", "description": "список URI задач задания", "items": { "type": "string", "format": "uri" } } }, "additionalProperties": false
Пример ответа с информацией о задании:
{ "created": "2009-07-03T10:27:00Z", "modified": "2009-07-03T10:27:14Z", "expires": "2009-07-04T10:28:30Z", "server_time": "2009-07-03T10:28:30Z", "server_policy_uri": "https://pilot.grid-net.ru/policy/job/", "definition": { "version": 2, "description": "тестовое задание", "default_storage_base": "gsiftp://tb01.grid-net.ru/home/shamardin/jt/", "tasks": [ { "id": "a", "description": "задача #1", "definition": { "version": 2, "executable": "/usr/bin/whoami", "stdout": "test.txt" } } ] } "state": [ { "s": "new", "ts": "2009-07-03T10:27:00Z" }, { "s": "pending", "ts": "2009-07-03T10:27:14Z" }, { "s": "running", "ts": "2009-07-03T10:27:22Z" } ], "owner": "/C=RU/O=NanoGrid/OU=users/OU=sinp.msu.ru/CN=Lev Shamardin", "operation": [ { "op": "start", "id": "c9deca6c-3208-4146-848b-2b65b0943127", "created": "2009-07-03T10:27:03Z", "completed": "2009-07-03T10:27:14Z", "success": true } ], "tasks": { "a": "https://pilot.grid-net.ru/jobs/912832/a/" } }
Для изменения задания, а так же для выполнения операций над заданием (например, запуск задания), используются запросы методом PUT по URI задания, который обычно имеет вид pilot/jobs/<jobid>/.
Запрос является объектом, имеющим следующие атрибуты:
Возможные коды HTTP ответа: 204, 401, 404.
Формальное описание JSON Schema:
{ "description": "Запрос на модификацию параметров задания", "type": "object", "properties": { "operation": { "type": "object", "description": "Операция с заданием", "properties": { "op": { "type": "string", "description": "операция", "enum": [ "start", "pause", "abort" ] }, "id": { "type": "string", "description": "id операции", "maxLength": 36 } }, "additionalProperties": true, "optional": true }, "definition": { "type": "string", "description": "описание задания на языке описания заданий", "format": "application/octet-stream", "optional": true } } }
Пример запроса на запуск задания:
{ "operation": { "op": "start", "id": "c9deca6c-3208-4146-848b-2b65b0943127" } }
Для получения списка заданий пользователя (в любом состоянии) используется запрос методом GET к pilot/jobs/. Ответом сервера является список объектов, каждый из которых имеет следующие атрибуты:
Возможные коды HTTP ответа: 200, 401.
Формальное описание JSON Schema:
{ "description": "Список заданий, к которым есть доступ у пользователя", "type": "array", "items": { "type": "object", "properties": { "uri": { "type": "string", "description": "URI задания", "format": "uri" } }, "additionalProperties": false } }
Пример ответа на запрос получения списка заданий:
[ { "uri": "https://pilot.grid-net.ru/jobs/199231/" }, { "uri": "https://pilot.grid-net.ru/jobs/912832/" } ]