Class: Pvectl::Parsers::CloudInitConfig

Inherits:
Object
  • Object
show all
Defined in:
lib/pvectl/parsers/cloud_init_config.rb

Overview

Parses and converts cloud-init configuration strings for Proxmox VMs.

CloudInitConfig handles the conversion between user-friendly key=value cloud-init specifications and the parameter names required by the Proxmox API. Unlike DiskConfig and NetConfig, all keys are optional.

Examples:

Parsing a cloud-init config string

config = CloudInitConfig.parse("user=admin,password=secret,ip=dhcp")
config[:user]     #=> "admin"
config[:password]  #=> "secret"
config[:ip]        #=> "dhcp"

Converting to Proxmox API parameters

config = { user: "admin", ip: "dhcp" }
CloudInitConfig.to_proxmox_params(config)
#=> { ciuser: "admin", ipconfig0: "ip=dhcp" }

Constant Summary collapse

VALID_KEYS =

All recognized cloud-init configuration keys.

%w[user password sshkeys ip gw nameserver searchdomain].freeze

Class Method Summary collapse

Class Method Details

.parse(string) ⇒ Hash<Symbol, String>

Parses a comma-separated key=value cloud-init config string into a Hash.

Examples:

CloudInitConfig.parse("user=admin,ip=dhcp,nameserver=8.8.8.8")
#=> { user: "admin", ip: "dhcp", nameserver: "8.8.8.8" }

Parameters:

  • string (String)

    cloud-init config in “key=value,key=value” format

Returns:

  • (Hash<Symbol, String>)

    parsed configuration

Raises:

  • (ArgumentError)

    if unknown keys are present



35
36
37
38
39
40
41
# File 'lib/pvectl/parsers/cloud_init_config.rb', line 35

def self.parse(string)
  pairs = string.split(",").map { |pair| pair.strip.split("=", 2).map(&:strip) }
  config = pairs.to_h { |k, v| [k.to_sym, v] }

  validate!(config)
  config
end

.to_proxmox_params(config) ⇒ Hash<Symbol, String>

Converts a parsed cloud-init config Hash to Proxmox API parameter names.

Maps user-friendly keys to their Proxmox API equivalents:

  • user becomes ciuser

  • password becomes cipassword

  • sshkeys stays sshkeys

  • ip becomes ipconfig0 with “ip=” prefix

  • nameserver stays nameserver

  • searchdomain stays searchdomain

Examples:

Minimal config

CloudInitConfig.to_proxmox_params({ user: "admin" })
#=> { ciuser: "admin" }

With IP and nameserver

CloudInitConfig.to_proxmox_params({ ip: "dhcp", nameserver: "8.8.8.8" })
#=> { ipconfig0: "ip=dhcp", nameserver: "8.8.8.8" }

Parameters:

  • config (Hash<Symbol, String>)

    parsed cloud-init configuration

Returns:

  • (Hash<Symbol, String>)

    Proxmox API parameters



63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/pvectl/parsers/cloud_init_config.rb', line 63

def self.to_proxmox_params(config)
  params = {}
  params[:ciuser] = config[:user] if config[:user]
  params[:cipassword] = config[:password] if config[:password]
  params[:sshkeys] = config[:sshkeys] if config[:sshkeys]
  if config[:ip]
    ip_str = "ip=#{config[:ip]}"
    ip_str += ",gw=#{config[:gw]}" if config[:gw]
    params[:ipconfig0] = ip_str
  end
  params[:nameserver] = config[:nameserver] if config[:nameserver]
  params[:searchdomain] = config[:searchdomain] if config[:searchdomain]
  params
end