Управление проектом через API с помощью cURL в Linux

Работа с API включает:

Аутентификация с помощью RC-файла

Для получения токена авторизуйтесь в SIM-Cloud. Параметры подключения передаются через переменные окружения из RC-файла.

  • Создайте файл api-rc со следующим содержимым:

unset OS_TOKEN
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_USERNAME={your_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={your_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-файл и замените блок:
# 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

to

export OS_PASSWORD={пароль для доступа к сервису}

Предупреждение

Такой способ небезопасен: пароль хранится в RC-файле открытым текстом.
Если это необходимо, ограничьте права доступа к файлу минимально необходимыми.

Получение токена

  • Откройте Bash, перейдите в каталог с RC-файлом и загрузите переменные командой source или .:

source api-rc

При запросе введите пароль проекта SIM-Cloud.

  • Получите токен командой:

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: содержит токен для 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`` — токен из переменной окружения;
``<METHOD>`` — HTTP-метод GET, HEAD, POST или PUT; по умолчанию GET;
``<URL>`` — конечная точка и путь из документации OpenStack;
после ``-d`` передаётся структура параметров в виде пар ``key:value``;
``| python -mjson.tool`` форматирует JSON-ответ для чтения.

Например, для дальнейшей работы нужен идентификатор проекта.

Выполните запрос:

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`` — токен из переменной окружения;
используется GET по умолчанию;
URL состоит из конечной точки и пути из документации Identity API.

Ответ имеет вид:

{
    "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`` — ``b1a56f59f6f013a061074fdcc56daec0``.

Обработка ответа

При неудачном запросе возвращаются код, сообщение и краткое описание ошибки:

{
    "error": {
        "code": 401,
        "message": "The request you have made requires authentication.",
        "title": "Unauthorized"
    }
}

Коды ответов и рекомендуемые действия приведены в поле Коды состояния документации каждого запроса.