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,86 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Presenters
|
|
5
|
+
# Presenter for node time and timezone settings.
|
|
6
|
+
#
|
|
7
|
+
# Renders both the UTC timestamp and the node's local wall clock as
|
|
8
|
+
# human-readable strings. Proxmox returns `localtime` as seconds-since-epoch
|
|
9
|
+
# interpreted as if the node's wall clock were UTC, so we format it via
|
|
10
|
+
# `Time.at(localtime).utc.strftime(...)` to preserve the node's view.
|
|
11
|
+
#
|
|
12
|
+
# @example Using with formatter
|
|
13
|
+
# presenter = TimeConfig.new
|
|
14
|
+
# formatter = Formatters::Table.new
|
|
15
|
+
# output = formatter.format(time_configs, presenter)
|
|
16
|
+
#
|
|
17
|
+
# @see Pvectl::Models::TimeConfig
|
|
18
|
+
#
|
|
19
|
+
class TimeConfig < Base
|
|
20
|
+
# Date format for timestamp columns.
|
|
21
|
+
TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S"
|
|
22
|
+
|
|
23
|
+
# Returns column headers for table output.
|
|
24
|
+
#
|
|
25
|
+
# @return [Array<String>] column headers
|
|
26
|
+
def columns
|
|
27
|
+
["NODE", "TIMEZONE", "TIME (UTC)", "LOCAL TIME"]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Converts TimeConfig model to a table row.
|
|
31
|
+
#
|
|
32
|
+
# @param model [Models::TimeConfig] time configuration
|
|
33
|
+
# @param _context [Hash] optional context (unused)
|
|
34
|
+
# @return [Array<String>] row values matching columns order
|
|
35
|
+
def to_row(model, **_context)
|
|
36
|
+
[
|
|
37
|
+
model.node_name || "-",
|
|
38
|
+
model.timezone || "-",
|
|
39
|
+
format_timestamp(model.time),
|
|
40
|
+
format_timestamp(model.localtime)
|
|
41
|
+
]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Converts TimeConfig model to a hash for JSON/YAML output.
|
|
45
|
+
#
|
|
46
|
+
# @param model [Models::TimeConfig] time configuration
|
|
47
|
+
# @return [Hash{String => Object}] hash representation
|
|
48
|
+
def to_hash(model)
|
|
49
|
+
{
|
|
50
|
+
"node" => model.node_name,
|
|
51
|
+
"timezone" => model.timezone,
|
|
52
|
+
"time" => model.time,
|
|
53
|
+
"localtime" => model.localtime,
|
|
54
|
+
"time_iso" => iso(model.time),
|
|
55
|
+
"localtime_iso" => iso(model.localtime)
|
|
56
|
+
}
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# Formats epoch seconds as a UTC-displayed string.
|
|
62
|
+
#
|
|
63
|
+
# Used for both the UTC `time` field and `localtime` (Proxmox encodes
|
|
64
|
+
# the local wall clock as seconds-since-epoch interpreted as UTC, so the
|
|
65
|
+
# same formatting produces the correct display in both cases).
|
|
66
|
+
#
|
|
67
|
+
# @param epoch [Integer, nil] seconds since 1970-01-01
|
|
68
|
+
# @return [String] formatted timestamp or "-" when nil
|
|
69
|
+
def format_timestamp(epoch)
|
|
70
|
+
return "-" if epoch.nil?
|
|
71
|
+
|
|
72
|
+
Time.at(epoch).utc.strftime(TIMESTAMP_FORMAT)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# ISO 8601 representation for JSON/YAML output.
|
|
76
|
+
#
|
|
77
|
+
# @param epoch [Integer, nil] seconds since 1970-01-01
|
|
78
|
+
# @return [String, nil] ISO 8601 string or nil when epoch is nil
|
|
79
|
+
def iso(epoch)
|
|
80
|
+
return nil if epoch.nil?
|
|
81
|
+
|
|
82
|
+
Time.at(epoch).utc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Presenters
|
|
5
|
+
# Presenter for container resource usage metrics (top command).
|
|
6
|
+
#
|
|
7
|
+
# Inherits from Presenters::Container for reuse of formatting methods.
|
|
8
|
+
# Includes TopPresenter for shared metrics display.
|
|
9
|
+
# Focuses on CPU, memory, swap, disk, and network utilization.
|
|
10
|
+
#
|
|
11
|
+
# @example Using with formatter
|
|
12
|
+
# presenter = TopContainer.new
|
|
13
|
+
# formatter = Formatters::Table.new
|
|
14
|
+
# output = formatter.format(containers, presenter)
|
|
15
|
+
#
|
|
16
|
+
# @see Pvectl::Presenters::Container Parent presenter
|
|
17
|
+
# @see Pvectl::Presenters::TopPresenter Shared metrics module
|
|
18
|
+
# @see Pvectl::Commands::Top::Command Top command
|
|
19
|
+
#
|
|
20
|
+
class TopContainer < Container
|
|
21
|
+
include TopPresenter
|
|
22
|
+
|
|
23
|
+
# Returns column headers for standard table output.
|
|
24
|
+
#
|
|
25
|
+
# @return [Array<String>] column headers
|
|
26
|
+
def columns
|
|
27
|
+
%w[CTID NAME NODE CPU(cores) CPU% MEMORY MEMORY%]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Returns additional column headers for wide output.
|
|
31
|
+
#
|
|
32
|
+
# @return [Array<String>] extra column headers
|
|
33
|
+
def extra_columns
|
|
34
|
+
%w[SWAP SWAP% DISK DISK% NETIN NETOUT]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Converts Container model to table row with metrics values.
|
|
38
|
+
#
|
|
39
|
+
# @param model [Models::Container] Container model
|
|
40
|
+
# @param context [Hash] optional context
|
|
41
|
+
# @return [Array<String>] row values matching columns order
|
|
42
|
+
def to_row(model, **_context)
|
|
43
|
+
@container = model
|
|
44
|
+
[
|
|
45
|
+
container.vmid.to_s,
|
|
46
|
+
display_name,
|
|
47
|
+
container.node,
|
|
48
|
+
cpu_cores_value(container),
|
|
49
|
+
cpu_usage_value(container),
|
|
50
|
+
memory_display,
|
|
51
|
+
percent_display(container.mem, container.maxmem)
|
|
52
|
+
]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns additional values for wide output.
|
|
56
|
+
#
|
|
57
|
+
# @param model [Models::Container] Container model
|
|
58
|
+
# @param context [Hash] optional context
|
|
59
|
+
# @return [Array<String>] extra values matching extra_columns order
|
|
60
|
+
def extra_values(model, **_context)
|
|
61
|
+
@container = model
|
|
62
|
+
[
|
|
63
|
+
swap_display,
|
|
64
|
+
percent_display(container.swap, container.maxswap),
|
|
65
|
+
disk_display,
|
|
66
|
+
percent_display(container.disk, container.maxdisk),
|
|
67
|
+
netin_display,
|
|
68
|
+
netout_display
|
|
69
|
+
]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Converts Container model to hash for JSON/YAML output.
|
|
73
|
+
#
|
|
74
|
+
# Returns metrics-focused hash without operational info
|
|
75
|
+
# (no status, template, tags, pool, uptime).
|
|
76
|
+
#
|
|
77
|
+
# @param model [Models::Container] Container model
|
|
78
|
+
# @return [Hash] metrics-focused hash representation
|
|
79
|
+
def to_hash(model)
|
|
80
|
+
@container = model
|
|
81
|
+
{
|
|
82
|
+
"ctid" => container.vmid,
|
|
83
|
+
"name" => container.name,
|
|
84
|
+
"node" => container.node,
|
|
85
|
+
"cpu" => {
|
|
86
|
+
"usage_percent" => container.cpu.nil? ? nil : (container.cpu * 100).round,
|
|
87
|
+
"cores" => container.maxcpu
|
|
88
|
+
},
|
|
89
|
+
"memory" => {
|
|
90
|
+
"used_bytes" => container.mem,
|
|
91
|
+
"total_bytes" => container.maxmem,
|
|
92
|
+
"usage_percent" => percent_value(container.mem, container.maxmem)
|
|
93
|
+
},
|
|
94
|
+
"swap" => {
|
|
95
|
+
"used_bytes" => container.swap,
|
|
96
|
+
"total_bytes" => container.maxswap,
|
|
97
|
+
"usage_percent" => percent_value(container.swap, container.maxswap)
|
|
98
|
+
},
|
|
99
|
+
"disk" => {
|
|
100
|
+
"used_bytes" => container.disk,
|
|
101
|
+
"total_bytes" => container.maxdisk,
|
|
102
|
+
"usage_percent" => percent_value(container.disk, container.maxdisk)
|
|
103
|
+
},
|
|
104
|
+
"network" => {
|
|
105
|
+
"in_bytes" => container.netin,
|
|
106
|
+
"out_bytes" => container.netout
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Presenters
|
|
5
|
+
# Presenter for node resource usage metrics (top command).
|
|
6
|
+
#
|
|
7
|
+
# Inherits from Presenters::Node for reuse of formatting methods.
|
|
8
|
+
# Focuses on CPU, memory, disk, and swap utilization rather than
|
|
9
|
+
# operational details (version, kernel, services).
|
|
10
|
+
#
|
|
11
|
+
# @example Using with formatter
|
|
12
|
+
# presenter = TopNode.new
|
|
13
|
+
# formatter = Formatters::Table.new
|
|
14
|
+
# output = formatter.format(nodes, presenter)
|
|
15
|
+
#
|
|
16
|
+
# @see Pvectl::Presenters::Node Parent presenter
|
|
17
|
+
# @see Pvectl::Commands::Top::Command Top command
|
|
18
|
+
#
|
|
19
|
+
class TopNode < Node
|
|
20
|
+
include TopPresenter
|
|
21
|
+
|
|
22
|
+
# Returns column headers for standard table output.
|
|
23
|
+
#
|
|
24
|
+
# @return [Array<String>] column headers
|
|
25
|
+
def columns
|
|
26
|
+
%w[NAME CPU(cores) CPU% MEMORY MEMORY%]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Returns additional column headers for wide output.
|
|
30
|
+
#
|
|
31
|
+
# @return [Array<String>] extra column headers
|
|
32
|
+
def extra_columns
|
|
33
|
+
%w[DISK DISK% SWAP SWAP% LOAD GUESTS]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Converts Node model to table row with metrics values.
|
|
37
|
+
#
|
|
38
|
+
# @param model [Models::Node] Node model
|
|
39
|
+
# @param context [Hash] optional context
|
|
40
|
+
# @return [Array<String>] row values matching columns order
|
|
41
|
+
def to_row(model, **_context)
|
|
42
|
+
@node = model
|
|
43
|
+
cores = node.offline? ? "-" : cpu_cores_value(node)
|
|
44
|
+
[
|
|
45
|
+
node.name,
|
|
46
|
+
cores,
|
|
47
|
+
cpu_percent,
|
|
48
|
+
memory_display,
|
|
49
|
+
memory_percent_display(node)
|
|
50
|
+
]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Returns additional values for wide output.
|
|
54
|
+
#
|
|
55
|
+
# @param model [Models::Node] Node model
|
|
56
|
+
# @param context [Hash] optional context
|
|
57
|
+
# @return [Array<String>] extra values matching extra_columns order
|
|
58
|
+
def extra_values(model, **_context)
|
|
59
|
+
@node = model
|
|
60
|
+
[
|
|
61
|
+
storage_display,
|
|
62
|
+
percent_display(node.disk, node.maxdisk),
|
|
63
|
+
swap_display,
|
|
64
|
+
swap_percent_display(node),
|
|
65
|
+
load_display,
|
|
66
|
+
node.guests_total.to_s
|
|
67
|
+
]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Converts Node model to hash for JSON/YAML output.
|
|
71
|
+
#
|
|
72
|
+
# Returns metrics-focused hash without operational info
|
|
73
|
+
# (no version, kernel, uptime, alerts, network).
|
|
74
|
+
#
|
|
75
|
+
# @param model [Models::Node] Node model
|
|
76
|
+
# @return [Hash] metrics-focused hash representation
|
|
77
|
+
def to_hash(model)
|
|
78
|
+
@node = model
|
|
79
|
+
{
|
|
80
|
+
"name" => node.name,
|
|
81
|
+
"cpu" => {
|
|
82
|
+
"usage_percent" => node.cpu.nil? ? nil : (node.cpu * 100).round,
|
|
83
|
+
"cores" => node.maxcpu
|
|
84
|
+
},
|
|
85
|
+
"memory" => {
|
|
86
|
+
"used_bytes" => node.mem,
|
|
87
|
+
"total_bytes" => node.maxmem,
|
|
88
|
+
"usage_percent" => memory_percent(node)
|
|
89
|
+
},
|
|
90
|
+
"disk" => {
|
|
91
|
+
"used_bytes" => node.disk,
|
|
92
|
+
"total_bytes" => node.maxdisk,
|
|
93
|
+
"usage_percent" => storage_percent(node)
|
|
94
|
+
},
|
|
95
|
+
"swap" => {
|
|
96
|
+
"used_bytes" => node.swap_used,
|
|
97
|
+
"total_bytes" => node.swap_total,
|
|
98
|
+
"usage_percent" => swap_percent(node)
|
|
99
|
+
},
|
|
100
|
+
"load" => {
|
|
101
|
+
"avg1" => node.loadavg&.dig(0),
|
|
102
|
+
"avg5" => node.loadavg&.dig(1),
|
|
103
|
+
"avg15" => node.loadavg&.dig(2)
|
|
104
|
+
},
|
|
105
|
+
"guests" => {
|
|
106
|
+
"total" => node.guests_total,
|
|
107
|
+
"vms" => node.guests_vms,
|
|
108
|
+
"cts" => node.guests_cts
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Presenters
|
|
5
|
+
# Shared metrics formatting for top command presenters.
|
|
6
|
+
#
|
|
7
|
+
# Provides common display methods for CPU cores, CPU usage percentage,
|
|
8
|
+
# and generic percentage calculations used across TopNode, TopVm,
|
|
9
|
+
# and TopContainer presenters.
|
|
10
|
+
#
|
|
11
|
+
# @example Including in a presenter
|
|
12
|
+
# class TopVm < Vm
|
|
13
|
+
# include TopPresenter
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
module TopPresenter
|
|
17
|
+
# Returns CPU core count for display.
|
|
18
|
+
#
|
|
19
|
+
# @param resource [Object] model with maxcpu attribute
|
|
20
|
+
# @return [String] core count or "-" if unavailable
|
|
21
|
+
def cpu_cores_value(resource)
|
|
22
|
+
return "-" if resource.maxcpu.nil?
|
|
23
|
+
|
|
24
|
+
resource.maxcpu.to_s
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns CPU usage as percentage string.
|
|
28
|
+
#
|
|
29
|
+
# @param resource [Object] model with cpu attribute (0.0-1.0 fraction)
|
|
30
|
+
# @return [String] CPU percentage (e.g., "23%") or "-" if unavailable
|
|
31
|
+
def cpu_usage_value(resource)
|
|
32
|
+
return "-" if resource.cpu.nil?
|
|
33
|
+
|
|
34
|
+
"#{(resource.cpu * 100).round}%"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Returns percentage display string from used/total values.
|
|
38
|
+
#
|
|
39
|
+
# @param used [Numeric, nil] used amount
|
|
40
|
+
# @param total [Numeric, nil] total amount
|
|
41
|
+
# @return [String] percentage (e.g., "45%") or "-" if unavailable
|
|
42
|
+
def percent_display(used, total)
|
|
43
|
+
pct = percent_value(used, total)
|
|
44
|
+
pct ? "#{pct}%" : "-"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Calculates percentage as integer from used/total values.
|
|
48
|
+
#
|
|
49
|
+
# @param used [Numeric, nil] used amount
|
|
50
|
+
# @param total [Numeric, nil] total amount
|
|
51
|
+
# @return [Integer, nil] percentage or nil if unavailable
|
|
52
|
+
def percent_value(used, total)
|
|
53
|
+
return nil if used.nil? || total.nil? || total.zero?
|
|
54
|
+
|
|
55
|
+
((used.to_f / total) * 100).round
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pvectl
|
|
4
|
+
module Presenters
|
|
5
|
+
# Presenter for VM resource usage metrics (top command).
|
|
6
|
+
#
|
|
7
|
+
# Inherits from Presenters::Vm for reuse of formatting methods.
|
|
8
|
+
# Includes TopPresenter for shared metrics display.
|
|
9
|
+
# Focuses on CPU, memory, disk, and network utilization.
|
|
10
|
+
#
|
|
11
|
+
# @example Using with formatter
|
|
12
|
+
# presenter = TopVm.new
|
|
13
|
+
# formatter = Formatters::Table.new
|
|
14
|
+
# output = formatter.format(vms, presenter)
|
|
15
|
+
#
|
|
16
|
+
# @see Pvectl::Presenters::Vm Parent presenter
|
|
17
|
+
# @see Pvectl::Presenters::TopPresenter Shared metrics module
|
|
18
|
+
# @see Pvectl::Commands::Top::Command Top command
|
|
19
|
+
#
|
|
20
|
+
class TopVm < Vm
|
|
21
|
+
include TopPresenter
|
|
22
|
+
|
|
23
|
+
# Returns column headers for standard table output.
|
|
24
|
+
#
|
|
25
|
+
# @return [Array<String>] column headers
|
|
26
|
+
def columns
|
|
27
|
+
%w[VMID NAME NODE CPU(cores) CPU% MEMORY MEMORY%]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Returns additional column headers for wide output.
|
|
31
|
+
#
|
|
32
|
+
# @return [Array<String>] extra column headers
|
|
33
|
+
def extra_columns
|
|
34
|
+
%w[DISK DISK% NETIN NETOUT]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Converts VM model to table row with metrics values.
|
|
38
|
+
#
|
|
39
|
+
# @param model [Models::Vm] VM model
|
|
40
|
+
# @param context [Hash] optional context
|
|
41
|
+
# @return [Array<String>] row values matching columns order
|
|
42
|
+
def to_row(model, **_context)
|
|
43
|
+
@vm = model
|
|
44
|
+
[
|
|
45
|
+
vm.vmid.to_s,
|
|
46
|
+
display_name,
|
|
47
|
+
vm.node,
|
|
48
|
+
cpu_cores_value(vm),
|
|
49
|
+
cpu_usage_value(vm),
|
|
50
|
+
memory_display,
|
|
51
|
+
percent_display(vm.mem, vm.maxmem)
|
|
52
|
+
]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Returns additional values for wide output.
|
|
56
|
+
#
|
|
57
|
+
# @param model [Models::Vm] VM model
|
|
58
|
+
# @param context [Hash] optional context
|
|
59
|
+
# @return [Array<String>] extra values matching extra_columns order
|
|
60
|
+
def extra_values(model, **_context)
|
|
61
|
+
@vm = model
|
|
62
|
+
[
|
|
63
|
+
disk_display,
|
|
64
|
+
percent_display(vm.disk, vm.maxdisk),
|
|
65
|
+
format_bytes(vm.netin),
|
|
66
|
+
format_bytes(vm.netout)
|
|
67
|
+
]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Converts VM model to hash for JSON/YAML output.
|
|
71
|
+
#
|
|
72
|
+
# Returns metrics-focused hash without operational info
|
|
73
|
+
# (no status, template, tags, ha, uptime).
|
|
74
|
+
#
|
|
75
|
+
# @param model [Models::Vm] VM model
|
|
76
|
+
# @return [Hash] metrics-focused hash representation
|
|
77
|
+
def to_hash(model)
|
|
78
|
+
@vm = model
|
|
79
|
+
{
|
|
80
|
+
"vmid" => vm.vmid,
|
|
81
|
+
"name" => vm.name,
|
|
82
|
+
"node" => vm.node,
|
|
83
|
+
"cpu" => {
|
|
84
|
+
"usage_percent" => vm.cpu.nil? ? nil : (vm.cpu * 100).round,
|
|
85
|
+
"cores" => vm.maxcpu
|
|
86
|
+
},
|
|
87
|
+
"memory" => {
|
|
88
|
+
"used_bytes" => vm.mem,
|
|
89
|
+
"total_bytes" => vm.maxmem,
|
|
90
|
+
"usage_percent" => percent_value(vm.mem, vm.maxmem)
|
|
91
|
+
},
|
|
92
|
+
"disk" => {
|
|
93
|
+
"used_bytes" => vm.disk,
|
|
94
|
+
"total_bytes" => vm.maxdisk,
|
|
95
|
+
"usage_percent" => percent_value(vm.disk, vm.maxdisk)
|
|
96
|
+
},
|
|
97
|
+
"network" => {
|
|
98
|
+
"in_bytes" => vm.netin,
|
|
99
|
+
"out_bytes" => vm.netout
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|