Module: Pvectl::Commands::SetResourceCommand Abstract

Included in:
SetContainer, SetNode, SetVm
Defined in:
lib/pvectl/commands/set_resource_command.rb,
sig/pvectl/commands/set_resource_command.rbs

Overview

This module is abstract.

Include this module and implement template methods.

Shared functionality for resource set commands.

Template method pattern: provides common set workflow (config loading, key-value parsing, diff display, dry-run) while specialization classes define resource-specific hooks.

Examples:

Specialization

class SetVm
  include SetResourceCommand
  private
  def resource_label = "VM"
  def resource_id_label = "VMID"
  # ...
end

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ void

This method returns an undefined value.

Hook called when module is included.

Parameters:

  • base (Class)

    the class including this module



39
40
41
# File 'lib/pvectl/commands/set_resource_command.rb', line 39

def self.included(base)
  base.extend(ClassMethods)
end

Instance Method Details

#build_set_service(connection) ⇒ Object

Builds the set service.

Parameters:

Returns:

  • (Object)

    set service instance

Raises:

  • (NotImplementedError)


122
123
124
# File 'lib/pvectl/commands/set_resource_command.rb', line 122

def build_set_service(connection)
  raise NotImplementedError, "#{self.class} must implement #build_set_service"
end

#display_diff(result) ⇒ void

This method returns an undefined value.

Displays a formatted diff from the operation result.

Parameters:



147
148
149
150
151
152
153
154
155
# File 'lib/pvectl/commands/set_resource_command.rb', line 147

def display_diff(result)
  diff = result.resource&.dig(:diff)
  return unless diff
  return if diff[:changed].empty? && diff[:added].empty? && diff[:removed].empty?

  $stdout.puts "\nChanges:"
  $stdout.puts Pvectl::ConfigSerializer.format_diff(diff)
  $stdout.puts ""
end

#executeInteger

Executes the set command.

Returns:

  • (Integer)

    exit code



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/pvectl/commands/set_resource_command.rb', line 57

def execute
  resource_id = @args.first
  return usage_error("#{resource_id_label} is required") unless resource_id

  key_values = parse_key_values(@args[1..])
  return usage_error("At least one key=value pair is required") if key_values.empty?

  load_config
  connection = Pvectl::Connection.new(@config)
  service = build_set_service(connection)
  result = service.execute(**execute_params(resource_id, key_values))

  if result.nil?
    $stdout.puts "No changes detected."
    return ExitCodes::SUCCESS
  end

  if result.successful?
    display_diff(result)
    if @options[:"dry-run"]
      $stdout.puts "(dry-run mode — no changes applied)"
    else
      $stdout.puts "#{resource_label} #{resource_id} updated successfully."
    end
    ExitCodes::SUCCESS
  else
    $stderr.puts "Error: #{result.error}"
    ExitCodes::GENERAL_ERROR
  end
rescue Pvectl::Config::ConfigNotFoundError,
       Pvectl::Config::InvalidConfigError,
       Pvectl::Config::ContextNotFoundError,
       Pvectl::Config::ClusterNotFoundError,
       Pvectl::Config::UserNotFoundError
  raise
rescue StandardError => e
  $stderr.puts "Error: #{e.message}"
  ExitCodes::GENERAL_ERROR
end

#execute_params(resource_id, key_values) ⇒ Hash

Builds execution parameters.

Parameters:

  • resource_id (String)

    resource identifier

  • key_values (Hash)

    parsed key-value pairs

Returns:

  • (Hash)

    parameters for the service

Raises:

  • (NotImplementedError)


114
115
116
# File 'lib/pvectl/commands/set_resource_command.rb', line 114

def execute_params(resource_id, key_values)
  raise NotImplementedError, "#{self.class} must implement #execute_params"
end

#initialize(args, options, global_options) ⇒ SetResourceCommand

Initializes a set command.

Parameters:

  • args (Array<String>)

    command arguments

  • options (Hash)

    command options

  • global_options (Hash)

    global CLI options

Returns:



48
49
50
51
52
# File 'lib/pvectl/commands/set_resource_command.rb', line 48

def initialize(args, options, global_options)
  @args = args
  @options = options
  @global_options = global_options
end

#load_configvoid

This method returns an undefined value.

Loads configuration.



160
161
162
163
164
# File 'lib/pvectl/commands/set_resource_command.rb', line 160

def load_config
  service = Pvectl::Config::Service.new
  service.load(config: @global_options[:config])
  @config = service.current_config
end

#parse_key_values(args) ⇒ Hash

Parses key=value pairs from argument list.

Parameters:

  • args (Array<String>)

    arguments like ["memory=4096", "cores=2"]

Returns:

  • (Hash)

    parsed pairs { "memory" => "4096", "cores" => "2" }



130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/pvectl/commands/set_resource_command.rb', line 130

def parse_key_values(args)
  pairs = {}
  (args || []).each do |arg|
    unless arg.include?("=")
      $stderr.puts "Warning: Ignoring argument without '=': #{arg}"
      next
    end
    key, value = arg.split("=", 2)
    pairs[key] = value
  end
  pairs
end

#resource_id_labelString

Returns human label for resource ID.

Returns:

  • (String)

    human label for resource ID

Raises:

  • (NotImplementedError)


105
106
107
# File 'lib/pvectl/commands/set_resource_command.rb', line 105

def resource_id_label
  raise NotImplementedError, "#{self.class} must implement #resource_id_label"
end

#resource_labelString

Returns human label for resource.

Returns:

  • (String)

    human label for resource

Raises:

  • (NotImplementedError)


100
101
102
# File 'lib/pvectl/commands/set_resource_command.rb', line 100

def resource_label
  raise NotImplementedError, "#{self.class} must implement #resource_label"
end

#service_optionsHash

Returns service options.

Returns:

  • (Hash)

    service options



178
179
180
181
182
# File 'lib/pvectl/commands/set_resource_command.rb', line 178

def service_options
  opts = {}
  opts[:dry_run] = true if @options[:"dry-run"]
  opts
end

#usage_error(message) ⇒ Integer

Outputs usage error.

Parameters:

  • message (String)

    error message

Returns:

  • (Integer)

    exit code



170
171
172
173
# File 'lib/pvectl/commands/set_resource_command.rb', line 170

def usage_error(message)
  $stderr.puts "Error: #{message}"
  ExitCodes::USAGE_ERROR
end