Class: Pvectl::Services::SetContainer

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

Overview

Orchestrates non-interactive container configuration updates.

Takes key-value pairs directly (no editor), computes diff against current config, and applies changes via the API. Supports dry-run mode and optimistic locking via digest.

Examples:

Basic usage

service = SetContainer.new(container_repository: repo)
result = service.execute(ctid: 200, params: { memory: "8192", cores: "4" })

Dry run

service = SetContainer.new(container_repository: repo, options: { dry_run: true })
result = service.execute(ctid: 200, params: { memory: "8192" })

Instance Method Summary collapse

Constructor Details

#initialize(container_repository:, options: {}) ⇒ SetContainer

Creates a new SetContainer service.

Parameters:

  • container_repository (Repositories::Container)

    Container repository

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

    options (dry_run)



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

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

Instance Method Details

#execute(ctid:, params:) ⇒ Models::ContainerOperationResult?

Executes the non-interactive container config update.

Fetches current config, computes diff against requested params, and applies changes via the API (unless dry-run).

Parameters:

  • ctid (Integer)

    Container identifier

  • params (Hash)

    key-value pairs to set

Returns:



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/pvectl/services/set_container.rb', line 37

def execute(ctid:, params:)
  container = @container_repository.get(ctid)
  return not_found_result(ctid) unless container

  config = @container_repository.fetch_config(container.node, ctid)
  resource_info = { vmid: ctid, node: container.node, status: container.status }

  changes = compute_diff(config, params)

  if changes[:changed].empty? && changes[:added].empty? && changes[:removed].empty?
    return nil
  end

  resource_info[:diff] = changes

  if @options[:dry_run]
    return build_result(resource_info, success: true)
  end

  update_params = build_update_params(changes, config)
  @container_repository.update(ctid, container.node, update_params)
  build_result(resource_info, success: true)
rescue StandardError => e
  build_result({ vmid: ctid }, success: false, error: e.message)
end