Керування проєктом через API за допомогою cURL у Linux

Робота з API складається з таких етапів:

Автентифікація за допомогою RC-файла

Для отримання токена та подальшої роботи з API потрібно автентифікуватися в 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-файла система один раз запросить пароль хмарного проєкту.
Щоб не вводити пароль вручну, відкрийте 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={Your password to access the service}

Попередження

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`` форматує відповідь для зручного читання.

Наприклад, для подальшої роботи потрібно дізнатися 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 — ідентифікатор токена зі змінної середовища;
метод не вказано, тому використовується 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 проєкту ``id`` — ``b1a56f59f6f013a061074fdcc56daec0``.

Обробка відповіді

Якщо запит завершився помилкою, сервіс поверне код, повідомлення та короткий опис причини:

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

Повний перелік можливих кодів відповіді та рекомендованих дій наведено в полі Коди стану документації відповідного запиту.