245 lines
7.1 KiB
YAML
245 lines
7.1 KiB
YAML
openapi: 3.0.3
|
||
info:
|
||
title: Proxmox Image Conversion Engine
|
||
description: |
|
||
Backend API that runs on the Proxmox host (`srv2`) to convert VMware images
|
||
(VMDK, VHD, etc.) to Proxmox‑compatible QCOW2, optionally shrink the disk,
|
||
and provision a VM with automatic boot‑type detection.
|
||
version: 1.1.0
|
||
contact:
|
||
name: Support
|
||
url: https://github.com/your-org/converter
|
||
|
||
servers:
|
||
- url: http://10.2.0.2:9000/api/v1
|
||
description: Internal Proxmox host (srv2)
|
||
|
||
paths:
|
||
/jobs:
|
||
post:
|
||
summary: Submit a new VM conversion and creation job
|
||
operationId: createJob
|
||
requestBody:
|
||
required: true
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/JobSubmissionRequest'
|
||
responses:
|
||
'202':
|
||
description: Job accepted and queued for processing
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/JobStatusResponse'
|
||
'400':
|
||
description: Invalid request or source file not found
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/ErrorResponse'
|
||
|
||
/jobs/{job_id}:
|
||
get:
|
||
summary: Get the current status of a conversion job
|
||
operationId: getJobStatus
|
||
parameters:
|
||
- name: job_id
|
||
in: path
|
||
required: true
|
||
schema:
|
||
type: string
|
||
example: "job_10007_1784637888"
|
||
responses:
|
||
'200':
|
||
description: Job status details
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/JobStatusResponse'
|
||
'404':
|
||
description: Job not found
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/ErrorResponse'
|
||
|
||
/jobs/{job_id}/cleanup:
|
||
post:
|
||
summary: Delete staging files or preserve them for reuse
|
||
operationId: cleanupJob
|
||
parameters:
|
||
- name: job_id
|
||
in: path
|
||
required: true
|
||
schema:
|
||
type: string
|
||
example: "job_10007_1784637888"
|
||
requestBody:
|
||
required: true
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: '#/components/schemas/CleanupRequest'
|
||
responses:
|
||
'200':
|
||
description: Cleanup action performed
|
||
content:
|
||
application/json:
|
||
schema:
|
||
type: object
|
||
properties:
|
||
job_id:
|
||
type: string
|
||
action_taken:
|
||
type: string
|
||
enum: [purged, retained]
|
||
message:
|
||
type: string
|
||
|
||
/health:
|
||
get:
|
||
summary: Health check endpoint
|
||
operationId: healthCheck
|
||
responses:
|
||
'200':
|
||
description: Service is healthy
|
||
content:
|
||
application/json:
|
||
schema:
|
||
type: object
|
||
properties:
|
||
status:
|
||
type: string
|
||
example: ok
|
||
|
||
components:
|
||
schemas:
|
||
DiskSpec:
|
||
type: object
|
||
required:
|
||
- disk_type
|
||
properties:
|
||
disk_type:
|
||
type: string
|
||
enum: [image_file, empty_disk]
|
||
description: |
|
||
`image_file` – convert an existing file from `source_filename`.
|
||
`empty_disk` – create a blank disk of the given `size_gb`.
|
||
source_filename:
|
||
type: string
|
||
nullable: true
|
||
description: Path relative to `/mnt/converter/in` (required if `disk_type=image_file`)
|
||
example: "64bit/Debian 12.11.0 (64bit).vmdk"
|
||
size_gb:
|
||
type: integer
|
||
nullable: true
|
||
description: Size in GiB (required if `disk_type=empty_disk`)
|
||
example: 50
|
||
format:
|
||
type: string
|
||
enum: [qcow2, raw, vmdk]
|
||
default: qcow2
|
||
description: Source image format (for `image_file`)
|
||
|
||
JobSubmissionRequest:
|
||
type: object
|
||
required:
|
||
- vmid
|
||
- vm_name
|
||
- boot_disk
|
||
properties:
|
||
vmid:
|
||
type: integer
|
||
description: Proxmox VM ID (must be unique on host)
|
||
example: 10007
|
||
vm_name:
|
||
type: string
|
||
description: Display name for the VM
|
||
example: "debian-default-shrink"
|
||
boot_type:
|
||
type: string
|
||
enum: [uefi, legacy]
|
||
default: uefi
|
||
description: Boot firmware type (ignored if `auto_detect_boot=true`)
|
||
auto_detect_boot:
|
||
type: boolean
|
||
default: true
|
||
description: |
|
||
If `true`, automatically detects whether the disk is EFI‑bootable and
|
||
overrides `boot_type`. Falls back to `legacy` if detection fails.
|
||
cpu_cores:
|
||
type: integer
|
||
default: 4
|
||
minimum: 1
|
||
example: 2
|
||
ram_mb:
|
||
type: integer
|
||
default: 8192
|
||
minimum: 512
|
||
example: 4096
|
||
target_storage:
|
||
type: string
|
||
default: "local-lvm"
|
||
description: Proxmox storage pool for the VM disks
|
||
example: "local-lvm"
|
||
boot_disk:
|
||
$ref: '#/components/schemas/DiskSpec'
|
||
additional_disks:
|
||
type: array
|
||
items:
|
||
$ref: '#/components/schemas/DiskSpec'
|
||
description: Additional data disks (converted or empty)
|
||
target_disk_size_gb:
|
||
type: integer
|
||
nullable: true
|
||
description: |
|
||
If provided, the boot disk (and only the boot disk) is resized to this
|
||
size (GiB). If omitted and the boot disk is larger than 30 GiB, it is
|
||
automatically shrunk to 30 GiB. Only shrinks when disk_type=image_file.
|
||
example: 40
|
||
|
||
JobStatusResponse:
|
||
type: object
|
||
properties:
|
||
job_id:
|
||
type: string
|
||
example: "job_10007_1784637888"
|
||
vmid:
|
||
type: integer
|
||
example: 10007
|
||
status:
|
||
type: string
|
||
enum: [queued, processing_conversion, importing_storage, completed, failed]
|
||
description: Current job phase
|
||
progress_percentage:
|
||
type: integer
|
||
minimum: 0
|
||
maximum: 100
|
||
example: 75
|
||
message:
|
||
type: string
|
||
description: Human‑readable status message
|
||
example: "Creating VM and importing disks..."
|
||
error_details:
|
||
type: string
|
||
nullable: true
|
||
description: If status is `failed`, contains the error reason
|
||
|
||
CleanupRequest:
|
||
type: object
|
||
required:
|
||
- delete_staging_files
|
||
properties:
|
||
delete_staging_files:
|
||
type: boolean
|
||
description: |
|
||
`true` – delete extracted source files and converted disk images.
|
||
`false` – keep files so another VM can be created from the same source.
|
||
|
||
ErrorResponse:
|
||
type: object
|
||
properties:
|
||
detail:
|
||
type: string
|
||
example: "Source file not found: 64bit/Debian 12.11.0 (64bit).vmdk"
|