Сервис выполнения многошаговых заданий реализован в виде 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/" } ]