Class: Pvectl::Services::ContainerLifecycle

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

Overview

Orchestrates container lifecycle operations.

Handles execution of start/stop/shutdown/restart operations with sync/async modes, error handling, and result collection.

Examples:

Basic usage

service = ContainerLifecycle.new(ct_repo, task_repo)
results = service.execute(:start, [ct1, ct2])
results.each { |r| puts "#{r.container.vmid}: #{r.status_text}" }

Constant Summary collapse

SYNC_OPERATIONS =

Returns:

i[start stop].freeze
ASYNC_OPERATIONS =

Returns:

i[shutdown restart].freeze
ALL_OPERATIONS =

Returns:

(SYNC_OPERATIONS + ASYNC_OPERATIONS).freeze
DEFAULT_TIMEOUT =

Returns:

60

Instance Method Summary collapse

Constructor Details

#initialize(container_repository, task_repository, options = {}) ⇒ ContainerLifecycle

Creates a new ContainerLifecycle service.

Parameters:

  • Container repository

  • Task repository

  • (defaults to: {})

    Options (timeout, async, wait, fail_fast)



27
28
29
30
31
# File 'lib/pvectl/services/container_lifecycle.rb', line 27

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

Instance Method Details

#call_api(operation, container) ⇒ String

Calls the appropriate API method.

Parameters:

  • Operation

  • Container

Returns:

  • Task UPID



91
92
93
# File 'lib/pvectl/services/container_lifecycle.rb', line 91

def call_api(operation, container)
  @container_repository.send(operation, container.vmid, container.node)
end

#execute(operation, containers) ⇒ Array<Models::ContainerOperationResult>

Executes a lifecycle operation on a list of containers.

Parameters:

  • Operation to execute

  • Containers to operate on

Returns:

  • Results for each container



38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/pvectl/services/container_lifecycle.rb', line 38

def execute(operation, containers)
  validate_operation!(operation)

  results = []
  containers.each do |container|
    result = execute_single(operation, container)
    results << result

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

#execute_single(operation, container) ⇒ Models::ContainerOperationResult

Executes operation on a single container.

Parameters:

  • Operation

  • Container

Returns:

  • Result



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

def execute_single(operation, container)
  task_upid = call_api(operation, container)

  if sync_mode?(operation)
    task = @task_repository.wait(task_upid, timeout: timeout)
    Models::ContainerOperationResult.new(
      container: container,
      operation: operation,
      task: task,
      success: task.successful?
    )
  else
    Models::ContainerOperationResult.new(
      container: container,
      operation: operation,
      task_upid: task_upid,
      success: :pending
    )
  end
rescue StandardError => e
  Models::ContainerOperationResult.new(
    container: container,
    operation: operation,
    success: false,
    error: e.message
  )
end

#sync_mode?(operation) ⇒ Boolean

Determines if operation should run in sync mode.

Parameters:

  • Operation

Returns:

  • true if sync mode



99
100
101
102
103
104
# File 'lib/pvectl/services/container_lifecycle.rb', line 99

def sync_mode?(operation)
  return false if @options[:async]
  return true if @options[:wait]

  SYNC_OPERATIONS.include?(operation)
end

#timeoutInteger

Returns configured timeout.

Returns:

  • Timeout in seconds



109
110
111
# File 'lib/pvectl/services/container_lifecycle.rb', line 109

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

#validate_operation!(operation) ⇒ void

This method returns an undefined value.

Validates operation is supported.

Parameters:

  • Operation

Raises:

  • if operation is not supported



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

def validate_operation!(operation)
  return if ALL_OPERATIONS.include?(operation)

  raise ArgumentError, "Unknown operation: #{operation}. Valid: #{ALL_OPERATIONS.join(', ')}"
end