Class: Pvectl::Services::Cloudinit

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

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.



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.

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.

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.

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

#resolve_node!(vmid) ⇒ String

Resolves a VMID to its node, ensuring the resource is a QEMU VM.

Raises:



84
85
86
87
88
89
90
91
92
93
# File 'lib/pvectl/services/cloudinit.rb', line 84

def resolve_node!(vmid)
  resolved = @resolver.resolve(vmid)
  raise Pvectl::ResourceNotFoundError, "VM #{vmid} not found" if resolved.nil?

  unless resolved[:type] == :qemu
    raise Pvectl::ResourceNotFoundError, "Resource #{vmid} is not a VM (cloud-init is VM-only)"
  end

  resolved[:node]
end