Class: Pvectl::Services::ResourceMigration

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

Overview

Orchestrates migration of VMs and containers between cluster nodes.

Single service for both resource types, parameterized by resource_type. Async mode (default): returns UPID immediately, no blocking. Sync mode (–wait): polls Task until completion or timeout.

Examples:

Migrate VMs async (default)

service = ResourceMigration.new(vm_repository: vm_repo, container_repository: ct_repo, task_repository: task_repo)
results = service.execute(:vm, [vm1, vm2], target: "pve2")

Migrate with sync wait

service = ResourceMigration.new(..., options: { wait: true })
results = service.execute(:vm, [vm], target: "pve2")

Constant Summary collapse

DEFAULT_TIMEOUT =
600

Instance Method Summary collapse

Constructor Details

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

Creates a new ResourceMigration service.

Parameters:

  • vm_repository (Repositories::Vm)

    VM repository

  • container_repository (Repositories::Container)

    Container repository

  • task_repository (Repositories::Task)

    Task repository

  • options (Hash) (defaults to: {})

    Options (online, restart, target_storage, timeout, wait, fail_fast)



28
29
30
31
32
33
# File 'lib/pvectl/services/resource_migration.rb', line 28

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

#execute(resource_type, resources, target:) ⇒ Array<Models::OperationResult>

Executes migration operation on resources.

Parameters:

  • resource_type (Symbol)

    :vm or :container

  • resources (Array<Models::Vm, Models::Container>)

    Resources to migrate

  • target (String)

    Target node name

Returns:



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/pvectl/services/resource_migration.rb', line 41

def execute(resource_type, resources, target:)
  @resource_type = resource_type

  migratable, skipped = partition_by_target(resources, target)
  report_skipped(skipped, target)
  return all_on_target_results(target) if migratable.empty?

  results = []
  migratable.each do |resource|
    result = migrate_single(resource, target)
    results << result

    break if @options[:fail_fast] && result.failed?
  end

  results
end