Class: Pvectl::Services::EditVm
- Inherits:
-
Object
- Object
- Pvectl::Services::EditVm
- Defined in:
- lib/pvectl/services/edit_vm.rb
Overview
Orchestrates the interactive VM configuration editing flow.
Fetches current config, opens it in an editor as structured YAML, validates changes, computes a diff, and applies updates via the API. Supports dry-run mode and optimistic locking via digest.
Instance Method Summary collapse
-
#execute(vmid:) ⇒ Models::VmOperationResult?
Executes the interactive VM edit flow.
-
#initialize(vm_repository:, editor_session: nil, options: {}) ⇒ EditVm
constructor
Creates a new EditVm service.
Constructor Details
#initialize(vm_repository:, editor_session: nil, options: {}) ⇒ EditVm
Creates a new EditVm service.
26 27 28 29 30 |
# File 'lib/pvectl/services/edit_vm.rb', line 26 def initialize(vm_repository:, editor_session: nil, options: {}) @vm_repository = vm_repository @editor_session = editor_session @options = end |
Instance Method Details
#execute(vmid:) ⇒ Models::VmOperationResult?
Executes the interactive VM edit flow.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/pvectl/services/edit_vm.rb', line 36 def execute(vmid:) vm = @vm_repository.get(vmid) return not_found_result(vmid) unless vm config = @vm_repository.fetch_config(vm.node, vmid) resource_info = { vmid: vmid, node: vm.node, status: vm.status } yaml_content = ConfigSerializer.to_yaml(config, type: :vm, resource: resource_info) validator = ->(content) { ConfigSerializer.validate(content, type: :vm) } session = @editor_session || EditorSession.new(validator: validator) edited = session.edit(yaml_content) return nil unless edited original_roundtrip = ConfigSerializer.from_yaml(yaml_content, type: :vm) edited_flat = ConfigSerializer.from_yaml(edited, type: :vm) violations = ConfigSerializer.readonly_violations(original_roundtrip, edited_flat, type: :vm) unless violations.empty? return build_result(resource_info, success: false, error: "Read-only fields cannot be changed: #{violations.join(', ')}") end changes = ConfigSerializer.diff(original_roundtrip, edited_flat) if changes[:changed].empty? && changes[:added].empty? && changes[:removed].empty? return nil end params = build_update_params(changes, config) resource_info[:diff] = changes if @options[:dry_run] return build_result(resource_info, success: true) end @vm_repository.update(vmid, vm.node, params) build_result(resource_info, success: true) rescue StandardError => e build_result({ vmid: vmid }, success: false, error: e.) end |