Class: Pvectl::Services::Cloudinit

Inherits:
Object
  • Object
show all
Defined in:
lib/pvectl/services/cloudinit.rb

Overview

Orchestrates cloud-init operations on VMs.

Provides three operations:

  • regenerate — rebuild the cloud-init ISO from current config

  • pending — list configuration changes not yet applied

  • dump — retrieve the auto-generated cloud-init YAML

Operations are VM-only — LXC containers do not expose cloud-init endpoints. When the vmid resolves to a non-QEMU resource, the service raises Pvectl::ResourceNotFoundError.

Examples:

Regenerate ISO for a VM

service = Cloudinit.new(vm_repository: vm_repo, resource_resolver: resolver)
service.regenerate(100)

Dump generated user-data YAML

yaml = service.dump(100, "user")

Constant Summary collapse

VALID_DUMP_TYPES =

Cloud-init config types supported by the dump operation.

%w[user network meta].freeze

Instance Method Summary collapse

Constructor Details

#initialize(vm_repository:, resource_resolver:) ⇒ Cloudinit

Creates a new Cloudinit service.

Parameters:



31
32
33
34
# File 'lib/pvectl/services/cloudinit.rb', line 31

def initialize(vm_repository:, resource_resolver:)
  @vm_repository = vm_repository
  @resolver = resource_resolver
end

Instance Method Details

#dump(vmid, type, node: nil) ⇒ String

Dumps the auto-generated cloud-init configuration.

Parameters:

  • vmid (Integer)

    VM identifier

  • type (String)

    one of “user”, “network”, “meta”

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

    explicit node name (skips resolver)

Returns:

  • (String)

    raw cloud-init YAML/text

Raises:



67
68
69
70
71
72
73
74
75
# File 'lib/pvectl/services/cloudinit.rb', line 67

def dump(vmid, type, node: nil)
  unless VALID_DUMP_TYPES.include?(type)
    raise ArgumentError, "Invalid cloud-init dump type: #{type.inspect} " \
                         "(valid: #{VALID_DUMP_TYPES.join(', ')})"
  end

  node ||= resolve_node!(vmid)
  @vm_repository.cloudinit_dump(node, vmid, type)
end

#pending(vmid, node: nil) ⇒ Array<Hash{Symbol => untyped}>

Returns pending cloud-init configuration changes.

Parameters:

  • vmid (Integer)

    VM identifier

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

    explicit node name (skips resolver)

Returns:

  • (Array<Hash{Symbol => untyped}>)

    pending entries

Raises:



54
55
56
57
# File 'lib/pvectl/services/cloudinit.rb', line 54

def pending(vmid, node: nil)
  node ||= resolve_node!(vmid)
  @vm_repository.cloudinit_pending(node, vmid)
end

#regenerate(vmid, node: nil) ⇒ Hash{Symbol => untyped}

Regenerates the cloud-init ISO for the given VM.

Parameters:

  • vmid (Integer)

    VM identifier

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

    explicit node name (skips resolver)

Returns:

  • (Hash{Symbol => untyped})

    { vmid: Integer, node: String }

Raises:



42
43
44
45
46
# File 'lib/pvectl/services/cloudinit.rb', line 42

def regenerate(vmid, node: nil)
  node ||= resolve_node!(vmid)
  @vm_repository.cloudinit_regenerate(node, vmid)
  { vmid: vmid, node: node }
end