Class: Pvectl::Repositories::Backup

Inherits:
Base
  • Object
show all
Defined in:
lib/pvectl/repositories/backup.rb

Overview

Repository for backup operations in Proxmox.

Handles listing, creating, deleting, and restoring backups via the Proxmox API (vzdump).

Examples:

Listing backups

repo = Backup.new(connection)
backups = repo.list(node: "pve1", storage: "local")

Creating a backup

upid = repo.create(100, "pve1", storage: "local", mode: "snapshot")

Restoring a backup

upid = repo.restore("local:backup/vzdump-qemu-100.vma.zst", "pve1", vmid: 200)

See Also:

Instance Method Summary collapse

Methods inherited from Base

#get, #initialize

Constructor Details

This class inherits a constructor from Pvectl::Repositories::Base

Instance Method Details

#create(vmid, node, storage:, mode: "snapshot", compress: "zstd", notes: nil, protected: false) ⇒ String

Creates a backup using vzdump.

Parameters:

  • vmid (Integer)

    VM/container ID

  • node (String)

    node name

  • storage (String)

    target storage

  • mode (String) (defaults to: "snapshot")

    backup mode (snapshot, suspend, stop)

  • compress (String) (defaults to: "zstd")

    compression (zstd, gzip, lzo, 0)

  • notes (String, nil) (defaults to: nil)

    backup notes

  • protected (Boolean) (defaults to: false)

    protect from deletion

Returns:

  • (String)

    task UPID



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/pvectl/repositories/backup.rb', line 59

def create(vmid, node, storage:, mode: "snapshot", compress: "zstd", notes: nil, protected: false)
  params = {
    vmid: vmid,
    storage: storage,
    mode: mode,
    compress: compress
  }
  params[:notes] = notes if notes
  params[:protected] = 1 if protected

  connection.client["nodes/#{node}/vzdump"].post(params)
end

#delete(volid, node) ⇒ String?

Deletes a backup.

Parameters:

  • volid (String)

    full volume ID

  • node (String)

    node name

Returns:

  • (String, nil)

    task UPID or nil



77
78
79
80
81
# File 'lib/pvectl/repositories/backup.rb', line 77

def delete(volid, node)
  storage = parse_storage(volid)
  encoded_volid = ERB::Util.url_encode(volid)
  connection.client["nodes/#{node}/storage/#{storage}/content/#{encoded_volid}"].delete
end

#list(vmid: nil, storage: nil, node: nil) ⇒ Array<Models::Backup>

Lists backups from storage.

When node and storage are not specified, discovers all nodes and backup-capable storages automatically.

Parameters:

  • vmid (Integer, nil) (defaults to: nil)

    filter by VM ID

  • storage (String, nil) (defaults to: nil)

    storage name (default: all backup storages)

  • node (String, nil) (defaults to: nil)

    node name (default: all nodes)

Returns:



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/pvectl/repositories/backup.rb', line 35

def list(vmid: nil, storage: nil, node: nil)
  nodes = node ? [node] : list_nodes
  storages_by_node = storage ? Hash[nodes.map { |n| [n, [storage]] }] : nil

  backups = []
  nodes.each do |n|
    backup_storages = storages_by_node ? storages_by_node[n] : list_backup_storages(n)
    backup_storages.each do |s|
      backups.concat(list_from_storage(n, s, vmid: vmid))
    end
  end
  backups
end

#restore(volid, node, vmid:, storage: nil, force: false, start: false, unique: false) ⇒ String

Restores a backup to a new or existing VM/container.

Parameters:

  • volid (String)

    backup volume ID

  • node (String)

    node name

  • vmid (Integer)

    target VM ID

  • storage (String, nil) (defaults to: nil)

    target storage

  • force (Boolean) (defaults to: false)

    overwrite existing VM

  • start (Boolean) (defaults to: false)

    start after restore

  • unique (Boolean) (defaults to: false)

    regenerate unique properties

Returns:

  • (String)

    task UPID



93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/pvectl/repositories/backup.rb', line 93

def restore(volid, node, vmid:, storage: nil, force: false, start: false, unique: false)
  resource_type = detect_type_from_volid(volid)
  endpoint = resource_type == :lxc ? "lxc" : "qemu"

  params = {
    archive: volid,
    vmid: vmid
  }
  params[:storage] = storage if storage
  params[:force] = 1 if force
  params[:start] = 1 if start
  params[:unique] = 1 if unique

  connection.client["nodes/#{node}/#{endpoint}"].post(params)
end