pvectl 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.claude/rules/branch-before-changes.md +52 -0
- data/.claude/rules/documentation-updates.md +104 -0
- data/.claude/rules/git-workflow.md +84 -0
- data/.claude/rules/proxmox-api-docs.md +58 -0
- data/.claude/rules/rbs-signatures.md +80 -0
- data/.claude/rules/refactoring-as-design-option.md +35 -0
- data/.claude/scheduled_tasks.lock +1 -0
- data/.claude/settings.json +51 -0
- data/.mcp.json +8 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +138 -0
- data/CLAUDE.md +211 -0
- data/CODE_OF_CONDUCT.md +132 -0
- data/LICENSE.txt +21 -0
- data/README.md +143 -0
- data/Rakefile +8 -0
- data/docs/proxmox-api-update.sh +96 -0
- data/exe/pvectl +5 -0
- data/lib/pvectl/argv_preprocessor.rb +334 -0
- data/lib/pvectl/cli.rb +102 -0
- data/lib/pvectl/commands/apt.rb +389 -0
- data/lib/pvectl/commands/clone_container.rb +230 -0
- data/lib/pvectl/commands/clone_vm.rb +331 -0
- data/lib/pvectl/commands/cloudinit/command.rb +122 -0
- data/lib/pvectl/commands/cloudinit/dump.rb +94 -0
- data/lib/pvectl/commands/cloudinit/pending.rb +137 -0
- data/lib/pvectl/commands/cloudinit/regenerate.rb +79 -0
- data/lib/pvectl/commands/config/command.rb +65 -0
- data/lib/pvectl/commands/config/get_contexts.rb +68 -0
- data/lib/pvectl/commands/config/set_cluster.rb +103 -0
- data/lib/pvectl/commands/config/set_context.rb +136 -0
- data/lib/pvectl/commands/config/set_credentials.rb +181 -0
- data/lib/pvectl/commands/config/use_context.rb +69 -0
- data/lib/pvectl/commands/config/view.rb +67 -0
- data/lib/pvectl/commands/console.rb +93 -0
- data/lib/pvectl/commands/console_ct.rb +187 -0
- data/lib/pvectl/commands/console_vm.rb +187 -0
- data/lib/pvectl/commands/container_lifecycle_command.rb +77 -0
- data/lib/pvectl/commands/create_backup.rb +173 -0
- data/lib/pvectl/commands/create_container.rb +141 -0
- data/lib/pvectl/commands/create_resource_command.rb +244 -0
- data/lib/pvectl/commands/create_snapshot.rb +242 -0
- data/lib/pvectl/commands/create_vm.rb +267 -0
- data/lib/pvectl/commands/delete_backup.rb +139 -0
- data/lib/pvectl/commands/delete_command.rb +119 -0
- data/lib/pvectl/commands/delete_container.rb +30 -0
- data/lib/pvectl/commands/delete_snapshot.rb +248 -0
- data/lib/pvectl/commands/delete_vm.rb +127 -0
- data/lib/pvectl/commands/describe/command.rb +251 -0
- data/lib/pvectl/commands/edit_container.rb +56 -0
- data/lib/pvectl/commands/edit_dns.rb +149 -0
- data/lib/pvectl/commands/edit_hosts.rb +135 -0
- data/lib/pvectl/commands/edit_node.rb +54 -0
- data/lib/pvectl/commands/edit_resource_command.rb +180 -0
- data/lib/pvectl/commands/edit_vm.rb +154 -0
- data/lib/pvectl/commands/edit_volume.rb +189 -0
- data/lib/pvectl/commands/feature_command.rb +230 -0
- data/lib/pvectl/commands/feature_container.rb +21 -0
- data/lib/pvectl/commands/feature_vm.rb +94 -0
- data/lib/pvectl/commands/get/command.rb +360 -0
- data/lib/pvectl/commands/get/handlers/backups.rb +76 -0
- data/lib/pvectl/commands/get/handlers/capabilities.rb +107 -0
- data/lib/pvectl/commands/get/handlers/containers.rb +148 -0
- data/lib/pvectl/commands/get/handlers/disks.rb +107 -0
- data/lib/pvectl/commands/get/handlers/dns.rb +94 -0
- data/lib/pvectl/commands/get/handlers/hosts.rb +94 -0
- data/lib/pvectl/commands/get/handlers/nodes.rb +162 -0
- data/lib/pvectl/commands/get/handlers/services.rb +81 -0
- data/lib/pvectl/commands/get/handlers/snapshots.rb +97 -0
- data/lib/pvectl/commands/get/handlers/storage.rb +118 -0
- data/lib/pvectl/commands/get/handlers/subscription.rb +69 -0
- data/lib/pvectl/commands/get/handlers/tasks.rb +89 -0
- data/lib/pvectl/commands/get/handlers/templates.rb +175 -0
- data/lib/pvectl/commands/get/handlers/time.rb +118 -0
- data/lib/pvectl/commands/get/handlers/vms.rb +145 -0
- data/lib/pvectl/commands/get/handlers/volume.rb +134 -0
- data/lib/pvectl/commands/get/resource_handler.rb +63 -0
- data/lib/pvectl/commands/get/resource_registry.rb +18 -0
- data/lib/pvectl/commands/get/watch_loop.rb +129 -0
- data/lib/pvectl/commands/irreversible_command.rb +265 -0
- data/lib/pvectl/commands/logs/command.rb +275 -0
- data/lib/pvectl/commands/logs/handlers/journal.rb +46 -0
- data/lib/pvectl/commands/logs/handlers/syslog.rb +53 -0
- data/lib/pvectl/commands/logs/handlers/task_detail.rb +52 -0
- data/lib/pvectl/commands/logs/handlers/task_logs.rb +115 -0
- data/lib/pvectl/commands/logs/resource_handler.rb +46 -0
- data/lib/pvectl/commands/logs/resource_registry.rb +22 -0
- data/lib/pvectl/commands/migrate_command.rb +282 -0
- data/lib/pvectl/commands/migrate_container.rb +23 -0
- data/lib/pvectl/commands/migrate_vm.rb +122 -0
- data/lib/pvectl/commands/move_disk_command.rb +239 -0
- data/lib/pvectl/commands/move_disk_container.rb +21 -0
- data/lib/pvectl/commands/move_disk_vm.rb +127 -0
- data/lib/pvectl/commands/ping.rb +249 -0
- data/lib/pvectl/commands/pull.rb +342 -0
- data/lib/pvectl/commands/push.rb +352 -0
- data/lib/pvectl/commands/reset.rb +64 -0
- data/lib/pvectl/commands/resource_lifecycle_command.rb +277 -0
- data/lib/pvectl/commands/resource_registry.rb +73 -0
- data/lib/pvectl/commands/restart.rb +70 -0
- data/lib/pvectl/commands/restart_container.rb +18 -0
- data/lib/pvectl/commands/restore_backup.rb +236 -0
- data/lib/pvectl/commands/resume.rb +57 -0
- data/lib/pvectl/commands/rollback_snapshot.rb +228 -0
- data/lib/pvectl/commands/sendkey_vm.rb +205 -0
- data/lib/pvectl/commands/service.rb +293 -0
- data/lib/pvectl/commands/set_container.rb +50 -0
- data/lib/pvectl/commands/set_node.rb +52 -0
- data/lib/pvectl/commands/set_resource_command.rb +185 -0
- data/lib/pvectl/commands/set_vm.rb +136 -0
- data/lib/pvectl/commands/set_volume.rb +212 -0
- data/lib/pvectl/commands/shared_config_parsers.rb +126 -0
- data/lib/pvectl/commands/shared_flags.rb +155 -0
- data/lib/pvectl/commands/shutdown.rb +73 -0
- data/lib/pvectl/commands/shutdown_container.rb +18 -0
- data/lib/pvectl/commands/start.rb +79 -0
- data/lib/pvectl/commands/start_container.rb +18 -0
- data/lib/pvectl/commands/stop.rb +75 -0
- data/lib/pvectl/commands/stop_container.rb +18 -0
- data/lib/pvectl/commands/suspend.rb +64 -0
- data/lib/pvectl/commands/template_command.rb +205 -0
- data/lib/pvectl/commands/template_container.rb +27 -0
- data/lib/pvectl/commands/template_vm.rb +106 -0
- data/lib/pvectl/commands/top/command.rb +206 -0
- data/lib/pvectl/commands/top/handlers/containers.rb +61 -0
- data/lib/pvectl/commands/top/handlers/nodes.rb +61 -0
- data/lib/pvectl/commands/top/handlers/vms.rb +61 -0
- data/lib/pvectl/commands/top/resource_handler.rb +46 -0
- data/lib/pvectl/commands/top/resource_registry.rb +22 -0
- data/lib/pvectl/commands/unlink_disk_vm.rb +232 -0
- data/lib/pvectl/commands/vm_lifecycle_command.rb +77 -0
- data/lib/pvectl/commands/wakeonlan_node.rb +153 -0
- data/lib/pvectl/config/errors.rb +62 -0
- data/lib/pvectl/config/models/cluster.rb +180 -0
- data/lib/pvectl/config/models/context.rb +100 -0
- data/lib/pvectl/config/models/resolved_config.rb +171 -0
- data/lib/pvectl/config/models/user.rb +133 -0
- data/lib/pvectl/config/provider.rb +297 -0
- data/lib/pvectl/config/service.rb +300 -0
- data/lib/pvectl/config/store.rb +161 -0
- data/lib/pvectl/config/wizard.rb +309 -0
- data/lib/pvectl/config_serializer.rb +1034 -0
- data/lib/pvectl/connection/retry_handler.rb +161 -0
- data/lib/pvectl/connection.rb +157 -0
- data/lib/pvectl/console/terminal_session.rb +449 -0
- data/lib/pvectl/editor_session.rb +157 -0
- data/lib/pvectl/exit_codes.rb +43 -0
- data/lib/pvectl/formatters/base.rb +55 -0
- data/lib/pvectl/formatters/color_support.rb +90 -0
- data/lib/pvectl/formatters/json.rb +45 -0
- data/lib/pvectl/formatters/output_helper.rb +77 -0
- data/lib/pvectl/formatters/registry.rb +72 -0
- data/lib/pvectl/formatters/table.rb +235 -0
- data/lib/pvectl/formatters/wide.rb +93 -0
- data/lib/pvectl/formatters/yaml.rb +49 -0
- data/lib/pvectl/manifest_serializer.rb +142 -0
- data/lib/pvectl/models/apt_package.rb +107 -0
- data/lib/pvectl/models/backup.rb +173 -0
- data/lib/pvectl/models/base.rb +49 -0
- data/lib/pvectl/models/capability.rb +62 -0
- data/lib/pvectl/models/container.rb +205 -0
- data/lib/pvectl/models/container_operation_result.rb +27 -0
- data/lib/pvectl/models/dns_config.rb +54 -0
- data/lib/pvectl/models/hosts_file.rb +47 -0
- data/lib/pvectl/models/journal_entry.rb +16 -0
- data/lib/pvectl/models/network_interface.rb +85 -0
- data/lib/pvectl/models/node.rb +195 -0
- data/lib/pvectl/models/node_operation_result.rb +45 -0
- data/lib/pvectl/models/operation_result.rb +110 -0
- data/lib/pvectl/models/physical_disk.rb +193 -0
- data/lib/pvectl/models/service.rb +80 -0
- data/lib/pvectl/models/snapshot.rb +101 -0
- data/lib/pvectl/models/snapshot_description.rb +39 -0
- data/lib/pvectl/models/storage.rb +180 -0
- data/lib/pvectl/models/subscription.rb +87 -0
- data/lib/pvectl/models/syslog_entry.rb +17 -0
- data/lib/pvectl/models/task.rb +95 -0
- data/lib/pvectl/models/task_entry.rb +52 -0
- data/lib/pvectl/models/task_log_line.rb +17 -0
- data/lib/pvectl/models/time_config.rb +47 -0
- data/lib/pvectl/models/vm.rb +137 -0
- data/lib/pvectl/models/vm_operation_result.rb +27 -0
- data/lib/pvectl/models/volume.rb +133 -0
- data/lib/pvectl/models/volume_operation_result.rb +26 -0
- data/lib/pvectl/parsers/cloud_init_config.rb +92 -0
- data/lib/pvectl/parsers/disk_config.rb +97 -0
- data/lib/pvectl/parsers/lxc_mount_config.rb +98 -0
- data/lib/pvectl/parsers/lxc_net_config.rb +97 -0
- data/lib/pvectl/parsers/net_config.rb +95 -0
- data/lib/pvectl/parsers/smart_text.rb +42 -0
- data/lib/pvectl/plugin_loader.rb +157 -0
- data/lib/pvectl/presenters/apt_package.rb +99 -0
- data/lib/pvectl/presenters/backup.rb +128 -0
- data/lib/pvectl/presenters/base.rb +283 -0
- data/lib/pvectl/presenters/capability.rb +104 -0
- data/lib/pvectl/presenters/config/context.rb +80 -0
- data/lib/pvectl/presenters/container.rb +574 -0
- data/lib/pvectl/presenters/container_operation_result.rb +109 -0
- data/lib/pvectl/presenters/disk.rb +184 -0
- data/lib/pvectl/presenters/dns_config.rb +68 -0
- data/lib/pvectl/presenters/hosts_file.rb +61 -0
- data/lib/pvectl/presenters/journal_entry.rb +20 -0
- data/lib/pvectl/presenters/node.rb +762 -0
- data/lib/pvectl/presenters/node_operation_result.rb +50 -0
- data/lib/pvectl/presenters/operation_result.rb +61 -0
- data/lib/pvectl/presenters/service.rb +76 -0
- data/lib/pvectl/presenters/snapshot.rb +239 -0
- data/lib/pvectl/presenters/snapshot_operation_result.rb +125 -0
- data/lib/pvectl/presenters/storage.rb +329 -0
- data/lib/pvectl/presenters/subscription.rb +189 -0
- data/lib/pvectl/presenters/syslog_entry.rb +20 -0
- data/lib/pvectl/presenters/task_entry.rb +69 -0
- data/lib/pvectl/presenters/task_log_line.rb +20 -0
- data/lib/pvectl/presenters/template.rb +76 -0
- data/lib/pvectl/presenters/time_config.rb +86 -0
- data/lib/pvectl/presenters/top_container.rb +112 -0
- data/lib/pvectl/presenters/top_node.rb +115 -0
- data/lib/pvectl/presenters/top_presenter.rb +59 -0
- data/lib/pvectl/presenters/top_vm.rb +105 -0
- data/lib/pvectl/presenters/vm.rb +853 -0
- data/lib/pvectl/presenters/vm_operation_result.rb +109 -0
- data/lib/pvectl/presenters/volume.rb +136 -0
- data/lib/pvectl/presenters/volume_operation_result.rb +58 -0
- data/lib/pvectl/repositories/apt.rb +93 -0
- data/lib/pvectl/repositories/backup.rb +186 -0
- data/lib/pvectl/repositories/base.rb +110 -0
- data/lib/pvectl/repositories/capabilities.rb +96 -0
- data/lib/pvectl/repositories/container.rb +503 -0
- data/lib/pvectl/repositories/disk.rb +87 -0
- data/lib/pvectl/repositories/dns.rb +54 -0
- data/lib/pvectl/repositories/hosts.rb +63 -0
- data/lib/pvectl/repositories/journal.rb +23 -0
- data/lib/pvectl/repositories/node.rb +537 -0
- data/lib/pvectl/repositories/service.rb +139 -0
- data/lib/pvectl/repositories/snapshot.rb +133 -0
- data/lib/pvectl/repositories/storage.rb +302 -0
- data/lib/pvectl/repositories/subscription.rb +77 -0
- data/lib/pvectl/repositories/syslog.rb +25 -0
- data/lib/pvectl/repositories/task.rb +82 -0
- data/lib/pvectl/repositories/task_list.rb +30 -0
- data/lib/pvectl/repositories/task_log.rb +31 -0
- data/lib/pvectl/repositories/time_config.rb +53 -0
- data/lib/pvectl/repositories/vm.rb +616 -0
- data/lib/pvectl/repositories/volume.rb +306 -0
- data/lib/pvectl/selectors/base.rb +201 -0
- data/lib/pvectl/selectors/container.rb +116 -0
- data/lib/pvectl/selectors/disk.rb +59 -0
- data/lib/pvectl/selectors/vm.rb +116 -0
- data/lib/pvectl/selectors/volume.rb +59 -0
- data/lib/pvectl/services/backup.rb +209 -0
- data/lib/pvectl/services/clone_container.rb +260 -0
- data/lib/pvectl/services/clone_vm.rb +265 -0
- data/lib/pvectl/services/cloudinit.rb +96 -0
- data/lib/pvectl/services/console.rb +152 -0
- data/lib/pvectl/services/container_lifecycle.rb +124 -0
- data/lib/pvectl/services/create_container.rb +179 -0
- data/lib/pvectl/services/create_vm.rb +191 -0
- data/lib/pvectl/services/edit_container.rb +125 -0
- data/lib/pvectl/services/edit_dns.rb +159 -0
- data/lib/pvectl/services/edit_hosts.rb +78 -0
- data/lib/pvectl/services/edit_node.rb +147 -0
- data/lib/pvectl/services/edit_vm.rb +125 -0
- data/lib/pvectl/services/edit_volume.rb +224 -0
- data/lib/pvectl/services/get/resource_service.rb +98 -0
- data/lib/pvectl/services/move_disk.rb +132 -0
- data/lib/pvectl/services/pull_config.rb +94 -0
- data/lib/pvectl/services/push_config.rb +524 -0
- data/lib/pvectl/services/resize_volume.rb +253 -0
- data/lib/pvectl/services/resource_delete.rb +169 -0
- data/lib/pvectl/services/resource_migration.rb +170 -0
- data/lib/pvectl/services/sendkey.rb +108 -0
- data/lib/pvectl/services/service_lifecycle.rb +89 -0
- data/lib/pvectl/services/set_container.rb +128 -0
- data/lib/pvectl/services/set_node.rb +236 -0
- data/lib/pvectl/services/set_vm.rb +128 -0
- data/lib/pvectl/services/set_volume.rb +126 -0
- data/lib/pvectl/services/snapshot.rb +261 -0
- data/lib/pvectl/services/task_listing.rb +75 -0
- data/lib/pvectl/services/unlink_disk.rb +86 -0
- data/lib/pvectl/services/vm_lifecycle.rb +124 -0
- data/lib/pvectl/services/wakeonlan.rb +79 -0
- data/lib/pvectl/utils/resource_resolver.rb +80 -0
- data/lib/pvectl/version.rb +13 -0
- data/lib/pvectl/wizards/create_container.rb +105 -0
- data/lib/pvectl/wizards/create_vm.rb +98 -0
- data/lib/pvectl.rb +439 -0
- data/sig/external/gli.rbs +16 -0
- data/sig/external/proxmox_api.rbs +10 -0
- data/sig/pvectl/argv_preprocessor.rbs +53 -0
- data/sig/pvectl/cli.rbs +26 -0
- data/sig/pvectl/commands/apt.rbs +47 -0
- data/sig/pvectl/commands/clone_container.rbs +31 -0
- data/sig/pvectl/commands/clone_vm.rbs +33 -0
- data/sig/pvectl/commands/cloudinit/command.rbs +13 -0
- data/sig/pvectl/commands/cloudinit/dump.rbs +13 -0
- data/sig/pvectl/commands/cloudinit/pending.rbs +17 -0
- data/sig/pvectl/commands/cloudinit/regenerate.rbs +11 -0
- data/sig/pvectl/commands/config/command.rbs +9 -0
- data/sig/pvectl/commands/config/get_contexts.rbs +11 -0
- data/sig/pvectl/commands/config/set_cluster.rbs +11 -0
- data/sig/pvectl/commands/config/set_context.rbs +15 -0
- data/sig/pvectl/commands/config/set_credentials.rbs +15 -0
- data/sig/pvectl/commands/config/use_context.rbs +11 -0
- data/sig/pvectl/commands/config/view.rbs +11 -0
- data/sig/pvectl/commands/console.rbs +9 -0
- data/sig/pvectl/commands/console_ct.rbs +27 -0
- data/sig/pvectl/commands/console_vm.rbs +27 -0
- data/sig/pvectl/commands/container_lifecycle_command.rbs +25 -0
- data/sig/pvectl/commands/create_backup.rbs +29 -0
- data/sig/pvectl/commands/create_container.rbs +30 -0
- data/sig/pvectl/commands/create_resource_command.rbs +53 -0
- data/sig/pvectl/commands/create_snapshot.rbs +35 -0
- data/sig/pvectl/commands/create_vm.rbs +30 -0
- data/sig/pvectl/commands/delete_backup.rbs +25 -0
- data/sig/pvectl/commands/delete_command.rbs +45 -0
- data/sig/pvectl/commands/delete_container.rbs +11 -0
- data/sig/pvectl/commands/delete_snapshot.rbs +35 -0
- data/sig/pvectl/commands/delete_vm.rbs +13 -0
- data/sig/pvectl/commands/describe/command.rbs +27 -0
- data/sig/pvectl/commands/edit_container.rbs +17 -0
- data/sig/pvectl/commands/edit_dns.rbs +25 -0
- data/sig/pvectl/commands/edit_hosts.rbs +23 -0
- data/sig/pvectl/commands/edit_node.rbs +17 -0
- data/sig/pvectl/commands/edit_resource_command.rbs +35 -0
- data/sig/pvectl/commands/edit_vm.rbs +19 -0
- data/sig/pvectl/commands/edit_volume.rbs +24 -0
- data/sig/pvectl/commands/feature_command.rbs +43 -0
- data/sig/pvectl/commands/feature_container.rbs +10 -0
- data/sig/pvectl/commands/feature_vm.rbs +12 -0
- data/sig/pvectl/commands/get/command.rbs +42 -0
- data/sig/pvectl/commands/get/handlers/backups.rbs +23 -0
- data/sig/pvectl/commands/get/handlers/capabilities.rbs +29 -0
- data/sig/pvectl/commands/get/handlers/containers.rbs +35 -0
- data/sig/pvectl/commands/get/handlers/disks.rbs +27 -0
- data/sig/pvectl/commands/get/handlers/dns.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/hosts.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/nodes.rbs +33 -0
- data/sig/pvectl/commands/get/handlers/services.rbs +23 -0
- data/sig/pvectl/commands/get/handlers/snapshots.rbs +27 -0
- data/sig/pvectl/commands/get/handlers/storage.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/subscription.rbs +25 -0
- data/sig/pvectl/commands/get/handlers/tasks.rbs +28 -0
- data/sig/pvectl/commands/get/handlers/templates.rbs +35 -0
- data/sig/pvectl/commands/get/handlers/time.rbs +29 -0
- data/sig/pvectl/commands/get/handlers/vms.rbs +35 -0
- data/sig/pvectl/commands/get/handlers/volume.rbs +27 -0
- data/sig/pvectl/commands/get/resource_handler.rbs +13 -0
- data/sig/pvectl/commands/get/resource_registry.rbs +8 -0
- data/sig/pvectl/commands/get/watch_loop.rbs +33 -0
- data/sig/pvectl/commands/irreversible_command.rbs +32 -0
- data/sig/pvectl/commands/logs/command.rbs +35 -0
- data/sig/pvectl/commands/logs/handlers/journal.rbs +21 -0
- data/sig/pvectl/commands/logs/handlers/syslog.rbs +21 -0
- data/sig/pvectl/commands/logs/handlers/task_detail.rbs +21 -0
- data/sig/pvectl/commands/logs/handlers/task_logs.rbs +35 -0
- data/sig/pvectl/commands/logs/resource_handler.rbs +11 -0
- data/sig/pvectl/commands/logs/resource_registry.rbs +8 -0
- data/sig/pvectl/commands/migrate_command.rbs +45 -0
- data/sig/pvectl/commands/migrate_container.rbs +11 -0
- data/sig/pvectl/commands/migrate_vm.rbs +13 -0
- data/sig/pvectl/commands/move_disk_command.rbs +43 -0
- data/sig/pvectl/commands/move_disk_container.rbs +11 -0
- data/sig/pvectl/commands/move_disk_vm.rbs +13 -0
- data/sig/pvectl/commands/ping.rbs +39 -0
- data/sig/pvectl/commands/pull.rbs +33 -0
- data/sig/pvectl/commands/push.rbs +32 -0
- data/sig/pvectl/commands/reset.rbs +11 -0
- data/sig/pvectl/commands/resource_lifecycle_command.rbs +55 -0
- data/sig/pvectl/commands/resource_registry.rbs +19 -0
- data/sig/pvectl/commands/restart.rbs +11 -0
- data/sig/pvectl/commands/restart_container.rbs +9 -0
- data/sig/pvectl/commands/restore_backup.rbs +27 -0
- data/sig/pvectl/commands/resume.rbs +11 -0
- data/sig/pvectl/commands/rollback_snapshot.rbs +31 -0
- data/sig/pvectl/commands/sendkey_vm.rbs +25 -0
- data/sig/pvectl/commands/service.rbs +38 -0
- data/sig/pvectl/commands/set_container.rbs +13 -0
- data/sig/pvectl/commands/set_node.rbs +13 -0
- data/sig/pvectl/commands/set_resource_command.rbs +25 -0
- data/sig/pvectl/commands/set_vm.rbs +15 -0
- data/sig/pvectl/commands/set_volume.rbs +24 -0
- data/sig/pvectl/commands/shared_config_parsers.rbs +19 -0
- data/sig/pvectl/commands/shared_flags.rbs +10 -0
- data/sig/pvectl/commands/shutdown.rbs +11 -0
- data/sig/pvectl/commands/shutdown_container.rbs +9 -0
- data/sig/pvectl/commands/start.rbs +11 -0
- data/sig/pvectl/commands/start_container.rbs +9 -0
- data/sig/pvectl/commands/stop.rbs +11 -0
- data/sig/pvectl/commands/stop_container.rbs +9 -0
- data/sig/pvectl/commands/suspend.rbs +11 -0
- data/sig/pvectl/commands/template_command.rbs +21 -0
- data/sig/pvectl/commands/template_container.rbs +10 -0
- data/sig/pvectl/commands/template_vm.rbs +12 -0
- data/sig/pvectl/commands/top/command.rbs +31 -0
- data/sig/pvectl/commands/top/handlers/containers.rbs +21 -0
- data/sig/pvectl/commands/top/handlers/nodes.rbs +21 -0
- data/sig/pvectl/commands/top/handlers/vms.rbs +21 -0
- data/sig/pvectl/commands/top/resource_handler.rbs +11 -0
- data/sig/pvectl/commands/top/resource_registry.rbs +8 -0
- data/sig/pvectl/commands/unlink_disk_vm.rbs +27 -0
- data/sig/pvectl/commands/vm_lifecycle_command.rbs +25 -0
- data/sig/pvectl/commands/wakeonlan_node.rbs +21 -0
- data/sig/pvectl/config/errors.rbs +24 -0
- data/sig/pvectl/config/models/cluster.rbs +39 -0
- data/sig/pvectl/config/models/context.rbs +23 -0
- data/sig/pvectl/config/models/resolved_config.rbs +51 -0
- data/sig/pvectl/config/models/user.rbs +31 -0
- data/sig/pvectl/config/provider.rbs +40 -0
- data/sig/pvectl/config/service.rbs +65 -0
- data/sig/pvectl/config/store.rbs +14 -0
- data/sig/pvectl/config/wizard.rbs +48 -0
- data/sig/pvectl/config_serializer.rbs +121 -0
- data/sig/pvectl/connection/retry_handler.rbs +31 -0
- data/sig/pvectl/connection.rbs +35 -0
- data/sig/pvectl/console/terminal_session.rbs +63 -0
- data/sig/pvectl/editor_session.rbs +33 -0
- data/sig/pvectl/exit_codes.rbs +19 -0
- data/sig/pvectl/formatters/base.rbs +13 -0
- data/sig/pvectl/formatters/color_support.rbs +13 -0
- data/sig/pvectl/formatters/json.rbs +7 -0
- data/sig/pvectl/formatters/output_helper.rbs +9 -0
- data/sig/pvectl/formatters/registry.rbs +13 -0
- data/sig/pvectl/formatters/table.rbs +25 -0
- data/sig/pvectl/formatters/wide.rbs +15 -0
- data/sig/pvectl/formatters/yaml.rbs +7 -0
- data/sig/pvectl/manifest_serializer.rbs +18 -0
- data/sig/pvectl/models/apt_package.rbs +26 -0
- data/sig/pvectl/models/backup.rbs +31 -0
- data/sig/pvectl/models/base.rbs +11 -0
- data/sig/pvectl/models/capability.rbs +16 -0
- data/sig/pvectl/models/container.rbs +44 -0
- data/sig/pvectl/models/container_operation_result.rbs +9 -0
- data/sig/pvectl/models/dns_config.rbs +15 -0
- data/sig/pvectl/models/hosts_file.rbs +13 -0
- data/sig/pvectl/models/journal_entry.rbs +10 -0
- data/sig/pvectl/models/network_interface.rbs +20 -0
- data/sig/pvectl/models/node.rbs +47 -0
- data/sig/pvectl/models/node_operation_result.rbs +12 -0
- data/sig/pvectl/models/operation_result.rbs +21 -0
- data/sig/pvectl/models/physical_disk.rbs +35 -0
- data/sig/pvectl/models/service.rbs +18 -0
- data/sig/pvectl/models/snapshot.rbs +21 -0
- data/sig/pvectl/models/snapshot_description.rbs +18 -0
- data/sig/pvectl/models/storage.rbs +39 -0
- data/sig/pvectl/models/subscription.rbs +24 -0
- data/sig/pvectl/models/syslog_entry.rbs +10 -0
- data/sig/pvectl/models/task.rbs +22 -0
- data/sig/pvectl/models/task_entry.rbs +24 -0
- data/sig/pvectl/models/task_log_line.rbs +10 -0
- data/sig/pvectl/models/time_config.rbs +12 -0
- data/sig/pvectl/models/vm.rbs +32 -0
- data/sig/pvectl/models/vm_operation_result.rbs +9 -0
- data/sig/pvectl/models/volume.rbs +29 -0
- data/sig/pvectl/models/volume_operation_result.rbs +9 -0
- data/sig/pvectl/parsers/cloud_init_config.rbs +15 -0
- data/sig/pvectl/parsers/disk_config.rbs +19 -0
- data/sig/pvectl/parsers/lxc_mount_config.rbs +19 -0
- data/sig/pvectl/parsers/lxc_net_config.rbs +19 -0
- data/sig/pvectl/parsers/net_config.rbs +19 -0
- data/sig/pvectl/parsers/smart_text.rbs +7 -0
- data/sig/pvectl/plugin_loader.rbs +25 -0
- data/sig/pvectl/presenters/apt_package.rbs +19 -0
- data/sig/pvectl/presenters/backup.rbs +25 -0
- data/sig/pvectl/presenters/base.rbs +41 -0
- data/sig/pvectl/presenters/capability.rbs +19 -0
- data/sig/pvectl/presenters/config/context.rbs +17 -0
- data/sig/pvectl/presenters/container.rbs +78 -0
- data/sig/pvectl/presenters/container_operation_result.rbs +19 -0
- data/sig/pvectl/presenters/disk.rbs +31 -0
- data/sig/pvectl/presenters/dns_config.rbs +13 -0
- data/sig/pvectl/presenters/hosts_file.rbs +13 -0
- data/sig/pvectl/presenters/journal_entry.rbs +11 -0
- data/sig/pvectl/presenters/node.rbs +118 -0
- data/sig/pvectl/presenters/node_operation_result.rbs +11 -0
- data/sig/pvectl/presenters/operation_result.rbs +17 -0
- data/sig/pvectl/presenters/service.rbs +15 -0
- data/sig/pvectl/presenters/snapshot.rbs +35 -0
- data/sig/pvectl/presenters/snapshot_operation_result.rbs +27 -0
- data/sig/pvectl/presenters/storage.rbs +59 -0
- data/sig/pvectl/presenters/subscription.rbs +36 -0
- data/sig/pvectl/presenters/syslog_entry.rbs +11 -0
- data/sig/pvectl/presenters/task_entry.rbs +21 -0
- data/sig/pvectl/presenters/task_log_line.rbs +11 -0
- data/sig/pvectl/presenters/template.rbs +15 -0
- data/sig/pvectl/presenters/time_config.rbs +19 -0
- data/sig/pvectl/presenters/top_container.rbs +17 -0
- data/sig/pvectl/presenters/top_node.rbs +17 -0
- data/sig/pvectl/presenters/top_presenter.rbs +13 -0
- data/sig/pvectl/presenters/top_vm.rbs +17 -0
- data/sig/pvectl/presenters/vm.rbs +91 -0
- data/sig/pvectl/presenters/vm_operation_result.rbs +19 -0
- data/sig/pvectl/presenters/volume.rbs +23 -0
- data/sig/pvectl/presenters/volume_operation_result.rbs +11 -0
- data/sig/pvectl/repositories/apt.rbs +17 -0
- data/sig/pvectl/repositories/backup.rbs +27 -0
- data/sig/pvectl/repositories/base.rbs +23 -0
- data/sig/pvectl/repositories/capabilities.rbs +20 -0
- data/sig/pvectl/repositories/container.rbs +63 -0
- data/sig/pvectl/repositories/disk.rbs +17 -0
- data/sig/pvectl/repositories/dns.rbs +13 -0
- data/sig/pvectl/repositories/hosts.rbs +13 -0
- data/sig/pvectl/repositories/journal.rbs +7 -0
- data/sig/pvectl/repositories/node.rbs +68 -0
- data/sig/pvectl/repositories/service.rbs +27 -0
- data/sig/pvectl/repositories/snapshot.rbs +19 -0
- data/sig/pvectl/repositories/storage.rbs +37 -0
- data/sig/pvectl/repositories/subscription.rbs +17 -0
- data/sig/pvectl/repositories/syslog.rbs +7 -0
- data/sig/pvectl/repositories/task.rbs +19 -0
- data/sig/pvectl/repositories/task_list.rbs +7 -0
- data/sig/pvectl/repositories/task_log.rbs +11 -0
- data/sig/pvectl/repositories/time_config.rbs +13 -0
- data/sig/pvectl/repositories/vm.rbs +85 -0
- data/sig/pvectl/repositories/volume.rbs +43 -0
- data/sig/pvectl/selectors/base.rbs +37 -0
- data/sig/pvectl/selectors/container.rbs +19 -0
- data/sig/pvectl/selectors/disk.rbs +13 -0
- data/sig/pvectl/selectors/vm.rbs +19 -0
- data/sig/pvectl/selectors/volume.rbs +13 -0
- data/sig/pvectl/services/backup.rbs +27 -0
- data/sig/pvectl/services/clone_container.rbs +35 -0
- data/sig/pvectl/services/clone_vm.rbs +35 -0
- data/sig/pvectl/services/cloudinit.rbs +19 -0
- data/sig/pvectl/services/console.rbs +23 -0
- data/sig/pvectl/services/container_lifecycle.rbs +26 -0
- data/sig/pvectl/services/create_container.rbs +64 -0
- data/sig/pvectl/services/create_vm.rbs +72 -0
- data/sig/pvectl/services/edit_container.rbs +17 -0
- data/sig/pvectl/services/edit_dns.rbs +23 -0
- data/sig/pvectl/services/edit_hosts.rbs +13 -0
- data/sig/pvectl/services/edit_node.rbs +21 -0
- data/sig/pvectl/services/edit_vm.rbs +17 -0
- data/sig/pvectl/services/edit_volume.rbs +18 -0
- data/sig/pvectl/services/get/resource_service.rbs +23 -0
- data/sig/pvectl/services/move_disk.rbs +21 -0
- data/sig/pvectl/services/pull_config.rbs +18 -0
- data/sig/pvectl/services/push_config.rbs +37 -0
- data/sig/pvectl/services/resize_volume.rbs +47 -0
- data/sig/pvectl/services/resource_delete.rbs +27 -0
- data/sig/pvectl/services/resource_migration.rbs +29 -0
- data/sig/pvectl/services/sendkey.rbs +19 -0
- data/sig/pvectl/services/service_lifecycle.rbs +17 -0
- data/sig/pvectl/services/set_container.rbs +14 -0
- data/sig/pvectl/services/set_node.rbs +23 -0
- data/sig/pvectl/services/set_vm.rbs +14 -0
- data/sig/pvectl/services/set_volume.rbs +12 -0
- data/sig/pvectl/services/snapshot.rbs +35 -0
- data/sig/pvectl/services/task_listing.rbs +13 -0
- data/sig/pvectl/services/unlink_disk.rbs +17 -0
- data/sig/pvectl/services/vm_lifecycle.rbs +26 -0
- data/sig/pvectl/services/wakeonlan.rbs +17 -0
- data/sig/pvectl/utils/resource_resolver.rbs +17 -0
- data/sig/pvectl/wizards/create_container.rbs +21 -0
- data/sig/pvectl/wizards/create_vm.rbs +21 -0
- data/sig/pvectl.rbs +9 -0
- metadata +675 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents a Proxmox subscription record for a specific node.
|
|
6
|
+
#
|
|
7
|
+
# Immutable value object created by Repositories::Subscription from the
|
|
8
|
+
# `/nodes/{node}/subscription` API endpoint. One Subscription per node.
|
|
9
|
+
#
|
|
10
|
+
# For community (unlicensed) nodes the API still returns a record with
|
|
11
|
+
# status="notfound" or similar; key/productname/etc. are nil in that case.
|
|
12
|
+
#
|
|
13
|
+
# @see Pvectl::Repositories::Subscription
|
|
14
|
+
# @see Pvectl::Presenters::Subscription
|
|
15
|
+
#
|
|
16
|
+
class Subscription < Base
|
|
17
|
+
# @return [String, nil] node this subscription belongs to
|
|
18
|
+
attr_reader :node
|
|
19
|
+
|
|
20
|
+
# @return [String, nil] subscription status (active, notfound, invalid, expired, ...)
|
|
21
|
+
attr_reader :status
|
|
22
|
+
|
|
23
|
+
# @return [String, nil] subscription level code (c, b, s, p)
|
|
24
|
+
attr_reader :level
|
|
25
|
+
|
|
26
|
+
# @return [String, nil] human-readable product name
|
|
27
|
+
attr_reader :productname
|
|
28
|
+
|
|
29
|
+
# @return [String, nil] subscription key (full, unmasked)
|
|
30
|
+
attr_reader :key
|
|
31
|
+
|
|
32
|
+
# @return [String, nil] next due date (ISO date string)
|
|
33
|
+
attr_reader :nextduedate
|
|
34
|
+
|
|
35
|
+
# @return [String, nil] registration date (ISO date string)
|
|
36
|
+
attr_reader :regdate
|
|
37
|
+
|
|
38
|
+
# @return [Integer, nil] last server check timestamp (epoch)
|
|
39
|
+
attr_reader :checktime
|
|
40
|
+
|
|
41
|
+
# @return [String, nil] server ID for license validation
|
|
42
|
+
attr_reader :serverid
|
|
43
|
+
|
|
44
|
+
# @return [Integer, nil] number of sockets covered
|
|
45
|
+
attr_reader :sockets
|
|
46
|
+
|
|
47
|
+
# @return [String, nil] URL to web shop
|
|
48
|
+
attr_reader :url
|
|
49
|
+
|
|
50
|
+
# @return [String, nil] signature for offline keys
|
|
51
|
+
attr_reader :signature
|
|
52
|
+
|
|
53
|
+
# @return [String, nil] human-readable status message
|
|
54
|
+
attr_reader :message
|
|
55
|
+
|
|
56
|
+
# Creates a Subscription value object.
|
|
57
|
+
#
|
|
58
|
+
# @param attrs [Hash] subscription attributes (symbol or string keys)
|
|
59
|
+
def initialize(attrs = {})
|
|
60
|
+
super
|
|
61
|
+
@node = @attributes[:node]
|
|
62
|
+
@status = @attributes[:status]
|
|
63
|
+
@level = @attributes[:level]
|
|
64
|
+
@productname = @attributes[:productname]
|
|
65
|
+
@key = @attributes[:key]
|
|
66
|
+
@nextduedate = @attributes[:nextduedate]
|
|
67
|
+
@regdate = @attributes[:regdate]
|
|
68
|
+
@checktime = @attributes[:checktime]
|
|
69
|
+
@serverid = @attributes[:serverid]
|
|
70
|
+
@sockets = @attributes[:sockets]
|
|
71
|
+
@url = @attributes[:url]
|
|
72
|
+
@signature = @attributes[:signature]
|
|
73
|
+
@message = @attributes[:message]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# @return [Boolean] true if subscription is active
|
|
77
|
+
def active?
|
|
78
|
+
status == "active"
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @return [Boolean] true if the node has no subscription set
|
|
82
|
+
def missing?
|
|
83
|
+
status.nil? || status == "notfound" || status == "new"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents a syslog line from GET /nodes/{node}/syslog.
|
|
6
|
+
# Proxmox returns syslog entries as {n: line_number, t: text}.
|
|
7
|
+
class SyslogEntry < Base
|
|
8
|
+
attr_reader :n, :t
|
|
9
|
+
|
|
10
|
+
def initialize(attrs = {})
|
|
11
|
+
super(attrs)
|
|
12
|
+
@n = @attributes[:n]
|
|
13
|
+
@t = @attributes[:t]
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents a Proxmox task (asynchronous operation).
|
|
6
|
+
#
|
|
7
|
+
# Tasks are returned by lifecycle operations (start, stop, etc.).
|
|
8
|
+
# The UPID (Unique Process ID) identifies the task.
|
|
9
|
+
#
|
|
10
|
+
# @example Creating a Task model
|
|
11
|
+
# task = Task.new(upid: "UPID:pve1:...", status: "running")
|
|
12
|
+
# task.pending? #=> true
|
|
13
|
+
# task.completed? #=> false
|
|
14
|
+
#
|
|
15
|
+
# @see Pvectl::Repositories::Task Repository that creates Task instances
|
|
16
|
+
#
|
|
17
|
+
class Task < Base
|
|
18
|
+
# @return [String] Unique Process ID
|
|
19
|
+
attr_reader :upid
|
|
20
|
+
|
|
21
|
+
# @return [String] Node where task runs
|
|
22
|
+
attr_reader :node
|
|
23
|
+
|
|
24
|
+
# @return [String] Task type (qmstart, qmstop, etc.)
|
|
25
|
+
attr_reader :type
|
|
26
|
+
|
|
27
|
+
# @return [String] Task status (running, stopped)
|
|
28
|
+
attr_reader :status
|
|
29
|
+
|
|
30
|
+
# @return [String, nil] Exit status (OK, ERROR, etc.)
|
|
31
|
+
attr_reader :exitstatus
|
|
32
|
+
|
|
33
|
+
# @return [Integer, nil] Task start time (Unix timestamp)
|
|
34
|
+
attr_reader :starttime
|
|
35
|
+
|
|
36
|
+
# @return [Integer, nil] Task end time (Unix timestamp)
|
|
37
|
+
attr_reader :endtime
|
|
38
|
+
|
|
39
|
+
# @return [String, nil] User who started the task
|
|
40
|
+
attr_reader :user
|
|
41
|
+
|
|
42
|
+
# Creates a new Task model from attributes.
|
|
43
|
+
#
|
|
44
|
+
# @param attrs [Hash] Task attributes from API
|
|
45
|
+
def initialize(attrs = {})
|
|
46
|
+
super(attrs)
|
|
47
|
+
@upid = @attributes[:upid]
|
|
48
|
+
@node = @attributes[:node]
|
|
49
|
+
@type = @attributes[:type]
|
|
50
|
+
@status = @attributes[:status]
|
|
51
|
+
@exitstatus = @attributes[:exitstatus]
|
|
52
|
+
@starttime = @attributes[:starttime]
|
|
53
|
+
@endtime = @attributes[:endtime]
|
|
54
|
+
@user = @attributes[:user]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Checks if the task is still running.
|
|
58
|
+
#
|
|
59
|
+
# @return [Boolean] true if status is "running"
|
|
60
|
+
def pending?
|
|
61
|
+
status == "running"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Checks if the task has completed.
|
|
65
|
+
#
|
|
66
|
+
# @return [Boolean] true if status is not "running"
|
|
67
|
+
def completed?
|
|
68
|
+
!pending?
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Checks if the task completed successfully.
|
|
72
|
+
#
|
|
73
|
+
# @return [Boolean] true if completed with "OK" exitstatus
|
|
74
|
+
def successful?
|
|
75
|
+
completed? && exitstatus == "OK"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Checks if the task failed.
|
|
79
|
+
#
|
|
80
|
+
# @return [Boolean] true if completed with non-OK exitstatus
|
|
81
|
+
def failed?
|
|
82
|
+
completed? && exitstatus != "OK"
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# Returns task duration in seconds.
|
|
86
|
+
#
|
|
87
|
+
# @return [Integer, nil] duration or nil if not available
|
|
88
|
+
def duration
|
|
89
|
+
return nil unless endtime && starttime
|
|
90
|
+
|
|
91
|
+
endtime - starttime
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents an entry in a node's task list.
|
|
6
|
+
#
|
|
7
|
+
# Each entry corresponds to an asynchronous operation (start, stop,
|
|
8
|
+
# migrate, backup, etc.) performed on a resource. Returned by
|
|
9
|
+
# GET /nodes/{node}/tasks endpoint.
|
|
10
|
+
#
|
|
11
|
+
# @example
|
|
12
|
+
# entry = TaskEntry.new(type: "qmstart", status: "stopped", exitstatus: "OK")
|
|
13
|
+
# entry.successful? #=> true
|
|
14
|
+
#
|
|
15
|
+
class TaskEntry < Base
|
|
16
|
+
attr_reader :upid, :node, :type, :status, :exitstatus,
|
|
17
|
+
:starttime, :endtime, :user, :id, :pid, :pstart
|
|
18
|
+
|
|
19
|
+
def initialize(attrs = {})
|
|
20
|
+
super(attrs)
|
|
21
|
+
@upid = @attributes[:upid]
|
|
22
|
+
@node = @attributes[:node]
|
|
23
|
+
@type = @attributes[:type]
|
|
24
|
+
@status = @attributes[:status]
|
|
25
|
+
@exitstatus = @attributes[:exitstatus]
|
|
26
|
+
@starttime = @attributes[:starttime]
|
|
27
|
+
@endtime = @attributes[:endtime]
|
|
28
|
+
@user = @attributes[:user]
|
|
29
|
+
@id = @attributes[:id]
|
|
30
|
+
@pid = @attributes[:pid]
|
|
31
|
+
@pstart = @attributes[:pstart]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def successful?
|
|
35
|
+
completed? && exitstatus == "OK"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def failed?
|
|
39
|
+
completed? && exitstatus != "OK"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def completed?
|
|
43
|
+
status != "running"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def duration
|
|
47
|
+
return nil unless endtime && starttime
|
|
48
|
+
endtime - starttime
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents a single line from a task's log output.
|
|
6
|
+
# Returned by GET /nodes/{node}/tasks/{upid}/log.
|
|
7
|
+
class TaskLogLine < Base
|
|
8
|
+
attr_reader :n, :t
|
|
9
|
+
|
|
10
|
+
def initialize(attrs = {})
|
|
11
|
+
super(attrs)
|
|
12
|
+
@n = @attributes[:n]
|
|
13
|
+
@t = @attributes[:t]
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents the time and timezone settings of a Proxmox node.
|
|
6
|
+
#
|
|
7
|
+
# Immutable value object holding the response from `GET /nodes/{node}/time`,
|
|
8
|
+
# augmented with the node name (which is not part of the API payload but is
|
|
9
|
+
# the identifying context for the lookup).
|
|
10
|
+
#
|
|
11
|
+
# Display formatting is handled by Presenters::TimeConfig.
|
|
12
|
+
#
|
|
13
|
+
# @example Creating from API data
|
|
14
|
+
# data = { time: 1_715_000_000, localtime: 1_715_007_200, timezone: "Europe/Warsaw" }
|
|
15
|
+
# model = TimeConfig.new(data.merge(node_name: "pve1"))
|
|
16
|
+
# model.timezone #=> "Europe/Warsaw"
|
|
17
|
+
#
|
|
18
|
+
# @see Pvectl::Repositories::TimeConfig Repository that creates instances
|
|
19
|
+
# @see Pvectl::Presenters::TimeConfig Presenter for formatting
|
|
20
|
+
#
|
|
21
|
+
class TimeConfig < Base
|
|
22
|
+
# @return [String, nil] node name (identifies which node this config belongs to)
|
|
23
|
+
attr_reader :node_name
|
|
24
|
+
|
|
25
|
+
# @return [Integer, nil] seconds since epoch (UTC)
|
|
26
|
+
attr_reader :time
|
|
27
|
+
|
|
28
|
+
# @return [Integer, nil] seconds since epoch interpreted as the node's local
|
|
29
|
+
# wall clock (Proxmox returns the local clock encoded as if it were UTC).
|
|
30
|
+
attr_reader :localtime
|
|
31
|
+
|
|
32
|
+
# @return [String, nil] IANA timezone name (e.g., "Europe/Warsaw", "UTC")
|
|
33
|
+
attr_reader :timezone
|
|
34
|
+
|
|
35
|
+
# Creates a new TimeConfig.
|
|
36
|
+
#
|
|
37
|
+
# @param attributes [Hash] attribute key-value pairs
|
|
38
|
+
def initialize(attributes = {})
|
|
39
|
+
super
|
|
40
|
+
@node_name = @attributes[:node_name]
|
|
41
|
+
@time = @attributes[:time]
|
|
42
|
+
@localtime = @attributes[:localtime]
|
|
43
|
+
@timezone = @attributes[:timezone]
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents a QEMU virtual machine in the Proxmox cluster.
|
|
6
|
+
#
|
|
7
|
+
# Immutable domain model containing VM attributes and status predicates.
|
|
8
|
+
# Created by Repositories::Vm from API data.
|
|
9
|
+
# Display/formatting methods are in Presenters::Vm.
|
|
10
|
+
#
|
|
11
|
+
# @example Creating a VM model
|
|
12
|
+
# vm = Vm.new(vmid: 100, name: "web", status: "running", node: "pve1")
|
|
13
|
+
# vm.running? #=> true
|
|
14
|
+
# vm.template? #=> false
|
|
15
|
+
#
|
|
16
|
+
# @example From API response
|
|
17
|
+
# data = { "vmid" => 100, "name" => "web", "status" => "running" }
|
|
18
|
+
# vm = Vm.new(data)
|
|
19
|
+
#
|
|
20
|
+
# @see Pvectl::Repositories::Vm Repository that creates VM instances
|
|
21
|
+
# @see Pvectl::Presenters::Vm Presenter for formatting VM data
|
|
22
|
+
#
|
|
23
|
+
class Vm < Base
|
|
24
|
+
# @return [Integer] unique VM identifier
|
|
25
|
+
attr_reader :vmid
|
|
26
|
+
|
|
27
|
+
# @return [String, nil] VM name
|
|
28
|
+
attr_reader :name
|
|
29
|
+
|
|
30
|
+
# @return [String] VM status (running, stopped, paused)
|
|
31
|
+
attr_reader :status
|
|
32
|
+
|
|
33
|
+
# @return [String] node name where VM runs
|
|
34
|
+
attr_reader :node
|
|
35
|
+
|
|
36
|
+
# @return [Float, nil] current CPU usage (0-1 scale)
|
|
37
|
+
attr_reader :cpu
|
|
38
|
+
|
|
39
|
+
# @return [Integer, nil] maximum CPU cores
|
|
40
|
+
attr_reader :maxcpu
|
|
41
|
+
|
|
42
|
+
# @return [Integer, nil] current memory usage in bytes
|
|
43
|
+
attr_reader :mem
|
|
44
|
+
|
|
45
|
+
# @return [Integer, nil] maximum memory in bytes
|
|
46
|
+
attr_reader :maxmem
|
|
47
|
+
|
|
48
|
+
# @return [Integer, nil] current disk usage in bytes
|
|
49
|
+
attr_reader :disk
|
|
50
|
+
|
|
51
|
+
# @return [Integer, nil] maximum disk size in bytes
|
|
52
|
+
attr_reader :maxdisk
|
|
53
|
+
|
|
54
|
+
# @return [Integer, nil] uptime in seconds
|
|
55
|
+
attr_reader :uptime
|
|
56
|
+
|
|
57
|
+
# @return [Integer, nil] template flag (1 if template, 0 otherwise)
|
|
58
|
+
attr_reader :template
|
|
59
|
+
|
|
60
|
+
# @return [String, nil] semicolon-separated tags
|
|
61
|
+
attr_reader :tags
|
|
62
|
+
|
|
63
|
+
# @return [String, nil] HA state
|
|
64
|
+
attr_reader :hastate
|
|
65
|
+
|
|
66
|
+
# @return [Integer, nil] network input bytes
|
|
67
|
+
attr_reader :netin
|
|
68
|
+
|
|
69
|
+
# @return [Integer, nil] network output bytes
|
|
70
|
+
attr_reader :netout
|
|
71
|
+
|
|
72
|
+
# @return [Hash, nil] raw API responses for describe command
|
|
73
|
+
attr_reader :describe_data
|
|
74
|
+
|
|
75
|
+
# @return [String, nil] resource pool name
|
|
76
|
+
attr_reader :pool
|
|
77
|
+
|
|
78
|
+
# @return [String, nil] resource type from API ("qemu")
|
|
79
|
+
attr_reader :type
|
|
80
|
+
|
|
81
|
+
# Creates a new VM model from attributes.
|
|
82
|
+
#
|
|
83
|
+
# @param attrs [Hash] VM attributes from API (string or symbol keys)
|
|
84
|
+
def initialize(attrs = {})
|
|
85
|
+
super(attrs)
|
|
86
|
+
# Use @attributes which has normalized symbol keys from Base
|
|
87
|
+
@vmid = @attributes[:vmid]
|
|
88
|
+
@name = @attributes[:name]
|
|
89
|
+
@status = @attributes[:status]
|
|
90
|
+
@node = @attributes[:node]
|
|
91
|
+
@cpu = @attributes[:cpu]
|
|
92
|
+
@maxcpu = @attributes[:maxcpu]
|
|
93
|
+
@mem = @attributes[:mem]
|
|
94
|
+
@maxmem = @attributes[:maxmem]
|
|
95
|
+
@disk = @attributes[:disk]
|
|
96
|
+
@maxdisk = @attributes[:maxdisk]
|
|
97
|
+
@uptime = @attributes[:uptime]
|
|
98
|
+
@template = @attributes[:template]
|
|
99
|
+
@tags = @attributes[:tags]
|
|
100
|
+
@hastate = @attributes[:hastate]
|
|
101
|
+
@netin = @attributes[:netin]
|
|
102
|
+
@netout = @attributes[:netout]
|
|
103
|
+
@describe_data = @attributes[:describe_data]
|
|
104
|
+
@pool = @attributes[:pool]
|
|
105
|
+
@type = @attributes[:type]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Checks if the VM is running.
|
|
109
|
+
#
|
|
110
|
+
# @return [Boolean] true if status is "running"
|
|
111
|
+
def running?
|
|
112
|
+
status == "running"
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Checks if the VM is stopped.
|
|
116
|
+
#
|
|
117
|
+
# @return [Boolean] true if status is "stopped"
|
|
118
|
+
def stopped?
|
|
119
|
+
status == "stopped"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Checks if the VM is paused.
|
|
123
|
+
#
|
|
124
|
+
# @return [Boolean] true if status is "paused"
|
|
125
|
+
def paused?
|
|
126
|
+
status == "paused"
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Checks if the VM is a template.
|
|
130
|
+
#
|
|
131
|
+
# @return [Boolean] true if template flag is 1
|
|
132
|
+
def template?
|
|
133
|
+
template == 1
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents the result of a lifecycle operation on a VM.
|
|
6
|
+
#
|
|
7
|
+
# Extends OperationResult with VM-specific attribute.
|
|
8
|
+
#
|
|
9
|
+
# @example Successful sync operation
|
|
10
|
+
# result = VmOperationResult.new(vm: vm, task: task, success: task.successful?)
|
|
11
|
+
# result.vm #=> #<Models::Vm>
|
|
12
|
+
# result.successful? #=> true
|
|
13
|
+
#
|
|
14
|
+
class VmOperationResult < OperationResult
|
|
15
|
+
# @return [Models::Vm] The VM this result is for
|
|
16
|
+
attr_reader :vm
|
|
17
|
+
|
|
18
|
+
# Creates a new VmOperationResult.
|
|
19
|
+
#
|
|
20
|
+
# @param attrs [Hash] Result attributes including :vm
|
|
21
|
+
def initialize(attrs = {})
|
|
22
|
+
super
|
|
23
|
+
@vm = @attributes[:vm]
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents a virtual disk (volume) attached to a VM or container.
|
|
6
|
+
#
|
|
7
|
+
# Volumes can originate from two data sources:
|
|
8
|
+
# - VM/CT config (has name like "scsi0", parsed from config values)
|
|
9
|
+
# - Storage content API (has volid, content type)
|
|
10
|
+
#
|
|
11
|
+
# @example From VM config
|
|
12
|
+
# Volume.new(name: "scsi0", storage: "local-lvm", volume_id: "vm-100-disk-0",
|
|
13
|
+
# size: "32G", resource_type: "vm", resource_id: 100, node: "pve1")
|
|
14
|
+
#
|
|
15
|
+
# @example From storage content API
|
|
16
|
+
# Volume.new(volid: "local-lvm:vm-100-disk-0", size: "32G", format: "raw",
|
|
17
|
+
# content: "images", resource_type: "vm", resource_id: 100, node: "pve1")
|
|
18
|
+
#
|
|
19
|
+
class Volume < Base
|
|
20
|
+
# @return [String, nil] disk name from config (e.g., "scsi0", "rootfs")
|
|
21
|
+
attr_reader :name
|
|
22
|
+
|
|
23
|
+
# @return [String, nil] storage name (e.g., "local-lvm")
|
|
24
|
+
attr_reader :storage
|
|
25
|
+
|
|
26
|
+
# @return [String, nil] volume identifier within storage (e.g., "vm-100-disk-0")
|
|
27
|
+
attr_reader :volume_id
|
|
28
|
+
|
|
29
|
+
# @return [String, nil] full volume identifier (e.g., "local-lvm:vm-100-disk-0")
|
|
30
|
+
attr_reader :volid
|
|
31
|
+
|
|
32
|
+
# @return [String, nil] volume size (e.g., "32G")
|
|
33
|
+
attr_reader :size
|
|
34
|
+
|
|
35
|
+
# @return [String, nil] disk format (e.g., "raw", "qcow2")
|
|
36
|
+
attr_reader :format
|
|
37
|
+
|
|
38
|
+
# @return [String, nil] resource type ("vm" or "ct")
|
|
39
|
+
attr_reader :resource_type
|
|
40
|
+
|
|
41
|
+
# @return [Integer, nil] VMID or CTID
|
|
42
|
+
attr_reader :resource_id
|
|
43
|
+
|
|
44
|
+
# @return [String, nil] Proxmox node name
|
|
45
|
+
attr_reader :node
|
|
46
|
+
|
|
47
|
+
# @return [String, nil] storage content type (e.g., "images", "rootdir")
|
|
48
|
+
attr_reader :content
|
|
49
|
+
|
|
50
|
+
# @return [String, nil] cache mode (e.g., "writeback", "none")
|
|
51
|
+
attr_reader :cache
|
|
52
|
+
|
|
53
|
+
# @return [String, nil] discard mode (e.g., "on", "ignore")
|
|
54
|
+
attr_reader :discard
|
|
55
|
+
|
|
56
|
+
# @return [Integer, nil] SSD emulation flag (1/0)
|
|
57
|
+
attr_reader :ssd
|
|
58
|
+
|
|
59
|
+
# @return [Integer, nil] IO thread flag (1/0)
|
|
60
|
+
attr_reader :iothread
|
|
61
|
+
|
|
62
|
+
# @return [Integer, nil] backup inclusion flag (1/0)
|
|
63
|
+
attr_reader :backup
|
|
64
|
+
|
|
65
|
+
# @return [String, nil] mount point path (containers only)
|
|
66
|
+
attr_reader :mp
|
|
67
|
+
|
|
68
|
+
# Creates a new Volume instance.
|
|
69
|
+
#
|
|
70
|
+
# @param attrs [Hash] volume attributes
|
|
71
|
+
# @option attrs [String] :name disk name from config
|
|
72
|
+
# @option attrs [String] :storage storage name
|
|
73
|
+
# @option attrs [String] :volume_id volume identifier within storage
|
|
74
|
+
# @option attrs [String] :volid full volume identifier
|
|
75
|
+
# @option attrs [String] :size volume size
|
|
76
|
+
# @option attrs [String] :format disk format
|
|
77
|
+
# @option attrs [String] :resource_type resource type ("vm" or "ct")
|
|
78
|
+
# @option attrs [Integer] :resource_id VMID or CTID
|
|
79
|
+
# @option attrs [String] :node Proxmox node name
|
|
80
|
+
# @option attrs [String] :content storage content type
|
|
81
|
+
# @option attrs [String] :cache cache mode
|
|
82
|
+
# @option attrs [String] :discard discard mode
|
|
83
|
+
# @option attrs [Integer] :ssd SSD emulation flag (1/0)
|
|
84
|
+
# @option attrs [Integer] :iothread IO thread flag (1/0)
|
|
85
|
+
# @option attrs [Integer] :backup backup inclusion flag (1/0)
|
|
86
|
+
# @option attrs [String] :mp mount point path
|
|
87
|
+
def initialize(attrs = {})
|
|
88
|
+
super
|
|
89
|
+
@name = attributes[:name]
|
|
90
|
+
@storage = attributes[:storage]
|
|
91
|
+
@volume_id = attributes[:volume_id]
|
|
92
|
+
@volid = attributes[:volid] || construct_volid
|
|
93
|
+
@size = attributes[:size]
|
|
94
|
+
@format = attributes[:format]
|
|
95
|
+
@resource_type = attributes[:resource_type]
|
|
96
|
+
@resource_id = attributes[:resource_id]
|
|
97
|
+
@node = attributes[:node]
|
|
98
|
+
@content = attributes[:content]
|
|
99
|
+
@cache = attributes[:cache]
|
|
100
|
+
@discard = attributes[:discard]
|
|
101
|
+
@ssd = attributes[:ssd]
|
|
102
|
+
@iothread = attributes[:iothread]
|
|
103
|
+
@backup = attributes[:backup]
|
|
104
|
+
@mp = attributes[:mp]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Checks if volume belongs to a VM.
|
|
108
|
+
#
|
|
109
|
+
# @return [Boolean]
|
|
110
|
+
def vm?
|
|
111
|
+
resource_type == "vm"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Checks if volume belongs to a container.
|
|
115
|
+
#
|
|
116
|
+
# @return [Boolean]
|
|
117
|
+
def container?
|
|
118
|
+
resource_type == "ct"
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
private
|
|
122
|
+
|
|
123
|
+
# Constructs volid from storage and volume_id when not provided directly.
|
|
124
|
+
#
|
|
125
|
+
# @return [String, nil]
|
|
126
|
+
def construct_volid
|
|
127
|
+
return nil unless storage && volume_id
|
|
128
|
+
|
|
129
|
+
"#{storage}:#{volume_id}"
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Models
|
|
5
|
+
# Represents the result of a set/edit operation on a volume.
|
|
6
|
+
#
|
|
7
|
+
# Extends OperationResult with volume-specific attribute.
|
|
8
|
+
#
|
|
9
|
+
# @example Successful resize + config update
|
|
10
|
+
# result = VolumeOperationResult.new(volume: vol, operation: :set, success: true)
|
|
11
|
+
# result.volume #=> #<Models::Volume>
|
|
12
|
+
#
|
|
13
|
+
class VolumeOperationResult < OperationResult
|
|
14
|
+
# @return [Models::Volume, nil] The volume this result is for
|
|
15
|
+
attr_reader :volume
|
|
16
|
+
|
|
17
|
+
# Creates a new VolumeOperationResult.
|
|
18
|
+
#
|
|
19
|
+
# @param attrs [Hash] Result attributes including :volume
|
|
20
|
+
def initialize(attrs = {})
|
|
21
|
+
super
|
|
22
|
+
@volume = @attributes[:volume]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|