Class: Pvectl::Repositories::Volume

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

Overview

Repository for virtual disk volumes attached to VMs and containers.

Aggregates volume data from two sources:

  • VM/CT config endpoints (parsed disk keys from configuration)

  • Storage content API (+/nodes/node/storage/storage/content+)

Uses composition: delegates to VmRepository and ContainerRepository for config fetching and node resolution.

Examples:

Listing volumes from VM config

repo = Volume.new(connection)
volumes = repo.list_from_config(resource_type: "vm", ids: [100, 101])
volumes.each { |v| puts "#{v.name}: #{v.storage}:#{v.volume_id} (#{v.size})" }

Finding a specific disk

volume = repo.find(resource_type: "vm", id: 100, disk_name: "scsi0")
puts volume.size if volume

See Also:

Constant Summary collapse

VM_DISK_PATTERN =

Pattern matching VM disk keys (scsi0, virtio1, ide2, sata3, efidisk0, tpmstate0)

/\A(?:scsi|virtio|ide|sata|efidisk|tpmstate)\d+\z/
CT_DISK_PATTERN =

Pattern matching container disk keys (rootfs, mp0, mp1, …)

/\A(?:rootfs|mp\d+)\z/

Instance Method Summary collapse

Methods inherited from Base

#get, #list

Constructor Details

#initialize(connection, vm_repo: nil, container_repo: nil) ⇒ Volume

Creates a new Volume repository.

Parameters:



39
40
41
42
43
# File 'lib/pvectl/repositories/volume.rb', line 39

def initialize(connection, vm_repo: nil, container_repo: nil)
  super(connection)
  @vm_repo = vm_repo
  @container_repo = container_repo
end

Instance Method Details

#find(resource_type:, id:, disk_name:, node: nil) ⇒ Models::Volume?

Finds a specific volume by disk name in a VM/CT config.

Parameters:

  • resource_type (String)

    “vm” or “ct”

  • id (Integer, String)

    VMID or CTID

  • disk_name (String)

    disk key name (e.g., “scsi0”, “rootfs”)

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

    optional node override

Returns:



91
92
93
94
# File 'lib/pvectl/repositories/volume.rb', line 91

def find(resource_type:, id:, disk_name:, node: nil)
  volumes = list_from_config(resource_type: resource_type, ids: [id], node: node)
  volumes.find { |v| v.name == disk_name }
end

#list_from_config(resource_type:, ids:, node: nil) ⇒ Array<Models::Volume>

Lists volumes from VM/CT configuration for given resource IDs.

Fetches config from each VM/CT and extracts disk entries. Excludes CD-ROM entries (containing media=cdrom).

Parameters:

  • resource_type (String)

    “vm” or “ct”

  • ids (Array<Integer, String>)

    list of VMID/CTID values

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

    filter results by node name

Returns:



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/pvectl/repositories/volume.rb', line 54

def list_from_config(resource_type:, ids:, node: nil)
  type = normalize_resource_type(resource_type)
  repo = repo_for(type)
  return [] unless repo

  volumes = ids.flat_map do |id|
    resource = repo.get(id)
    next [] if resource.nil?
    next [] if node && resource.node != node

    config = repo.fetch_config(resource.node, id.to_i)
    extract_volumes(config, type, id.to_i, resource.node)
  end

  volumes
end

#list_from_storage(storage:, node: nil) ⇒ Array<Models::Volume>

Lists volumes from storage content API.

Queries /nodes/{node}/storage/{storage}/content to list all volumes in the given storage.

Parameters:

  • storage (String)

    storage name (e.g., “local-lvm”)

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

    node name (queries all online nodes if nil)

Returns:



79
80
81
82
# File 'lib/pvectl/repositories/volume.rb', line 79

def list_from_storage(storage:, node: nil)
  nodes = node ? [node] : online_nodes
  nodes.flat_map { |node_name| fetch_storage_volumes(node_name, storage) }
end