Cloud Providers & VM Provisioning
Connect VMware vCenter or Proxmox VE to Skitflow and provision VMs directly from the dashboard (self-hosted + enterprise only).
Cloud Providers are self-hosted only and require an active enterprise
license or trial with the cloudProviders feature enabled.
Skitflow can connect to on-premises hypervisors and provision virtual machines on demand. Supported backends:
| Type | Hypervisor |
|---|---|
vmware | VMware vCenter (ESXi) |
proxmox | Proxmox VE |
Permissions
Three roles govern access. Owners and admins bypass permission checks automatically.
| Permission | What it allows |
|---|---|
cloud.manage | Create/update/delete providers, VM tiers, and VM orders |
cloud.order | Order VMs and delete their org's VM orders |
cloud.read | Read-only access to providers, tiers, and orders |
Configure roles under Settings → Custom Roles.
Cloud Providers
A cloud provider is the connection record for a hypervisor endpoint. Credentials are stored AES-GCM encrypted.
Adding a provider
Navigate to Settings → Cloud Providers → Add Provider and fill in:
| Field | Description |
|---|---|
| Name | Display label |
| Type | vmware or proxmox |
| Host | vCenter/Proxmox hostname or IP |
| Auth mode | password (username + password) or token (API token) |
| Username | Service account username |
| Password / Token | Credential (write-only — not readable after save) |
| Skip TLS verification | Disable certificate verification for self-signed certs |
Click Test Connection to verify before saving.
Managing providers
| Action | Notes |
|---|---|
| Edit | All fields except type can be updated. Password is re-encrypted only when a new value is submitted. |
| Delete | Removes the provider record. Associated VM tiers and VM order (provision) records are cascade-deleted. Registered server rows and running VMs are not touched. |
| Inventory | Fetches the live resource list from the hypervisor (networks, datastores, templates, resource pools for VMware; nodes, storages, bridges, templates for Proxmox). |
API examples
# List providers
curl -X GET 'https://your-instance/api/cloud.listProviders' \
-H 'x-api-key: YOUR_API_KEY'
# Create a VMware provider
curl -X POST 'https://your-instance/api/cloud.createProvider' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": "vCenter Dev",
"providerType": "vmware",
"authMode": "password",
"host": "vcenter.internal",
"username": "[email protected]",
"password": "secret",
"skipTlsVerify": false
}'
# Test a connection without saving
curl -X POST 'https://your-instance/api/cloud.testProvider' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"providerType": "proxmox",
"authMode": "token",
"host": "proxmox.internal:8006",
"username": "root@pam",
"password": "TOKEN_VALUE",
"skipTlsVerify": true
}'VM Tiers
A VM tier is a saved hardware + placement template attached to one provider. Members with cloud.order can order VMs from tiers without needing cloud.manage.
VMware tier placement fields
| Field | Description |
|---|---|
templateMoid | Source VM/template managed object ID |
networkMoid | Target network/portgroup MOID |
datastoreMoid | Target datastore MOID |
resourcePoolMoid | Resource pool MOID |
folderMoid | (optional) Destination folder MOID |
Proxmox tier placement fields
| Field | Description |
|---|---|
templateVmid | Source template VMID |
node | Target Proxmox node name |
storageId | (optional) Storage for the cloned disk |
bridge | (optional) Network bridge; if omitted, the template's existing network config is kept. vlanTag is only applied when bridge is set. |
vlanTag | (optional) VLAN tag 1–4094 |
ipAddress | (optional) Static IP for cloud-init |
ipCidr | (optional) Prefix length (0–32) |
gateway | (optional) Default gateway |
sshUsername | (optional) Username injected via cloud-init |
extraDiskGb | (optional) Additional data disk size |
extraDiskStorageId | (optional) Storage for the extra disk |
Common hardware fields (both types)
| Field | Description |
|---|---|
cpu | vCPU count (≥ 1) |
memoryMb | RAM in MiB (≥ 256) |
diskGb | Root disk size in GiB (≥ 1) |
sshKeyId | (optional) SSH key to inject (must belong to the same org) |
cloudInitExtra | (optional) Additional cloud-init user-data |
API examples
# List tiers for a provider
curl -X GET 'https://your-instance/api/cloud.listTiers?cloudProviderId=PROVIDER_ID' \
-H 'x-api-key: YOUR_API_KEY'
# Create a Proxmox tier
curl -X POST 'https://your-instance/api/cloud.createTier' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": "2vCPU / 4 GB",
"cloudProviderId": "PROVIDER_ID",
"cpu": 2,
"memoryMb": 4096,
"diskGb": 40,
"placement": {
"kind": "proxmox",
"templateVmid": 9000,
"node": "pve01",
"bridge": "vmbr0"
}
}'VM Provisioning
A VM provision (order) tracks one VM lifecycle from request through hypervisor deployment to a registered Skitflow server.
Ordering a VM
Navigate to Settings → Servers → Order VM (also available from Settings → Cloud Providers). Choose a saved tier or fill in ad-hoc custom parameters.
For Proxmox orders from a tier, you can override the IP address and extra disk at order time without changing the tier.
Order payload (from tier)
curl -X POST 'https://your-instance/api/cloud.orderVm' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"vmName": "app-01",
"vmTierId": "TIER_ID"
}'Order payload (custom, VMware)
curl -X POST 'https://your-instance/api/cloud.orderVm' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"vmName": "app-02",
"cloudProviderId": "PROVIDER_ID",
"custom": {
"kind": "vmware",
"cpu": 4,
"memoryMb": 8192,
"diskGb": 80,
"templateMoid": "vm-100",
"networkMoid": "network-10",
"datastoreMoid": "datastore-5",
"resourcePoolMoid": "resgroup-8"
}
}'Provision status lifecycle
pending → cloning → customizing ─┬→ waiting_ip → ready
│ ↘ failed
└──────────────────↘ manual| Status | Meaning |
|---|---|
pending | Queued, not yet started |
cloning | Hypervisor is cloning the template |
customizing | Applying CPU/RAM/disk/network configuration |
waiting_ip | Waiting for the VM to report an IP address. Skipped entirely for a Proxmox order with a static ipAddress — that address is used directly. |
ready | VM is running and registered as a Skitflow server |
failed | Provisioning failed — see errorMessage on the provision record |
manual | VM was created but requires manual server registration — either no SSH key/cloud-init failed (reached straight from customizing) or the IP poll timed out after waiting_ip. errorMessage states which case applies. |
Once ready, the provisioned VM appears in Servers and can be used for deployments.
Deleting a provision
Deleting a provision:
- Destroys the VM on the hypervisor (best-effort — a connection failure is logged but does not block deletion).
- Removes the linked server record from the Servers list.
- Deletes the provision row.
curl -X POST 'https://your-instance/api/cloud.removeProvision' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{"vmProvisionId": "PROVISION_ID"}'Audit log
Every create, update, and delete action on providers, tiers, and provisions is recorded in Audit Logs under resource types cloud-provider, vm-tier, and vm-provision.