Руководство по REST API для папок ВМ
1. Введение
Для поддержки и управления древовидной структурой папок ВМ посредством архитектуры REST предоставляется VM Folders API на базе сервиса 'zvirt-engine-backend'.
Данное API дополняет оригинальное REST API zVirt и придерживается основных принципов его построения, но в отличии от оригинального реализует доступ по HTTP(S) протоколу, без реализации SDK.
Эта документация служит справочником по REST API для папок ВМ. Она предназначена для предоставления разработчикам и администраторам инструкций и примеров, которые помогут использовать функциональные возможности папок ВМ сетей через API.
2. Предварительные требования к API
Предварительные требования для использования REST API для Папок ВМ:
-
Клиент или программная библиотека, которая инициирует и получает HTTP-запросы от сервера API. Например:
-
Инструмент командной строки cURL.
-
RESTClient — отладчик для веб-служб RESTful.
-
Postman — HTTP-клиент для тестирования API.
-
-
Знание протокола передачи гипертекста (HTTP), протокола, используемого для взаимодействия с REST API. Инженерная рабочая группа Интернета публикует запрос комментариев (RFC) с объяснением протокола передачи гипертекста по адресу http://www.ietf.org/rfc/rfc2616.txt.
-
Знание расширяемого языка разметки (XML) или нотации объектов JavaScript (JSON), которые API использует для создания представлений ресурсов. W3C предоставляет полную спецификацию XML на http://www.w3.org/TR/xml. ECMA International предоставляет бесплатную публикацию по JSON на http://www.ecma-international.org.
3. Аутентификация и безопасность
OAuth — это сложный протокол с несколькими механизмами получения токенов авторизации и доступа. Для использования с API поддерживается только предоставление учетных данных владельца ресурса, как описано в разделе 4.3 RFC 6749.
Сначала необходимо получить токен, отправив имя пользователя и пароль в службу единого входа Менеджера управления:
POST /ovirt-engine/sso/oauth/token HTTP/1.1
Host: myengine.example.com
Content-Type: application/x-www-form-urlencoded
Accept: application/json
Тело запроса должно содержать параметры grant_type, scope, username и password:
| Имя | Значение |
|---|---|
grant_type |
password |
scope |
ovirt-app-api |
username |
admin@internal |
password |
mypassword |
Эти параметры должны быть представлены в URL кодировке. Например, символ @ в имени пользователя должен быть закодирован как %40. Результирующее тело запроса будет примерно таким:
grant_type=password&scope=ovirt-app-api&username=admin%40internal&password=mypassword
Параметр scope описан как необязательный в OAuth RFC, но при использовании его с API он является обязательным, и его значение должно быть ovirt-app-api.
|
Если имя пользователя и пароль верны, служба единого входа Менеджера управления ответит документом JSON, подобным этому:
{
"access_token": "fqbR1ftzh8wBCviLxJcYuV5oSDI=",
"token_type": "bearer",
"scope": "...",
...
}
Для целей аутентификации API единственной подходящей парой имя/значение является access_token. Ни в коем случае не манипулируйте этим; используйте его точно так, как это предусмотрено службой единого входа.
После получения токена его можно использовать для выполнения запросов к API, включив его в заголовок HTTP Authorization и используя схему Bearer. Например, чтобы получить список виртуальных машин, отправьте такой запрос:
GET /ovirt-engine/api/vms HTTP/1.1
Host: myengine.example.com
Accept: application/xml
Authorization: Bearer fqbR1ftzh8wBCviLxJcYuV5oSDI=
Токен можно использовать несколько раз для нескольких запросов, но в конечном итоге срок его действия истечет. По истечении этого срока сервер отклонит запрос с кодом ответа HTTP 401:
HTTP/1.1 401 Unauthorized
В этом случае требуется новый токен, так как служба единого входа Менеджера управления в настоящее время не поддерживает обновление токенов. Новый токен можно запросить тем же способом, который описан выше.
3.1. TLS/SSL-сертификация
API zVirt требует защищенного протокола передачи гипертекста (HTTPS) для безопасного взаимодействия с клиентским программным обеспечением. Это включает в себя получение сертификата ЦС, используемого сервером, и его импорт в хранилище сертификатов вашего клиента.
3.1.1. Получение CA сертификата
Вы можете получить CA сертификат от Менеджера управления zVirt и передать его на клиентскую машину одним из следующих способов:
Способ 1
Предпочтительный метод получения CA сертификата — использовать инструмент командной строки openssl s_client для выполнения реального рукопожатия TLS с сервером, а затем извлечь сертификаты, которые он представляет. Запустите команду следующим образом:
$ openssl s_client \
-connect myengine.example.com:443 \
-showcerts \
< /dev/null
Эта команда подключится к серверу и отобразит вывод, подобный следующему:
CONNECTED(00000003)
depth=1 C = US, O = Example Inc., CN = myengine.example.com.23416
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
0 s:/C=US/O=Example Inc./CN=myengine.example.com
i:/C=US/O=Example Inc./CN=myengine.example.com.23416
-----BEGIN CERTIFICATE-----
MIIEaTCCA1GgAwIBAgICEAQwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCVVMx
FTATBgNVBAoTDEV4YW1wbGUgSW5jLjEjMCEGA1UEAxMaZW5naW5lNDEuZXhhbXBs
SVlJe7e5FTEtHJGTAeWWM6dGbsFhip5VXM0gfqg=
-----END CERTIFICATE-----
1 s:/C=US/O=Example Inc./CN=myengine.example.com.23416
i:/C=US/O=Example Inc./CN=myengine.example.com.23416
-----BEGIN CERTIFICATE-----
MIIDxjCCAq6gAwIBAgICEAAwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCVVMx
FTATBgNVBAoTDEV4YW1wbGUgSW5jLjEjMCEGA1UEAxMaZW5naW5lNDEuZXhhbXBs
Pkyg1rQHR6ebGQ==
-----END CERTIFICATE-----
Текст между маркерами -----BEGIN CERTIFICATE----- и -----END CERTIFICATE----- показывает сертификаты, представленные сервером. Первый — это сертификат самого сервера, а последний — CA сертификат. Скопируйте CA сертификат вместе с метками в файл ca.crt. Результат должен выглядеть так:
-----BEGIN CERTIFICATE-----
MIIDxjCCAq6gAwIBAgICEAAwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UEBhMCVVMx
FTATBgNVBAoTDEV4YW1wbGUgSW5jLjEjMCEGA1UEAxMaZW5naW5lNDEuZXhhbXBs
Pkyg1rQHR6ebGQ==
-----END CERTIFICATE-----
| Это самый надежный способ получить CA сертификат, используемый сервером. Остальные описанные здесь способы сработают в большинстве случаев, но они не дадут правильный CA сертификат, если он был вручную заменен администратором сервера. |
Способ 2
Если вы не можете использовать описанный выше метод openssl s_client, вы можете вместо этого использовать инструмент командной строки для загрузки CA сертификата из Менеджера управления zVirt.
Примеры инструментов командной строки включают curl и wget, оба из которых доступны на нескольких платформах.
При использовании curl:
$ curl \
--output ca.crt \
'http://myengine.example.com/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA'
При использовании wget:
$ wget \
--output-document ca.crt \
'http://myengine.example.com/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA'
Способ 3
С помощью веб-браузера перейдите к сертификату, расположенному по адресу:
https://myengine.example.com/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA
В зависимости от выбранного браузера сертификат загружается или импортируется в хранилище ключей браузера.
-
Если браузер загружает сертификат: сохраните файл как ca.crt.
-
Если браузер импортирует сертификат: экспортируйте его из параметров сертификации браузера и сохраните как ca.crt.
Способ 4
Войдите в Менеджер управления, экспортируйте сертификат из хранилища доверенных сертификатов и скопируйте его на свой клиентский компьютер.
-
Войдите на машину с Менеджером управления как root.
-
Экспортируйте сертификат из хранилища доверенных сертификатов с помощью утилиты
keytool:keytool \ -keystore /etc/pki/ovirt-engine/.truststore \ -storepass mypass \ -exportcert \ -alias cacert \ -rfc \ -file ca.crtЭто создает файл сертификата с именем ca.crt.
-
Скопируйте сертификат на клиентскую машину с помощью команды
scp:$ scp ca.crt myuser@myclient.example.com:/home/myuser/.
Каждый из этих методов приводит к созданию файла сертификата с именем ca.crt на клиентском компьютере. Затем вы должны импортировать этот файл в хранилище сертификатов клиента.
4. Общие понятия
4.1. Типы
API использует концепцию типов для описания различных видов принимаемых и возвращаемых объектов.
Существует три соответствующих вида типов:
-
Примитивные типы - Описывают простые виды объектов, такие как string (строки) или integer (целые числа).
-
Перечисляемые типы - описывают списки допустимых значений, таких как
statusилиDiskFormat. -
Структурированные типы - описывают структурированные объекты с несколькими атрибутами и ссылками, например
parentVmFoldersилиchildren.
4.2. Идентифицируемые типы
Многие из типов, используемых API, представляют собой идентифицируемые объекты, объекты, которые имеют уникальный идентификатор и существуют независимо от других объектов.
5. Сервисы
Модель REST API основана на ресурсах. Ресурс в рамках данного руководства рассматривается как сервис, выполняющий операции только над одной сущностью (entity).
Существует два соответствующих вида сервисов:
-
Сервисы, управляющие коллекцией объектов - эти сервисы отвечают за перечисление существующих объектов и добавление новых объектов.
-
Сервисы, управляющие конкретным объектом - эти сервисы отвечают за получение, обновление, удаление и выполнение действий в определенных объектах.
Реализован ряд сервисов для работы с API папок виртуальных машин:
-
VmFoldersService — сервис, обеспечивающий выполнение операций с папками виртуальных машин, поддерживает следующий функционал:
-
получение папки ВМ по её уникальному идентификатору;
-
вывод полного списка папок ВМ;
-
изменение свойств существующей папки VM;
-
создание новой папки ВМ;
-
удаление папки ВМ по указанному идентификатору;
-
проверка наличия вложенных объектов в указанной папке ВМ.
-
-
VmFoldersTreeService - сервис, предназначенный для выполнения операций с древовидной структурой папок виртуальных машин.
Реализует следующий функционал:
-
получение структурированного представления дерева папок с включением или исключением виртуальных машин;
-
перемещение отдельных объектов в пределах дерева папок;
-
перемещение групп объектов в рамках дерева;
-
извлечение конкретного узла дерева папок;
-
получение идентификаторов всех потомков или исключительно непосредственных дочерних узлов заданного типа;
-
выбор объектов виртуальных машин, являющихся прямыми потомками выбранного узла;
-
определение родительской папки для указанного объекта;
-
формирование поддерева для указанных объектов;
-
преобразование идентификаторов виртуальных машин в соответствующие сущности.
-
-
VmFolderActionCheckerService - сервис, осуществляющий проверку возможности выполнения операций с элементами дерева папок виртуальных машин.
Поддерживаемые функции сервиса:
-
Проверка выполнения операции с корневым элементом дерева и выброс исключения в подобном случае;
-
Проверка наличия необходимых прав доступа для совершения запрашиваемого действия и выдача ошибки при их отсутствии;
-
Анализ ограничений на перемещение объекта в дерево папок и уведомление об ошибке в случае нарушения любого из них;
-
Проверка типа родительского объекта: валидация того, что целевой родительский элемент не является виртуальной машиной (ВМ), с генерацией ошибки при попытке назначения родителя типа ВМ;
-
Проверка типа удаляемого объекта: подтверждение того, что удаляемый элемент не является виртуальной машиной (ВМ) перед выполнением операции удаления;
-
Проверка условий для удаления объекта в дереве с генерацией ошибки в случае нарушения любого из них;
-
Выполнение контроля глубины вложенности объектов и возникновение ошибки при достижении предельного значения уровня вложенности.
-
Каждый сервис доступен по определенному пути внутри сервера. Например, сервис, управляющий структурой папок ВМ, существующих в системе, доступен по пути /folders/vm/v1, а сервис, управляющий папкой ВМ с идентификатором 123, доступен по пути /folders/vm/v1/123.
Все виды сервисов имеют набор методов, представляющих операции, которые они могут выполнять. Сервисы, управляющие коллекциями объектов, обычно имеют методы list и add. Сервисы, управляющие определенными объектами, обычно имеют методы get, update и remove. Кроме того, сервисы могут также иметь методы action, представляющие менее распространенные операции.
Для более обычных методов существует прямое сопоставление между именем метода и именем метода HTTP:
| Имя метода | HTTP-метод |
|---|---|
|
POST |
|
GET |
|
GET |
|
PUT |
|
DELETE |
Путь, используемый в HTTP-запросе — это путь сервиса с префиксом /zvirt-engine-backend/folders/vm/v1 или /zvirt-engine-backend/folders/vm/v1/tree.
5.1. Описание интерфейса отображения сервисов
Описанные ниже методы сервисов расположены во фрейме, который содержит интерактивные элементы, обеспечивающие удобное представление.
-
Инструменты управления отображением:
-
Expand all - позволяет развернуть все категории.
-
Collapse all - позволяет свернуть все категории.
-
-
Список категорий. При клике на заголовок категории можно свернуть/развернуть ее содержимое.
-
Список сервисов и их методов в категории. При клике на строку метода можно свернуть/развернуть его описание.
-
Общее и подробное описание метода.
-
Поле параметров запроса:
-
query-string parameters - параметры передаваемые в строке запроса (например,
/ovirt-engine/api/datacenters?max=3) -
request body - содержимое тела запроса. На вкладке Example представлен пример, на вкладке Schema - схема данных.
Тело запроса применяется только в POST- и PUT-запросах.
На вкладке Schema представлено подробное описание параметров объекта. По умолчанию описание отображается в однострочном формате, поэтому часть описания может быть не видна. Для отображения полного формата нажмите Multiline description. -
request headers - список специфических параметров, которые необходимо включить в заголовок запроса.
-
-
Поле параметров ответа:
-
В верхней части содержит возвращаемые коды с описанием. В большинстве случаев представлен только пример успешного выполнения, но могут встретиться дополнительные коды (см. скрин ниже). Поскольку все методы используют одинаковый набор кодов ответа, их описание вынесено в таблицу в разделе обработка ошибок.
-
На вкладке Example представлен пример, на вкладке Schema - схема данных.
На вкладке Schema представлено подробное описание параметров объекта. По умолчанию описание отображается в однострочном формате, поэтому часть описания может быть не видна. Для отображения полного формата нажмите Multiline description.
-