Class: Pvectl::Services::MoveDisk

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

Overview

Orchestrates moving a VM disk or container volume to a different storage on the same node.

Operates on one resource at a time (single VM or single container). Async mode (default): returns UPID immediately, no blocking. Sync mode (--wait): polls Task until completion or timeout.

Examples:

Move VM disk async (default)

service = MoveDisk.new(
  vm_repository: vm_repo,
  container_repository: ct_repo,
  task_repository: task_repo
)
result = service.execute(:vm, vm, disk: "scsi0", target_storage: "storage2")

Move container volume with --wait

service = MoveDisk.new(..., options: { wait: true })
result = service.execute(:container, ct, disk: "rootfs", target_storage: "storage2")

Constant Summary collapse

DEFAULT_TIMEOUT =
600

Instance Method Summary collapse

Constructor Details

#initialize(vm_repository:, container_repository:, task_repository:, options: {}) ⇒ MoveDisk

Creates a new MoveDisk service.



33
34
35
36
37
38
# File 'lib/pvectl/services/move_disk.rb', line 33

def initialize(vm_repository:, container_repository:, task_repository:, options: {})
  @vm_repository = vm_repository
  @container_repository = container_repository
  @task_repository = task_repository
  @options = options
end

Instance Method Details

#build_result(resource, **attrs) ⇒ Models::VmOperationResult, Models::ContainerOperationResult

Builds typed OperationResult for the current resource type.



116
117
118
119
120
121
122
# File 'lib/pvectl/services/move_disk.rb', line 116

def build_result(resource, **attrs)
  if @resource_type == :vm
    Models::VmOperationResult.new(vm: resource, **attrs)
  else
    Models::ContainerOperationResult.new(container: resource, **attrs)
  end
end

#execute(resource_type, resource, disk:, target_storage:) ⇒ Models::VmOperationResult, Models::ContainerOperationResult

Executes the move operation on a single resource.



47
48
49
50
# File 'lib/pvectl/services/move_disk.rb', line 47

def execute(resource_type, resource, disk:, target_storage:)
  @resource_type = resource_type
  move_single(resource, disk, target_storage)
end

#invoke_repository(resource, disk, target_storage) ⇒ String

Calls the appropriate repository method based on resource type.



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/pvectl/services/move_disk.rb', line 88

def invoke_repository(resource, disk, target_storage)
  if @resource_type == :vm
    @vm_repository.move_disk(
      resource.vmid,
      resource.node,
      disk,
      target_storage,
      format: @options[:format],
      delete: @options[:delete_source] ? true : false,
      bwlimit: @options[:bandwidth]
    )
  else
    @container_repository.move_volume(
      resource.vmid,
      resource.node,
      disk,
      target_storage,
      delete: @options[:delete_source] ? true : false,
      bwlimit: @options[:bandwidth]
    )
  end
end

#move_single(resource, disk, target_storage) ⇒ Models::VmOperationResult, Models::ContainerOperationResult

Performs the move on a single resource and builds the result.



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/pvectl/services/move_disk.rb', line 60

def move_single(resource, disk, target_storage)
  upid = invoke_repository(resource, disk, target_storage)

  if @options[:wait]
    task = @task_repository.wait(upid, timeout: timeout)
    build_result(resource,
                 operation: :move_disk,
                 task: task,
                 success: task.successful?)
  else
    build_result(resource,
                 operation: :move_disk,
                 task_upid: upid,
                 success: :pending)
  end
rescue StandardError => e
  build_result(resource,
               operation: :move_disk,
               success: false,
               error: e.message)
end

#timeoutInteger

Returns configured timeout.



127
128
129
# File 'lib/pvectl/services/move_disk.rb', line 127

def timeout
  @options[:timeout] || DEFAULT_TIMEOUT
end