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.
Files changed (558) hide show
  1. checksums.yaml +7 -0
  2. data/.claude/rules/branch-before-changes.md +52 -0
  3. data/.claude/rules/documentation-updates.md +104 -0
  4. data/.claude/rules/git-workflow.md +84 -0
  5. data/.claude/rules/proxmox-api-docs.md +58 -0
  6. data/.claude/rules/rbs-signatures.md +80 -0
  7. data/.claude/rules/refactoring-as-design-option.md +35 -0
  8. data/.claude/scheduled_tasks.lock +1 -0
  9. data/.claude/settings.json +51 -0
  10. data/.mcp.json +8 -0
  11. data/.ruby-gemset +1 -0
  12. data/.ruby-version +1 -0
  13. data/CHANGELOG.md +138 -0
  14. data/CLAUDE.md +211 -0
  15. data/CODE_OF_CONDUCT.md +132 -0
  16. data/LICENSE.txt +21 -0
  17. data/README.md +143 -0
  18. data/Rakefile +8 -0
  19. data/docs/proxmox-api-update.sh +96 -0
  20. data/exe/pvectl +5 -0
  21. data/lib/pvectl/argv_preprocessor.rb +334 -0
  22. data/lib/pvectl/cli.rb +102 -0
  23. data/lib/pvectl/commands/apt.rb +389 -0
  24. data/lib/pvectl/commands/clone_container.rb +230 -0
  25. data/lib/pvectl/commands/clone_vm.rb +331 -0
  26. data/lib/pvectl/commands/cloudinit/command.rb +122 -0
  27. data/lib/pvectl/commands/cloudinit/dump.rb +94 -0
  28. data/lib/pvectl/commands/cloudinit/pending.rb +137 -0
  29. data/lib/pvectl/commands/cloudinit/regenerate.rb +79 -0
  30. data/lib/pvectl/commands/config/command.rb +65 -0
  31. data/lib/pvectl/commands/config/get_contexts.rb +68 -0
  32. data/lib/pvectl/commands/config/set_cluster.rb +103 -0
  33. data/lib/pvectl/commands/config/set_context.rb +136 -0
  34. data/lib/pvectl/commands/config/set_credentials.rb +181 -0
  35. data/lib/pvectl/commands/config/use_context.rb +69 -0
  36. data/lib/pvectl/commands/config/view.rb +67 -0
  37. data/lib/pvectl/commands/console.rb +93 -0
  38. data/lib/pvectl/commands/console_ct.rb +187 -0
  39. data/lib/pvectl/commands/console_vm.rb +187 -0
  40. data/lib/pvectl/commands/container_lifecycle_command.rb +77 -0
  41. data/lib/pvectl/commands/create_backup.rb +173 -0
  42. data/lib/pvectl/commands/create_container.rb +141 -0
  43. data/lib/pvectl/commands/create_resource_command.rb +244 -0
  44. data/lib/pvectl/commands/create_snapshot.rb +242 -0
  45. data/lib/pvectl/commands/create_vm.rb +267 -0
  46. data/lib/pvectl/commands/delete_backup.rb +139 -0
  47. data/lib/pvectl/commands/delete_command.rb +119 -0
  48. data/lib/pvectl/commands/delete_container.rb +30 -0
  49. data/lib/pvectl/commands/delete_snapshot.rb +248 -0
  50. data/lib/pvectl/commands/delete_vm.rb +127 -0
  51. data/lib/pvectl/commands/describe/command.rb +251 -0
  52. data/lib/pvectl/commands/edit_container.rb +56 -0
  53. data/lib/pvectl/commands/edit_dns.rb +149 -0
  54. data/lib/pvectl/commands/edit_hosts.rb +135 -0
  55. data/lib/pvectl/commands/edit_node.rb +54 -0
  56. data/lib/pvectl/commands/edit_resource_command.rb +180 -0
  57. data/lib/pvectl/commands/edit_vm.rb +154 -0
  58. data/lib/pvectl/commands/edit_volume.rb +189 -0
  59. data/lib/pvectl/commands/feature_command.rb +230 -0
  60. data/lib/pvectl/commands/feature_container.rb +21 -0
  61. data/lib/pvectl/commands/feature_vm.rb +94 -0
  62. data/lib/pvectl/commands/get/command.rb +360 -0
  63. data/lib/pvectl/commands/get/handlers/backups.rb +76 -0
  64. data/lib/pvectl/commands/get/handlers/capabilities.rb +107 -0
  65. data/lib/pvectl/commands/get/handlers/containers.rb +148 -0
  66. data/lib/pvectl/commands/get/handlers/disks.rb +107 -0
  67. data/lib/pvectl/commands/get/handlers/dns.rb +94 -0
  68. data/lib/pvectl/commands/get/handlers/hosts.rb +94 -0
  69. data/lib/pvectl/commands/get/handlers/nodes.rb +162 -0
  70. data/lib/pvectl/commands/get/handlers/services.rb +81 -0
  71. data/lib/pvectl/commands/get/handlers/snapshots.rb +97 -0
  72. data/lib/pvectl/commands/get/handlers/storage.rb +118 -0
  73. data/lib/pvectl/commands/get/handlers/subscription.rb +69 -0
  74. data/lib/pvectl/commands/get/handlers/tasks.rb +89 -0
  75. data/lib/pvectl/commands/get/handlers/templates.rb +175 -0
  76. data/lib/pvectl/commands/get/handlers/time.rb +118 -0
  77. data/lib/pvectl/commands/get/handlers/vms.rb +145 -0
  78. data/lib/pvectl/commands/get/handlers/volume.rb +134 -0
  79. data/lib/pvectl/commands/get/resource_handler.rb +63 -0
  80. data/lib/pvectl/commands/get/resource_registry.rb +18 -0
  81. data/lib/pvectl/commands/get/watch_loop.rb +129 -0
  82. data/lib/pvectl/commands/irreversible_command.rb +265 -0
  83. data/lib/pvectl/commands/logs/command.rb +275 -0
  84. data/lib/pvectl/commands/logs/handlers/journal.rb +46 -0
  85. data/lib/pvectl/commands/logs/handlers/syslog.rb +53 -0
  86. data/lib/pvectl/commands/logs/handlers/task_detail.rb +52 -0
  87. data/lib/pvectl/commands/logs/handlers/task_logs.rb +115 -0
  88. data/lib/pvectl/commands/logs/resource_handler.rb +46 -0
  89. data/lib/pvectl/commands/logs/resource_registry.rb +22 -0
  90. data/lib/pvectl/commands/migrate_command.rb +282 -0
  91. data/lib/pvectl/commands/migrate_container.rb +23 -0
  92. data/lib/pvectl/commands/migrate_vm.rb +122 -0
  93. data/lib/pvectl/commands/move_disk_command.rb +239 -0
  94. data/lib/pvectl/commands/move_disk_container.rb +21 -0
  95. data/lib/pvectl/commands/move_disk_vm.rb +127 -0
  96. data/lib/pvectl/commands/ping.rb +249 -0
  97. data/lib/pvectl/commands/pull.rb +342 -0
  98. data/lib/pvectl/commands/push.rb +352 -0
  99. data/lib/pvectl/commands/reset.rb +64 -0
  100. data/lib/pvectl/commands/resource_lifecycle_command.rb +277 -0
  101. data/lib/pvectl/commands/resource_registry.rb +73 -0
  102. data/lib/pvectl/commands/restart.rb +70 -0
  103. data/lib/pvectl/commands/restart_container.rb +18 -0
  104. data/lib/pvectl/commands/restore_backup.rb +236 -0
  105. data/lib/pvectl/commands/resume.rb +57 -0
  106. data/lib/pvectl/commands/rollback_snapshot.rb +228 -0
  107. data/lib/pvectl/commands/sendkey_vm.rb +205 -0
  108. data/lib/pvectl/commands/service.rb +293 -0
  109. data/lib/pvectl/commands/set_container.rb +50 -0
  110. data/lib/pvectl/commands/set_node.rb +52 -0
  111. data/lib/pvectl/commands/set_resource_command.rb +185 -0
  112. data/lib/pvectl/commands/set_vm.rb +136 -0
  113. data/lib/pvectl/commands/set_volume.rb +212 -0
  114. data/lib/pvectl/commands/shared_config_parsers.rb +126 -0
  115. data/lib/pvectl/commands/shared_flags.rb +155 -0
  116. data/lib/pvectl/commands/shutdown.rb +73 -0
  117. data/lib/pvectl/commands/shutdown_container.rb +18 -0
  118. data/lib/pvectl/commands/start.rb +79 -0
  119. data/lib/pvectl/commands/start_container.rb +18 -0
  120. data/lib/pvectl/commands/stop.rb +75 -0
  121. data/lib/pvectl/commands/stop_container.rb +18 -0
  122. data/lib/pvectl/commands/suspend.rb +64 -0
  123. data/lib/pvectl/commands/template_command.rb +205 -0
  124. data/lib/pvectl/commands/template_container.rb +27 -0
  125. data/lib/pvectl/commands/template_vm.rb +106 -0
  126. data/lib/pvectl/commands/top/command.rb +206 -0
  127. data/lib/pvectl/commands/top/handlers/containers.rb +61 -0
  128. data/lib/pvectl/commands/top/handlers/nodes.rb +61 -0
  129. data/lib/pvectl/commands/top/handlers/vms.rb +61 -0
  130. data/lib/pvectl/commands/top/resource_handler.rb +46 -0
  131. data/lib/pvectl/commands/top/resource_registry.rb +22 -0
  132. data/lib/pvectl/commands/unlink_disk_vm.rb +232 -0
  133. data/lib/pvectl/commands/vm_lifecycle_command.rb +77 -0
  134. data/lib/pvectl/commands/wakeonlan_node.rb +153 -0
  135. data/lib/pvectl/config/errors.rb +62 -0
  136. data/lib/pvectl/config/models/cluster.rb +180 -0
  137. data/lib/pvectl/config/models/context.rb +100 -0
  138. data/lib/pvectl/config/models/resolved_config.rb +171 -0
  139. data/lib/pvectl/config/models/user.rb +133 -0
  140. data/lib/pvectl/config/provider.rb +297 -0
  141. data/lib/pvectl/config/service.rb +300 -0
  142. data/lib/pvectl/config/store.rb +161 -0
  143. data/lib/pvectl/config/wizard.rb +309 -0
  144. data/lib/pvectl/config_serializer.rb +1034 -0
  145. data/lib/pvectl/connection/retry_handler.rb +161 -0
  146. data/lib/pvectl/connection.rb +157 -0
  147. data/lib/pvectl/console/terminal_session.rb +449 -0
  148. data/lib/pvectl/editor_session.rb +157 -0
  149. data/lib/pvectl/exit_codes.rb +43 -0
  150. data/lib/pvectl/formatters/base.rb +55 -0
  151. data/lib/pvectl/formatters/color_support.rb +90 -0
  152. data/lib/pvectl/formatters/json.rb +45 -0
  153. data/lib/pvectl/formatters/output_helper.rb +77 -0
  154. data/lib/pvectl/formatters/registry.rb +72 -0
  155. data/lib/pvectl/formatters/table.rb +235 -0
  156. data/lib/pvectl/formatters/wide.rb +93 -0
  157. data/lib/pvectl/formatters/yaml.rb +49 -0
  158. data/lib/pvectl/manifest_serializer.rb +142 -0
  159. data/lib/pvectl/models/apt_package.rb +107 -0
  160. data/lib/pvectl/models/backup.rb +173 -0
  161. data/lib/pvectl/models/base.rb +49 -0
  162. data/lib/pvectl/models/capability.rb +62 -0
  163. data/lib/pvectl/models/container.rb +205 -0
  164. data/lib/pvectl/models/container_operation_result.rb +27 -0
  165. data/lib/pvectl/models/dns_config.rb +54 -0
  166. data/lib/pvectl/models/hosts_file.rb +47 -0
  167. data/lib/pvectl/models/journal_entry.rb +16 -0
  168. data/lib/pvectl/models/network_interface.rb +85 -0
  169. data/lib/pvectl/models/node.rb +195 -0
  170. data/lib/pvectl/models/node_operation_result.rb +45 -0
  171. data/lib/pvectl/models/operation_result.rb +110 -0
  172. data/lib/pvectl/models/physical_disk.rb +193 -0
  173. data/lib/pvectl/models/service.rb +80 -0
  174. data/lib/pvectl/models/snapshot.rb +101 -0
  175. data/lib/pvectl/models/snapshot_description.rb +39 -0
  176. data/lib/pvectl/models/storage.rb +180 -0
  177. data/lib/pvectl/models/subscription.rb +87 -0
  178. data/lib/pvectl/models/syslog_entry.rb +17 -0
  179. data/lib/pvectl/models/task.rb +95 -0
  180. data/lib/pvectl/models/task_entry.rb +52 -0
  181. data/lib/pvectl/models/task_log_line.rb +17 -0
  182. data/lib/pvectl/models/time_config.rb +47 -0
  183. data/lib/pvectl/models/vm.rb +137 -0
  184. data/lib/pvectl/models/vm_operation_result.rb +27 -0
  185. data/lib/pvectl/models/volume.rb +133 -0
  186. data/lib/pvectl/models/volume_operation_result.rb +26 -0
  187. data/lib/pvectl/parsers/cloud_init_config.rb +92 -0
  188. data/lib/pvectl/parsers/disk_config.rb +97 -0
  189. data/lib/pvectl/parsers/lxc_mount_config.rb +98 -0
  190. data/lib/pvectl/parsers/lxc_net_config.rb +97 -0
  191. data/lib/pvectl/parsers/net_config.rb +95 -0
  192. data/lib/pvectl/parsers/smart_text.rb +42 -0
  193. data/lib/pvectl/plugin_loader.rb +157 -0
  194. data/lib/pvectl/presenters/apt_package.rb +99 -0
  195. data/lib/pvectl/presenters/backup.rb +128 -0
  196. data/lib/pvectl/presenters/base.rb +283 -0
  197. data/lib/pvectl/presenters/capability.rb +104 -0
  198. data/lib/pvectl/presenters/config/context.rb +80 -0
  199. data/lib/pvectl/presenters/container.rb +574 -0
  200. data/lib/pvectl/presenters/container_operation_result.rb +109 -0
  201. data/lib/pvectl/presenters/disk.rb +184 -0
  202. data/lib/pvectl/presenters/dns_config.rb +68 -0
  203. data/lib/pvectl/presenters/hosts_file.rb +61 -0
  204. data/lib/pvectl/presenters/journal_entry.rb +20 -0
  205. data/lib/pvectl/presenters/node.rb +762 -0
  206. data/lib/pvectl/presenters/node_operation_result.rb +50 -0
  207. data/lib/pvectl/presenters/operation_result.rb +61 -0
  208. data/lib/pvectl/presenters/service.rb +76 -0
  209. data/lib/pvectl/presenters/snapshot.rb +239 -0
  210. data/lib/pvectl/presenters/snapshot_operation_result.rb +125 -0
  211. data/lib/pvectl/presenters/storage.rb +329 -0
  212. data/lib/pvectl/presenters/subscription.rb +189 -0
  213. data/lib/pvectl/presenters/syslog_entry.rb +20 -0
  214. data/lib/pvectl/presenters/task_entry.rb +69 -0
  215. data/lib/pvectl/presenters/task_log_line.rb +20 -0
  216. data/lib/pvectl/presenters/template.rb +76 -0
  217. data/lib/pvectl/presenters/time_config.rb +86 -0
  218. data/lib/pvectl/presenters/top_container.rb +112 -0
  219. data/lib/pvectl/presenters/top_node.rb +115 -0
  220. data/lib/pvectl/presenters/top_presenter.rb +59 -0
  221. data/lib/pvectl/presenters/top_vm.rb +105 -0
  222. data/lib/pvectl/presenters/vm.rb +853 -0
  223. data/lib/pvectl/presenters/vm_operation_result.rb +109 -0
  224. data/lib/pvectl/presenters/volume.rb +136 -0
  225. data/lib/pvectl/presenters/volume_operation_result.rb +58 -0
  226. data/lib/pvectl/repositories/apt.rb +93 -0
  227. data/lib/pvectl/repositories/backup.rb +186 -0
  228. data/lib/pvectl/repositories/base.rb +110 -0
  229. data/lib/pvectl/repositories/capabilities.rb +96 -0
  230. data/lib/pvectl/repositories/container.rb +503 -0
  231. data/lib/pvectl/repositories/disk.rb +87 -0
  232. data/lib/pvectl/repositories/dns.rb +54 -0
  233. data/lib/pvectl/repositories/hosts.rb +63 -0
  234. data/lib/pvectl/repositories/journal.rb +23 -0
  235. data/lib/pvectl/repositories/node.rb +537 -0
  236. data/lib/pvectl/repositories/service.rb +139 -0
  237. data/lib/pvectl/repositories/snapshot.rb +133 -0
  238. data/lib/pvectl/repositories/storage.rb +302 -0
  239. data/lib/pvectl/repositories/subscription.rb +77 -0
  240. data/lib/pvectl/repositories/syslog.rb +25 -0
  241. data/lib/pvectl/repositories/task.rb +82 -0
  242. data/lib/pvectl/repositories/task_list.rb +30 -0
  243. data/lib/pvectl/repositories/task_log.rb +31 -0
  244. data/lib/pvectl/repositories/time_config.rb +53 -0
  245. data/lib/pvectl/repositories/vm.rb +616 -0
  246. data/lib/pvectl/repositories/volume.rb +306 -0
  247. data/lib/pvectl/selectors/base.rb +201 -0
  248. data/lib/pvectl/selectors/container.rb +116 -0
  249. data/lib/pvectl/selectors/disk.rb +59 -0
  250. data/lib/pvectl/selectors/vm.rb +116 -0
  251. data/lib/pvectl/selectors/volume.rb +59 -0
  252. data/lib/pvectl/services/backup.rb +209 -0
  253. data/lib/pvectl/services/clone_container.rb +260 -0
  254. data/lib/pvectl/services/clone_vm.rb +265 -0
  255. data/lib/pvectl/services/cloudinit.rb +96 -0
  256. data/lib/pvectl/services/console.rb +152 -0
  257. data/lib/pvectl/services/container_lifecycle.rb +124 -0
  258. data/lib/pvectl/services/create_container.rb +179 -0
  259. data/lib/pvectl/services/create_vm.rb +191 -0
  260. data/lib/pvectl/services/edit_container.rb +125 -0
  261. data/lib/pvectl/services/edit_dns.rb +159 -0
  262. data/lib/pvectl/services/edit_hosts.rb +78 -0
  263. data/lib/pvectl/services/edit_node.rb +147 -0
  264. data/lib/pvectl/services/edit_vm.rb +125 -0
  265. data/lib/pvectl/services/edit_volume.rb +224 -0
  266. data/lib/pvectl/services/get/resource_service.rb +98 -0
  267. data/lib/pvectl/services/move_disk.rb +132 -0
  268. data/lib/pvectl/services/pull_config.rb +94 -0
  269. data/lib/pvectl/services/push_config.rb +524 -0
  270. data/lib/pvectl/services/resize_volume.rb +253 -0
  271. data/lib/pvectl/services/resource_delete.rb +169 -0
  272. data/lib/pvectl/services/resource_migration.rb +170 -0
  273. data/lib/pvectl/services/sendkey.rb +108 -0
  274. data/lib/pvectl/services/service_lifecycle.rb +89 -0
  275. data/lib/pvectl/services/set_container.rb +128 -0
  276. data/lib/pvectl/services/set_node.rb +236 -0
  277. data/lib/pvectl/services/set_vm.rb +128 -0
  278. data/lib/pvectl/services/set_volume.rb +126 -0
  279. data/lib/pvectl/services/snapshot.rb +261 -0
  280. data/lib/pvectl/services/task_listing.rb +75 -0
  281. data/lib/pvectl/services/unlink_disk.rb +86 -0
  282. data/lib/pvectl/services/vm_lifecycle.rb +124 -0
  283. data/lib/pvectl/services/wakeonlan.rb +79 -0
  284. data/lib/pvectl/utils/resource_resolver.rb +80 -0
  285. data/lib/pvectl/version.rb +13 -0
  286. data/lib/pvectl/wizards/create_container.rb +105 -0
  287. data/lib/pvectl/wizards/create_vm.rb +98 -0
  288. data/lib/pvectl.rb +439 -0
  289. data/sig/external/gli.rbs +16 -0
  290. data/sig/external/proxmox_api.rbs +10 -0
  291. data/sig/pvectl/argv_preprocessor.rbs +53 -0
  292. data/sig/pvectl/cli.rbs +26 -0
  293. data/sig/pvectl/commands/apt.rbs +47 -0
  294. data/sig/pvectl/commands/clone_container.rbs +31 -0
  295. data/sig/pvectl/commands/clone_vm.rbs +33 -0
  296. data/sig/pvectl/commands/cloudinit/command.rbs +13 -0
  297. data/sig/pvectl/commands/cloudinit/dump.rbs +13 -0
  298. data/sig/pvectl/commands/cloudinit/pending.rbs +17 -0
  299. data/sig/pvectl/commands/cloudinit/regenerate.rbs +11 -0
  300. data/sig/pvectl/commands/config/command.rbs +9 -0
  301. data/sig/pvectl/commands/config/get_contexts.rbs +11 -0
  302. data/sig/pvectl/commands/config/set_cluster.rbs +11 -0
  303. data/sig/pvectl/commands/config/set_context.rbs +15 -0
  304. data/sig/pvectl/commands/config/set_credentials.rbs +15 -0
  305. data/sig/pvectl/commands/config/use_context.rbs +11 -0
  306. data/sig/pvectl/commands/config/view.rbs +11 -0
  307. data/sig/pvectl/commands/console.rbs +9 -0
  308. data/sig/pvectl/commands/console_ct.rbs +27 -0
  309. data/sig/pvectl/commands/console_vm.rbs +27 -0
  310. data/sig/pvectl/commands/container_lifecycle_command.rbs +25 -0
  311. data/sig/pvectl/commands/create_backup.rbs +29 -0
  312. data/sig/pvectl/commands/create_container.rbs +30 -0
  313. data/sig/pvectl/commands/create_resource_command.rbs +53 -0
  314. data/sig/pvectl/commands/create_snapshot.rbs +35 -0
  315. data/sig/pvectl/commands/create_vm.rbs +30 -0
  316. data/sig/pvectl/commands/delete_backup.rbs +25 -0
  317. data/sig/pvectl/commands/delete_command.rbs +45 -0
  318. data/sig/pvectl/commands/delete_container.rbs +11 -0
  319. data/sig/pvectl/commands/delete_snapshot.rbs +35 -0
  320. data/sig/pvectl/commands/delete_vm.rbs +13 -0
  321. data/sig/pvectl/commands/describe/command.rbs +27 -0
  322. data/sig/pvectl/commands/edit_container.rbs +17 -0
  323. data/sig/pvectl/commands/edit_dns.rbs +25 -0
  324. data/sig/pvectl/commands/edit_hosts.rbs +23 -0
  325. data/sig/pvectl/commands/edit_node.rbs +17 -0
  326. data/sig/pvectl/commands/edit_resource_command.rbs +35 -0
  327. data/sig/pvectl/commands/edit_vm.rbs +19 -0
  328. data/sig/pvectl/commands/edit_volume.rbs +24 -0
  329. data/sig/pvectl/commands/feature_command.rbs +43 -0
  330. data/sig/pvectl/commands/feature_container.rbs +10 -0
  331. data/sig/pvectl/commands/feature_vm.rbs +12 -0
  332. data/sig/pvectl/commands/get/command.rbs +42 -0
  333. data/sig/pvectl/commands/get/handlers/backups.rbs +23 -0
  334. data/sig/pvectl/commands/get/handlers/capabilities.rbs +29 -0
  335. data/sig/pvectl/commands/get/handlers/containers.rbs +35 -0
  336. data/sig/pvectl/commands/get/handlers/disks.rbs +27 -0
  337. data/sig/pvectl/commands/get/handlers/dns.rbs +25 -0
  338. data/sig/pvectl/commands/get/handlers/hosts.rbs +25 -0
  339. data/sig/pvectl/commands/get/handlers/nodes.rbs +33 -0
  340. data/sig/pvectl/commands/get/handlers/services.rbs +23 -0
  341. data/sig/pvectl/commands/get/handlers/snapshots.rbs +27 -0
  342. data/sig/pvectl/commands/get/handlers/storage.rbs +25 -0
  343. data/sig/pvectl/commands/get/handlers/subscription.rbs +25 -0
  344. data/sig/pvectl/commands/get/handlers/tasks.rbs +28 -0
  345. data/sig/pvectl/commands/get/handlers/templates.rbs +35 -0
  346. data/sig/pvectl/commands/get/handlers/time.rbs +29 -0
  347. data/sig/pvectl/commands/get/handlers/vms.rbs +35 -0
  348. data/sig/pvectl/commands/get/handlers/volume.rbs +27 -0
  349. data/sig/pvectl/commands/get/resource_handler.rbs +13 -0
  350. data/sig/pvectl/commands/get/resource_registry.rbs +8 -0
  351. data/sig/pvectl/commands/get/watch_loop.rbs +33 -0
  352. data/sig/pvectl/commands/irreversible_command.rbs +32 -0
  353. data/sig/pvectl/commands/logs/command.rbs +35 -0
  354. data/sig/pvectl/commands/logs/handlers/journal.rbs +21 -0
  355. data/sig/pvectl/commands/logs/handlers/syslog.rbs +21 -0
  356. data/sig/pvectl/commands/logs/handlers/task_detail.rbs +21 -0
  357. data/sig/pvectl/commands/logs/handlers/task_logs.rbs +35 -0
  358. data/sig/pvectl/commands/logs/resource_handler.rbs +11 -0
  359. data/sig/pvectl/commands/logs/resource_registry.rbs +8 -0
  360. data/sig/pvectl/commands/migrate_command.rbs +45 -0
  361. data/sig/pvectl/commands/migrate_container.rbs +11 -0
  362. data/sig/pvectl/commands/migrate_vm.rbs +13 -0
  363. data/sig/pvectl/commands/move_disk_command.rbs +43 -0
  364. data/sig/pvectl/commands/move_disk_container.rbs +11 -0
  365. data/sig/pvectl/commands/move_disk_vm.rbs +13 -0
  366. data/sig/pvectl/commands/ping.rbs +39 -0
  367. data/sig/pvectl/commands/pull.rbs +33 -0
  368. data/sig/pvectl/commands/push.rbs +32 -0
  369. data/sig/pvectl/commands/reset.rbs +11 -0
  370. data/sig/pvectl/commands/resource_lifecycle_command.rbs +55 -0
  371. data/sig/pvectl/commands/resource_registry.rbs +19 -0
  372. data/sig/pvectl/commands/restart.rbs +11 -0
  373. data/sig/pvectl/commands/restart_container.rbs +9 -0
  374. data/sig/pvectl/commands/restore_backup.rbs +27 -0
  375. data/sig/pvectl/commands/resume.rbs +11 -0
  376. data/sig/pvectl/commands/rollback_snapshot.rbs +31 -0
  377. data/sig/pvectl/commands/sendkey_vm.rbs +25 -0
  378. data/sig/pvectl/commands/service.rbs +38 -0
  379. data/sig/pvectl/commands/set_container.rbs +13 -0
  380. data/sig/pvectl/commands/set_node.rbs +13 -0
  381. data/sig/pvectl/commands/set_resource_command.rbs +25 -0
  382. data/sig/pvectl/commands/set_vm.rbs +15 -0
  383. data/sig/pvectl/commands/set_volume.rbs +24 -0
  384. data/sig/pvectl/commands/shared_config_parsers.rbs +19 -0
  385. data/sig/pvectl/commands/shared_flags.rbs +10 -0
  386. data/sig/pvectl/commands/shutdown.rbs +11 -0
  387. data/sig/pvectl/commands/shutdown_container.rbs +9 -0
  388. data/sig/pvectl/commands/start.rbs +11 -0
  389. data/sig/pvectl/commands/start_container.rbs +9 -0
  390. data/sig/pvectl/commands/stop.rbs +11 -0
  391. data/sig/pvectl/commands/stop_container.rbs +9 -0
  392. data/sig/pvectl/commands/suspend.rbs +11 -0
  393. data/sig/pvectl/commands/template_command.rbs +21 -0
  394. data/sig/pvectl/commands/template_container.rbs +10 -0
  395. data/sig/pvectl/commands/template_vm.rbs +12 -0
  396. data/sig/pvectl/commands/top/command.rbs +31 -0
  397. data/sig/pvectl/commands/top/handlers/containers.rbs +21 -0
  398. data/sig/pvectl/commands/top/handlers/nodes.rbs +21 -0
  399. data/sig/pvectl/commands/top/handlers/vms.rbs +21 -0
  400. data/sig/pvectl/commands/top/resource_handler.rbs +11 -0
  401. data/sig/pvectl/commands/top/resource_registry.rbs +8 -0
  402. data/sig/pvectl/commands/unlink_disk_vm.rbs +27 -0
  403. data/sig/pvectl/commands/vm_lifecycle_command.rbs +25 -0
  404. data/sig/pvectl/commands/wakeonlan_node.rbs +21 -0
  405. data/sig/pvectl/config/errors.rbs +24 -0
  406. data/sig/pvectl/config/models/cluster.rbs +39 -0
  407. data/sig/pvectl/config/models/context.rbs +23 -0
  408. data/sig/pvectl/config/models/resolved_config.rbs +51 -0
  409. data/sig/pvectl/config/models/user.rbs +31 -0
  410. data/sig/pvectl/config/provider.rbs +40 -0
  411. data/sig/pvectl/config/service.rbs +65 -0
  412. data/sig/pvectl/config/store.rbs +14 -0
  413. data/sig/pvectl/config/wizard.rbs +48 -0
  414. data/sig/pvectl/config_serializer.rbs +121 -0
  415. data/sig/pvectl/connection/retry_handler.rbs +31 -0
  416. data/sig/pvectl/connection.rbs +35 -0
  417. data/sig/pvectl/console/terminal_session.rbs +63 -0
  418. data/sig/pvectl/editor_session.rbs +33 -0
  419. data/sig/pvectl/exit_codes.rbs +19 -0
  420. data/sig/pvectl/formatters/base.rbs +13 -0
  421. data/sig/pvectl/formatters/color_support.rbs +13 -0
  422. data/sig/pvectl/formatters/json.rbs +7 -0
  423. data/sig/pvectl/formatters/output_helper.rbs +9 -0
  424. data/sig/pvectl/formatters/registry.rbs +13 -0
  425. data/sig/pvectl/formatters/table.rbs +25 -0
  426. data/sig/pvectl/formatters/wide.rbs +15 -0
  427. data/sig/pvectl/formatters/yaml.rbs +7 -0
  428. data/sig/pvectl/manifest_serializer.rbs +18 -0
  429. data/sig/pvectl/models/apt_package.rbs +26 -0
  430. data/sig/pvectl/models/backup.rbs +31 -0
  431. data/sig/pvectl/models/base.rbs +11 -0
  432. data/sig/pvectl/models/capability.rbs +16 -0
  433. data/sig/pvectl/models/container.rbs +44 -0
  434. data/sig/pvectl/models/container_operation_result.rbs +9 -0
  435. data/sig/pvectl/models/dns_config.rbs +15 -0
  436. data/sig/pvectl/models/hosts_file.rbs +13 -0
  437. data/sig/pvectl/models/journal_entry.rbs +10 -0
  438. data/sig/pvectl/models/network_interface.rbs +20 -0
  439. data/sig/pvectl/models/node.rbs +47 -0
  440. data/sig/pvectl/models/node_operation_result.rbs +12 -0
  441. data/sig/pvectl/models/operation_result.rbs +21 -0
  442. data/sig/pvectl/models/physical_disk.rbs +35 -0
  443. data/sig/pvectl/models/service.rbs +18 -0
  444. data/sig/pvectl/models/snapshot.rbs +21 -0
  445. data/sig/pvectl/models/snapshot_description.rbs +18 -0
  446. data/sig/pvectl/models/storage.rbs +39 -0
  447. data/sig/pvectl/models/subscription.rbs +24 -0
  448. data/sig/pvectl/models/syslog_entry.rbs +10 -0
  449. data/sig/pvectl/models/task.rbs +22 -0
  450. data/sig/pvectl/models/task_entry.rbs +24 -0
  451. data/sig/pvectl/models/task_log_line.rbs +10 -0
  452. data/sig/pvectl/models/time_config.rbs +12 -0
  453. data/sig/pvectl/models/vm.rbs +32 -0
  454. data/sig/pvectl/models/vm_operation_result.rbs +9 -0
  455. data/sig/pvectl/models/volume.rbs +29 -0
  456. data/sig/pvectl/models/volume_operation_result.rbs +9 -0
  457. data/sig/pvectl/parsers/cloud_init_config.rbs +15 -0
  458. data/sig/pvectl/parsers/disk_config.rbs +19 -0
  459. data/sig/pvectl/parsers/lxc_mount_config.rbs +19 -0
  460. data/sig/pvectl/parsers/lxc_net_config.rbs +19 -0
  461. data/sig/pvectl/parsers/net_config.rbs +19 -0
  462. data/sig/pvectl/parsers/smart_text.rbs +7 -0
  463. data/sig/pvectl/plugin_loader.rbs +25 -0
  464. data/sig/pvectl/presenters/apt_package.rbs +19 -0
  465. data/sig/pvectl/presenters/backup.rbs +25 -0
  466. data/sig/pvectl/presenters/base.rbs +41 -0
  467. data/sig/pvectl/presenters/capability.rbs +19 -0
  468. data/sig/pvectl/presenters/config/context.rbs +17 -0
  469. data/sig/pvectl/presenters/container.rbs +78 -0
  470. data/sig/pvectl/presenters/container_operation_result.rbs +19 -0
  471. data/sig/pvectl/presenters/disk.rbs +31 -0
  472. data/sig/pvectl/presenters/dns_config.rbs +13 -0
  473. data/sig/pvectl/presenters/hosts_file.rbs +13 -0
  474. data/sig/pvectl/presenters/journal_entry.rbs +11 -0
  475. data/sig/pvectl/presenters/node.rbs +118 -0
  476. data/sig/pvectl/presenters/node_operation_result.rbs +11 -0
  477. data/sig/pvectl/presenters/operation_result.rbs +17 -0
  478. data/sig/pvectl/presenters/service.rbs +15 -0
  479. data/sig/pvectl/presenters/snapshot.rbs +35 -0
  480. data/sig/pvectl/presenters/snapshot_operation_result.rbs +27 -0
  481. data/sig/pvectl/presenters/storage.rbs +59 -0
  482. data/sig/pvectl/presenters/subscription.rbs +36 -0
  483. data/sig/pvectl/presenters/syslog_entry.rbs +11 -0
  484. data/sig/pvectl/presenters/task_entry.rbs +21 -0
  485. data/sig/pvectl/presenters/task_log_line.rbs +11 -0
  486. data/sig/pvectl/presenters/template.rbs +15 -0
  487. data/sig/pvectl/presenters/time_config.rbs +19 -0
  488. data/sig/pvectl/presenters/top_container.rbs +17 -0
  489. data/sig/pvectl/presenters/top_node.rbs +17 -0
  490. data/sig/pvectl/presenters/top_presenter.rbs +13 -0
  491. data/sig/pvectl/presenters/top_vm.rbs +17 -0
  492. data/sig/pvectl/presenters/vm.rbs +91 -0
  493. data/sig/pvectl/presenters/vm_operation_result.rbs +19 -0
  494. data/sig/pvectl/presenters/volume.rbs +23 -0
  495. data/sig/pvectl/presenters/volume_operation_result.rbs +11 -0
  496. data/sig/pvectl/repositories/apt.rbs +17 -0
  497. data/sig/pvectl/repositories/backup.rbs +27 -0
  498. data/sig/pvectl/repositories/base.rbs +23 -0
  499. data/sig/pvectl/repositories/capabilities.rbs +20 -0
  500. data/sig/pvectl/repositories/container.rbs +63 -0
  501. data/sig/pvectl/repositories/disk.rbs +17 -0
  502. data/sig/pvectl/repositories/dns.rbs +13 -0
  503. data/sig/pvectl/repositories/hosts.rbs +13 -0
  504. data/sig/pvectl/repositories/journal.rbs +7 -0
  505. data/sig/pvectl/repositories/node.rbs +68 -0
  506. data/sig/pvectl/repositories/service.rbs +27 -0
  507. data/sig/pvectl/repositories/snapshot.rbs +19 -0
  508. data/sig/pvectl/repositories/storage.rbs +37 -0
  509. data/sig/pvectl/repositories/subscription.rbs +17 -0
  510. data/sig/pvectl/repositories/syslog.rbs +7 -0
  511. data/sig/pvectl/repositories/task.rbs +19 -0
  512. data/sig/pvectl/repositories/task_list.rbs +7 -0
  513. data/sig/pvectl/repositories/task_log.rbs +11 -0
  514. data/sig/pvectl/repositories/time_config.rbs +13 -0
  515. data/sig/pvectl/repositories/vm.rbs +85 -0
  516. data/sig/pvectl/repositories/volume.rbs +43 -0
  517. data/sig/pvectl/selectors/base.rbs +37 -0
  518. data/sig/pvectl/selectors/container.rbs +19 -0
  519. data/sig/pvectl/selectors/disk.rbs +13 -0
  520. data/sig/pvectl/selectors/vm.rbs +19 -0
  521. data/sig/pvectl/selectors/volume.rbs +13 -0
  522. data/sig/pvectl/services/backup.rbs +27 -0
  523. data/sig/pvectl/services/clone_container.rbs +35 -0
  524. data/sig/pvectl/services/clone_vm.rbs +35 -0
  525. data/sig/pvectl/services/cloudinit.rbs +19 -0
  526. data/sig/pvectl/services/console.rbs +23 -0
  527. data/sig/pvectl/services/container_lifecycle.rbs +26 -0
  528. data/sig/pvectl/services/create_container.rbs +64 -0
  529. data/sig/pvectl/services/create_vm.rbs +72 -0
  530. data/sig/pvectl/services/edit_container.rbs +17 -0
  531. data/sig/pvectl/services/edit_dns.rbs +23 -0
  532. data/sig/pvectl/services/edit_hosts.rbs +13 -0
  533. data/sig/pvectl/services/edit_node.rbs +21 -0
  534. data/sig/pvectl/services/edit_vm.rbs +17 -0
  535. data/sig/pvectl/services/edit_volume.rbs +18 -0
  536. data/sig/pvectl/services/get/resource_service.rbs +23 -0
  537. data/sig/pvectl/services/move_disk.rbs +21 -0
  538. data/sig/pvectl/services/pull_config.rbs +18 -0
  539. data/sig/pvectl/services/push_config.rbs +37 -0
  540. data/sig/pvectl/services/resize_volume.rbs +47 -0
  541. data/sig/pvectl/services/resource_delete.rbs +27 -0
  542. data/sig/pvectl/services/resource_migration.rbs +29 -0
  543. data/sig/pvectl/services/sendkey.rbs +19 -0
  544. data/sig/pvectl/services/service_lifecycle.rbs +17 -0
  545. data/sig/pvectl/services/set_container.rbs +14 -0
  546. data/sig/pvectl/services/set_node.rbs +23 -0
  547. data/sig/pvectl/services/set_vm.rbs +14 -0
  548. data/sig/pvectl/services/set_volume.rbs +12 -0
  549. data/sig/pvectl/services/snapshot.rbs +35 -0
  550. data/sig/pvectl/services/task_listing.rbs +13 -0
  551. data/sig/pvectl/services/unlink_disk.rbs +17 -0
  552. data/sig/pvectl/services/vm_lifecycle.rbs +26 -0
  553. data/sig/pvectl/services/wakeonlan.rbs +17 -0
  554. data/sig/pvectl/utils/resource_resolver.rbs +17 -0
  555. data/sig/pvectl/wizards/create_container.rbs +21 -0
  556. data/sig/pvectl/wizards/create_vm.rbs +21 -0
  557. data/sig/pvectl.rbs +9 -0
  558. 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