Class: Pvectl::Services::Get::ResourceService

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

Overview

Service for fetching and formatting resource data.

Orchestrates the data flow between:

  • ResourceHandler (provides models and presenter)

  • Formatters::Registry (formats output)

This follows ARCHITECTURE.md section 3.4: “Services orchestrate data flow between Repository, Models, and Formatters”

Examples:

Basic usage

handler = ResourceRegistry.for("nodes")
service = ResourceService.new(handler: handler, format: "table")
output = service.list(node: "pve1")
puts output

Instance Method Summary collapse

Constructor Details

#initialize(handler:, format: "table", color_enabled: true) ⇒ ResourceService

Creates a new ResourceService.

Parameters:

  • handler (ResourceHandler)

    the resource handler for data fetching

  • format (String) (defaults to: "table")

    output format (table, json, yaml, wide)

  • color_enabled (Boolean) (defaults to: true)

    whether to enable colored output



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

def initialize(handler:, format: "table", color_enabled: true)
  @handler = handler
  @format = format
  @color_enabled = color_enabled
end

Instance Method Details

#describe(name:, node: nil, args: [], vmid: nil) ⇒ String

Describes and formats a single resource.

For local storage with multiple instances, returns list of nodes when no node specified, or full describe when node is specified.

Parameters:

  • name (String)

    resource name

  • node (String, nil) (defaults to: nil)

    filter by node name (for local storage)

  • vmid (Array<String>, nil) (defaults to: nil)

    filter by VM/CT IDs

Returns:

  • (String)

    formatted output string



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/pvectl/services/get/resource_service.rb', line 59

def describe(name:, node: nil, args: [], vmid: nil)
  result = @handler.describe(name: name, node: node, args: args, vmid: vmid)
  presenter = @handler.presenter

  if result.is_a?(Array)
    # Multiple instances - format as list
    format_output(result, presenter)
  else
    # Single model - format as describe
    format_output_describe(result, presenter)
  end
end

#list(node: nil, name: nil, args: [], storage: nil, vmid: nil, selector: nil, **options) ⇒ String

Fetches and formats resources.

Parameters:

  • node (String, nil) (defaults to: nil)

    filter by node name

  • name (String, nil) (defaults to: nil)

    filter by resource name

  • args (Array<String>) (defaults to: [])

    additional positional arguments (e.g., VMIDs for snapshots)

  • storage (String, nil) (defaults to: nil)

    filter by storage (for backups)

  • vmid (Array<String>, nil) (defaults to: nil)

    filter by VM/CT IDs

  • selector (Selectors::Base, nil) (defaults to: nil)

    client-side selector for filtering results

  • options (Hash)

    additional options passed through to handler (e.g., limit, since, type_filter)

Returns:

  • (String)

    formatted output string



43
44
45
46
47
48
# File 'lib/pvectl/services/get/resource_service.rb', line 43

def list(node: nil, name: nil, args: [], storage: nil, vmid: nil, selector: nil, **options)
  models = @handler.list(node: node, name: name, args: args, storage: storage, vmid: vmid, **options)
  models = selector.apply(models) if selector && !selector.empty?
  presenter = @handler.presenter
  format_output(models, presenter)
end