VCenter: REST API: как загрузить яйцеклетку в библиотеку контента
Я пытаюсь создать виртуальную машину из ova, используя REST API. Я могу сделать это с помощью этого API отдыха:
https://vcenter_ip/rest/com/vmware/vcenter/ovf/library-item/id:<library_item_id_ie_ova_item>?~action=deploy
Для этого я загрузил яйцеклетку через клиента VSphere. (Библиотека содержимого-> Выбрать библиотеку-> Импортировать элемент-> Выбрать.ovf-файл из локального -> (предлагает выбрать эталонные файлы) выбрать зависимый.vmdk из локального)
Но я хочу выполнить загрузку через Rest API.
Шаги, которые я сделал до сих пор:
- Создать библиотеку
URL: https://vcenter_ip/rest/com/vmware/content/local-library
Method: POST
Headers:
Key:Content-Type
value: application/json
Request Body:
{
"create_spec": {
"name": "CL1",
"description": "CL1 Desc",
"publish_info": {
"authentication_method": "NONE",
"persist_json_enabled": false,
"published": false
},
"storage_backings": [
{
"datastore_id": "datastore-144",
"type": "DATASTORE"
}
],
"type": "LOCAL"
}
}
- Создать элемент библиотеки
URL: https://vcenter_ip/rest/com/vmware/content/library/item
Method: POST
Headers:
Key:Content-Type
value: application/json
Request Body:
{
"create_spec": {
"library_id": "<library_id",
"description": "mydesc",
"name": "Damn Small Linux",
"type": "ovf"
}
}
- Создать новую сессию обновления
URL: https://vcenter_ip/rest/com/vmware/content/library/item/update-session
Method: POST
Headers:
Key:Content-Type
value: application/json
Request Body:
{
"create_spec":{
"library_item_id": "<lib_item_id>"
}
}
Response:
{
"value": "26f143a2-fb9d-4ed9-bd5f-c7be5825ee37:ec4f8df0-249f-4887-ab84-0933f86e106c"
}
Затем я пытаюсь загрузить файлы в библиотеку контента, и именно здесь у меня возникают проблемы.
- Загрузить ovf
4 (а). запросить конечную точку для загрузки файла.ovf
Method: POST
Headers:
Key:Content-Type
value: application/json
Key:update_session_id
value: 26f143a2-fb9d-4ed9-bd5f-c7be5825ee37:ec4f8df0-249f-4887-ab84-0933f86e106c
{
"file_spec": {
"source_type": "PUSH",
"name": "Damn Small Linux.ovf",
"size": 9
}
}
Тело ответа:
{
"value": {
"bytes_transferred": 0,
"upload_endpoint": {
"uri": "https://<vcenter_ip>:443/cls/data/1a5129a1-87e8-4650-855d-9041c493c475/Damn%20Small%20Linux.ovf"
},
"name": "Damn Small Linux.ovf",
"source_type": "PUSH",
"status": "WAITING_FOR_TRANSFER"
}
}
4 (б). Выгрузка на этот URI с помощью запроса put с файлом, загруженным в виде данных многоэлементной формы (я сделал это с почтальоном, остальные звонки я сделал через Vcenter api explorer)
4 (с). Проверить файл в сеансе обновления
URL: https://vcenter_ip/rest/com/vmware/content/library/item/updatesession/file/id:26f143a2-fb9d-4ed9-bd5f-c7be5825ee37%3Aec4f8df0-249f-4887-ab84-0933f86e106c?~action=validate
Method: POST
Headers:
Key:Content-Type
value: application/json
Key:update_session_id
value: 26f143a2-fb9d-4ed9-bd5f-c7be5825ee37:ec4f8df0-249f-4887-ab84-0933f86e106c
Response Body:
{
"value": {
"has_errors": true,
"invalid_files": [
{
"error_message": {
"args": [
"Damn Small Linux.ovf",
"1:1:PARSE_ERROR: Parse error: Unexpected character '-' (code 45) in prolog; expected '<'\r\n at [row,col {unknown-source}]: [1,1].\r\n"
],
"default_message": "File Damn Small Linux.ovf was considered invalid. Reason: 1:1:PARSE_ERROR: Parse error: Unexpected character '-' (code 45) in prolog; expected '<'\r\n at [row,col {unknown-source}]: [1,1].\r\n.",
"id": "com.vmware.vdcs.cls-main.update_session_file_validation"
},
"name": "Damn Small Linux.ovf"
}
],
"missing_files": []
}
}
Но это тот же файл, который я загрузил при успешной загрузке через клиент vsphere.
В чем здесь проблема? И как мне после этого загрузить ссылку.vmdk после этого?
1 ответ
Это старый вопрос, но я поставлю ответ, если кто-то столкнется с этим:
Чтобы это работало, при загрузке данных необходимы две настройки PUT
:
- Установить заголовки
Content-Type
какapplication/octet-stream
- Под телом убедитесь, что вы выбрали двоичный файл для (ovf) файла