Class: Pvectl::Repositories::Node
- Defined in:
- lib/pvectl/repositories/node.rb
Overview
Repository for Proxmox cluster nodes.
Uses the ‘/nodes` API endpoint to list nodes. Optionally fetches additional details from per-node endpoints.
Instance Method Summary collapse
-
#describe(name) ⇒ Models::Node?
Describes a node with comprehensive details from multiple API endpoints.
-
#fetch_config(node_name) ⇒ Hash
Fetches configuration for a node.
-
#get(name, include_details: false) ⇒ Models::Node?
Gets a single node by name.
-
#initialize(connection, storage_repository: nil) ⇒ Node
constructor
Creates a new Node repository.
-
#list(include_details: false) ⇒ Array<Models::Node>
Lists all nodes in the cluster.
-
#update(node_name, params = {}) ⇒ void
Updates node configuration.
-
#wakeonlan(node_name) ⇒ String?
Sends a Wake-on-LAN packet to a node.
Constructor Details
#initialize(connection, storage_repository: nil) ⇒ Node
Creates a new Node repository.
28 29 30 31 |
# File 'lib/pvectl/repositories/node.rb', line 28 def initialize(connection, storage_repository: nil) super(connection) @storage_repository = storage_repository end |
Instance Method Details
#describe(name) ⇒ Models::Node?
Describes a node with comprehensive details from multiple API endpoints.
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/pvectl/repositories/node.rb', line 75 def describe(name) # First check if node exists in cluster nodes_data = unwrap(connection.client["nodes"].get) basic_data = nodes_data.find { |n| (n[:node] || n[:name]) == name } return nil if basic_data.nil? # Merge guest counts guest_counts = guest_counts_for_cluster data = basic_data.merge( guests_vms: guest_counts.dig(name, :vms) || 0, guests_cts: guest_counts.dig(name, :cts) || 0 ) # For offline nodes, return basic data with offline note unless basic_data[:status] == "online" data[:offline_note] = "Node offline - detailed metrics unavailable" return build_describe_model(data) end # Fetch comprehensive details data = data.merge(describe_details_for(name)) build_describe_model(data) end |
#fetch_config(node_name) ⇒ Hash
Fetches configuration for a node.
105 106 107 108 109 110 |
# File 'lib/pvectl/repositories/node.rb', line 105 def fetch_config(node_name) resp = connection.client["nodes/#{node_name}/config"].get extract_data(resp) rescue StandardError {} end |
#get(name, include_details: false) ⇒ Models::Node?
Gets a single node by name.
67 68 69 |
# File 'lib/pvectl/repositories/node.rb', line 67 def get(name, include_details: false) list(include_details: include_details).find { |n| n.name == name } end |
#list(include_details: false) ⇒ Array<Models::Node>
Lists all nodes in the cluster.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/pvectl/repositories/node.rb', line 37 def list(include_details: false) response = connection.client["nodes"].get nodes_data = unwrap(response) # Get guest counts from cluster/resources guest_counts = guest_counts_for_cluster nodes_data.map do |data| node_name = data[:node] || data[:name] # Merge guest counts data = data.merge( guests_vms: guest_counts.dig(node_name, :vms) || 0, guests_cts: guest_counts.dig(node_name, :cts) || 0 ) # Fetch extended details if requested if include_details && (data[:status] == "online") data = data.merge(details_for(node_name)) end build_model(data) end end |
#update(node_name, params = {}) ⇒ void
This method returns an undefined value.
Updates node configuration.
117 118 119 |
# File 'lib/pvectl/repositories/node.rb', line 117 def update(node_name, params = {}) connection.client["nodes/#{node_name}/config"].put(params) end |
#wakeonlan(node_name) ⇒ String?
Sends a Wake-on-LAN packet to a node.
Calls ‘POST /nodes/node/wakeonlan`. The target node must have its MAC address registered in the cluster configuration beforehand (via `pvecm` or the web UI). The API returns the MAC address used for the magic packet.
131 132 133 134 135 |
# File 'lib/pvectl/repositories/node.rb', line 131 def wakeonlan(node_name) response = connection.client["nodes/#{node_name}/wakeonlan"].post data = extract_data(response) data.is_a?(String) ? data : nil end |