Class: Pvectl::Services::UnlinkDisk

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

Overview

Orchestrates disk unlinking from a VM configuration.

Delegates to the VM repository to issue the unlink PUT request and wraps the outcome in a Models::VmOperationResult. The underlying Proxmox endpoint is synchronous and returns no UPID, so the result captures success/failure synchronously.

Examples:

Soft unlink (keeps volume as unused)

service = UnlinkDisk.new(repository: vm_repo)
result = service.execute(vmid: 100, node: "pve1", disk_ids: "scsi1")

Hard delete via force

service = UnlinkDisk.new(repository: vm_repo)
result = service.execute(vmid: 100, node: "pve1", disk_ids: %w[scsi1 scsi2], force: true)

Instance Method Summary collapse

Constructor Details

#initialize(repository:) ⇒ UnlinkDisk

Creates a new UnlinkDisk service.

Parameters:



24
25
26
# File 'lib/pvectl/services/unlink_disk.rb', line 24

def initialize(repository:)
  @repository = repository
end

Instance Method Details

#build_result(vmid, node, disk_ids, force, **attrs) ⇒ Models::VmOperationResult

Builds a VmOperationResult.

Parameters:

  • vmid (Integer)

    VM identifier

  • node (String)

    node name

  • disk_ids (Array<String>, String)

    disk identifiers

  • force (Boolean)

    force flag

  • attrs (Hash)

    additional result attributes (:success, :error)

Returns:



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/pvectl/services/unlink_disk.rb', line 52

def build_result(vmid, node, disk_ids, force, **attrs)
  vm = fetch_vm(vmid) || Models::Vm.new(vmid: vmid, node: node)
  Models::VmOperationResult.new(
    operation: :unlink_disk,
    vm: vm,
    resource: {
      vmid: vmid,
      node: node,
      disk_ids: format_disk_ids(disk_ids),
      force: force
    },
    **attrs
  )
end

#execute(vmid:, node:, disk_ids:, force: false) ⇒ Models::VmOperationResult

Unlinks one or more disks from the VM configuration.

Parameters:

  • vmid (Integer)

    VM identifier

  • node (String)

    node name

  • disk_ids (Array<String>, String)

    disk identifiers

  • force (Boolean) (defaults to: false)

    physically remove the underlying volume(s)

  • vmid: (Integer)
  • node: (String)
  • disk_ids: (Array[String], String)
  • force: (Boolean) (defaults to: false)

Returns:



35
36
37
38
39
40
# File 'lib/pvectl/services/unlink_disk.rb', line 35

def execute(vmid:, node:, disk_ids:, force: false)
  @repository.unlink_disks(node, vmid, disk_ids, force: force)
  build_result(vmid, node, disk_ids, force, success: true)
rescue StandardError => e
  build_result(vmid, node, disk_ids, force, success: false, error: e.message)
end

#fetch_vm(vmid) ⇒ Models::Vm?

Fetches the VM model for the result, swallowing any lookup errors.

Parameters:

  • vmid (Integer)

    VM identifier

Returns:

  • (Models::Vm, nil)

    VM model or nil if unavailable



71
72
73
74
75
# File 'lib/pvectl/services/unlink_disk.rb', line 71

def fetch_vm(vmid)
  @repository.get(vmid)
rescue StandardError
  nil
end

#format_disk_ids(disk_ids) ⇒ String

Formats disk_ids into a stable comma-separated representation.

Parameters:

  • disk_ids (Array<String>, String)

    disk identifiers

Returns:

  • (String)

    comma-separated disk ID list



81
82
83
# File 'lib/pvectl/services/unlink_disk.rb', line 81

def format_disk_ids(disk_ids)
  Array(disk_ids).flat_map { |id| id.to_s.split(",") }.map(&:strip).reject(&:empty?).join(",")
end