Class: Pvectl::Commands::Get::Handlers::Containers
- Inherits:
-
Object
- Object
- Pvectl::Commands::Get::Handlers::Containers
- Includes:
- ResourceHandler
- Defined in:
- lib/pvectl/commands/get/handlers/containers.rb,
sig/pvectl/commands/get/handlers/containers.rbs
Overview
Handler for listing LXC containers.
Implements ResourceHandler interface for the "containers" resource type. Uses Repositories::Container for data access and Presenters::Container for formatting.
Registered with ResourceRegistry on file load for "containers", "container", "ct", and "cts".
Constant Summary collapse
- CTID_PATTERN =
CTID validation pattern (100-999999999)
/\A[1-9]\d{2,8}\z/- SORT_FIELDS =
Sort field mappings. Negative values for descending sort (higher values first).
{ "name" => ->(c) { c.name || "" }, "node" => ->(c) { c.node || "" }, "cpu" => ->(c) { -(c.cpu || 0) }, "memory" => ->(c) { -(c.mem || 0) }, "disk" => ->(c) { -(c.disk || 0) }, "netin" => ->(c) { -(c.netin || 0) }, "netout" => ->(c) { -(c.netout || 0) } }.freeze
Instance Attribute Summary collapse
-
#repository ⇒ Repositories::Container
readonly
Returns repository, creating it if necessary.
Instance Method Summary collapse
-
#apply_sort(containers, sort_field) ⇒ Array<Models::Container>
Applies sorting to containers collection.
-
#build_repository ⇒ Repositories::Container
Builds repository with connection from config.
-
#describe(name:, node: nil, args: [], vmid: nil) ⇒ Models::Container
Describes a single container with comprehensive details.
-
#initialize(repository: nil) ⇒ Containers
constructor
Creates handler with optional repository for dependency injection.
-
#list(node: nil, name: nil, args: [], storage: nil, sort: nil, **_options) ⇒ Array<Models::Container>
Lists containers with optional filtering and sorting.
-
#presenter ⇒ Presenters::Container
Returns presenter for containers.
-
#selector_class ⇒ Class
Returns selector class for container filtering.
-
#valid_ctid?(ctid) ⇒ Boolean
Validates CTID format.
Constructor Details
#initialize(repository: nil) ⇒ Containers
Creates handler with optional repository for dependency injection.
44 45 46 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 44 def initialize(repository: nil) @repository = repository end |
Instance Attribute Details
#repository ⇒ Repositories::Container (readonly)
Returns repository, creating it if necessary.
99 100 101 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 99 def repository @repository ||= build_repository end |
Instance Method Details
#apply_sort(containers, sort_field) ⇒ Array<Models::Container>
Applies sorting to containers collection.
118 119 120 121 122 123 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 118 def apply_sort(containers, sort_field) sort_proc = SORT_FIELDS[sort_field.to_s] return containers unless sort_proc containers.sort_by(&sort_proc) end |
#build_repository ⇒ Repositories::Container
Builds repository with connection from config.
106 107 108 109 110 111 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 106 def build_repository config_service = Pvectl::Config::Service.new config_service.load connection = Pvectl::Connection.new(config_service.current_config) Pvectl::Repositories::Container.new(connection) end |
#describe(name:, node: nil, args: [], vmid: nil) ⇒ Models::Container
Describes a single container with comprehensive details.
84 85 86 87 88 89 90 91 92 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 84 def describe(name:, node: nil, args: [], vmid: nil) raise ArgumentError, "Invalid CTID: must be positive integer (100-999999999)" unless valid_ctid?(name) ctid = name.to_i container = repository.describe(ctid) raise Pvectl::ResourceNotFoundError, "Container not found: #{ctid}" if container.nil? container end |
#list(node: nil, name: nil, args: [], storage: nil, sort: nil, **_options) ⇒ Array<Models::Container>
Lists containers with optional filtering and sorting.
63 64 65 66 67 68 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 63 def list(node: nil, name: nil, args: [], storage: nil, sort: nil, **) containers = repository.list(node: node) containers = containers.select { |c| c.name == name } if name containers = apply_sort(containers, sort) if sort containers end |
#presenter ⇒ Presenters::Container
Returns presenter for containers.
73 74 75 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 73 def presenter Pvectl::Presenters::Container.new end |
#selector_class ⇒ Class
Returns selector class for container filtering.
51 52 53 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 51 def selector_class Pvectl::Selectors::Container end |
#valid_ctid?(ctid) ⇒ Boolean
Validates CTID format.
CTID must be a positive integer between 100 and 999999999. The minimum CTID in Proxmox is 100 (unlike VMID which can be 1).
132 133 134 135 136 |
# File 'lib/pvectl/commands/get/handlers/containers.rb', line 132 def valid_ctid?(ctid) return false if ctid.nil? || ctid.to_s.empty? ctid.to_s.match?(CTID_PATTERN) end |