Class: Pvectl::Services::TaskListing

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

Overview

Service for listing tasks across one or all cluster nodes.

Encapsulates multi-node iteration, merge, sort, and limit logic. Used by both Get::Handlers::Tasks and Logs::Handlers::TaskLogs.

Examples:

List all tasks cluster-wide

service = TaskListing.new(task_list_repository: repo, node_repository: node_repo)
tasks = service.list(limit: 20)

List tasks on a specific node

tasks = service.list(node: "pve1", type_filter: "vzdump")

Instance Method Summary collapse

Constructor Details

#initialize(task_list_repository:, node_repository:) ⇒ TaskListing

Creates a new TaskListing service.



22
23
24
25
# File 'lib/pvectl/services/task_listing.rb', line 22

def initialize(task_list_repository:, node_repository:)
  @task_list_repository = task_list_repository
  @node_repository = node_repository
end

Instance Method Details

#list(node: nil, vmid: nil, limit: 50, since: nil, until_time: nil, type_filter: nil, status_filter: nil) ⇒ Array<Models::TaskEntry>

Lists tasks, optionally filtered.

When node is nil, iterates all cluster nodes and merges results sorted by starttime descending.



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

def list(node: nil, vmid: nil, limit: 50, since: nil, until_time: nil,
         type_filter: nil, status_filter: nil)
  if node
    @task_list_repository.list(
      node: node, vmid: vmid, limit: limit, since: since,
      until_time: until_time, type_filter: type_filter,
      status_filter: status_filter
    )
  else
    list_all_nodes(
      vmid: vmid, limit: limit, since: since,
      until_time: until_time, type_filter: type_filter,
      status_filter: status_filter
    )
  end
end

#list_all_nodes(vmid:, limit:, since:, until_time:, type_filter:, status_filter:) ⇒ Array<Models::TaskEntry>

Iterates all cluster nodes and merges results.



62
63
64
65
66
67
68
69
70
71
72
# File 'lib/pvectl/services/task_listing.rb', line 62

def list_all_nodes(vmid:, limit:, since:, until_time:, type_filter:, status_filter:)
  nodes = @node_repository.list.map(&:name)
  entries = nodes.flat_map do |node_name|
    @task_list_repository.list(
      node: node_name, vmid: vmid, limit: limit, since: since,
      until_time: until_time, type_filter: type_filter,
      status_filter: status_filter
    )
  end
  entries.sort_by { |e| -(e.starttime || 0) }.first(limit)
end