Управление проектом через 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»