Class: Pvectl::Selectors::Vm

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

Overview

Selector for filtering VMs.

Extends Base with VM-specific field extraction. Supports: status, tags, pool, name, template.

Examples:

Filter running VMs

selector = Vm.parse("status=running")
running_vms = selector.apply(all_vms)

Filter by multiple criteria

selector = Vm.parse("status=running,tags=prod")
filtered = selector.apply(all_vms)

Filter by name pattern

selector = Vm.parse("name=~web-*")
web_vms = selector.apply(all_vms)

Constant Summary collapse

SUPPORTED_FIELDS =

Returns:

  • (Array[String])
%w[status tags pool name template].freeze

Instance Attribute Summary

Attributes inherited from Base

#conditions

Instance Method Summary collapse

Methods inherited from Base

#compare_value, #empty?, #initialize, #matches?, parse, parse_all, #wildcard_match?

Constructor Details

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

Instance Method Details

#apply(vms) ⇒ Array<Models::Vm>

Applies selector to VM collection.

Parameters:

Returns:



29
30
31
32
33
# File 'lib/pvectl/selectors/vm.rb', line 29

def apply(vms)
  return vms if empty?

  vms.select { |vm| matches?(vm) }
end

#extract_value(vm, field) ⇒ String?

Extracts field value from VM model.

Parameters:

  • vm (Models::Vm)

    VM model

  • field (String)

    Field name (status, tags, pool, name, template)

Returns:

  • (String, nil)

    Field value

Raises:

  • (ArgumentError)

    if field is not supported



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/pvectl/selectors/vm.rb', line 43

def extract_value(vm, field)
  case field
  when "status"
    vm.status
  when "tags"
    vm.tags
  when "pool"
    vm.pool
  when "name"
    vm.name
  when "template"
    vm.template? ? "yes" : "no"
  else
    raise ArgumentError, "Unknown field: #{field}. Supported: #{SUPPORTED_FIELDS.join(', ')}"
  end
end

#match_condition?(vm, condition) ⇒ Boolean

Override to handle tags specially. Tags in Proxmox are semicolon-separated: "tag1;tag2;tag3" Selector "tags=prod" should match if "prod" is one of the tags.

Parameters:

  • vm (Models::Vm)

    VM model

  • condition (Hash)

    Condition

Returns:

  • (Boolean)

    true if matches



67
68
69
70
71
72
# File 'lib/pvectl/selectors/vm.rb', line 67

def match_condition?(vm, condition)
  return match_tags_condition?(vm, condition) if condition[:field] == "tags"
  return super(vm, normalize_boolean_condition(condition)) if condition[:field] == "template"

  super
end

#match_tags_condition?(vm, condition) ⇒ Boolean

Special matching for tags field. Proxmox tags are semicolon-separated, so we check if the value is contained in the tag list.

Parameters:

  • vm (Models::Vm)

    VM model

  • condition (Hash)

    Condition

Returns:

  • (Boolean)

    true if matches



97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/pvectl/selectors/vm.rb', line 97

def match_tags_condition?(vm, condition)
  tags_string = vm.tags || ""
  tag_list = tags_string.split(";").map(&:strip)

  case condition[:operator]
  when :eq
    tag_list.include?(condition[:value])
  when :neq
    !tag_list.include?(condition[:value])
  when :match
    tag_list.any? { |tag| wildcard_match?(tag, condition[:value]) }
  when :in
    (tag_list & condition[:value]).any?
  else
    false
  end
end