Class: Pvectl::Repositories::Task

Inherits:
Base
  • Object
show all
Defined in:
lib/pvectl/repositories/task.rb,
sig/pvectl/repositories/task.rbs

Overview

Repository for Proxmox tasks (async operations).

Tasks are identified by UPID (Unique Process ID) which encodes the node name, allowing us to query the correct node.

Examples:

Finding a task

repo = Task.new(connection)
task = repo.find("UPID:pve1:000ABC:...")
task.completed? #=> true/false

Instance Attribute Summary

Attributes inherited from Base

#connection

Instance Method Summary collapse

Methods inherited from Base

#extract_data, #initialize, #models_from, #unwrap

Constructor Details

This class inherits a constructor from Pvectl::Repositories::Base

Instance Method Details

#build_model(data) ⇒ Models::Task

Builds Task model from API response.

Parameters:

  • API response

Returns:

  • Task model



66
67
68
# File 'lib/pvectl/repositories/task.rb', line 66

def build_model(data)
  Models::Task.new(data)
end

#extract_node_from_upid(upid) ⇒ String

Extracts node name from UPID. UPID format: UPID:node:pid:pstart:starttime:type:id:user:

Parameters:

  • UPID string

Returns:

  • Node name



77
78
79
# File 'lib/pvectl/repositories/task.rb', line 77

def extract_node_from_upid(upid)
  upid.split(":")[1]
end

#find(upid) ⇒ Models::Task

Finds a task by UPID.

Parameters:

  • Unique Process ID

Returns:

  • Task model



22
23
24
25
26
27
# File 'lib/pvectl/repositories/task.rb', line 22

def find(upid)
  node = extract_node_from_upid(upid)
  response = connection.client["nodes/#{node}/tasks/#{CGI.escape(upid)}/status"].get
  data = extract_data(response)
  build_model(data.merge(upid: upid))
end

#get(id) ⇒ Models::Task

Not implemented - use find instead

Parameters:

Returns:



56
57
58
# File 'lib/pvectl/repositories/task.rb', line 56

def get(id)
  find(id)
end

#listbot

Not implemented - tasks are looked up by UPID, not listed

Returns:

Raises:



51
52
53
# File 'lib/pvectl/repositories/task.rb', line 51

def list
  raise NotImplementedError, "Use find(upid) to get task status"
end

#wait(upid, timeout: 60, interval: 2) ⇒ Models::Task

Waits for a task to complete.

Parameters:

  • Task UPID

  • (defaults to: 60)

    Max wait time in seconds

  • (defaults to: 2)

    Poll interval in seconds

  • (defaults to: 60)
  • (defaults to: 2)

Returns:

  • Completed task

Raises:

  • if task doesn't complete in time



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/pvectl/repositories/task.rb', line 36

def wait(upid, timeout: 60, interval: 2)
  deadline = Time.now + timeout
  loop do
    task = find(upid)
    return task if task.completed?

    if Time.now > deadline
      raise Timeout::Error, "Task #{upid} timed out after #{timeout}s"
    end

    sleep interval
  end
end