<html> <?xml version=“1.0” encoding=“UTF-8”?> <!DOCTYPE html

PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd">

<html xmlns=“http://www.w3.org/1999/xhtml”><!–This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.–><head profile=“http://dublincore.org/documents/dcmi-terms/”><meta http-equiv=“Content-Type” content=“application/xhtml+xml; charset=utf-8”/><title xml:lang=“en-US”>- no title specified</title><meta name=“DCTERMS.title” content=“” xml:lang=“en-US”/><meta name=“DCTERMS.language” content=“en-US” scheme=“DCTERMS.RFC4646”/><meta name=“DCTERMS.source” content=“http://xml.openoffice.org/odf2xhtml”/><meta name=“DCTERMS.creator” content=“Andrey Demichev”/><meta name=“DCTERMS.issued” content=“2011-12-09T12:59:41” scheme=“DCTERMS.W3CDTF”/><meta name=“DCTERMS.contributor” content=“Andrey Demichev”/><meta name=“DCTERMS.modified” content=“2011-12-09T13:02:49” scheme=“DCTERMS.W3CDTF”/><meta name=“DCTERMS.provenance” content=“” xml:lang=“en-US”/><meta name=“DCTERMS.subject” content=“,” xml:lang=“en-US”/><link rel=“schema.DC” href=“http://purl.org/dc/elements/1.1/” hreflang=“en”/><link rel=“schema.DCTERMS” href=“http://purl.org/dc/terms/” hreflang=“en”/><link rel=“schema.DCTYPE” href=“http://purl.org/dc/dcmitype/” hreflang=“en”/><link rel=“schema.DCAM” href=“http://purl.org/dc/dcam/” hreflang=“en”/><base href=“.”/><style type=“text/css”>

@page {  }
table { border-collapse:collapse; border-spacing:0; empty-cells:show }
td, th { vertical-align:top; font-size:12pt;}
h1, h2, h3, h4, h5, h6 { clear:both }
ol, ul { margin:0; padding:0;}
li { list-style: none; margin:0; padding:0;}
<!-- "li span.odfLiEnd" - IE 7 issue-->
li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
span.footnodeNumber { padding-right:1em; }
span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
* { margin:0;}
.Heading_20_3 { font-size:14pt; margin-bottom:0.0835in; margin-top:0.1665in; font-family:Arial; writing-mode:page; margin-left:0.5in; margin-right:0in; text-indent:0in; font-weight:bold; }
.Heading_20_4 { font-size:14pt; font-weight:bold; margin-bottom:0.0417in; margin-left:0.6in; margin-right:0in; margin-top:0.1665in; text-indent:-0.6in; font-family:Arial; writing-mode:page; }
.P1 { font-size:10pt; margin-bottom:0.1965in; margin-top:0in; font-family:Courier New; writing-mode:page; }
.P10 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P11 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P12 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P13 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0in; font-family:Times New Roman; writing-mode:page; }
.P14 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0.4583in; margin-right:0in; text-align:justify ! important; text-indent:-0.0102in; font-family:Times New Roman; writing-mode:page; }
.P15 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P17 { font-size:14pt; font-weight:bold; margin-bottom:0.0835in; margin-left:0.5in; margin-right:0in; margin-top:0.1665in; text-indent:0in; font-family:Arial; writing-mode:page; }
.P18 { font-size:14pt; font-style:italic; font-weight:bold; margin-bottom:0.0835in; margin-left:0.4in; margin-right:0in; margin-top:0.1665in; text-indent:0in; font-family:Arial; writing-mode:page; }
.P19 { font-size:14pt; font-weight:bold; margin-bottom:0.0417in; margin-left:0.6in; margin-right:0in; margin-top:0.1665in; text-indent:-0.6in; font-family:Arial; writing-mode:page; }
.P2 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; background-color:transparent; }
.P3 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P4 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P5 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Courier New; writing-mode:page; }
.P6 { color:#000000; font-size:10pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Courier New; writing-mode:page; }
.P7 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P8 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.P9 { color:#000000; font-size:14pt; font-weight:normal; line-height:150%; margin-left:0in; margin-right:0in; text-align:justify ! important; text-indent:0.2402in; font-family:Times New Roman; writing-mode:page; }
.Preformatted_20_Text { font-size:10pt; font-family:Courier New; writing-mode:page; margin-top:0in; margin-bottom:0in; }
.отчет { font-size:14pt; font-family:Times New Roman; writing-mode:page; margin-left:0in; margin-right:0in; line-height:150%; text-align:justify ! important; text-indent:0.2402in; color:#000000; font-weight:normal; }
.Table24 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table25 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table26 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table27 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table28 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table29 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table32 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table33 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table34 { width:6.925in; float:none; writing-mode:lr-tb; }
.Table24_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table25_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table26_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table27_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table28_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table29_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table32_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table33_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table34_A1 { padding:0.0382in; border-width:0.0133cm; border-style:solid; border-color:#000000; }
.Table24_A { width:6.925in; }
.Table25_A { width:6.925in; }
.Table26_A { width:6.925in; }
.Table27_A { width:6.925in; }
.Table28_A { width:6.925in; }
.Table29_A { width:6.925in; }
.Table32_A { width:6.925in; }
.Table33_A { width:6.925in; }
.Table34_A { width:6.925in; }
.Bullet_20_Symbols { font-family:StarSymbol, Times New Roman; font-size:9pt; }
.Emphasis { font-style:italic; }
.Strong_20_Emphasis { font-weight:bold; }
.T1 { font-family:Courier New; }
.Teletype { font-family:Courier New; }
<!-- ODF styles with no properties representable as CSS -->
.T2 { }
</style></head><body><h2 class="P18"><a id="a__Спецификации_RESTful-веб-сервисов_для_удаленного_доступа_к_суперкомпьютерным_ресурсам_с_учетом_особенностей_задач_моделирования_в_области_нанонаук"><span/></a>Спецификации RESTful-веб-сервисов для удаленного доступа к суперкомпьютерным ресурсам с учетом особенностей задач моделирования в области нанонаук</h2><p class="P2">Комплекс RESTful-веб-сервисов для удаленного доступа к суперкомпьютерным ресурсам с учетом особенностей задач моделирования в области нанонаук обеспечивает возможность удаленного запуска задач на суперкомпьютерах с использованием локальных менеджеров ресурсов кластеров.</p><h3 class="Heading_20_3"><a id="a__Сервис_обработки_запросов_пользователей__интерфейса_прикладного_программирования_сервиса_удаленного_доступа_к_ресурсам__"><span/></a>Сервис обработки запросов пользователей (интерфейса прикладного программирования сервиса удаленного доступа к ресурсам).</h3><p class="отчет">Назначение данного сервиса — обработка запросов пользователей на запуск задач на суперкомпьютере. Сервис реализован как RESTful-грид-сервис, использующий протоколы HTTPS и X.509 для аутентификации запросов и систему управления виртуальными организациями VOMS для авторизации запросов. В процессе работы сервер помещает информацию о задачах пользователей в СУБД, используемую другими сервисами комплекса для дальнейшей обработки. Эта же база данных используется в качестве источника информации о состоянии задач и т.п.</p><p class="отчет">Ниже приводится проект REST-интерфейса данного сервиса с описанием используемых форматов данных.</p><h4 class="Heading_20_4"><a id="a__Общие_положения_"><span/></a>Общие положения.</h4><p class="отчет">Интерфейс прикладного программирования сервиса запуска задач реализован как RESTful-грид-сервис. Входные данные в запросах сервера, если это не оговорено отдельно, могут быть представлены в одном из следующих форматов: JSON, YAML. При этом используются одни и те же структуры данных, формат представления изменяет только способ сериализации данных. В данном документе все примеры и спецификации будут приводиться в формате JSON, поскольку он является ,более выразительным для восприятия человеком форматом, чем YAML: Любой объект JSON может быть представлен в виде функционально эквивалентного описания YAML, обратное в общем случае не верно. </p><p class="отчет">Обязательным требованием к формату запроса серверу является обязательное и правильное указание заголовка Content-Type в запросе.</p><p class="отчет">Ответы сервера, если это не оговаривается специально, могут быть представлены в одном из следующих форматов: JSON, YAML. Кроме того, ответы на многие запросы сервера, выполняемые методом GET и не содержащие тела запроса, могут быть возвращены в формате HTML. Выбор формата возвращаемого представления определяется в порядке приоритета, указанном в заголовке Accept, посылаемом клиентом, при отсутствии заголовка Accept используется формат JSON.</p><p class="отчет">Соединения с сервером всегда устанавливаются по протоколу HTTPS (транспорт TLSv1), с использованием клиентских сертификатов X.509 либо прокси-сертификатов RFC3820. Прокси-сертификаты могут иметь дополнительные расширения (атрибутные сертификаты), используемые для авторизации запросов. </p><p class="отчет">Все запросы, имеющие не пустое тело запроса, должны содержать заголовок Content-Length.</p><h4 class="Heading_20_4"><a id="a__Аутентификация_и_авторизация_"><span/></a>Аутентификация и авторизация.</h4><p class="отчет">При обработке запроса сервер проверяет подлинность сертификата пользователя, использованного при установлении соединения. При этом обязательно используются списки отозванных сертификатов (CRL), если они доступны для сертификационного центра, выдавшего сертификат пользователя. Помимо проверок, требуемых в рамках протоколов TLSv1 и HTTPS, проводится проверка принадлежности имени в сертификате (DN) к пространству имен, допустимому для данного CA. Пространства имен всех CA хранятся в соответствующих файлах в формате Signing Policy, используемом IGTF.</p><p class="отчет">Для авторизации запросов, требующих уточнения принадлежности пользователя к виртуальной организации, проводится проверка атрибутного сертификата VOMS, содержащегося в прокси-сертификате. Полная семантика атрибутов FQAN описывается в Artifact artf6312: The VOMS Attribute Certificate Format (http://forge.gridforum.org/sf/go/artf6312). Атрибуты FQAN могут содержать информацию о членстве в группах и о ролях в группах.</p><ul><li><p class="P4" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0cm">‒.</span>Членство в группе: <span class="odfLiEnd"/> </p></li></ul><table border="0" cellspacing="0" cellpadding="0" class="Table24"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table24_A1"><p class="P5">/«vo name»/«subgroup»/.../«subgroup»</p></td></tr></table><ul><li><p class="P4" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0cm">‒.</span>Роль в группе:<span class="odfLiEnd"/> </p></li></ul><table border="0" cellspacing="0" cellpadding="0" class="Table25"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table25_A1"><p class="P5">/«vo name»/«subgroup»/.../«subgroup»/Role=«role name»/Capability=«capability name»</p></td></tr></table><ul><li><p class="P13"> </p></li></ul><p class="отчет">В случаях, если особенной роли или особенной возможности (Capability) у пользователя нет, соответствующие значения принимают вид <span class="T1">/Role=NULL</span> и <span class="T1">/Capability=NULL</span>. Кроме того, части атрибута, имеющие такие значения можно не указывать. То есть следующие значения атрибутов являются эквивалентными: </p><table border="0" cellspacing="0" cellpadding="0" class="Table26"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table26_A1"><p class="отчет">- <span class="T1">/testbed</span></p><p class="отчет">- <span class="T1">/testbed/Role=NULL</span></p><p class="отчет">- <span class="T1">/testbed/Capability=NULL</span></p><p class="отчет">- <span class="T1">/tesbted/Role=NULL/Capability=NULL</span>`</p></td></tr></table><p class="P5"> </p><p class="отчет">Порядок атрибутов FQAN является значимым. Обработка атрибутов FQAN должна проводиться именно в том порядке, в котором они присутствуют в сертификате. </p><p class="отчет">В цепочке делегирования прокси-сертификата VOMS-расширения могут присутствовать в любом из прокси-сертификатов цепочки. Для авторизации необходимо использовать наиболее близкие к концу цепочки voms-расширения, то есть те расширения, которые находятся в самых последних делегациях.</p><h4 class="Heading_20_4"><a id="a__Получение_списка_задач_пользователя_"><span/></a>Получение списка задач пользователя.</h4><p class="отчет">Задачи каждого пользователя образуют коллекцию задач <span class="T1">SERVER/jobs/</span> (здесь и далее строка <span class="T1">SERVER</span> используется для обозначения базового URI сервиса).</p><p class="отчет">Запрос GET к коллекции возвращает список всех задач пользователя, имеющий вид:</p><table border="0" cellspacing="0" cellpadding="0" class="Table27"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table27_A1"><p class="P5">[ { «uri»: «job_uri», «job_id»: «some_id» }, ... ]</p></td></tr></table><p class="P5"> </p><p class="отчет">Здесь job_uri — полный URI задачи пользователя, используемый для действий с задачами, some_id — некоторый внутренний идентификатор задачи.</p><h4 class="Heading_20_4"><a id="a__Создание_новой_задачи_"><span/></a>Создание новой задачи.</h4><p class="отчет">Создание задач возможно с использованием двух протоколов создания ресурсов, упрощенного и идемпотентного.</p><p class="отчет">а) Упрощенный протокол.</p><p class="P14">Для создания новых задач используется запрос POST по адресу SERVER/jobs/, содержащий объект с описанием задачи. </p><p class="P15">б) Идемпотентный протокол.</p><p class="P15">Клиент генерирует строку-идентификатор задачи <span class="T1">job_id</span>, используя алгоритм UUID в модификации time-based UUID (описание алгоритма см. в разделе 4.2 RFC 4122). Далее с использованием протокола HTTP/1.1 выполняется условный запрос PUT по адресу SERVER/jobs/job_id, с заголовками <span class="T1">Expect: 100-continue</span> и <span class="T1">If-None-Match: *</span>. В случае получения от сервера кода ошибки 417 клиент должен сгенерировать новый идентификатор задачи и повторить попытку запроса. В случае получения ответа с кодом 100, клиент должен продолжить передачу данных на сервер.</p><p class="P15">В случае успешного создания ресурса клиент получает ответ сервера с кодом 201 а также URI созданной задачи в заголовке Location. Также ответ сервера содержит заголовок Termination-Time, указывающий время жизни созданного ресурса-задачи. По умолчанию новые задачи имеют очень небольшое время жизни (единицы минут), которое должно быть увеличено клиентами при последующих обращениях к серверу. Создание новой задачи не приводит к ее автоматическому запуску или постановке в очередь.</p><h4 class="Heading_20_4"><a id="a__Получение_информации_о_задаче_"><span/></a>Получение информации о задаче.</h4><p class="отчет">Для получения информации о состоянии задачи используется запрос GET к URI задачи, имеющему вид SERVER/jobs/«jobid»/, где «jobid» —  идентификатор задачи.</p><p class="отчет">Ответ на запрос является объектом, имеющим следующие атрибуты:</p><ul><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">created</span>, <span class="Strong_20_Emphasis">modified</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Дата/время создания задания и дата/время последнего изменения задания или его состояния.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">server_policy_url</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>URL документа, описывающего политику сервера, применяемую к данному заданию. Политика сервера описывает используемые сервером умолчания, и ограничения.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">owner</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>DN владельца задания<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">vo</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Виртуальная организация, от имени которой запущено задание. null если неизвестно.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">state</span>, <span class="Emphasis">список объектов</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>История изменений состояния задачи. Каждый объект имеет атрибуты:<span class="odfLiEnd"/> </p><ul><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">s</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Состояние задачи. Возможные значения:<span class="odfLiEnd"/> </p><ul><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">new</span>: только что созданная задача; <span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">pending</span>: задача ожидает обработки;<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">queued</span>: задача поставлена в очередь;<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">running</span>:задача выполняется; <span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">paused</span>: выполнение задачи приостановлено; <span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">finished</span>: выполнение задачи завершено; <span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">aborted</span>: выполнение задачи отменено. <span class="odfLiEnd"/> </p></li></ul></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">ts</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Дата/время, когда наступило соответствующее состояние.<span class="odfLiEnd"/> </p></li></ul></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Объект состояния может так же иметь другие атрибуты, не определенные в данном списке. Состояния в списке перечисляются в историческом порядке, начиная с самого старого состояния. Последние состояние в списке является текущим.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">operation</span>, <span class="Emphasis">список объектов</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Текущие операции и история выполнения операций над задачей. Каждый объект имеет атрибуты:<span class="odfLiEnd"/> </p><ul><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">op</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Операция. Возможные значения:<span class="odfLiEnd"/> </p><ul><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">start</span>: запуск задачи на выполнение; <span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">pause</span>: приостановка выполнения задачи; <span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">abort</span>: отмена выполнения задачи. <span class="odfLiEnd"/> </p></li></ul></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">id</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Уникальный идентификатор операции.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">created</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Дата и время помещения данной операции в очередь.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">completed</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Дата и время завершения данной операции.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">success</span>, <span class="Emphasis">boolean</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Было ли завершение операции успешным.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">result</span>, <span class="Emphasis">объект</span> Расширенный результат завершения операции, произвольный объект.<span class="odfLiEnd"/> </p></li></ul></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Объект операция может так же иметь другие атрибуты, не определенные в данном списке.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Операции обрабатываются системой в хронологическом порядке. Порядок, в котором объекты присутствуют в списке, может быть произвольным.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">definition</span>, <span class="Emphasis">объект</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Описание задачи.<span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">deleted</span>, <span class="Emphasis">boolean</span><span class="odfLiEnd"/> </p></li><li><p class="P7" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Значение True означает, что данное задание помечено как удаленное. Удаленные задания доступны только для чтения.<span class="odfLiEnd"/> </p></li></ul><h4 class="Heading_20_4"><a id="a__Работа_с_делегацией_сертификата__используемой_задачей_"><span/></a>Работа с делегацией сертификата, используемой задачей.</h4><p class="отчет">Задача во время выполнения может использовать делегированный ей прокси-сертификат. Для работы с делегацией сертификата используется ресурс, имеющий адрес <span class="T1">SERVER/jobs/job_id/delegation</span>.</p><p class="отчет">Делегация является JSON-объектом со следующими атрибутами (часть из них опциональны):</p><table border="0" cellspacing="0" cellpadding="0" class="Table28"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table28_A1"><p class="P5">{ "vo": "«vo_name»",</p><p class="P5">  "fqans": [ "«fqan1»", ... ],</p><p class="P5">  "next_expiration": "«timestamp»"</p><p class="P5">}</p></td></tr></table><p class="отчет"> </p><p class="отчет"><span class="Strong_20_Emphasis">vo</span> <span class="Emphasis">строка, только для чтения</span> </p><p class="отчет">Виртуальная организация, к которой относится данная делегация. </p><p class="отчет"><span class="Strong_20_Emphasis">fqans</span> <span class="Emphasis">список строк, только для чтения</span> </p><p class="отчет">Список атрибутов FQAN из VOMS-расширений делегации. </p><p class="отчет"><span class="Strong_20_Emphasis">next_expiration</span> <span class="Emphasis">строка, дата/время, только для чтения</span> </p><p class="отчет">Срок окончания действия текущего экземпляра делегации. </p><p class="отчет">По умолчанию задача не имеет делегации. Для создания или обновления существующей делегации задачи используется следующий протокол.</p><ul><li><p class="P8" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Клиент должен получить ключ новой делегации, который необходимо подписать. Это можно сделать следующими способами:<span class="odfLiEnd"/> </p><ul><li><p class="P8" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Получить публичный ключ, отправив запрос <span class="Teletype">GET</span> по адресу <span class="T1">SERVER</span><span class="Teletype"><span class="T1">/jobs/job_id/delegation/pubkey</span></span>. Ключ может быть возвращен в одном из следующих форматов:<span class="odfLiEnd"/> </p><ul><li><p class="P8" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">application/x-pkcs1</span>, <span class="Teletype">application/x-pkcs1+der</span>: публичный ключ в формате PKCS#1 [<a href="http://tools.ietf.org/html/rfc3447.html#appendix-A.1.1"><span class="Strong_20_Emphasis">RFC 3447</span></a>, Appendix A.1.1]; <span class="odfLiEnd"/> </p></li><li><p class="P8" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">application/x-pkcs1+pem</span>: публичный ключ в формате PKCS#1 в кодировании PEM (Base64+заголовки). <span class="odfLiEnd"/> </p></li></ul></li><li><p class="P8" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>По умолчанию используется формат <span class="Teletype">application/x-pkcs1+pem</span>.<span class="odfLiEnd"/> </p></li><li><p class="P8" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Получить запрос на сертификат, отправив запрос <span class="Teletype">GET</span> по адресу <span class="T1">SERVER</span><span class="Teletype"><span class="T1">/jobs/job_id/delegation</span></span><span class="Teletype">/request</span>. В случае, если обновление делегации происходит впервые (то есть при создании новой делегации), subject запроса будет содержать некорректное значение. Запрос может быть возвращен в одном из следующих форматов:<span class="odfLiEnd"/> </p><ul><li><p class="P8" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">application/pkcs10</span>, <span class="Teletype">application/pkcs10+der</span>: запрос в формате PKCS#10 [RFC 2986] <span class="odfLiEnd"/> </p></li><li><p class="P8" style="margin-left:3.2421cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">application/pkcs10+pem</span>: запрос в формате PKCS#10 в кодировании PEM (Base64+заголовки). <span class="odfLiEnd"/> </p></li></ul></li><li><p class="P8" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>По умолчанию используется формат <span class="Teletype">application/pkcs10</span>.<span class="odfLiEnd"/> </p></li></ul></li><li><p class="P8" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Создать и подписать прокси-сертификат, использовав публичный ключ из предыдущего пункта.<span class="odfLiEnd"/> </p></li><li><p class="P8" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Отправить прокси-сертификат со всей цепочкой сертификатов на сервер, используя запрос <span class="Teletype">PUT</span> по адресу <span class="T1">SERVER</span><span class="Teletype"><span class="T1">/jobs/job_id/delegation/</span></span><span class="Teletype">renew</span>. Элементы цепочки должны передоваться в порядке от конца (нового прокси-сертификата) к началу (сертификату пользователя). Цепочка может быть отправлена в одном из следующих форматов:<span class="odfLiEnd"/> </p><ul><li><p class="P8" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">application/x-pkix-chain+pem</span>: последовательность сертификатов в «текстовом» представлении PEM, от конца цепочки к началу. <span class="odfLiEnd"/> </p></li><li><p class="P8" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">application/x-pkix-chain</span>, <span class="Teletype">application/x-pkix-chain+der</span>: ASN.1 Sequence, состоящий из сертификатов, от конца цепочки к началу (т.е. результат паковки стека сертификатов OpenSSL при помощи функции ASN1_seq_pack_X509 из OpenSSL). <span class="odfLiEnd"/> </p></li></ul><p class="P8" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm"><!-- --></span>По умолчанию используется формат <span class="Teletype">application/x-pkix-chain+pem</span>.<span class="odfLiEnd"/> </p></li></ul><h4 class="Heading_20_4"><a id="a__Изменение_параметров_задачи_"><span/></a>Изменение параметров задачи.</h4><p class="отчет">Если обработка задачи еще не была начата сервером (задача находится в состоянии new), возможно изменение описания задачи. Для этого используется запрос PUT по адресу <span class="T1">SERVER</span><span class="Teletype"><span class="T1">/jobs/job_id/, </span></span>содержащий новое описание задачи.</p><h4 class="Heading_20_4"><a id="a__Выполнение_операций_с_задачами_"><span/></a>Выполнение операций с задачами.</h4><p class="отчет">Для выполнения операций над задачей (например, запуск задачи), используются запросы методом <span class="Teletype">PUT</span> по URI задачи, который имеет вид <span class="T1">SERVER</span><span class="Teletype"><span class="T1">/jobs/«jobid»/operation</span></span>.</p><p class="отчет">Запрос является объектом, имеющим следующие атрибуты:</p><ul><li><ul><li><p class="P9" style="margin-left:0.7249cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">op</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P9" style="margin-left:0.7249cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Выполняемая операция. Возможные значения:<span class="odfLiEnd"/> </p><ul><li><p class="P9" style="margin-left:1.9721cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">start</span>: запустить задачу на выполнение; <span class="odfLiEnd"/> </p></li><li><p class="P9" style="margin-left:1.9721cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">pause</span>: приостановить выполнение задачи; <span class="odfLiEnd"/> </p></li><li><p class="P9" style="margin-left:1.9721cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">abort</span>: отменить выполнение задачи. <span class="odfLiEnd"/> </p></li></ul></li><li><p class="P9" style="margin-left:0.7249cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">id</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P9" style="margin-left:0.7249cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Уникальный в рамках одного задания идентификатор операции. Генерация уникального id является ответственностью клиента, в качестве id рекомендуется использовать, например, uuid4.<span class="odfLiEnd"/> </p></li></ul></li></ul><h4 class="Heading_20_4"><a id="a__Удаление_задач_"><span/></a>Удаление задач.</h4><p class="отчет">Для удаления задач используются запросы методом DELETE по адресу задачи. Удаление задачи также приводит к отмене ее выполнения и удаления всех файлов задачи с сервера.</p><p class="отчет">Удаление задач также производится сервером автоматически по истечении времени жизни задачи, которое сообщается во всех ответах сервера в заголовке Termination-Time.</p><h4 class="Heading_20_4"><a id="a__Изменение_времени_жизни_задачи_"><span/></a>Изменение времени жизни задачи.</h4><p class="отчет">Для контроля времени жизни ресурсов и управления им предлагается использовать заголовки протокола HTTP. Для обозначения времени жизни ресурса предлагается использовать нестандартный заголовок Termination-Time, спецификация которого в расширенной форме Бэкуса-Наура [rfc5234] приводится ниже:</p><table border="0" cellspacing="0" cellpadding="0" class="Table29"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table29_A1"><p class="P6">Termination-Time = "Termination-Time" ": " rfc1123-date</p><p class="P6">rfc1123-date     = wkday ", " date " " time " GMT"</p><p class="P6">wkday            = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"</p><p class="P6">date             = 2*DIGIT " " month " " 4*DIGIT</p><p class="P6">month            = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / </p><p class="P6">                   "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"</p><p class="P6">time             = 2*DIGIT ":" 2*DIGIT ":" 2*DIGIT</p></td></tr></table><p class="отчет"> </p><p class="отчет">Поле date содержит дату в формате день месяц год; поле time содержит время, в диапазоне 00:00:00 --- 23:59:59. </p><p class="отчет">Необходимость использования отдельного заголовка для указания времени жизни вызвана тем, что другие близкие по смыслу стандартные заголовки имеют интерпретацию, связанную с конкретным представлением ресурса, а не ресурсом в целом. Так, например, заголовок Expires имеет стандартную интерпретацию как актуальность/время жизни данного представления, и, поэтому, не может использоваться для указания времени жизни ресурса.</p><p class="отчет">Заголовок Termination-Time является опциональным, и может присутствовать как в запросе, так и в ответе.</p><p class="отчет">Наличие заголовка Termination-Time в запросе используется для изменения времени жизни ресурса. В случае возможности изменения времени жизни ресурса, грид-сервис должен выполнить действия, соответствующие запросу и изменить время жизни ресурса. В ответе на запрос должен присутствовать заголовок Termination-Time, содержащий новое время жизни ресурса. В случае если указанное изменение времени жизни невозможно или не поддерживается для данного ресурса, грид-сервис не должен выполнять действие, соответствующее запросу и должен вернуть ответ с кодом состояния 409 содержащий заголовок Location: urn:X-RESTful-Grid:invalid-termination-time.</p><p class="отчет">Наличие заголовка Termination-Time в ответе грид-сервиса указывает, что данный ресурс может быть автоматически уничтожен сервисом в указанный момент времени, однако не гарантирует уничтожения ресурса. Отсутствие заголовка Termination-Time в ответе грид-сервиса означает, что время жизни ресурса не определено явно, и клиент не должен делать предположений о времени жизни ресурса.</p><p class="отчет"> </p><p class="отчет">Для изменения времени жизни ресурса без совершения каких-либо операций с ресурсом предлагается использовать расширенное указание Pragma: only-termination-time. Чтобы изменить время жизни ресурса не совершая операций, клиент отправляет серверу запрос методом PUT, в котором присутствует заголовок Pragma: only-termination-time и желаемое значение времени жизни ресурса в заголовке Termination-Time, но отсутствует представление ресурса. Запрос, содержащий представление ресурса и такой набор заголовков считается ошибочным, сервер должен вернуть ответ с кодом состояния 400 и заголовком Location: urn:X-RESTful-Grid:invalid-pragma-combination.Сервис запуска задач и отслеживания состояния задач (сервис интерфейса с локальным менеджером ресурсов).</p><p class="отчет">Назначение данного сервиса — запуск и отслеживание состояния задач, на основе информации, содержащейся в СУБД системы запуска задач.</p><p class="отчет">Данный сервис обеспечивает выполнение логики обработки задач, запускает задачи с использованием локального менеджера ресурсов и следит за ходом их выполнения. Сервис содержит следующие компоненты:</p><ul><li><p class="P10" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0cm">‒.</span>обработчик задач. Занимается анализом заданий и задач, хранящихся в базе данных; направляет задачи в очередь исполнения;<span class="odfLiEnd"/> </p></li><li><p class="P10" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0cm">‒.</span>очередь исполнения задач. Задачи попадают в эту очередь по мере готовности к постановке в очередь локального менеджера ресурсов. Обработчик этой очереди запускает задачи с использованием локального менеджера ресурсов кластера или суперкомпьютера.;<span class="odfLiEnd"/> </p></li><li><p class="P10" style="margin-left:0cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0cm">‒.</span>очередь опроса состояния. Обработчик этой очереди опрашивает локальный менеджер ресурсов о состоянии выполняющихся задач.<span class="odfLiEnd"/> </p></li></ul><h3 class="Heading_20_3"><a id="a__Сервис_выбора_ресурсов_"><span/></a>Сервис выбора ресурсов.</h3><p class="отчет">Назначение данного сервиса — подбор необходимых параметров запуска задачи на кластере, с учетом требований к ресурсам и предустановленному программному обеспечению задачи. Данный сервис используется сервисом запуска и отслеживания состояния задач для выбора очереди, в котору производится постановка задачи. Реализован как RESTful-веб-сервис.</p><h3 class="Heading_20_3"><a id="a__Сервис_трансляции_представлений_задач_"><span/></a>Сервис трансляции представлений задач.</h3><p class="отчет">Назначение данного сервиса — преобразование унифицированного описания задачи, используемой клиентами RESTful-веб-сервиса для удаленного доступа к суперкомпьютерным ресурсам с учетом особенностей задач моделирования в области нанонаук в язык описания, используемый локальным менеджером ресурсов данного кластера или суперкомпьютера.</p><p class="P3">Сервис используется сервисом запуска и отслеживания состояния задач. Реализован как RESTful-веб-сервис.</p><h3 class="Heading_20_3"><a id="a__Сервис_доступа_к_учетной_информации_"><span/></a>Сервис доступа к учетной информации.</h3><h4 class="Heading_20_4"><a id="a__Общие_положения_"><span/></a>Общие положения.</h4><p class="отчет">Учетная информация о выполненных задачах предоставляется в виде отдельного RESTful-грид-сервиса. Сервис использует процедуру доступа, авторизации и аутентификации аналогичную описанной в разделе .</p><p class="отчет">Записи из журналов учетной информации могут быть возвращены в форматах JSON, YAML, CSV, HTML. Формат представления, выбранный клиентом, необходимо указать в заголовке Accept.</p><h4 class="Heading_20_4"><a id="a__Запросы_учетной_информации_за_заданный_период_времени_"><span/></a>Запросы учетной информации за заданный период времени.</h4><p class="отчет">Запрос производится по URI вида <span class="Teletype">SERVER/accounting/«ts1»-«ts2»/</span>, где <span class="Teletype">«ts1»</span> и <span class="Teletype">«ts2»</span> могут иметь одно из следующих значений:</p><ul><li><p class="P11" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">current</span>: текущее дата/время на сервере. <span class="odfLiEnd"/> </p></li><li><p class="P11" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Дата и время во временной зоне UTC, в формате <span class="Teletype">YYYYmmddHHMMSS[.FFFFFF]</span>, где <span class="Teletype">YYYY</span> — год, <span class="Teletype">mm</span> — месяц, <span class="Teletype">dd</span> — день, <span class="Teletype">HH</span> — час, <span class="Teletype">MM</span> — минуты, <span class="Teletype">SS</span> — секунды, <span class="Teletype">[.FFFFFF]</span> — доли секунды. Например: <span class="Teletype">20091124124337</span> соответствует 24 ноября 2009 года, 15:43:34 по Московскому зимнему времени, <span class="Teletype">20051211182733.832922</span> соответствует 11 декабря 2005 года, 21:27:33 и 0.832922 секунды по Московскому зимнему времени. <span class="odfLiEnd"/> </p></li><li><p class="P11" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Невыполнение следующих требований приведет к ответу с кодом <a href="http://www.ngrid.ru/sw/pilot/docs/api.html#bad-request">400</a>:<span class="odfLiEnd"/> </p></li><li><p class="P11" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">«ts1»</span> не может иметь значение <span class="Teletype">current</span>; <span class="odfLiEnd"/> </p></li><li><p class="P11" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">«ts2»</span> должен быть больше <span class="Teletype">«ts1»</span>. <span class="odfLiEnd"/> </p></li></ul><p class="отчет">Примеры URI запросов.</p><p class="отчет">Аккаунтинговая информация с 00:00:00 UTC 24 ноября 2009 года по текущий момент:</p><table border="0" cellspacing="0" cellpadding="0" class="Table32"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table32_A1"><p class="отчет"><span class="Teletype">SERVER/accounting/period/20091124000000-current/</span></p></td></tr></table><p class="отчет"> </p><p class="отчет">Аккаунтинговая информация с 00:00:00 UTC 24 ноября 2009 года по 12:43:37 и 0.291323 секунды UTC 24 ноября 2009 года:</p><table border="0" cellspacing="0" cellpadding="0" class="Table33"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table33_A1"><p class="отчет"><span class="Teletype">SERVER/accounting/period/20091124000000-20091124124337.291323/</span></p></td></tr></table><p class="отчет"> </p><h4 class="Heading_20_4"><a id="a__Запрос_последних_N_записей_учетной_информации_"><span/></a>Запрос последних N записей учетной информации.</h4><p class="отчет">Запрос производится по URI вида <span class="Teletype">SERVER/accounting/last/N/</span>, где <span class="Teletype">N</span> — количество возвращаемых записей. Возвращаются последние <span class="Teletype">N</span> записей учетной информации.</p><h4 class="Heading_20_4"><a id="a__Назначение_полей_в_записях_учетной_информации_"><span/></a>Назначение полей в записях учетной информации.</h4><p class="отчет">Ответы сервиса в любоим представлении могут содержать одно или несколько полей из перечисленных ниже для каждой из возвращенных записей. Возможные поля:</p><ul><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">ts</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Дата и время соответствующей записи аккаунтинга, в формате ISO 8601, во временной зоне UTC с долями секунды.<span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">user_dn</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Subject сертификата пользователя, являющегося владельцем задания.<span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">job_id</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Идентификатор задания<span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">vo</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Виртуальная организация, к которой относится данная операция (если известна); null, если виртуальная организация не может быть определена.<span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">event</span>, <span class="Emphasis">строка</span><span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Учитываемое событие. Возможные значения:<span class="odfLiEnd"/> </p><ul><li><p class="P12" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">job_started</span>: задача была запущена. В <a href="http://www.ngrid.ru/sw/pilot/docs/api.html#detail">detail</a> содержится информация об очереди и, возможно, имени хоста, на котором запущена задача. Для событий этого типа обязательно присутствуют поля <span class="Teletype">job_id</span>, <span class="Teletype">user_dn</span>, и <span class="Teletype">detail</span>. <span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">job_finished</span>: задача завершилась успешно. Для событий этого типа обязательно присутствуют поля <span class="Teletype">job_id</span>, <span class="Teletype">user_dn</span>. Может присутствовать поле <span class="Teletype">detail</span>, содержащее код завершения задачи. <span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:1.9949cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Teletype">job_aborted</span>: задача заверешилась не успешно. Для событий этого типа обязательно присутствуют поля <span class="Teletype">job_id</span>, <span class="Teletype">user_dn</span>. Может присутствовать поле <span class="Teletype">detail</span>, содержащее код завершения задачи. <span class="odfLiEnd"/> </p></li></ul></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">detail</span>, <span class="Emphasis">строка, опциональный параметр</span><span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span>Дополнительная информация о событии. См. описание значений в описании параметра <a href="http://www.ngrid.ru/sw/pilot/docs/api.html#event">event</a>. null, если дополнительной информации нет.<span class="odfLiEnd"/> </p></li><li><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm">‒.</span><span class="Strong_20_Emphasis">info</span>, <span class="Emphasis">объект</span><span class="odfLiEnd"/> </p><p class="P12" style="margin-left:0.748cm;"><span class="Bullet_20_Symbols" style="display:block;float:left;min-width:0.4991cm"><!-- --></span>Дополнительная информация о событии, если известна; null, если дополнительной информации нет. Имеет различные значения для разных типов событий.<span class="odfLiEnd"/> </p></li></ul><h3 class="P17"><a id="a__База_данных_задач_и_учетной_информации_"><span/></a>База данных задач и учетной информации.</h3><p class="отчет"><span class="T2">Сервисы </span><span class="T2"/><span class="T2">–</span><span class="T2"/><span class="T2"> для своей работы используют общую базу данных, содержащую информацию о задачах, которые были обработаны сервисами, а также находятся в очереди на обработку или выполняются.</span></p><p class="P3">Все отношения кроме jobs находятся в третьей нормальной форме Кодда, небольшая денормализация вызвана соображениями производительности. Для обеспечения целостности данных с учетом денормализации используются хранимые процедуры, вызываемые триггерами обновления соответствующих таблиц.</p><p class="отчет"><span class="T2">Информация о задачах хранится в таблицах jobs. Таблица job_operations содержит информацию об операциях с задачами, которые выполнялись, или должны быть выполнены. Таблица job_states используется для хранения истории состояний задач. Состояния последовательно нумеруются в поле seq, текущему состоянию соответствует строка с максимальным значением seq. Кроме того, для текущего состояния задачи поле s таблицы job_state дублируется в  поле current_state в таблице jobs. Это делается из соображений производительности: запросы с выборкой по текущему состоянию часто используются многими сервисами системы, такая денормализация позволяет существенно их ускорить, ликвидируя необходимость дополнительных запросов для выяснения текущего состояния. Хранимые процедуры триггеров обновления и добавления записей таблицы job_states предотвращают нарушение целостности данных, автоматически обновляя поле current_state связанной таблицы.</span></p><p class="P3">История состояний и операций, помимо уже описанных выше таблиц, хранится в альтернативном виде в таблице accounting_log, организованной как учетный журнал всех событий, которые происходят внутри сервиса запуска задач.</p><h3 class="P17"><a id="a__Сервис_информации_о_текущем_состоянии_суперкомпьютера_"><span/></a>Сервис информации о текущем состоянии суперкомпьютера.</h3><p class="отчет"><span class="T2">Сервис предосталяет информацию о текущем состоянии суперкомпьютера или кластера в виде JSON-ресурса. Для получения информации о состоянии кластера и его очередей необходимо послать запрос методом GET по адресу SERVER/status/</span></p><p class="отчет"><span class="T2">Ответ в формате JSON содержит общую информацию о кластере, информацию об очередях и их загрузке, информацию о доступном предустановленном программном обеспечении и правах доступа к нему.</span></p><h4 class="P19"><a id="a__Внутренний_интерфейс_обновления_информации_о_текущем_состоянии"><span/></a>Внутренний интерфейс обновления информации о текущем состоянии</h4><p class="отчет"><span class="T2">Данный интерфейс предназначен для программ локального менеджера ресурсов суперкомпьютера и предоставляет возможность обновления информации о состоянии кластера или суперкомпьютера со стороны локального менеджера ресурсов. </span></p><p class="отчет"><span class="T2">Для обновления информации необходимо отправить запрос методом POST по адресу </span><a href="http://localhost:44000/">http://localhost:44000/</a><span class="T2">, содержащий обновленные значения полей. Например:</span></p><table border="0" cellspacing="0" cellpadding="0" class="Table34"><colgroup><col width="769"/></colgroup><tr><td style="text-align:left;width:6.925in; " class="Table34_A1"><p class="Preformatted_20_Text">$ curl -H 'Content-Type: application/json' --data-binary '{"workq":</p><p class="Preformatted_20_Text">&gt; {"TotalJobs": 3, "RunningJobs": 2, "WaitingJobs": 1}</p><p class="P1">&gt; }' http://localhost:44080</p></td></tr></table><p class="отчет"> </p><p class="отчет">Аттрибутами передаваемого объекта являются названия очередей (“workq” в примере). Разрешается передовать любые свойства ComputingShare (стр. 26-29 спецификации <a href="http://www.ngrid.ru/sw/infosys2/0.3/_static/GFD.147.pdf">GLUE 2.0</a>), например, <span class="Teletype">TotalJobs</span>, <span class="Teletype">RunningJobs</span>, <span class="Teletype">MaxCPUTime</span>, и так далее.</p></body></html>