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
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.
Defined Under Namespace
Modules: ClassMethods
Class Method Summary collapse
-
.included(base) ⇒ void
Hook called when module is included.
Instance Method Summary collapse
-
#build_set_service(connection) ⇒ Object
Builds the set service.
-
#display_diff(result) ⇒ void
Displays a formatted diff from the operation result.
-
#execute ⇒ Integer
Executes the set command.
-
#execute_params(resource_id, key_values) ⇒ Hash
Builds execution parameters.
-
#initialize(args, options, global_options) ⇒ SetResourceCommand
Initializes a set command.
-
#load_config ⇒ void
Loads configuration.
-
#parse_key_values(args) ⇒ Hash
Parses key=value pairs from argument list.
-
#resource_id_label ⇒ String
Human label for resource ID.
-
#resource_label ⇒ String
Human label for resource.
-
#service_options ⇒ Hash
Returns service options.
-
#usage_error(message) ⇒ Integer
Outputs usage error.
Class Method Details
.included(base) ⇒ void
This method returns an undefined value.
Hook called when module is included.
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.
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.
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 |
#execute ⇒ Integer
Executes the set command.
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 [:"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.
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.
48 49 50 51 52 |
# File 'lib/pvectl/commands/set_resource_command.rb', line 48 def initialize(args, , ) @args = args = = end |
#load_config ⇒ void
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: [:config]) @config = service.current_config end |
#parse_key_values(args) ⇒ Hash
Parses key=value pairs from argument list.
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_label ⇒ String
Returns human label for resource ID.
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_label ⇒ String
Returns human label for resource.
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_options ⇒ Hash
Returns service options.
178 179 180 181 182 |
# File 'lib/pvectl/commands/set_resource_command.rb', line 178 def opts = {} opts[:dry_run] = true if [:"dry-run"] opts end |
#usage_error(message) ⇒ Integer
Outputs usage error.
170 171 172 173 |
# File 'lib/pvectl/commands/set_resource_command.rb', line 170 def usage_error() $stderr.puts "Error: #{message}" ExitCodes::USAGE_ERROR end |