Управление проектом через API, используя консольную утилиту cURL в ОС Linux¶
Рассмотрим процесс работы с API. Он включант в себя следующие пункты:
Аутентификация с помощью с помощью RC файла¶
Для получения tokenID и дальнейшей работы с помощью API, понадобится аутентифицироваться в SIM-Cloud. Для установки нужных переменных окружения операционной системы используется, специальным образом сформированный, RC файл.
- Создадим файл с названием «api-rc» со следующим содержимым:
unset OS_TOKEN export OS_PROJECT_DOMAIN_NAME=default export OS_USER_DOMAIN_NAME=default export OS_USERNAME={Ваш логин для доступа к услуге} # Get the password. echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: " read -sr OS_PASSWORD_INPUT export OS_PASSWORD=$OS_PASSWORD_INPUT export OS_PROJECT_NAME={Имя Вашего проекта} export OS_IDENTITY_API_VERSION=3 export PS1='[\u@\h (SIM-CLOUD API)]\$ ' export OS_API="https://api.sim-cloud.net" export OS_AUTH_URL=$OS_API":5000/v3"Примечание
При экспорте переменных из RC файла будет однократно запрашиваться пароль для облачного проекта.Если нужно отключить запрос пароля и обеспечить его автоматический ввод, то откройте RC файл любым текстовым редактором и замените блок текста:# Get the password. echo "Please enter your OpenStack Password for project $OS_PROJECT_NAME as user $OS_USERNAME: " read -sr OS_PASSWORD_INPUT export OS_PASSWORD=$OS_PASSWORD_INPUTна
export OS_PASSWORD={Ваш пароль для доступа к услуге}Предупреждение
Поскольку RC файл является обычным текстовым файлом и ваш пароль будет доступен в открытом, не зашифрованном виде, то это - небезопасно!В этом случае установите в системе минимально-необходимые права на его использование!
Получение «token ID»¶
Открываем консоль bash, переходим в каталог содержащий наш RC файл и с помощью команды «.» (точка) или «source» производим экспорт переменных из RC файла в окружение системы.
source api-rcВ случае необходимости, вводим свой пароль к проекту в SIM-Cloud.
Получить tokenID можно с помощью команды:
curl -v \ -s \ -X POST $OS_AUTH_URL/auth/tokens?nocatalog \ -H "Content-Type: application/json" \ -d ' { "auth": { "identity": { "methods": ["password"], "password": { "user": { "domain": { "name": "'"$OS_USER_DOMAIN_NAME"'"}, "name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'" } } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name": "'"$OS_PROJECT_NAME"'" } } } }' | echoВ полученном ответе находим строку начинающуюся с «< X-Subject-Token: », весь набор символов идущий далее, является tokenID, который мы будем использовать в наших API запросах, например:
< X-Subject-Token: gAAAAABbcWL17tiGivJp4oc8OGiZS0Sfgn_-ZrlNzocZwTo0nfwe3Y2EbUrI-k3JfSLrIksLAKt-iFGwIhn9-JoiEL4EpTgI4WxZZPzGubDSMgoO-3wRzAm64cVr91efQU_W4JYYjxwGCqL-T4XVLncngUg7pzqJ0AHzmZB4OMXeB5dlFqDpPlEДалее требуется присвоить это значение переменной OS_TOKEN и экспортировать эту переменную в окружение системы.
Выполним все это одной командой:
export OS_TOKEN=`curl -s -i -H "Content-Type: application/json" -X POST $OS_AUTH_URL/auth/tokens -d '{"auth": {"identity": {"methods": ["password"], "password": {"user": {"name": "'"$OS_USERNAME"'", "domain": {"name": "default"}, "password": "'"$OS_PASSWORD"'" }}}}}' | awk '/X-Subject-Token/ {print $2}'`
Отправка API запроса¶
Для отправки API запроса, в общем случае используем конструкцию типа
curl -s -H "X-Auth-Token: $OS_TOKEN" -H "Content-Type: application/json" -X <METHOD> <URL> -d '{key: value}' | python -mjson.tool
- где
• $OS_TOKEN - наш tikenID который подставится из переменной окружения• <METHOD> - метод передачи HTTP запроса: GET, HEAD, POST или PUT. Если не указано, используется метод GET• <URL> - строка состоящая из комбинации обозначения точки доступа и параметров взятых из официальной документации по комплексу OpenStack• после «-d» описывается структура в которой, в виде «ключ:значение», указываются параметры для передачи в запросе• « | python -mjson.tool» - этот код обеспечивает вывод ответной информации в удобочитаемом видеНапример, для дальнейшей работы с проектом, нам нужно узнать его идентификатор (ID).
Для этого мы используем следующий запрос:
curl -s -H "X-Auth-Token: $OS_TOKEN" -H "Content-Type: application/json" https://api.sim-cloud.net:5000/v3/auth/projects | python -mjson.tool
- где
• $OS_TOKEN - наш tokenID который подставится из переменной окружения• <METHOD> - используется метод по умолчанию (GET), поэтому этот ключ мы не указываем• <URL> - строка состоящая из комбинации URL точки доступа и параметров взятых из официальной документации api-ref/identityИ получим следующую информацию:
{ "links": { "next": null, "previous": null, "self": "https://api.sim-cloud.net:5000/v3/auth/projects" }, "projects": [ { "description": "", "domain_id": "b9091e0ccd2febc3464e4d83c04be17a", "enabled": true, "id": "b1a56f59f6f013a061074fdcc56daec0", "is_domain": false, "links": { "self": "https://api.sim-cloud.net:5000/v3/projects/b1a56f59f6f013a061074fdcc56daec0" }, "name": "demo", "parent_id": "b9c04be1e0cc464e4091d83d2febc37a" } ] }
- где мы можем увидеть
• имя нашего проекта - «name»: «demo»• ID нашего проекта - «id»: «b1a56f59f6f013a061074fdcc56daec0»
Обработка ответа¶
Если запрос был выполнен не успешно, то будет указан код ошибки, сообщение о ней и краткая причина её возникновения:
{ "error": { "code": 401, "message": "The request you have made requires authentication.", "title": "Unauthorized" } }Полный перечень возможных кодов возврата и рекомендуемых действий для них указан в документации к каждому запросу, в поле «Status Codes»