Class: Pvectl::Commands::Get::Handlers::Storage

Inherits:
Object
  • Object
show all
Includes:
ResourceHandler
Defined in:
lib/pvectl/commands/get/handlers/storage.rb,
sig/pvectl/commands/get/handlers/storage.rbs

Overview

Handler for listing Proxmox cluster storage pools.

Implements ResourceHandler interface for the "storages" resource type (with "storage" and "stor" as aliases). Uses Repositories::Storage for data access and Presenters::Storage for formatting.

Examples:

Using via ResourceRegistry

handler = ResourceRegistry.for("storages")
storage_pools = handler.list(node: "pve1")

See Also:

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ResourceHandler

#selector_class

Constructor Details

#initialize(repository: nil) ⇒ Storage

Creates handler with optional repository for dependency injection.

Parameters:



27
28
29
# File 'lib/pvectl/commands/get/handlers/storage.rb', line 27

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

Instance Attribute Details

#repositoryRepositories::Storage (readonly)

Returns repository, creating it if necessary.

Returns:



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

def repository
  @repository ||= build_repository
end

Instance Method Details

#build_repositoryRepositories::Storage

Builds repository with connection from config.

Returns:



101
102
103
104
105
106
# File 'lib/pvectl/commands/get/handlers/storage.rb', line 101

def build_repository
  config_service = Pvectl::Config::Service.new
  config_service.load
  connection = Pvectl::Connection.new(config_service.current_config)
  Pvectl::Repositories::Storage.new(connection)
end

#describe(name:, node: nil, args: [], vmid: nil) ⇒ Models::Storage+

Describes a single storage pool by name.

For local storage (exists on multiple nodes):

  • Without node: returns array of instances (which nodes have it)
  • With node: returns full describe for that specific node

For shared storage: returns full describe (single instance).

Parameters:

  • name (String)

    storage name

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

    filter by node name (required for local storage)

  • name: (String)
  • node: (String, nil) (defaults to: nil)
  • args: (Array[String]) (defaults to: [])
  • vmid: (Array[String], nil) (defaults to: nil)

Returns:

Raises:



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/pvectl/commands/get/handlers/storage.rb', line 64

def describe(name:, node: nil, args: [], vmid: nil)
  raise ArgumentError, "Invalid storage name" if name.nil? || name.empty?

  # Check if storage exists on multiple nodes (local storage)
  instances = repository.list_instances(name)
  raise Pvectl::ResourceNotFoundError, "Storage not found: #{name}" if instances.empty?

  if instances.size > 1 && node.nil?
    # Return list of instances instead of single describe
    return instances
  end

  # Single instance or node specified - full describe
  storage = repository.describe(name, node: node)
  unless storage
    if node
      raise Pvectl::ResourceNotFoundError, "Storage '#{name}' not found on node '#{node}'"
    else
      raise Pvectl::ResourceNotFoundError, "Storage not found: #{name}"
    end
  end

  storage
end

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

Lists storage pools with optional filtering.

Parameters:

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

    filter by node name

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

    filter by storage name

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

    unused, for interface compatibility

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

    unused, for interface compatibility (storage is filtered via name)

  • node: (String, nil) (defaults to: nil)
  • name: (String, nil) (defaults to: nil)
  • args: (Array[String]) (defaults to: [])
  • storage: (String, nil) (defaults to: nil)

Returns:



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

def list(node: nil, name: nil, args: [], storage: nil, **_options)
  storage_pools = repository.list(node: node)
  storage_pools = storage_pools.select { |s| s.name == name } if name
  storage_pools
end

#presenterPresenters::Storage

Returns presenter for storage pools.

Returns:



47
48
49
# File 'lib/pvectl/commands/get/handlers/storage.rb', line 47

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