Class: Pvectl::Commands::Get::Handlers::Volume

Inherits:
Object
  • Object
show all
Includes:
ResourceHandler
Defined in:
lib/pvectl/commands/get/handlers/volume.rb

Overview

Handler for listing and describing virtual disk volumes.

Implements ResourceHandler interface for the “volumes” resource type. Supports two listing modes:

  • Config mode: list volumes from VM/CT config by resource type and IDs

  • Storage mode: list volumes from a specific storage

Uses Repositories::Volume for data access, Presenters::Volume for formatting, and Selectors::Volume for client-side filtering.

Examples:

List VM volumes via ResourceRegistry

handler = ResourceRegistry.for("volumes")
volumes = handler.list(args: ["vm", "100"], node: "pve1")

List storage volumes

handler = ResourceRegistry.for("volumes")
volumes = handler.list(storage: "local-lvm")

Describe a specific volume

handler = ResourceRegistry.for("volumes")
volume = handler.describe(name: "vm", args: ["100", "scsi0"])

See Also:

Instance Method Summary collapse

Constructor Details

#initialize(repository: nil) ⇒ Volume

Creates handler with optional repository for dependency injection.

Parameters:



39
40
41
# File 'lib/pvectl/commands/get/handlers/volume.rb', line 39

def initialize(repository: nil)
  @repository = repository
end

Instance Method Details

#describe(name:, args: [], node: nil, **_options) ⇒ Models::Volume

Describes a single virtual disk volume.

Locates a specific disk by resource type, ID, and disk name.

Parameters:

  • name (String)

    resource type (“vm” or “ct”)

  • args (Array<String>) (defaults to: [])
    id, disk_name

    pair

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

    optional node filter

  • _options (Hash)

    unused, for interface compatibility

Returns:

Raises:



80
81
82
83
84
85
86
87
88
89
# File 'lib/pvectl/commands/get/handlers/volume.rb', line 80

def describe(name:, args: [], node: nil, **_options)
  resource_type = name
  id = args[0]&.to_i
  disk_name = args[1]

  volume = repository.find(resource_type: resource_type, id: id, disk_name: disk_name, node: node)
  raise Pvectl::ResourceNotFoundError, "Volume '#{disk_name}' not found on #{resource_type} #{id}" unless volume

  volume
end

#list(args: [], storage: nil, node: nil, **_options) ⇒ Array<Models::Volume>

Lists virtual disk volumes with two modes of operation.

Config mode: requires resource type and at least one ID in args.

args = ["vm", "100", "101"] lists volumes from VMs 100 and 101.

Storage mode: requires storage parameter.

storage = "local-lvm" lists all volumes on that storage.

Parameters:

  • args (Array<String>) (defaults to: [])

    resource type and IDs (config mode)

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

    storage name (storage mode)

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

    filter by node name

  • _options (Hash)

    unused, for interface compatibility

Returns:



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/pvectl/commands/get/handlers/volume.rb', line 56

def list(args: [], storage: nil, node: nil, **_options)
  if storage
    repository.list_from_storage(storage: storage, node: node)
  elsif args.length >= 2
    resource_type = args[0]
    ids = args[1..].map(&:to_i)
    repository.list_from_config(resource_type: resource_type, ids: ids, node: node)
  else
    $stderr.puts "Usage: pvectl get volume <vm|ct> <ID...> [--node NODE]"
    $stderr.puts "       pvectl get volume --storage <STORAGE> [--node NODE]"
    []
  end
end

#presenterPresenters::Volume

Returns presenter for virtual disk volumes.

Returns:



94
95
96
# File 'lib/pvectl/commands/get/handlers/volume.rb', line 94

def presenter
  Pvectl::Presenters::Volume.new
end

#selector_classClass

Returns selector class for client-side filtering.

Returns:

  • (Class)

    Selectors::Volume class



101
102
103
# File 'lib/pvectl/commands/get/handlers/volume.rb', line 101

def selector_class
  Pvectl::Selectors::Volume
end