{
  "openapi": "3.0.3",
  "info": {
    "title": "Oxide Propolis Server API",
    "description": "API for interacting with the Propolis hypervisor frontend.",
    "contact": {
      "url": "https://oxide.computer",
      "email": "api@oxide.computer"
    },
    "version": "0.0.1"
  },
  "paths": {
    "/instance": {
      "get": {
        "operationId": "instance_get",
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InstanceGetResponse"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/Error"
          },
          "5XX": {
            "$ref": "#/components/responses/Error"
          }
        }
      },
      "put": {
        "operationId": "instance_ensure",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InstanceEnsureRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "successful creation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InstanceEnsureResponse"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/Error"
          },
          "5XX": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/instance/disk/{id}/snapshot/{snapshot_id}": {
      "post": {
        "summary": "Issue a snapshot request to a crucible backend",
        "operationId": "instance_issue_crucible_snapshot_request",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "style": "simple"
          },
          {
            "in": "path",
            "name": "snapshot_id",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "style": "simple"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "title": "Null",
                  "type": "string",
                  "enum": [
                    null
                  ]
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/Error"
          },
          "5XX": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/instance/migrate/status": {
      "get": {
        "operationId": "instance_migrate_status",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InstanceMigrateStatusRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InstanceMigrateStatusResponse"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/Error"
          },
          "5XX": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/instance/serial": {
      "get": {
        "operationId": "instance_serial",
        "responses": {
          "default": {
            "description": "",
            "content": {
              "*/*": {
                "schema": {}
              }
            }
          }
        },
        "x-dropshot-websocket": {}
      }
    },
    "/instance/state": {
      "put": {
        "operationId": "instance_state_put",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InstanceStateRequested"
              }
            }
          },
          "required": true
        },
        "responses": {
          "204": {
            "description": "resource updated"
          },
          "4XX": {
            "$ref": "#/components/responses/Error"
          },
          "5XX": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    },
    "/instance/state-monitor": {
      "get": {
        "operationId": "instance_state_monitor",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InstanceStateMonitorRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InstanceStateMonitorResponse"
                }
              }
            }
          },
          "4XX": {
            "$ref": "#/components/responses/Error"
          },
          "5XX": {
            "$ref": "#/components/responses/Error"
          }
        }
      }
    }
  },
  "components": {
    "responses": {
      "Error": {
        "description": "Error",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "CrucibleOpts": {
        "type": "object",
        "properties": {
          "cert_pem": {
            "nullable": true,
            "type": "string"
          },
          "control": {
            "nullable": true,
            "type": "string"
          },
          "flush_timeout": {
            "nullable": true,
            "type": "integer",
            "format": "uint32",
            "minimum": 0
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "key": {
            "nullable": true,
            "type": "string"
          },
          "key_pem": {
            "nullable": true,
            "type": "string"
          },
          "lossy": {
            "type": "boolean"
          },
          "read_only": {
            "type": "boolean"
          },
          "root_cert_pem": {
            "nullable": true,
            "type": "string"
          },
          "target": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "id",
          "lossy",
          "read_only",
          "target"
        ]
      },
      "DiskAttachment": {
        "type": "object",
        "properties": {
          "disk_id": {
            "type": "string",
            "format": "uuid"
          },
          "generation_id": {
            "type": "integer",
            "format": "uint64",
            "minimum": 0
          },
          "state": {
            "$ref": "#/components/schemas/DiskAttachmentState"
          }
        },
        "required": [
          "disk_id",
          "generation_id",
          "state"
        ]
      },
      "DiskAttachmentState": {
        "oneOf": [
          {
            "type": "string",
            "enum": [
              "Detached",
              "Destroyed",
              "Faulted"
            ]
          },
          {
            "type": "object",
            "properties": {
              "Attached": {
                "type": "string",
                "format": "uuid"
              }
            },
            "required": [
              "Attached"
            ],
            "additionalProperties": false
          }
        ]
      },
      "DiskRequest": {
        "type": "object",
        "properties": {
          "device": {
            "type": "string"
          },
          "gen": {
            "type": "integer",
            "format": "uint64",
            "minimum": 0
          },
          "name": {
            "type": "string"
          },
          "read_only": {
            "type": "boolean"
          },
          "slot": {
            "$ref": "#/components/schemas/Slot"
          },
          "volume_construction_request": {
            "$ref": "#/components/schemas/VolumeConstructionRequest"
          }
        },
        "required": [
          "device",
          "gen",
          "name",
          "read_only",
          "slot",
          "volume_construction_request"
        ]
      },
      "Error": {
        "description": "Error information from a response.",
        "type": "object",
        "properties": {
          "error_code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "request_id": {
            "type": "string"
          }
        },
        "required": [
          "message",
          "request_id"
        ]
      },
      "Instance": {
        "type": "object",
        "properties": {
          "disks": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DiskAttachment"
            }
          },
          "nics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkInterface"
            }
          },
          "properties": {
            "$ref": "#/components/schemas/InstanceProperties"
          },
          "state": {
            "$ref": "#/components/schemas/InstanceState"
          }
        },
        "required": [
          "disks",
          "nics",
          "properties",
          "state"
        ]
      },
      "InstanceEnsureRequest": {
        "type": "object",
        "properties": {
          "cloud_init_bytes": {
            "nullable": true,
            "type": "string"
          },
          "disks": {
            "default": [],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DiskRequest"
            }
          },
          "migrate": {
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/InstanceMigrateInitiateRequest"
              }
            ]
          },
          "nics": {
            "default": [],
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NetworkInterfaceRequest"
            }
          },
          "properties": {
            "$ref": "#/components/schemas/InstanceProperties"
          }
        },
        "required": [
          "properties"
        ]
      },
      "InstanceEnsureResponse": {
        "type": "object",
        "properties": {
          "migrate": {
            "nullable": true,
            "allOf": [
              {
                "$ref": "#/components/schemas/InstanceMigrateInitiateResponse"
              }
            ]
          }
        }
      },
      "InstanceGetResponse": {
        "type": "object",
        "properties": {
          "instance": {
            "$ref": "#/components/schemas/Instance"
          }
        },
        "required": [
          "instance"
        ]
      },
      "InstanceMigrateInitiateRequest": {
        "type": "object",
        "properties": {
          "migration_id": {
            "type": "string",
            "format": "uuid"
          },
          "src_addr": {
            "type": "string"
          },
          "src_uuid": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "migration_id",
          "src_addr",
          "src_uuid"
        ]
      },
      "InstanceMigrateInitiateResponse": {
        "type": "object",
        "properties": {
          "migration_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "migration_id"
        ]
      },
      "InstanceMigrateStatusRequest": {
        "type": "object",
        "properties": {
          "migration_id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "migration_id"
        ]
      },
      "InstanceMigrateStatusResponse": {
        "type": "object",
        "properties": {
          "state": {
            "$ref": "#/components/schemas/MigrationState"
          }
        },
        "required": [
          "state"
        ]
      },
      "InstanceProperties": {
        "type": "object",
        "properties": {
          "bootrom_id": {
            "description": "ID of the bootrom used to initialize this Instance.",
            "type": "string",
            "format": "uuid"
          },
          "description": {
            "description": "Free-form text description of an Instance.",
            "type": "string"
          },
          "id": {
            "description": "Unique identifier for this Instance.",
            "type": "string",
            "format": "uuid"
          },
          "image_id": {
            "description": "ID of the image used to initialize this Instance.",
            "type": "string",
            "format": "uuid"
          },
          "memory": {
            "description": "Size of memory allocated to the Instance, in MiB.",
            "type": "integer",
            "format": "uint64",
            "minimum": 0
          },
          "name": {
            "description": "Human-readable name of the Instance.",
            "type": "string"
          },
          "vcpus": {
            "description": "Number of vCPUs to be allocated to the Instance.",
            "type": "integer",
            "format": "uint8",
            "minimum": 0
          }
        },
        "required": [
          "bootrom_id",
          "description",
          "id",
          "image_id",
          "memory",
          "name",
          "vcpus"
        ]
      },
      "InstanceState": {
        "description": "Current state of an Instance.",
        "type": "string",
        "enum": [
          "Creating",
          "Starting",
          "Running",
          "Stopping",
          "Stopped",
          "Rebooting",
          "Migrating",
          "Repairing",
          "Failed",
          "Destroyed"
        ]
      },
      "InstanceStateMonitorRequest": {
        "type": "object",
        "properties": {
          "gen": {
            "type": "integer",
            "format": "uint64",
            "minimum": 0
          }
        },
        "required": [
          "gen"
        ]
      },
      "InstanceStateMonitorResponse": {
        "type": "object",
        "properties": {
          "gen": {
            "type": "integer",
            "format": "uint64",
            "minimum": 0
          },
          "state": {
            "$ref": "#/components/schemas/InstanceState"
          }
        },
        "required": [
          "gen",
          "state"
        ]
      },
      "InstanceStateRequested": {
        "type": "string",
        "enum": [
          "Run",
          "Stop",
          "Reboot",
          "MigrateStart"
        ]
      },
      "MigrationState": {
        "type": "string",
        "enum": [
          "Sync",
          "RamPush",
          "Pause",
          "RamPushDirty",
          "Device",
          "Arch",
          "Resume",
          "RamPull",
          "Finish",
          "Error"
        ]
      },
      "NetworkInterface": {
        "type": "object",
        "properties": {
          "attachment": {
            "$ref": "#/components/schemas/NetworkInterfaceAttachmentState"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "attachment",
          "name"
        ]
      },
      "NetworkInterfaceAttachmentState": {
        "oneOf": [
          {
            "type": "string",
            "enum": [
              "Detached",
              "Faulted"
            ]
          },
          {
            "type": "object",
            "properties": {
              "Attached": {
                "$ref": "#/components/schemas/Slot"
              }
            },
            "required": [
              "Attached"
            ],
            "additionalProperties": false
          }
        ]
      },
      "NetworkInterfaceRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "slot": {
            "$ref": "#/components/schemas/Slot"
          }
        },
        "required": [
          "name",
          "slot"
        ]
      },
      "Slot": {
        "description": "A stable index which is translated by Propolis into a PCI BDF, visible to the guest.",
        "type": "integer",
        "format": "uint8",
        "minimum": 0
      },
      "VolumeConstructionRequest": {
        "oneOf": [
          {
            "type": "object",
            "properties": {
              "block_size": {
                "type": "integer",
                "format": "uint64",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "read_only_parent": {
                "nullable": true,
                "allOf": [
                  {
                    "$ref": "#/components/schemas/VolumeConstructionRequest"
                  }
                ]
              },
              "sub_volumes": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/VolumeConstructionRequest"
                }
              },
              "type": {
                "type": "string",
                "enum": [
                  "volume"
                ]
              }
            },
            "required": [
              "block_size",
              "id",
              "sub_volumes",
              "type"
            ]
          },
          {
            "type": "object",
            "properties": {
              "block_size": {
                "type": "integer",
                "format": "uint64",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "type": {
                "type": "string",
                "enum": [
                  "url"
                ]
              },
              "url": {
                "type": "string"
              }
            },
            "required": [
              "block_size",
              "id",
              "type",
              "url"
            ]
          },
          {
            "type": "object",
            "properties": {
              "block_size": {
                "type": "integer",
                "format": "uint64",
                "minimum": 0
              },
              "gen": {
                "type": "integer",
                "format": "uint64",
                "minimum": 0
              },
              "opts": {
                "$ref": "#/components/schemas/CrucibleOpts"
              },
              "type": {
                "type": "string",
                "enum": [
                  "region"
                ]
              }
            },
            "required": [
              "block_size",
              "gen",
              "opts",
              "type"
            ]
          },
          {
            "type": "object",
            "properties": {
              "block_size": {
                "type": "integer",
                "format": "uint64",
                "minimum": 0
              },
              "id": {
                "type": "string",
                "format": "uuid"
              },
              "path": {
                "type": "string"
              },
              "type": {
                "type": "string",
                "enum": [
                  "file"
                ]
              }
            },
            "required": [
              "block_size",
              "id",
              "path",
              "type"
            ]
          }
        ]
      }
    }
  }
}