Спецификации RESTful-веб-сервисов для удаленного доступа к суперкомпьютерным ресурсам с учетом особенностей задач моделирования в области нанонаук

Комплекс RESTful-веб-сервисов для удаленного доступа к суперкомпьютерным ресурсам с учетом особенностей задач моделирования в области нанонаук обеспечивает возможность удаленного запуска задач на суперкомпьютерах с использованием локальных менеджеров ресурсов кластеров.

Сервис обработки запросов пользователей (интерфейса прикладного программирования сервиса удаленного доступа к ресурсам).

Назначение данного сервиса — обработка запросов пользователей на запуск задач на суперкомпьютере. Сервис реализован как RESTful-грид-сервис, использующий протоколы HTTPS и X.509 для аутентификации запросов и систему управления виртуальными организациями VOMS для авторизации запросов. В процессе работы сервер помещает информацию о задачах пользователей в СУБД, используемую другими сервисами комплекса для дальнейшей обработки. Эта же база данных используется в качестве источника информации о состоянии задач и т.п.

Ниже приводится проект REST-интерфейса данного сервиса с описанием используемых форматов данных.

Общие положения.

Интерфейс прикладного программирования сервиса запуска задач реализован как RESTful-грид-сервис. Входные данные в запросах сервера, если это не оговорено отдельно, могут быть представлены в одном из следующих форматов: JSON, YAML. При этом используются одни и те же структуры данных, формат представления изменяет только способ сериализации данных. В данном документе все примеры и спецификации будут приводиться в формате JSON, поскольку он является ,более выразительным для восприятия человеком форматом, чем YAML: Любой объект JSON может быть представлен в виде функционально эквивалентного описания YAML, обратное в общем случае не верно.

Обязательным требованием к формату запроса серверу является обязательное и правильное указание заголовка Content-Type в запросе.

Ответы сервера, если это не оговаривается специально, могут быть представлены в одном из следующих форматов: JSON, YAML. Кроме того, ответы на многие запросы сервера, выполняемые методом GET и не содержащие тела запроса, могут быть возвращены в формате HTML. Выбор формата возвращаемого представления определяется в порядке приоритета, указанном в заголовке Accept, посылаемом клиентом, при отсутствии заголовка Accept используется формат JSON.

Соединения с сервером всегда устанавливаются по протоколу HTTPS (транспорт TLSv1), с использованием клиентских сертификатов X.509 либо прокси-сертификатов RFC3820. Прокси-сертификаты могут иметь дополнительные расширения (атрибутные сертификаты), используемые для авторизации запросов.

Все запросы, имеющие не пустое тело запроса, должны содержать заголовок Content-Length.

Аутентификация и авторизация.

При обработке запроса сервер проверяет подлинность сертификата пользователя, использованного при установлении соединения. При этом обязательно используются списки отозванных сертификатов (CRL), если они доступны для сертификационного центра, выдавшего сертификат пользователя. Помимо проверок, требуемых в рамках протоколов TLSv1 и HTTPS, проводится проверка принадлежности имени в сертификате (DN) к пространству имен, допустимому для данного CA. Пространства имен всех CA хранятся в соответствующих файлах в формате Signing Policy, используемом IGTF.

Для авторизации запросов, требующих уточнения принадлежности пользователя к виртуальной организации, проводится проверка атрибутного сертификата VOMS, содержащегося в прокси-сертификате. Полная семантика атрибутов FQAN описывается в Artifact artf6312: The VOMS Attribute Certificate Format (http://forge.gridforum.org/sf/go/artf6312). Атрибуты FQAN могут содержать информацию о членстве в группах и о ролях в группах.

/«vo name»/«subgroup»/.../«subgroup»

/«vo name»/«subgroup»/.../«subgroup»/Role=«role name»/Capability=«capability name»

В случаях, если особенной роли или особенной возможности (Capability) у пользователя нет, соответствующие значения принимают вид /Role=NULL и /Capability=NULL. Кроме того, части атрибута, имеющие такие значения можно не указывать. То есть следующие значения атрибутов являются эквивалентными:

- /testbed

- /testbed/Role=NULL

- /testbed/Capability=NULL

- /tesbted/Role=NULL/Capability=NULL`

Порядок атрибутов FQAN является значимым. Обработка атрибутов FQAN должна проводиться именно в том порядке, в котором они присутствуют в сертификате.

В цепочке делегирования прокси-сертификата VOMS-расширения могут присутствовать в любом из прокси-сертификатов цепочки. Для авторизации необходимо использовать наиболее близкие к концу цепочки voms-расширения, то есть те расширения, которые находятся в самых последних делегациях.

Получение списка задач пользователя.

Задачи каждого пользователя образуют коллекцию задач SERVER/jobs/ (здесь и далее строка SERVER используется для обозначения базового URI сервиса).

Запрос GET к коллекции возвращает список всех задач пользователя, имеющий вид:

[ { «uri»: «job_uri», «job_id»: «some_id» }, ... ]

Здесь job_uri — полный URI задачи пользователя, используемый для действий с задачами, some_id — некоторый внутренний идентификатор задачи.

Создание новой задачи.

Создание задач возможно с использованием двух протоколов создания ресурсов, упрощенного и идемпотентного.

а) Упрощенный протокол.

Для создания новых задач используется запрос POST по адресу SERVER/jobs/, содержащий объект с описанием задачи.

б) Идемпотентный протокол.

Клиент генерирует строку-идентификатор задачи job_id, используя алгоритм UUID в модификации time-based UUID (описание алгоритма см. в разделе 4.2 RFC 4122). Далее с использованием протокола HTTP/1.1 выполняется условный запрос PUT по адресу SERVER/jobs/job_id, с заголовками Expect: 100-continue и If-None-Match: *. В случае получения от сервера кода ошибки 417 клиент должен сгенерировать новый идентификатор задачи и повторить попытку запроса. В случае получения ответа с кодом 100, клиент должен продолжить передачу данных на сервер.

В случае успешного создания ресурса клиент получает ответ сервера с кодом 201 а также URI созданной задачи в заголовке Location. Также ответ сервера содержит заголовок Termination-Time, указывающий время жизни созданного ресурса-задачи. По умолчанию новые задачи имеют очень небольшое время жизни (единицы минут), которое должно быть увеличено клиентами при последующих обращениях к серверу. Создание новой задачи не приводит к ее автоматическому запуску или постановке в очередь.

Получение информации о задаче.

Для получения информации о состоянии задачи используется запрос GET к URI задачи, имеющему вид SERVER/jobs/«jobid»/, где «jobid» — идентификатор задачи.

Ответ на запрос является объектом, имеющим следующие атрибуты:

Работа с делегацией сертификата, используемой задачей.

Задача во время выполнения может использовать делегированный ей прокси-сертификат. Для работы с делегацией сертификата используется ресурс, имеющий адрес SERVER/jobs/job_id/delegation.

Делегация является JSON-объектом со следующими атрибутами (часть из них опциональны):

{ "vo": "«vo_name»",

"fqans": [ "«fqan1»", ... ],

"next_expiration": "«timestamp»"

}

vo строка, только для чтения

Виртуальная организация, к которой относится данная делегация.

fqans список строк, только для чтения

Список атрибутов FQAN из VOMS-расширений делегации.

next_expiration строка, дата/время, только для чтения

Срок окончания действия текущего экземпляра делегации.

По умолчанию задача не имеет делегации. Для создания или обновления существующей делегации задачи используется следующий протокол.

Изменение параметров задачи.

Если обработка задачи еще не была начата сервером (задача находится в состоянии new), возможно изменение описания задачи. Для этого используется запрос PUT по адресу SERVER/jobs/job_id/, содержащий новое описание задачи.

Выполнение операций с задачами.

Для выполнения операций над задачей (например, запуск задачи), используются запросы методом PUT по URI задачи, который имеет вид SERVER/jobs/«jobid»/operation.

Запрос является объектом, имеющим следующие атрибуты:

Удаление задач.

Для удаления задач используются запросы методом DELETE по адресу задачи. Удаление задачи также приводит к отмене ее выполнения и удаления всех файлов задачи с сервера.

Удаление задач также производится сервером автоматически по истечении времени жизни задачи, которое сообщается во всех ответах сервера в заголовке Termination-Time.

Изменение времени жизни задачи.

Для контроля времени жизни ресурсов и управления им предлагается использовать заголовки протокола HTTP. Для обозначения времени жизни ресурса предлагается использовать нестандартный заголовок Termination-Time, спецификация которого в расширенной форме Бэкуса-Наура [rfc5234] приводится ниже:

Termination-Time = "Termination-Time" ": " rfc1123-date

rfc1123-date = wkday ", " date " " time " GMT"

wkday = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"

date = 2*DIGIT " " month " " 4*DIGIT

month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /

"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"

time = 2*DIGIT ":" 2*DIGIT ":" 2*DIGIT

Поле date содержит дату в формате день месяц год; поле time содержит время, в диапазоне 00:00:00 --- 23:59:59.

Необходимость использования отдельного заголовка для указания времени жизни вызвана тем, что другие близкие по смыслу стандартные заголовки имеют интерпретацию, связанную с конкретным представлением ресурса, а не ресурсом в целом. Так, например, заголовок Expires имеет стандартную интерпретацию как актуальность/время жизни данного представления, и, поэтому, не может использоваться для указания времени жизни ресурса.

Заголовок Termination-Time является опциональным, и может присутствовать как в запросе, так и в ответе.

Наличие заголовка Termination-Time в запросе используется для изменения времени жизни ресурса. В случае возможности изменения времени жизни ресурса, грид-сервис должен выполнить действия, соответствующие запросу и изменить время жизни ресурса. В ответе на запрос должен присутствовать заголовок Termination-Time, содержащий новое время жизни ресурса. В случае если указанное изменение времени жизни невозможно или не поддерживается для данного ресурса, грид-сервис не должен выполнять действие, соответствующее запросу и должен вернуть ответ с кодом состояния 409 содержащий заголовок Location: urn:X-RESTful-Grid:invalid-termination-time.

Наличие заголовка Termination-Time в ответе грид-сервиса указывает, что данный ресурс может быть автоматически уничтожен сервисом в указанный момент времени, однако не гарантирует уничтожения ресурса. Отсутствие заголовка Termination-Time в ответе грид-сервиса означает, что время жизни ресурса не определено явно, и клиент не должен делать предположений о времени жизни ресурса.

Для изменения времени жизни ресурса без совершения каких-либо операций с ресурсом предлагается использовать расширенное указание Pragma: only-termination-time. Чтобы изменить время жизни ресурса не совершая операций, клиент отправляет серверу запрос методом PUT, в котором присутствует заголовок Pragma: only-termination-time и желаемое значение времени жизни ресурса в заголовке Termination-Time, но отсутствует представление ресурса. Запрос, содержащий представление ресурса и такой набор заголовков считается ошибочным, сервер должен вернуть ответ с кодом состояния 400 и заголовком Location: urn:X-RESTful-Grid:invalid-pragma-combination.Сервис запуска задач и отслеживания состояния задач (сервис интерфейса с локальным менеджером ресурсов).

Назначение данного сервиса — запуск и отслеживание состояния задач, на основе информации, содержащейся в СУБД системы запуска задач.

Данный сервис обеспечивает выполнение логики обработки задач, запускает задачи с использованием локального менеджера ресурсов и следит за ходом их выполнения. Сервис содержит следующие компоненты:

Сервис выбора ресурсов.

Назначение данного сервиса — подбор необходимых параметров запуска задачи на кластере, с учетом требований к ресурсам и предустановленному программному обеспечению задачи. Данный сервис используется сервисом запуска и отслеживания состояния задач для выбора очереди, в котору производится постановка задачи. Реализован как RESTful-веб-сервис.

Сервис трансляции представлений задач.

Назначение данного сервиса — преобразование унифицированного описания задачи, используемой клиентами RESTful-веб-сервиса для удаленного доступа к суперкомпьютерным ресурсам с учетом особенностей задач моделирования в области нанонаук в язык описания, используемый локальным менеджером ресурсов данного кластера или суперкомпьютера.

Сервис используется сервисом запуска и отслеживания состояния задач. Реализован как RESTful-веб-сервис.

Сервис доступа к учетной информации.

Общие положения.

Учетная информация о выполненных задачах предоставляется в виде отдельного RESTful-грид-сервиса. Сервис использует процедуру доступа, авторизации и аутентификации аналогичную описанной в разделе .

Записи из журналов учетной информации могут быть возвращены в форматах JSON, YAML, CSV, HTML. Формат представления, выбранный клиентом, необходимо указать в заголовке Accept.

Запросы учетной информации за заданный период времени.

Запрос производится по URI вида SERVER/accounting/«ts1»-«ts2»/, где «ts1» и «ts2» могут иметь одно из следующих значений:

Примеры URI запросов.

Аккаунтинговая информация с 00:00:00 UTC 24 ноября 2009 года по текущий момент:

SERVER/accounting/period/20091124000000-current/

Аккаунтинговая информация с 00:00:00 UTC 24 ноября 2009 года по 12:43:37 и 0.291323 секунды UTC 24 ноября 2009 года:

SERVER/accounting/period/20091124000000-20091124124337.291323/

Запрос последних N записей учетной информации.

Запрос производится по URI вида SERVER/accounting/last/N/, где N — количество возвращаемых записей. Возвращаются последние N записей учетной информации.

Назначение полей в записях учетной информации.

Ответы сервиса в любоим представлении могут содержать одно или несколько полей из перечисленных ниже для каждой из возвращенных записей. Возможные поля:

База данных задач и учетной информации.

Сервисы для своей работы используют общую базу данных, содержащую информацию о задачах, которые были обработаны сервисами, а также находятся в очереди на обработку или выполняются.

Все отношения кроме jobs находятся в третьей нормальной форме Кодда, небольшая денормализация вызвана соображениями производительности. Для обеспечения целостности данных с учетом денормализации используются хранимые процедуры, вызываемые триггерами обновления соответствующих таблиц.

Информация о задачах хранится в таблицах jobs. Таблица job_operations содержит информацию об операциях с задачами, которые выполнялись, или должны быть выполнены. Таблица job_states используется для хранения истории состояний задач. Состояния последовательно нумеруются в поле seq, текущему состоянию соответствует строка с максимальным значением seq. Кроме того, для текущего состояния задачи поле s таблицы job_state дублируется в поле current_state в таблице jobs. Это делается из соображений производительности: запросы с выборкой по текущему состоянию часто используются многими сервисами системы, такая денормализация позволяет существенно их ускорить, ликвидируя необходимость дополнительных запросов для выяснения текущего состояния. Хранимые процедуры триггеров обновления и добавления записей таблицы job_states предотвращают нарушение целостности данных, автоматически обновляя поле current_state связанной таблицы.

История состояний и операций, помимо уже описанных выше таблиц, хранится в альтернативном виде в таблице accounting_log, организованной как учетный журнал всех событий, которые происходят внутри сервиса запуска задач.

Сервис информации о текущем состоянии суперкомпьютера.

Сервис предосталяет информацию о текущем состоянии суперкомпьютера или кластера в виде JSON-ресурса. Для получения информации о состоянии кластера и его очередей необходимо послать запрос методом GET по адресу SERVER/status/

Ответ в формате JSON содержит общую информацию о кластере, информацию об очередях и их загрузке, информацию о доступном предустановленном программном обеспечении и правах доступа к нему.

Внутренний интерфейс обновления информации о текущем состоянии

Данный интерфейс предназначен для программ локального менеджера ресурсов суперкомпьютера и предоставляет возможность обновления информации о состоянии кластера или суперкомпьютера со стороны локального менеджера ресурсов.

Для обновления информации необходимо отправить запрос методом POST по адресу http://localhost:44000/, содержащий обновленные значения полей. Например:

$ curl -H 'Content-Type: application/json' --data-binary '{"workq":

> {"TotalJobs": 3, "RunningJobs": 2, "WaitingJobs": 1}

> }' http://localhost:44080

Аттрибутами передаваемого объекта являются названия очередей (“workq” в примере). Разрешается передовать любые свойства ComputingShare (стр. 26-29 спецификации GLUE 2.0), например, TotalJobs, RunningJobs, MaxCPUTime, и так далее.