incus-mirror/shared/api/storage_pool_volume.go
Stéphane Graber a172b4ef43
shared/api: Add StorageVolumeRebuildPost
Signed-off-by: Stéphane Graber <stgraber@stgraber.org>
2026-05-26 18:35:05 -04:00

282 lines
7.9 KiB
Go

package api
import (
"time"
)
// StorageVolumesPost represents the fields of a new storage pool volume
//
// swagger:model
//
// API extension: storage.
type StorageVolumesPost struct {
StorageVolumePut `yaml:",inline"`
// Volume name
// Example: foo
Name string `json:"name" yaml:"name"`
// Volume type (container, custom, image or virtual-machine)
// Example: custom
Type string `json:"type" yaml:"type"`
// Migration source
//
// API extension: storage_api_local_volume_handling
Source StorageVolumeSource `json:"source" yaml:"source"`
// Volume content type (filesystem or block)
// Example: filesystem
//
// API extension: custom_block_volumes
ContentType string `json:"content_type" yaml:"content_type"`
}
// StorageVolumePost represents the fields required to rename a storage pool volume
//
// swagger:model
//
// API extension: storage_api_volume_rename.
type StorageVolumePost struct {
// New volume name
// Example: foo
Name string `json:"name" yaml:"name"`
// New storage pool
// Example: remote
//
// API extension: storage_api_local_volume_handling
Pool string `json:"pool,omitempty" yaml:"pool,omitempty"`
// Initiate volume migration
// Example: false
//
// API extension: storage_api_remote_volume_handling
Migration bool `json:"migration" yaml:"migration"`
// Migration target (for push mode)
//
// API extension: storage_api_remote_volume_handling
Target *StorageVolumePostTarget `json:"target" yaml:"target"`
// Whether snapshots should be discarded (migration only)
// Example: false
//
// API extension: storage_api_remote_volume_snapshots
VolumeOnly bool `json:"volume_only" yaml:"volume_only"`
// New project name
// Example: foo
//
// API extension: storage_volume_project_move
Project string `json:"project,omitempty" yaml:"project,omitempty"`
// Migration source
//
// API extension: cluster_internal_custom_volume_copy
Source StorageVolumeSource `json:"source" yaml:"source"`
}
// StorageVolumePostTarget represents the migration target host and operation
//
// swagger:model
//
// API extension: storage_api_remote_volume_handling.
type StorageVolumePostTarget struct {
// The certificate of the migration target
// Example: X509 PEM certificate
Certificate string `json:"certificate" yaml:"certificate"`
// Remote operation URL (for migration)
// Example: https://1.2.3.4:8443/1.0/operations/1721ae08-b6a8-416a-9614-3f89302466e1
Operation string `json:"operation,omitempty" yaml:"operation,omitempty"`
// Migration websockets credentials
// Example: {"migration": "random-string"}
Websockets map[string]string `json:"secrets,omitempty" yaml:"secrets,omitempty"`
}
// StorageVolumeFull is a combination of StorageVolume, StorageVolumeBackup, StorageVolumeSnapshot and StorageVolumeState.
//
// swagger:model
//
// API extension: storage_volume_full.
type StorageVolumeFull struct {
StorageVolume `yaml:",inline"`
// List of backups.
Backups []StorageVolumeBackup `json:"backups" yaml:"backups"`
// List of snapshots.
Snapshots []StorageVolumeSnapshot `json:"snapshots" yaml:"snapshots"`
// State.
State *StorageVolumeState `json:"state" yaml:"state"`
}
// StorageVolume represents the fields of a storage volume.
//
// swagger:model
//
// API extension: storage.
type StorageVolume struct {
StorageVolumePut `yaml:",inline"`
// Volume name
// Example: foo
Name string `json:"name" yaml:"name"`
// Volume type
// Example: custom
Type string `json:"type" yaml:"type"`
// List of URLs of objects using this storage volume
// Example: ["/1.0/instances/blah"]
UsedBy []string `json:"used_by" yaml:"used_by"`
// What cluster member this record was found on
// Example: server01
//
// API extension: clustering
Location string `json:"location" yaml:"location"`
// Volume content type (filesystem or block)
// Example: filesystem
//
// API extension: custom_block_volumes
ContentType string `json:"content_type" yaml:"content_type"`
// Project containing the volume.
// Example: default
//
// API extension: storage_volumes_all_projects
Project string `json:"project" yaml:"project"`
// Volume creation timestamp
// Example: 2021-03-23T20:00:00-04:00
// API extension: storage_volumes_created_at
CreatedAt time.Time `json:"created_at" yaml:"created_at"`
}
// URL returns the URL for the volume.
func (v *StorageVolume) URL(apiVersion string, poolName string) *URL {
u := NewURL()
volName, snapName, isSnap := GetParentAndSnapshotName(v.Name)
if isSnap {
u = u.Path(apiVersion, "storage-pools", poolName, "volumes", v.Type, volName, "snapshots", snapName)
} else {
u = u.Path(apiVersion, "storage-pools", poolName, "volumes", v.Type, volName)
}
return u.Project(v.Project).Target(v.Location)
}
// StorageVolumePut represents the modifiable fields of a storage volume
//
// swagger:model
//
// API extension: storage.
type StorageVolumePut struct {
// Storage volume configuration map (refer to doc/storage.md)
// Example: {"zfs.remove_snapshots": "true", "size": "50GiB"}
Config ConfigMap `json:"config" yaml:"config"`
// Description of the storage volume
// Example: My custom volume
//
// API extension: entity_description
Description string `json:"description" yaml:"description"`
// Name of a snapshot to restore
// Example: snap0
//
// API extension: storage_api_volume_snapshots
Restore string `json:"restore,omitempty" yaml:"restore,omitempty"`
}
// StorageVolumeSource represents the creation source for a new storage volume
//
// swagger:model
//
// API extension: storage_api_local_volume_handling.
type StorageVolumeSource struct {
// Source volume name (for copy)
// Example: foo
Name string `json:"name" yaml:"name"`
// Source type (copy or migration)
// Example: copy
Type string `json:"type" yaml:"type"`
// Source storage pool (for copy)
// Example: local
Pool string `json:"pool" yaml:"pool"`
// Certificate (for migration)
// Example: X509 PEM certificate
//
// API extension: storage_api_remote_volume_handling
Certificate string `json:"certificate" yaml:"certificate"`
// Whether to use pull or push mode (for migration)
// Example: pull
//
// API extension: storage_api_remote_volume_handling
Mode string `json:"mode,omitempty" yaml:"mode,omitempty"`
// Remote operation URL (for migration)
// Example: https://1.2.3.4:8443/1.0/operations/1721ae08-b6a8-416a-9614-3f89302466e1
//
// API extension: storage_api_remote_volume_handling
Operation string `json:"operation,omitempty" yaml:"operation,omitempty"`
// Map of migration websockets (for migration)
// Example: {"rsync": "RANDOM-STRING"}
//
// API extension: storage_api_remote_volume_handling
Websockets map[string]string `json:"secrets,omitempty" yaml:"secrets,omitempty"`
// Whether snapshots should be discarded (for migration)
// Example: false
//
// API extension: storage_api_volume_snapshots
VolumeOnly bool `json:"volume_only" yaml:"volume_only"`
// Whether existing destination volume should be refreshed
// Example: false
//
// API extension: custom_volume_refresh
Refresh bool `json:"refresh" yaml:"refresh"`
// Whether to exclude source snapshots earlier than latest target snapshot
// Example: false
//
// API extension: custom_volume_refresh_exclude_older_snapshots
RefreshExcludeOlder bool `json:"refresh_exclude_older" yaml:"refresh_exclude_older"`
// Source project name
// Example: foo
//
// API extension: storage_api_project
Project string `json:"project,omitempty" yaml:"project,omitempty"`
// What cluster member this record was found on
// Example: server01
//
// API extension: cluster_internal_custom_volume_copy
Location string `json:"location" yaml:"location"`
}
// Writable converts a full StorageVolume struct into a StorageVolumePut struct (filters read-only fields).
func (v *StorageVolume) Writable() StorageVolumePut {
return v.StorageVolumePut
}
// StorageVolumeRebuildPost represents the fields available for a storage volume rebuild request.
//
// swagger:model
//
// API extension: storage_volumes_rebuild.
type StorageVolumeRebuildPost struct{}