Class: Pvectl::Repositories::Storage

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

Overview

Repository for Proxmox cluster storage pools.

Uses the ‘/cluster/resources?type=storage` API endpoint for cluster-wide view. Handles aggregation of shared storage (deduplication by name).

Examples:

Listing all storage pools

repo = Storage.new(connection)
storage_pools = repo.list
storage_pools.each { |s| puts "#{s.name}: #{s.plugintype}" }

Listing storage on a specific node

storage_pools = repo.list(node: "pve1")

See Also:

Instance Method Summary collapse

Methods inherited from Base

#initialize

Constructor Details

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

Instance Method Details

#describe(name, node: nil) ⇒ Models::Storage?

Describes a storage with comprehensive details from multiple API endpoints.

Fetches:

  • Basic storage info from cluster resources (via get or get_for_node)

  • Configuration from /storage/name

  • Status from /nodes/node/storage/name/status

  • Content (volumes) from /nodes/node/storage/name/content

Parameters:

  • name (String)

    storage name

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

    specific node for local storage

Returns:

  • (Models::Storage, nil)

    Storage model with full details, or nil if not found



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/pvectl/repositories/storage.rb', line 85

def describe(name, node: nil)
  storage = node ? get_for_node(name, node) : get(name)
  return nil unless storage

  # GET /storage/{name} - configuration
  config = fetch_storage_config(name)

  # Find active node for this storage
  node = find_node_for_storage(name, storage)

  # GET /nodes/{node}/storage/{name}/status (if node available)
  status = node ? fetch_storage_status(node, name) : {}

  # GET /nodes/{node}/storage/{name}/content (volumes)
  content = node ? fetch_storage_content(node, name) : []

  build_describe_model(storage, config, status, content)
end

#get(name) ⇒ Models::Storage?

Gets a single storage pool by name.

Parameters:

  • name (String)

    storage pool name

Returns:



48
49
50
# File 'lib/pvectl/repositories/storage.rb', line 48

def get(name)
  list.find { |s| s.name == name }
end

#get_for_node(name, node) ⇒ Models::Storage?

Gets storage for a specific node.

Parameters:

  • name (String)

    storage name

  • node (String)

    node name

Returns:



70
71
72
# File 'lib/pvectl/repositories/storage.rb', line 70

def get_for_node(name, node)
  list_instances(name).find { |s| s.node == node }
end

#list(node: nil) ⇒ Array<Models::Storage>

Lists all storage pools in the cluster.

Uses ‘/cluster/resources?type=storage` endpoint for cluster-wide view. Aggregates shared storage by keeping first entry per storage name.

Parameters:

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

    filter by node name

Returns:



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/pvectl/repositories/storage.rb', line 29

def list(node: nil)
  response = connection.client["cluster/resources"].get(params: { type: "storage" })
  storage_data = normalize_response(response)

  # Aggregate shared storage (deduplicate by name, keep first entry)
  aggregated = aggregate_storage(storage_data)

  # Filter by node if specified
  if node
    aggregated = aggregated.select { |data| data[:node] == node || data[:shared] == 1 }
  end

  aggregated.map { |data| build_model(data) }
end

#list_for_node(node_name) ⇒ Array<Models::Storage>

Lists storage pools for a specific node.

Uses ‘/nodes/node/storage` endpoint which returns detailed per-node storage information including avail, enabled, active flags.

Parameters:

  • node_name (String)

    node name

Returns:



111
112
113
114
115
116
# File 'lib/pvectl/repositories/storage.rb', line 111

def list_for_node(node_name)
  response = connection.client["nodes/#{node_name}/storage"].get
  storage_data = normalize_response(response)

  storage_data.map { |data| build_model_from_node_api(data, node_name) }
end

#list_instances(name) ⇒ Array<Models::Storage>

Lists all instances of a storage by name.

For shared storage: returns single instance. For local storage: returns all instances (one per node).

Parameters:

  • name (String)

    storage name

Returns:



59
60
61
62
63
# File 'lib/pvectl/repositories/storage.rb', line 59

def list_instances(name)
  response = connection.client["cluster/resources"].get(params: { type: "storage" })
  storage_data = normalize_response(response)
  storage_data.select { |s| s[:storage] == name }.map { |data| build_model(data) }
end