@rancher/shell 0.1.2 → 0.1.4

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 (347) hide show
  1. package/assets/brand/suse/dark/rancher-logo.svg +1 -148
  2. package/assets/brand/suse/rancher-logo.svg +1 -130
  3. package/assets/images/featured/img1.jpg +0 -0
  4. package/assets/images/featured.jpg +0 -0
  5. package/assets/images/generic-plugin.svg +7 -0
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/translations/en-us.yaml +209 -813
  10. package/assets/translations/zh-hans.yaml +28 -792
  11. package/components/ActionMenu.vue +3 -3
  12. package/components/AsyncButton.vue +17 -2
  13. package/components/ButtonDropdown.vue +4 -0
  14. package/components/Carousel.vue +291 -0
  15. package/components/CodeMirror.vue +6 -8
  16. package/components/CommunityLinks.vue +70 -19
  17. package/components/ContainerResourceLimit.vue +14 -0
  18. package/components/CruResource.vue +11 -3
  19. package/components/Dialog.vue +102 -0
  20. package/components/ExplorerMembers.vue +121 -0
  21. package/components/ExplorerProjectsNamespaces.vue +404 -0
  22. package/components/GrafanaDashboard.vue +17 -2
  23. package/components/IconMessage.vue +9 -1
  24. package/components/LocaleSelector.vue +114 -0
  25. package/components/PromptModal.vue +2 -3
  26. package/components/ResourceList/index.vue +1 -1
  27. package/components/ResourceTable.vue +9 -7
  28. package/components/SimpleBox.vue +6 -4
  29. package/components/SingleClusterInfo.vue +1 -1
  30. package/components/SortableTable/index.vue +18 -25
  31. package/components/SortableTable/selection.js +1 -0
  32. package/components/Tabbed/Tab.vue +5 -0
  33. package/components/Tabbed/index.vue +29 -2
  34. package/components/auth/AzureWarning.vue +5 -1
  35. package/components/auth/Principal.vue +2 -1
  36. package/components/auth/RoleDetailEdit.vue +18 -11
  37. package/components/fleet/FleetBundles.vue +8 -3
  38. package/components/fleet/FleetRepos.vue +0 -2
  39. package/components/fleet/FleetSummary.vue +6 -0
  40. package/components/form/KeyValue.vue +80 -58
  41. package/components/form/NameNsDescription.vue +12 -8
  42. package/components/form/NodeScheduling.vue +1 -1
  43. package/components/form/ResourceTabs/index.vue +5 -1
  44. package/components/form/WorkloadPorts.vue +1 -1
  45. package/components/formatter/ClusterLink.vue +3 -7
  46. package/components/formatter/WorkloadHealthScale.vue +1 -1
  47. package/components/nav/Header.vue +9 -9
  48. package/components/nav/NamespaceFilter.vue +10 -7
  49. package/components/nav/TopLevelMenu.vue +10 -65
  50. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  51. package/config/footer.js +13 -14
  52. package/config/labels-annotations.js +2 -1
  53. package/config/product/explorer.js +5 -4
  54. package/config/product/harvester-manager.js +64 -2
  55. package/config/product/legacy.js +0 -47
  56. package/config/product/manager.js +9 -0
  57. package/config/product/multi-cluster-apps.js +0 -12
  58. package/config/product/settings.js +12 -1
  59. package/config/product/uiplugins.js +17 -0
  60. package/config/settings.js +37 -72
  61. package/config/table-headers.js +0 -1
  62. package/config/types.js +9 -25
  63. package/config/uiplugins.js +60 -0
  64. package/content/docs/en-us/getting-started.md +1 -26
  65. package/core/plugin-routes.ts +34 -22
  66. package/core/plugin.ts +15 -3
  67. package/core/plugins-loader.js +2 -0
  68. package/core/plugins.js +91 -36
  69. package/core/types.ts +7 -1
  70. package/detail/provisioning.cattle.io.cluster.vue +15 -2
  71. package/detail/workload/index.vue +11 -5
  72. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  73. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  74. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  75. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  76. package/dialog/DiagnosticTimingsDialog.vue +116 -0
  77. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  78. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  79. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  80. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  81. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +9 -3
  82. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  83. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  84. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  85. package/edit/auth/azuread.vue +44 -6
  86. package/edit/management.cattle.io.project.vue +2 -2
  87. package/edit/namespace.vue +17 -10
  88. package/edit/networking.k8s.io.ingress/index.vue +2 -2
  89. package/edit/persistentvolume/index.vue +3 -0
  90. package/edit/persistentvolumeclaim.vue +1 -0
  91. package/edit/pod.vue +27 -0
  92. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  93. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  94. package/edit/provisioning.cattle.io.cluster/rke2.vue +76 -5
  95. package/edit/service.vue +8 -6
  96. package/edit/workload/__tests__/Upgrading.test.ts +1 -0
  97. package/edit/workload/index.vue +375 -15
  98. package/edit/workload/mixins/workload.js +62 -7
  99. package/edit/workload/storage/ContainerMountPaths.vue +240 -0
  100. package/edit/workload/storage/Mount.vue +1 -0
  101. package/edit/workload/storage/awsElasticBlockStore.vue +20 -1
  102. package/edit/workload/storage/azureDisk.vue +22 -2
  103. package/edit/workload/storage/azureFile.vue +20 -2
  104. package/edit/workload/storage/csi/index.vue +23 -1
  105. package/edit/workload/storage/gcePersistentDisk.vue +20 -2
  106. package/edit/workload/storage/index.vue +23 -49
  107. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  108. package/edit/workload/storage/vsphereVolume.vue +11 -1
  109. package/layouts/default.vue +63 -32
  110. package/layouts/error.vue +5 -1
  111. package/layouts/home.vue +14 -5
  112. package/layouts/plain.vue +10 -5
  113. package/list/harvesterhci.io.management.cluster.vue +74 -33
  114. package/list/management.cattle.io.setting.vue +3 -3
  115. package/list/namespace.vue +3 -5
  116. package/list/provisioning.cattle.io.cluster.vue +1 -1
  117. package/machine-config/amazonec2.vue +2 -0
  118. package/machine-config/harvester.vue +100 -51
  119. package/middleware/authenticated.js +56 -52
  120. package/mixins/form-validation.js +1 -1
  121. package/mixins/resource-fetch.js +3 -1
  122. package/models/catalog.cattle.io.uiplugin.js +34 -0
  123. package/models/cluster/node.js +25 -2
  124. package/models/fleet.cattle.io.bundle.js +27 -20
  125. package/models/harvesterhci.io.management.cluster.js +200 -5
  126. package/models/management.cattle.io.cluster.js +1 -1
  127. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  128. package/models/management.cattle.io.project.js +23 -2
  129. package/models/namespace.js +19 -3
  130. package/models/pod.js +19 -2
  131. package/models/provisioning.cattle.io.cluster.js +16 -6
  132. package/models/workload.js +9 -246
  133. package/models/workload.service.js +314 -0
  134. package/nuxt.config.js +80 -34
  135. package/package.json +107 -108
  136. package/pages/auth/login.vue +11 -2
  137. package/pages/auth/setup.vue +1 -1
  138. package/pages/c/_cluster/_product/members/index.vue +3 -93
  139. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  140. package/pages/c/_cluster/apps/charts/index.vue +46 -1
  141. package/pages/c/_cluster/apps/charts/install.vue +10 -9
  142. package/pages/c/_cluster/explorer/index.vue +72 -9
  143. package/pages/c/_cluster/explorer/tools/index.vue +12 -5
  144. package/pages/c/_cluster/mcapps/index.vue +1 -1
  145. package/pages/c/_cluster/settings/brand.vue +0 -40
  146. package/pages/c/_cluster/settings/links.vue +200 -0
  147. package/pages/c/_cluster/settings/performance.vue +19 -16
  148. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +232 -0
  149. package/pages/c/_cluster/uiplugins/InstallDialog.vue +242 -0
  150. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +284 -0
  151. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +130 -0
  152. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +253 -0
  153. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +115 -0
  154. package/pages/c/_cluster/uiplugins/index.vue +694 -0
  155. package/pages/diagnostic.vue +185 -101
  156. package/pages/docs/_doc.vue +3 -1
  157. package/pages/fail-whale.vue +1 -10
  158. package/pages/home.vue +21 -56
  159. package/pages/index.vue +18 -4
  160. package/pages/prefs.vue +108 -86
  161. package/pages/safeMode.vue +17 -0
  162. package/pages/support/index.vue +23 -15
  163. package/pkg/auto-import.js +44 -7
  164. package/pkg/dynamic-importer.lib.js +4 -0
  165. package/pkg/dynamic-plugin-loader.js +28 -0
  166. package/pkg/import.js +2 -2
  167. package/pkg/model-loader-require.lib.js +3 -0
  168. package/pkg/vue.config.js +9 -6
  169. package/plugins/dashboard-store/model-loader-require.js +12 -0
  170. package/plugins/dashboard-store/model-loader.js +4 -1
  171. package/plugins/dashboard-store/resource-class.js +12 -5
  172. package/plugins/formatters.js +15 -0
  173. package/plugins/plugin.js +56 -4
  174. package/plugins/steve/actions.js +1 -1
  175. package/plugins/steve/index.js +6 -4
  176. package/plugins/steve/mutations.js +1 -1
  177. package/plugins/steve/subscribe.js +89 -56
  178. package/plugins/steve/web-worker.steve-sub-worker.js +24 -15
  179. package/promptRemove/management.cattle.io.globalrole.vue +47 -0
  180. package/promptRemove/management.cattle.io.roletemplate.vue +47 -0
  181. package/promptRemove/mixin/roleDeletionCheck.js +97 -0
  182. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  183. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  184. package/scripts/build-pkg.sh +48 -2
  185. package/scripts/drone-build-pkg.sh +31 -0
  186. package/scripts/publish-shell.sh +11 -12
  187. package/scripts/serve-pkgs +17 -10
  188. package/scripts/sync-shell-deps +37 -0
  189. package/store/catalog.js +12 -9
  190. package/store/i18n.js +26 -12
  191. package/store/index.js +4 -181
  192. package/store/prefs.js +46 -2
  193. package/store/type-map.js +47 -33
  194. package/store/uiplugins.ts +15 -61
  195. package/utils/__tests__/object.test.ts +0 -24
  196. package/utils/__tests__/selector.test.ts +1 -1
  197. package/utils/cluster.js +1 -1
  198. package/utils/custom-validators.js +1 -12
  199. package/utils/dynamic-importer.js +5 -1
  200. package/utils/grafana.js +2 -6
  201. package/utils/socket.js +41 -20
  202. package/utils/string.js +1 -7
  203. package/utils/validators/formRules/__tests__/index.test.ts +108 -0
  204. package/utils/validators/formRules/index.ts +9 -1
  205. package/utils/validators/setting.js +0 -35
  206. package/yarn-error.log +195 -0
  207. package/components/FilterLabel.vue +0 -254
  208. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  209. package/components/VMConsoleBar.vue +0 -87
  210. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  211. package/components/dialog/harvester/BackupModal.vue +0 -117
  212. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  213. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  214. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  215. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  216. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  217. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  218. package/components/dialog/harvester/SupportBundle.vue +0 -217
  219. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  220. package/components/form/SerialConsole/index.vue +0 -267
  221. package/components/formatter/AttachVMWithName.vue +0 -46
  222. package/components/formatter/CloudInitType.vue +0 -27
  223. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  224. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  225. package/components/formatter/HarvesterDiskState.vue +0 -66
  226. package/components/formatter/HarvesterHostName.vue +0 -66
  227. package/components/formatter/HarvesterIpAddress.vue +0 -90
  228. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  229. package/components/formatter/HarvesterMigrationState.vue +0 -85
  230. package/components/formatter/HarvesterNodeName.vue +0 -49
  231. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  232. package/components/formatter/HarvesterVmState.vue +0 -123
  233. package/components/nav/HarvesterUpgrade.vue +0 -232
  234. package/components/novnc/NovncConsole.vue +0 -93
  235. package/components/novnc/NovncConsoleItem.vue +0 -89
  236. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  237. package/config/harvester-map.js +0 -44
  238. package/config/harvester-table-headers.js +0 -27
  239. package/config/product/harvester.js +0 -305
  240. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  241. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  242. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  243. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  244. package/detail/harvesterhci.io.host/index.vue +0 -243
  245. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  246. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  247. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  248. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  249. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  250. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  251. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  252. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  253. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  254. package/edit/harvesterhci.io.host/index.vue +0 -533
  255. package/edit/harvesterhci.io.keypair.vue +0 -112
  256. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  257. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  258. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  259. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  260. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  261. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  262. package/edit/harvesterhci.io.setting/index.vue +0 -201
  263. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  264. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  265. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  266. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  267. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  268. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  269. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  270. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  271. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  272. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  273. package/edit/harvesterhci.io.volume.vue +0 -195
  274. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  275. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  276. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  277. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  278. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  279. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  280. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  281. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  282. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  283. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  284. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  285. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  286. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  287. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  288. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  289. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  290. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  291. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  292. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  293. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  294. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  295. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  296. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  297. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  298. package/edit/workload/types/Deployment.vue +0 -377
  299. package/edit/workload/types/Generic.vue +0 -295
  300. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  301. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  302. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  303. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  304. package/list/harvesterhci.io.host/index.vue +0 -186
  305. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  306. package/list/harvesterhci.io.setting.vue +0 -241
  307. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  308. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  309. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  310. package/list/harvesterhci.io.volume.vue +0 -122
  311. package/list/kubevirt.io.virtualmachine.vue +0 -193
  312. package/mixins/harvester-vm/impl.js +0 -267
  313. package/mixins/harvester-vm/index.js +0 -1357
  314. package/models/harvester/configmap.js +0 -32
  315. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  316. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  317. package/models/harvester/harvesterhci.io.setting.js +0 -127
  318. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  319. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  320. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  321. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  322. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  323. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  324. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  325. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  326. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  327. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  328. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  329. package/models/harvester/management.cattle.io.setting.js +0 -40
  330. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  331. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  332. package/models/harvester/node.js +0 -255
  333. package/models/harvester/persistentvolumeclaim.js +0 -166
  334. package/models/harvester/pod.js +0 -185
  335. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  336. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  337. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  338. package/pages/c/_cluster/harvester/index.vue +0 -24
  339. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  340. package/pages/plugins.vue +0 -387
  341. package/pkg/model-loader.lib.js +0 -3
  342. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  343. package/server/verdaccio-middleware.js +0 -56
  344. package/store/harvester-common.js +0 -126
  345. package/utils/validators/vm-datavolumes.js +0 -38
  346. package/utils/validators/vm-image.js +0 -32
  347. package/utils/validators/vm.js +0 -221
@@ -1,364 +0,0 @@
1
- <script>
2
- import CruResource from '@shell/components/CruResource';
3
- import Tabbed from '@shell/components/Tabbed';
4
- import Tab from '@shell/components/Tabbed/Tab';
5
- import { LabeledInput } from '@components/Form/LabeledInput';
6
- import KeyValue from '@shell/components/form/KeyValue';
7
- import NameNsDescription from '@shell/components/form/NameNsDescription';
8
- import { RadioGroup } from '@components/Form/Radio';
9
- import LabelValue from '@shell/components/LabelValue';
10
- import Select from '@shell/components/form/Select';
11
- import CreateEditView from '@shell/mixins/create-edit-view';
12
- import { OS } from '@shell/mixins/harvester-vm';
13
- import { VM_IMAGE_FILE_FORMAT } from '@shell/utils/validators/vm-image';
14
- import { HCI as HCI_ANNOTATIONS } from '@shell/config/labels-annotations';
15
- import { exceptionToErrorsArray } from '@shell/utils/error';
16
-
17
- const DOWNLOAD = 'download';
18
- const UPLOAD = 'upload';
19
- const rawORqcow2 = 'raw_qcow2';
20
-
21
- export default {
22
- name: 'EditImage',
23
-
24
- components: {
25
- Tab,
26
- Tabbed,
27
- KeyValue,
28
- Select,
29
- CruResource,
30
- LabeledInput,
31
- NameNsDescription,
32
- RadioGroup,
33
- LabelValue,
34
- },
35
-
36
- mixins: [CreateEditView],
37
-
38
- props: {
39
- value: {
40
- type: Object,
41
- required: true,
42
- },
43
- },
44
-
45
- data() {
46
- if ( !this.value.spec ) {
47
- this.$set(this.value, 'spec', { sourceType: DOWNLOAD });
48
- }
49
-
50
- if (!this.value.metadata.name) {
51
- this.value.metadata.generateName = 'image-';
52
- }
53
-
54
- return {
55
- url: this.value.spec.url,
56
- files: [],
57
- resource: '',
58
- headers: {},
59
- fileUrl: '',
60
- file: '',
61
- };
62
- },
63
-
64
- computed: {
65
- uploadFileName() {
66
- return this.file?.name || '';
67
- },
68
-
69
- imageName() {
70
- return this.value?.metadata?.annotations?.[HCI_ANNOTATIONS.IMAGE_NAME] || '-';
71
- },
72
-
73
- isCreateEdit() {
74
- return this.isCreate || this.isEdit;
75
- },
76
-
77
- showEditAsYaml() {
78
- return this.value.spec.sourceType === DOWNLOAD;
79
- }
80
- },
81
-
82
- watch: {
83
- 'value.spec.url'(neu) {
84
- const url = neu.trim();
85
- const suffixName = url.split('/').pop();
86
- const fileSuffix = suffixName.split('.').pop().toLowerCase();
87
-
88
- this.value.spec.url = url;
89
- if (VM_IMAGE_FILE_FORMAT.includes(fileSuffix)) {
90
- Object.keys(this.value.labels).forEach((key, idx) => {
91
- if (key === HCI_ANNOTATIONS.IMAGE_SUFFIX) {
92
- this.$refs.labels.remove(idx);
93
- }
94
- });
95
- if (fileSuffix === 'iso') {
96
- this.$refs.labels.add(HCI_ANNOTATIONS.IMAGE_SUFFIX, fileSuffix);
97
- } else {
98
- this.$refs.labels.add(HCI_ANNOTATIONS.IMAGE_SUFFIX, rawORqcow2);
99
- }
100
-
101
- if (!this.value.spec.displayName) {
102
- this.$refs.nd.changeNameAndNamespace({
103
- text: suffixName,
104
- selected: this.value.metadata.namespace,
105
- });
106
- }
107
- }
108
-
109
- const os = this.getOSType(url);
110
-
111
- if (os) {
112
- Object.keys(this.value.labels).forEach((key, idx) => {
113
- if (key === HCI_ANNOTATIONS.OS_TYPE) {
114
- this.$refs.labels.remove(idx);
115
- }
116
- });
117
- this.$refs.labels.add(HCI_ANNOTATIONS.OS_TYPE, os.value);
118
- }
119
- },
120
-
121
- 'value.spec.sourceType'() {
122
- this.$set(this, 'file', null);
123
- this.url = '';
124
-
125
- if (this.$refs?.file?.value) {
126
- this.$refs.file.value = null;
127
- }
128
- },
129
- },
130
-
131
- methods: {
132
- async saveImage(buttonCb) {
133
- this.value.spec.displayName = (this.value.spec.displayName || '').trim();
134
-
135
- if (this.value.spec.sourceType === UPLOAD && this.isCreate) {
136
- try {
137
- this.value.spec.url = '';
138
-
139
- const file = this.file;
140
-
141
- this.value.metadata.annotations[HCI_ANNOTATIONS.IMAGE_NAME] = file?.name;
142
-
143
- const res = await this.value.save();
144
-
145
- res.uploadImage(file);
146
-
147
- buttonCb(true);
148
- this.done();
149
- } catch (e) {
150
- this.errors = exceptionToErrorsArray(e);
151
- buttonCb(false);
152
- }
153
- } else {
154
- this.save(buttonCb);
155
- }
156
- },
157
-
158
- handleFileUpload() {
159
- const file = this.$refs.file.files[0];
160
-
161
- this.file = file;
162
-
163
- if (!this.value.spec.displayName) {
164
- this.$refs.nd.changeNameAndNamespace({
165
- text: file?.name,
166
- selected: this.value.metadata.namespace,
167
- });
168
- }
169
- },
170
-
171
- selectFile() {
172
- // Clear the value so the user can reselect the same file again
173
- this.$refs.file.value = null;
174
- this.$refs.file.click();
175
- },
176
-
177
- internalAnnotations(option) {
178
- const optionKeys = [HCI_ANNOTATIONS.OS_TYPE, HCI_ANNOTATIONS.IMAGE_SUFFIX];
179
-
180
- return optionKeys.find(O => O === option.key);
181
- },
182
-
183
- calculateOptions(keyName) {
184
- if (keyName === HCI_ANNOTATIONS.OS_TYPE) {
185
- return OS;
186
- } else if (keyName === HCI_ANNOTATIONS.IMAGE_SUFFIX) {
187
- return [{
188
- label: 'ISO',
189
- value: 'iso'
190
- }, {
191
- label: 'raw/qcow2',
192
- value: rawORqcow2
193
- }];
194
- }
195
-
196
- return [];
197
- },
198
-
199
- focusKey() {
200
- this.$refs.key.focus();
201
- },
202
-
203
- getOSType(url) {
204
- if (!url) {
205
- return;
206
- }
207
-
208
- return OS.find( (os) => {
209
- if (os.match) {
210
- return os.match.find(matchValue => url.toLowerCase().includes(matchValue)) ? os.value : false;
211
- } else {
212
- return url.toLowerCase().includes(os.value.toLowerCase()) ? os.value : false;
213
- }
214
- });
215
- }
216
- },
217
-
218
- };
219
- </script>
220
-
221
- <template>
222
- <CruResource
223
- :done-route="doneRoute"
224
- :resource="value"
225
- :mode="mode"
226
- :errors="errors"
227
- :can-yaml="showEditAsYaml ? true : false"
228
- :apply-hooks="applyHooks"
229
- @finish="saveImage"
230
- >
231
- <NameNsDescription
232
- ref="nd"
233
- v-model="value"
234
- :mode="mode"
235
- :label="t('generic.name')"
236
- name-key="spec.displayName"
237
- />
238
-
239
- <Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true">
240
- <Tab name="basic" :label="t('harvester.image.tabs.basics')" :weight="3" class="bordered-table">
241
- <RadioGroup
242
- v-if="isCreate"
243
- v-model="value.spec.sourceType"
244
- name="model"
245
- :options="[
246
- 'download',
247
- 'upload',
248
- ]"
249
- :labels="[
250
- t('harvester.image.sourceType.download'),
251
- t('harvester.image.sourceType.upload'),
252
- ]"
253
- :mode="mode"
254
- />
255
- <div class="row mb-20 mt-20">
256
- <div v-if="isCreateEdit" class="col span-12">
257
- <LabeledInput
258
- v-if="isEdit"
259
- v-model="value.spec.sourceType"
260
- :mode="mode"
261
- class="mb-20"
262
- :disabled="isEdit"
263
- label-key="harvester.image.source"
264
- />
265
-
266
- <LabeledInput
267
- v-if="value.spec.sourceType === 'download'"
268
- v-model="value.spec.url"
269
- :mode="mode"
270
- :disabled="isEdit"
271
- class="labeled-input--tooltip"
272
- required
273
- label-key="harvester.image.url"
274
- :tooltip="t('harvester.image.urlTip', {}, true)"
275
- />
276
-
277
- <div v-else>
278
- <button
279
- v-if="isCreate"
280
- type="button"
281
- class="btn role-primary"
282
- @click="selectFile"
283
- >
284
- <span>
285
- {{ t('harvester.image.uploadFile') }}
286
- </span>
287
- <input
288
- v-show="false"
289
- id="file"
290
- ref="file"
291
- type="file"
292
- accept=".qcow, .qcow2, .raw, .img, .iso"
293
- @change="handleFileUpload()"
294
- />
295
- </button>
296
-
297
- <div
298
- v-if="uploadFileName"
299
- class="fileName mt-5"
300
- >
301
- <span class="icon icon-file" />
302
- {{ uploadFileName }}
303
- </div>
304
- </div>
305
- </div>
306
- <div
307
- v-else
308
- class="col span-12"
309
- >
310
- <LabelValue
311
- :name="t('harvester.image.fileName')"
312
- :value="imageName"
313
- />
314
- </div>
315
- </div>
316
- </Tab>
317
-
318
- <Tab name="labels" :label="t('labels.labels.title')" :weight="2" class="bordered-table">
319
- <KeyValue
320
- key="labels"
321
- ref="labels"
322
- :value="value.labels"
323
- :add-label="t('labels.addLabel')"
324
- :mode="mode"
325
- :pad-left="false"
326
- :read-allowed="false"
327
- @focusKey="focusKey"
328
- @input="value.setLabels($event)"
329
- >
330
- <template #key="{ row, keyName, queueUpdate}">
331
- <input
332
- ref="key"
333
- v-model="row[keyName]"
334
- :placeholder="t('keyValue.keyPlaceholder')"
335
- @input="queueUpdate"
336
- />
337
- </template>
338
-
339
- <template #value="{row, keyName, valueName, queueUpdate}">
340
- <Select
341
- v-if="internalAnnotations(row)"
342
- v-model="row[valueName]"
343
- :searchable="true"
344
- :clearable="false"
345
- :options="calculateOptions(row[keyName])"
346
- @input="queueUpdate"
347
- />
348
- <input
349
- v-else
350
- v-model="row[valueName]"
351
- :disabled="isView"
352
- :type="'text'"
353
- :placeholder="t('keyValue.valuePlaceholder')"
354
- autocorrect="off"
355
- autocapitalize="off"
356
- spellcheck="false"
357
- @input="queueUpdate"
358
- />
359
- </template>
360
- </KeyValue>
361
- </Tab>
362
- </Tabbed>
363
- </CruResource>
364
- </template>
@@ -1,340 +0,0 @@
1
- <script>
2
- import { mapGetters } from 'vuex';
3
- import Tabbed from '@shell/components/Tabbed';
4
- import Tab from '@shell/components/Tabbed/Tab';
5
- import { Checkbox } from '@components/Form/Checkbox';
6
- import CruResource from '@shell/components/CruResource';
7
- import NameNsDescription from '@shell/components/form/NameNsDescription';
8
- import LabeledSelect from '@shell/components/form/LabeledSelect';
9
-
10
- import Volume from '@shell/edit/kubevirt.io.virtualmachine/VirtualMachineVolume';
11
- import Network from '@shell/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork';
12
- import CpuMemory from '@shell/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory';
13
- import CloudConfig from '@shell/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig';
14
- import SSHKey from '@shell/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey';
15
- import NodeScheduling from '@shell/components/form/NodeScheduling';
16
- import Reserved from '@shell/edit/kubevirt.io.virtualmachine/VirtualMachineReserved';
17
-
18
- import { HCI } from '@shell/config/types';
19
- import { randomStr } from '@shell/utils/string';
20
- import { RunStrategys } from '@shell/config/harvester-map';
21
- import { _CONFIG, _EDIT, _VIEW } from '@shell/config/query-params';
22
- import { HCI as HCI_ANNOTATIONS } from '@shell/config/labels-annotations';
23
-
24
- import VM_MIXIN from '@shell/mixins/harvester-vm';
25
- import CreateEditView from '@shell/mixins/create-edit-view';
26
- import { AFTER_SAVE_HOOKS } from '@shell/mixins/child-hook';
27
-
28
- export default {
29
- name: 'HarvesterEditVMTemplate',
30
-
31
- components: {
32
- Tab,
33
- SSHKey,
34
- Volume,
35
- Tabbed,
36
- Network,
37
- Checkbox,
38
- CpuMemory,
39
- CruResource,
40
- CloudConfig,
41
- LabeledSelect,
42
- NameNsDescription,
43
- NodeScheduling,
44
- Reserved,
45
- },
46
-
47
- mixins: [CreateEditView, VM_MIXIN],
48
-
49
- props: {
50
- value: {
51
- type: Object,
52
- required: true,
53
- },
54
- },
55
-
56
- data() {
57
- if (this.mode === _EDIT) {
58
- this.value.cleanForNew();
59
- }
60
-
61
- const templateId = this.value.templateId || this.$route.query.templateId;
62
-
63
- return {
64
- templateId,
65
- templateValue: null,
66
- templateSpec: null,
67
- versionName: '',
68
- description: '',
69
- defaultVersion: null,
70
- isDefaultVersion: false,
71
- RunStrategys,
72
- };
73
- },
74
-
75
- computed: {
76
- ...mapGetters({ t: 'i18n/t' }),
77
- isConfig() {
78
- return this.$route.query?.as === _CONFIG || this.isView;
79
- },
80
-
81
- realTemplateMode() {
82
- return this.templateId ? _VIEW : this.mode;
83
- },
84
- secretNamePrefix() {
85
- return this.templateValue?.metadata?.name;
86
- }
87
- },
88
-
89
- watch: {
90
- templateId: {
91
- async handler(neu) {
92
- const templates = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_TEMPLATE });
93
- let templateValue = templates.find( V => V.id === neu) || null;
94
- let templateSpec = templateValue?.spec;
95
-
96
- if (!templateValue) {
97
- templateSpec = {
98
- description: '',
99
- defaultVersionId: ''
100
- };
101
-
102
- templateValue = await this.$store.dispatch('harvester/create', {
103
- metadata: {
104
- name: '',
105
- namespace: ''
106
- },
107
- spec: templateSpec,
108
- type: HCI.VM_TEMPLATE
109
- });
110
- }
111
-
112
- this.templateValue = templateValue;
113
- this.templateSpec = templateSpec;
114
- },
115
- immediate: true
116
- }
117
- },
118
-
119
- created() {
120
- this.registerAfterHook(async() => {
121
- if (this.isDefaultVersion) {
122
- // Set the default version according to annotation:[HCI_ANNOTATIONS.TEMPLATE_VERSION_CUSTOM_NAME]
123
- const versions = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_VERSION, opt: { force: true } });
124
-
125
- const version = versions.find( V => V?.metadata?.annotations?.[HCI_ANNOTATIONS.TEMPLATE_VERSION_CUSTOM_NAME] === this.customName);
126
-
127
- if (version) {
128
- try {
129
- this.templateValue.defaultVersionId = version.id;
130
-
131
- const data = [{
132
- op: 'replace', path: '/spec/defaultVersionId', value: version.id
133
- }];
134
-
135
- await this.templateValue.patch( data, { url: this.templateValue.linkFor('view') });
136
- } catch (err) {
137
- return Promise.reject(new Error(err.message));
138
- }
139
- }
140
- }
141
- });
142
- },
143
-
144
- mounted() {
145
- this.imageId = this.diskRows[0]?.image || '';
146
- },
147
-
148
- methods: {
149
- async saveVMT(buttonCb) {
150
- this.parseVM();
151
-
152
- const templates = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_TEMPLATE });
153
- const template = templates.find( O => O.metadata.name === this.templateValue.metadata.name);
154
-
155
- try {
156
- if (!this.templateId) {
157
- if (this.templateValue?.metadata?.name) {
158
- await this.templateValue.save();
159
- } else {
160
- this.errors = [this.t('validation.required', { key: this.t('harvester.vmTemplate.nameNsDescription.name') })];
161
- buttonCb(false);
162
-
163
- return;
164
- }
165
- } else {
166
- template.save();
167
- }
168
-
169
- this.value.cleanForNew();
170
- this.customName = randomStr(10);
171
- this.$set(this.value.metadata, 'annotations', {
172
- ...this.value.metadata.annotations,
173
- [HCI_ANNOTATIONS.TEMPLATE_VERSION_CUSTOM_NAME]: this.customName
174
- });
175
-
176
- const name = this.templateValue.metadata.name || template.metadata.name;
177
- const namespace = this.templateValue.metadata.namespace || template.metadata.namespace;
178
-
179
- if (this.isCreate) {
180
- this.value.metadata.namespace = namespace;
181
- }
182
-
183
- this.$set(this.value.spec, 'templateId', `${ namespace }/${ name }`);
184
- const res = await this.value.save();
185
-
186
- await this.saveSecret(res);
187
- await this.applyHooks(AFTER_SAVE_HOOKS);
188
- this.done();
189
- } catch (e) {
190
- this.errors = [e];
191
- buttonCb(false);
192
- }
193
- },
194
-
195
- onTabChanged({ tab }) {
196
- if (tab.name === 'advanced') {
197
- this.$refs.yamlEditor?.refresh();
198
- }
199
- }
200
- },
201
- };
202
- </script>
203
-
204
- <template>
205
- <CruResource
206
- v-if="templateSpec && spec"
207
- :done-route="doneRoute"
208
- :resource="value"
209
- :can-yaml="false"
210
- :mode="mode"
211
- :errors="errors"
212
- :apply-hooks="applyHooks"
213
- @finish="saveVMT"
214
- >
215
- <NameNsDescription
216
- v-model="templateValue"
217
- :mode="realTemplateMode"
218
- name-label="harvester.vmTemplate.nameNsDescription.name"
219
- :namespaced="true"
220
- />
221
-
222
- <Checkbox
223
- v-if="templateId"
224
- v-model="isDefaultVersion"
225
- class="mb-20"
226
- :label="t('tableHeaders.defaultVersion')"
227
- type="checkbox"
228
- :mode="mode"
229
- />
230
-
231
- <Tabbed :side-tabs="true" @changed="onTabChanged">
232
- <Tab name="Basics" :label="t('harvester.vmTemplate.tabs.basics')">
233
- <CpuMemory :cpu="cpu" :memory="memory" :disabled="isConfig" @updateCpuMemory="updateCpuMemory" />
234
-
235
- <div class="mb-20">
236
- <SSHKey v-model="sshKey" :namespace="templateValue.metadata.namespace" :disable-create="isView" :mode="mode" @update:sshKey="updateSSHKey" />
237
- </div>
238
- </Tab>
239
-
240
- <Tab name="Volume" :label="t('harvester.tab.volume')" :weight="-1">
241
- <Volume v-model="diskRows" :mode="mode" :namespace="value.metadata.namespace" :existing-volume-disabled="true" />
242
- </Tab>
243
-
244
- <Tab name="Network" :label="t('harvester.tab.network')" :weight="-2">
245
- <Network v-model="networkRows" :mode="mode" />
246
- </Tab>
247
-
248
- <Tab
249
- name="nodeScheduling"
250
- :label="t('workload.container.titles.nodeScheduling')"
251
- :weight="-89"
252
- >
253
- <NodeScheduling
254
- :mode="mode"
255
- :value="spec.template.spec"
256
- :nodes="nodesIdOptions"
257
- />
258
- </Tab>
259
-
260
- <Tab name="advanced" :label="t('harvester.tab.advanced')" :weight="-99">
261
- <div class="row mb-20">
262
- <div class="col span-6">
263
- <LabeledSelect
264
- v-model="runStrategy"
265
- label-key="harvester.virtualMachine.runStrategy"
266
- :options="RunStrategys"
267
- :mode="mode"
268
- />
269
- </div>
270
-
271
- <div class="col span-6">
272
- <LabeledSelect
273
- v-model="osType"
274
- label-key="harvester.virtualMachine.osType"
275
- :mode="mode"
276
- :options="OS"
277
- />
278
- </div>
279
- </div>
280
-
281
- <div class="row mb-20">
282
- <a v-if="showAdvanced" v-t="'harvester.generic.showMore'" role="button" @click="toggleAdvanced" />
283
- <a v-else v-t="'harvester.generic.showMore'" role="button" @click="toggleAdvanced" />
284
- </div>
285
-
286
- <div v-if="showAdvanced" class="mb-20">
287
- <Reserved
288
- :reserved-memory="reservedMemory"
289
- :mode="mode"
290
- @updateReserved="updateReserved"
291
- />
292
- </div>
293
-
294
- <CloudConfig
295
- ref="yamlEditor"
296
- :mode="mode"
297
- :user-script="userScript"
298
- :namespace="templateValue.metadata.namespace"
299
- :network-script="networkScript"
300
- @updateUserData="updateUserData"
301
- @updateNetworkData="updateNetworkData"
302
- />
303
-
304
- <div class="spacer"></div>
305
- <Checkbox
306
- v-model="installUSBTablet"
307
- class="check"
308
- type="checkbox"
309
- :label="t('harvester.virtualMachine.enableUsb')"
310
- :mode="mode"
311
- />
312
-
313
- <Checkbox
314
- v-model="installAgent"
315
- class="check"
316
- type="checkbox"
317
- label-key="harvester.virtualMachine.installAgent"
318
- :mode="mode"
319
- />
320
-
321
- <Checkbox
322
- v-model="efiEnabled"
323
- class="check"
324
- type="checkbox"
325
- :label="t('harvester.virtualMachine.efiEnabled')"
326
- :mode="mode"
327
- />
328
-
329
- <Checkbox
330
- v-if="efiEnabled"
331
- v-model="secureBoot"
332
- class="check"
333
- type="checkbox"
334
- :label="t('harvester.virtualMachine.secureBoot')"
335
- :mode="mode"
336
- />
337
- </Tab>
338
- </Tabbed>
339
- </CruResource>
340
- </template>