Class: Pvectl::Repositories::Storage
- 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).
Instance Method Summary collapse
-
#describe(name, node: nil) ⇒ Models::Storage?
Describes a storage with comprehensive details from multiple API endpoints.
-
#get(name) ⇒ Models::Storage?
Gets a single storage pool by name.
-
#get_for_node(name, node) ⇒ Models::Storage?
Gets storage for a specific node.
-
#list(node: nil) ⇒ Array<Models::Storage>
Lists all storage pools in the cluster.
-
#list_for_node(node_name) ⇒ Array<Models::Storage>
Lists storage pools for a specific node.
-
#list_instances(name) ⇒ Array<Models::Storage>
Lists all instances of a storage by name.
Methods inherited from Base
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
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.
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.
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.
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.
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).
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 |