CPVM HTTP API: Snapshots

Upload snapshot (multiple requests)

Create empty snapshot

curl -XPOST --netrc \
-H "Content-Type: application/json" \
-d "@sn_meta.json" \
https://api.acapella.ru/cb/newSnapshot
  • Если в параметрах не указать snapshotName или snapshotTag, то они будут сгенерированы и придут в ответе.
  • Если в параметрах запроса указать список хешей фрагментов, то сервер будет искать существующий замороженный снапшот с таким же набором хешей в CB и, если такой будет найден, может вернуть его как результат запроса (в этом случае в метаданных снапшота будет стоять свойство frozen = true).

Также сервер может найти частичное совпадение по хешам отдельных фрагментов, и в этом случае они автоматически добавляются в новый снапшот.

sn_meta.json:

{
    "name": "my-project",
    "tag": "1.0",
    "removeAfterExecute": false,
    "expirationTimeSec": 3600,
    "accessLevel": "Invisible",
    "accessPerUser": {
        "user123": "Visisble",
        "vasya1999": "ReadWrite"
    },
    "fileHashes": {
        "existing/file/fragment.py": {
            // hash sum of fragment content
            "sha1": "994b9399061fa0f57b3cf6849407cfbc8f5ea1d0",
            // ro - Read Only, exe - Executable
            "permissions": { "ro": false, "exe": true }
        },
        "another/file.txt": {
            "sha1": "d11ad1d3fe8152b570915df3cb8406e3629bf00e",
            "permissions": { "ro": true, "exe": false }
        }
    }
}
  • removeAfterExecute удаление снапшота сразу после первого исполнения (нельзя запустить более одного раза)
  • expirationTimeSec автоматическое удаление снапшота по истечению указанного периода времени с момента запроса
  • fileHashes словарь <file_path> -> <SHA1(file_content)>. Существующие в CB файлы с данными хешами будут автоматически добавлены в снапшот, вплость до того, что CB может возвратить существующий снапшот как результат (при полном совпадении).

Response:

{
    "snapshot": {},
    "notFound": [
        "d11ad1d3fe8152b570915df3cb8406e3629bf00e"
    ]
}
  • snapshot: same as metadata in request, but also with all names and tags generated
  • notFound: file hashes, that are not found in fragment repository

Upload files

Upload file fragment.py to snapshot my-project/1.0 at path existing/file/fragment.py:

curl -XPOST --netrc -d "@fragment.py" \
https://api.acapella.ru/cb/snapshots/my-project/1.0/files/existing/file/fragment.py

Freeze snapshot

После заморозки снапшот становится доступным для исполнения и недоступным для изменения.

curl -XPOST --netrc https://api.acapella.ru/cb/snapshots/my-project/1.0/freeze

Upload snapshot (1 request)

Если снапшот имеет небольшой суммарный размер, то имеет смысл залить и заморозить его с помощью одного запроса:

curl -XPOST --netrc \
-H "Content-Type: application/json" \
-d "@snanpshot.json" \
https://api.acapella.ru/cb/snapshot

snanpshot.json:

{
    "meta": {
        "name": "my-project",
        "tag": "1.0",
        "removeAfterExecute": false,
        "expirationTimeSec": 3600,
        "accessLevel": "Invisible",
        "accessPerUser": {
            "user123": "Visisble",
            "vasya1999": "ReadWrite"
        },
        "fileHashes": {
            "another/file.txt": {
                "sha1": "d11ad1d3fe8152b570915df3cb8406e3629bf00e",
                "permissions": { "ro": true, "exe": false }
            }
        }
    },
    "files": {
        "existing/file/fragment.py": {
            // base64
            "content": "aW1wb3J0IGFwXG5wcmludChhcC51c2VyLmlkKVxucHJpbnQoYXAudHJhbnNhY3Rpb24uaWQpCg==",
            "permissions": { "ro": true, "exe": false }
        }
    }
}

Response is the same as in cb/newSnapshot

Remove snapshot

curl -XDELETE --netrc https://api.acapella.ru/cb/snapshots/my-project/1.0