Class: Pvectl::Repositories::Node

Inherits:
Base
  • Object
show all
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.

Examples:

Listing all nodes

repo = Node.new(connection)
nodes = repo.list
nodes.each { |n| puts "#{n.name}: #{n.status}" }

Getting node with extended details

node = repo.get("pve-node1", include_details: true)

See Also:

Instance Method Summary collapse

Constructor Details

#initialize(connection, storage_repository: nil) ⇒ Node

Creates a new Node repository.

Parameters:



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.

Parameters:

  • name (String)

    node name

Returns:

  • (Models::Node, nil)

    Node model with full details, or nil if not found



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.

Parameters:

  • node_name (String)

    node name

Returns:

  • (Hash)

    node configuration



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.

Parameters:

  • name (String)

    node name

  • include_details (Boolean) (defaults to: false)

    fetch version/status details

Returns:



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.

Parameters:

  • include_details (Boolean) (defaults to: false)

    fetch version/status details (extra API calls)

Returns:



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.

Parameters:

  • node_name (String)

    node name

  • params (Hash) (defaults to: {})

    configuration parameters to update



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.

Parameters:

  • node_name (String)

    cluster node name

Returns:

  • (String, nil)

    MAC address used to assemble the WoL packet

Raises:

  • (StandardError)

    propagates any API error (e.g., missing MAC)



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