@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,255 +0,0 @@
1
- import pickBy from 'lodash/pickBy';
2
- import { HCI, LONGHORN, POD, NODE } from '@shell/config/types';
3
- import { HCI as HCI_ANNOTATIONS } from '@shell/config/labels-annotations';
4
- import { clone } from '@shell/utils/object';
5
- import findLast from 'lodash/findLast';
6
- import { colorForState, stateDisplay } from '@shell/plugins/dashboard-store/resource-class';
7
- import SteveModel from '@shell/plugins/steve/steve-class';
8
- import { parseSi } from '@shell/utils/units';
9
-
10
- const ALLOW_SYSTEM_LABEL_KEYS = [
11
- 'topology.kubernetes.io/zone',
12
- 'topology.kubernetes.io/region',
13
- ];
14
-
15
- export default class HciNode extends SteveModel {
16
- get _availableActions() {
17
- const cordon = {
18
- action: 'cordon',
19
- enabled: this.hasAction('cordon') && !this.isCordoned,
20
- icon: 'icon icon-fw icon-pause',
21
- label: this.t('harvester.action.cordon'),
22
- total: 1,
23
- };
24
-
25
- const uncordon = {
26
- action: 'uncordon',
27
- enabled: this.hasAction('uncordon'),
28
- icon: 'icon icon-fw icon-play',
29
- label: this.t('harvester.action.uncordon'),
30
- total: 1,
31
- };
32
-
33
- const enableMaintenance = {
34
- action: 'enableMaintenanceMode',
35
- enabled: this.hasAction('enableMaintenanceMode'),
36
- icon: 'icon icon-fw icon-unlock',
37
- label: this.t('harvester.action.enableMaintenance'),
38
- total: 1
39
- };
40
-
41
- const disableMaintenance = {
42
- action: 'disableMaintenanceMode',
43
- enabled: this.hasAction('disableMaintenanceMode'),
44
- icon: 'icon icon-fw icon-lock',
45
- label: this.t('harvester.action.disableMaintenance'),
46
- total: 1
47
- };
48
-
49
- return [
50
- cordon,
51
- uncordon,
52
- enableMaintenance,
53
- disableMaintenance,
54
- ...super._availableActions
55
- ];
56
- }
57
-
58
- get confirmRemove() {
59
- return true;
60
- }
61
-
62
- get filteredSystemLabels() {
63
- const reg = /(k3s|kubernetes|kubevirt|harvesterhci|k3os)+\.io/;
64
-
65
- const labels = pickBy(this.labels, (value, key) => {
66
- return !reg.test(key);
67
- });
68
-
69
- ALLOW_SYSTEM_LABEL_KEYS.map((key) => {
70
- const value = this?.metadata?.labels?.[key];
71
-
72
- if (value) {
73
- labels[key] = value;
74
- }
75
- });
76
-
77
- return labels;
78
- }
79
-
80
- get nameDisplay() {
81
- return this.metadata?.annotations?.[HCI_ANNOTATIONS.HOST_CUSTOM_NAME] || this.name;
82
- }
83
-
84
- get stateDisplay() {
85
- if (this.isEnteringMaintenance) {
86
- return 'Entering maintenance mode';
87
- }
88
-
89
- if (this.isMaintenance) {
90
- return 'Maintenance';
91
- }
92
-
93
- if (this.isCordoned ) {
94
- return 'Cordoned';
95
- }
96
-
97
- return stateDisplay(this.state);
98
- }
99
-
100
- get stateBackground() {
101
- return colorForState(this.stateDisplay, this.stateObj?.error, this.stateObj?.transitioning).replace('text-', 'bg-');
102
- }
103
-
104
- get stateDescription() {
105
- const currentIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.CURRENT_IP];
106
- const initIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.INIT_IP];
107
-
108
- if (initIP && currentIP && currentIP !== initIP) {
109
- return this.t('harvester.host.inconsistentIP', { currentIP, initIP });
110
- }
111
-
112
- return super.stateDescription;
113
- }
114
-
115
- get stateObj() {
116
- const currentIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.CURRENT_IP];
117
- const initIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.INIT_IP];
118
-
119
- if (initIP && currentIP && currentIP !== initIP) {
120
- this.metadata.state.error = true;
121
- }
122
-
123
- return this.metadata?.state;
124
- }
125
-
126
- get detailLocation() {
127
- const detailLocation = clone(this._detailLocation);
128
-
129
- detailLocation.params.resource = HCI.HOST;
130
-
131
- return detailLocation;
132
- }
133
-
134
- get doneOverride() {
135
- const detailLocation = clone(this._detailLocation);
136
-
137
- delete detailLocation.params.namespace;
138
- delete detailLocation.params.id;
139
- detailLocation.params.resource = HCI.HOST;
140
- detailLocation.name = 'c-cluster-product-resource';
141
-
142
- return detailLocation;
143
- }
144
-
145
- get parentNameOverride() {
146
- return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.HOST }"`, { count: 1 })?.trim();
147
- }
148
-
149
- get parentLocationOverride() {
150
- return this.doneOverride;
151
- }
152
-
153
- get internalIp() {
154
- const addresses = this.status?.addresses || [];
155
-
156
- return findLast(addresses, address => address.type === 'InternalIP')?.address;
157
- }
158
-
159
- get isMaster() {
160
- return this.metadata?.labels?.[HCI_ANNOTATIONS.NODE_ROLE_MASTER] !== undefined || this.metadata?.labels?.[HCI_ANNOTATIONS.NODE_ROLE_CONTROL_PLANE] !== undefined;
161
- }
162
-
163
- cordon() {
164
- this.doAction('cordon', {});
165
- }
166
-
167
- uncordon() {
168
- this.doAction('uncordon', {});
169
- }
170
-
171
- enableMaintenanceMode(resources = this) {
172
- this.$dispatch('promptModal', {
173
- resources,
174
- component: 'harvester/MaintenanceDialog'
175
- });
176
- }
177
-
178
- disableMaintenanceMode() {
179
- this.doAction('disableMaintenanceMode', {});
180
- }
181
-
182
- get isUnSchedulable() {
183
- return this.metadata?.labels?.[HCI_ANNOTATIONS.NODE_SCHEDULABLE] === 'false' || this.spec.unschedulable;
184
- }
185
-
186
- get isMigratable() {
187
- const states = ['in-progress', 'unavailable'];
188
-
189
- return !this.metadata?.annotations?.[HCI_ANNOTATIONS.MAINTENANCE_STATUS] && !this.isUnSchedulable && !states.includes(this.state);
190
- }
191
-
192
- get isCordoned() {
193
- return this.isUnSchedulable;
194
- }
195
-
196
- get isEnteringMaintenance() {
197
- return this.metadata?.annotations?.[HCI_ANNOTATIONS.MAINTENANCE_STATUS] === 'running';
198
- }
199
-
200
- get isMaintenance() {
201
- return this.metadata?.annotations?.[HCI_ANNOTATIONS.MAINTENANCE_STATUS] === 'completed';
202
- }
203
-
204
- get longhornDisks() {
205
- const inStore = this.$rootGetters['currentProduct'].inStore;
206
- const longhornNode = this.$rootGetters[`${ inStore }/byId`](LONGHORN.NODES, `longhorn-system/${ this.id }`);
207
- const diskStatus = longhornNode?.status?.diskStatus || {};
208
- const diskSpec = longhornNode?.spec?.disks || {};
209
-
210
- const longhornDisks = Object.keys(diskStatus).map((key) => {
211
- return {
212
- ...diskSpec[key],
213
- ...diskStatus[key],
214
- name: key,
215
- storageReserved: diskSpec[key]?.storageReserved,
216
- storageAvailable: diskStatus[key]?.storageAvailable,
217
- storageMaximum: diskStatus[key]?.storageMaximum,
218
- storageScheduled: diskStatus[key]?.storageScheduled,
219
- readyCondiction: diskStatus[key]?.conditions?.Ready || {},
220
- schedulableCondiction: diskStatus[key]?.conditions?.Schedulable || {},
221
- };
222
- });
223
-
224
- return longhornDisks;
225
- }
226
-
227
- get pods() {
228
- const inStore = this.$rootGetters['currentProduct'].inStore;
229
- const pods = this.$rootGetters[`${ inStore }/all`](POD) || [];
230
-
231
- return pods.filter(p => p?.spec?.nodeName === this.id && p?.metadata?.name !== 'removing');
232
- }
233
-
234
- get reserved() {
235
- try {
236
- return JSON.parse(this.metadata.annotations[HCI_ANNOTATIONS.HOST_REQUEST] || '{}');
237
- } catch {
238
- return {};
239
- }
240
- }
241
-
242
- get cpuReserved() {
243
- return parseSi(this.reserved.cpu || '0');
244
- }
245
-
246
- get memoryReserved() {
247
- return parseSi(this.reserved.memory || '0');
248
- }
249
-
250
- get canDelete() {
251
- const nodes = this.$rootGetters['harvester/all'](NODE) || [];
252
-
253
- return nodes.length > 1;
254
- }
255
- }
@@ -1,166 +0,0 @@
1
- import Vue from 'vue';
2
- import { _CLONE } from '@shell/config/query-params';
3
- import pick from 'lodash/pick';
4
- import { HCI } from '@shell/config/types';
5
- import { HCI as HCI_ANNOTATIONS, DESCRIPTION } from '@shell/config/labels-annotations';
6
- import { findBy } from '@shell/utils/array';
7
- import { get, clone } from '@shell/utils/object';
8
- import SteveModel from '@shell/plugins/steve/steve-class';
9
- import { colorForState } from '@shell/plugins/dashboard-store/resource-class';
10
-
11
- export default class HciPv extends SteveModel {
12
- applyDefaults(_, realMode) {
13
- const accessModes = realMode === _CLONE ? this.spec.accessModes : [];
14
- const storage = realMode === _CLONE ? this.spec.resources.requests.storage : null;
15
-
16
- Vue.set(this, 'spec', {
17
- accessModes,
18
- storageClassName: '',
19
- volumeName: '',
20
- resources: { requests: { storage } }
21
- });
22
- }
23
-
24
- get availableActions() {
25
- return [
26
- {
27
- action: 'exportImage',
28
- enabled: this.hasAction('export'),
29
- icon: 'icon icon-copy',
30
- label: this.t('harvester.action.exportImage'),
31
- },
32
- {
33
- action: 'cancelExpand',
34
- enabled: this.hasAction('cancelExpand'),
35
- icon: 'icon icon-backup',
36
- label: this.t('harvester.action.cancelExpand'),
37
- },
38
- ...super._availableActions
39
- ];
40
- }
41
-
42
- exportImage(resources = this) {
43
- this.$dispatch('promptModal', {
44
- resources,
45
- component: 'harvester/ExportImageDialog'
46
- });
47
- }
48
-
49
- cancelExpand(resources = this) {
50
- this.doActionGrowl('cancelExpand', {});
51
- }
52
-
53
- cleanForNew() {
54
- this.$dispatch(`cleanForNew`, this);
55
-
56
- delete this.metadata.finalizers;
57
- const keys = [HCI_ANNOTATIONS.IMAGE_ID, DESCRIPTION];
58
-
59
- this.metadata.annotations = pick(this.metadata.annotations, keys);
60
- }
61
-
62
- get canUpdate() {
63
- return this.hasLink('update');
64
- }
65
-
66
- get stateDisplay() {
67
- const ownedBy = this?.metadata?.annotations?.[HCI_ANNOTATIONS.OWNED_BY];
68
- const status = this?.status?.phase === 'Bound' ? 'Ready' : 'NotReady';
69
-
70
- const conditions = this?.status?.conditions || [];
71
-
72
- if (findBy(conditions, 'type', 'Resizing')?.status === 'True') {
73
- return 'Resizing';
74
- } else if (ownedBy) {
75
- return 'In-use';
76
- } else {
77
- return status;
78
- }
79
- }
80
-
81
- get state() {
82
- let status = this?.status?.phase === 'Bound' ? 'Ready' : 'NotReady';
83
-
84
- const conditions = this?.status?.conditions || [];
85
-
86
- if (findBy(conditions, 'type', 'Resizing')?.status === 'True') {
87
- status = 'Resizing';
88
- }
89
-
90
- return status;
91
- }
92
-
93
- get stateColor() {
94
- const state = this.stateDisplay;
95
-
96
- return colorForState(state);
97
- }
98
-
99
- get stateDescription() {
100
- return this.metadata?.annotations?.[HCI_ANNOTATIONS.VM_VOLUME_STATUS] || super.stateDescription;
101
- }
102
-
103
- get detailLocation() {
104
- const detailLocation = clone(this._detailLocation);
105
-
106
- detailLocation.params.resource = HCI.VOLUME;
107
-
108
- return detailLocation;
109
- }
110
-
111
- get doneOverride() {
112
- const detailLocation = clone(this._detailLocation);
113
-
114
- delete detailLocation.params.namespace;
115
- delete detailLocation.params.id;
116
- detailLocation.params.resource = HCI.VOLUME;
117
- detailLocation.name = 'c-cluster-product-resource';
118
-
119
- return detailLocation;
120
- }
121
-
122
- get parentNameOverride() {
123
- return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.VOLUME }"`, { count: 1 }).trim();
124
- }
125
-
126
- get parentLocationOverride() {
127
- return this.doneOverride;
128
- }
129
-
130
- get phaseState() {
131
- return this.status?.phase || 'N/A';
132
- }
133
-
134
- get attachVM() {
135
- const allVMs = this.$rootGetters['harvester/all'](HCI.VM);
136
- const ownedBy = get(this, `metadata.annotations."${ HCI_ANNOTATIONS.OWNED_BY }"`) || '';
137
-
138
- if (!ownedBy) {
139
- return null;
140
- }
141
-
142
- const ownedId = JSON.parse(ownedBy)[0]?.refs?.[0];
143
-
144
- return allVMs.find( D => D.id === ownedId);
145
- }
146
-
147
- get isAvailable() {
148
- return this.stateDisplay !== 'Resizing';
149
- }
150
-
151
- get volumeSort() {
152
- const volume = this.spec?.resources?.requests?.storage || 0;
153
-
154
- return parseInt(volume);
155
- }
156
-
157
- get isSystemResource() {
158
- const systemNamespaces = this.$rootGetters['systemNamespaces'];
159
-
160
- if ( systemNamespaces.includes(this.metadata?.namespace) ) {
161
- return true;
162
- }
163
-
164
- return false;
165
- }
166
- }
@@ -1,185 +0,0 @@
1
- import includes from 'lodash/includes';
2
- import { findBy } from '@shell/utils/array';
3
- import { get } from '@shell/utils/object';
4
- import { NODE } from '@shell/config/types';
5
- import Resource from '@shell/plugins/dashboard-store/resource-class';
6
-
7
- const POD_STATUS_NOT_SCHEDULABLE = 'POD_NOT_SCHEDULABLE';
8
-
9
- const POD_STATUS_FAILED = 'POD_FAILED';
10
- const POD_STATUS_CRASHLOOP_BACKOFF = 'POD_CRASHLOOP_BACKOFF';
11
- const POD_STATUS_UNKNOWN = 'POD_STATUS_UNKNOWN';
12
- const POD_STATUS_CONTAINER_FAILING = 'POD_CONTAINER_FAILING';
13
- const POD_STATUS_NOT_READY = 'POD_NOT_READY';
14
-
15
- const POD_STATUS_PENDING = 'POD_STATUS_PENDING';
16
- const POD_STATUS_COMPLETED = 'POD_STATUS_COMPLETED';
17
- const POD_STATUS_SUCCEEDED = 'POD_STATUS_SUCCEEDED';
18
- const POD_STATUS_RUNNING = 'POD_STATUS_RUNNING';
19
-
20
- const failedWaitingContainerReasons = ['ImagePullBackOff', 'ErrImagePull', 'CrashLoopBackOff'];
21
- const failedTerminationContainerReasons = ['Error'];
22
-
23
- const errorStatusMapper = {
24
- Failed: POD_STATUS_FAILED,
25
- CrashLoopBackOff: POD_STATUS_CRASHLOOP_BACKOFF,
26
- Unknown: POD_STATUS_UNKNOWN,
27
- };
28
-
29
- const okStatusMapper = {
30
- Pending: POD_STATUS_PENDING,
31
- Running: POD_STATUS_RUNNING,
32
- Completed: POD_STATUS_COMPLETED,
33
- Succeeded: POD_STATUS_SUCCEEDED,
34
- };
35
-
36
- const stateReasonResolver = {
37
- terminated: ({ reason, exitCode }) => `Terminated with ${ reason }${ exitCode ? ` (exit code ${ exitCode }).` : '.' }`,
38
- waiting: ({ reason }) => `Waiting (${ reason }).`,
39
- };
40
-
41
- export default class HciPod extends Resource {
42
- get inStore() {
43
- return this.$rootGetters['currentProduct'].inStore;
44
- }
45
-
46
- get nodes() {
47
- return this.$rootGetters[`${ this.inStore }/all`](NODE);
48
- }
49
-
50
- get node() {
51
- const { nodeName } = this.spec;
52
-
53
- return this.nodes.filter((node) => {
54
- return node?.metadata?.name === nodeName;
55
- })[0];
56
- }
57
-
58
- get getPodStatus() {
59
- return this.isNotSchedulable ||
60
- this.hasErrorStatus ||
61
- this.isContainerFailing ||
62
- this.isNotReady ||
63
- this.hasOkStatus || { status: POD_STATUS_UNKNOWN };
64
- }
65
-
66
- get isNotSchedulable() {
67
- if (!this.isPodSchedulable) {
68
- const conditions = get(this, 'status.conditions');
69
- const podScheduledCond = findBy(conditions, 'type', 'PodScheduled');
70
-
71
- return {
72
- status: POD_STATUS_NOT_SCHEDULABLE,
73
- message: podScheduledCond.message || 'Pod scheduling failed.',
74
- };
75
- }
76
-
77
- return null;
78
- }
79
-
80
- get hasErrorStatus() {
81
- const status = errorStatusMapper[this?.status?.phase];
82
-
83
- if (status) {
84
- return {
85
- status,
86
- message: this.getContainerStatusReason(this.findFailingContainerStatus),
87
- };
88
- }
89
-
90
- return null;
91
- }
92
-
93
- get isPodSchedulable() {
94
- const conditions = get(this, 'status.conditions');
95
- const podScheduledCond = findBy(conditions, 'type', 'PodScheduled');
96
-
97
- return !(
98
- podScheduledCond &&
99
- podScheduledCond.status !== 'True' &&
100
- podScheduledCond.reason === 'Unschedulable'
101
- );
102
- }
103
-
104
- get findFailingContainerStatus() {
105
- return (get(this, 'status.containerStatuses'), []).find((container) => {
106
- return !container.ready &&
107
- (includes(failedWaitingContainerReasons, get(container, 'state.waiting.reason')) ||
108
- includes(failedTerminationContainerReasons, get(container, 'state.terminated.reason')));
109
- });
110
- }
111
-
112
- get getContainerStatusReason() {
113
- return (containerStatus) => {
114
- if (containerStatus) {
115
- const stateName = Object.getOwnPropertyNames(containerStatus.state).find(
116
- pn => !!containerStatus.state[pn].reason,
117
- );
118
-
119
- if (stateName) {
120
- const state = containerStatus.state[stateName];
121
-
122
- return (
123
- state.message ||
124
- (stateReasonResolver[stateName] && stateReasonResolver[stateName](state)) ||
125
- stateName
126
- );
127
- }
128
- }
129
-
130
- return undefined;
131
- };
132
- }
133
-
134
- get isContainerFailing() {
135
- const failingContainer = this.findFailingContainerStatus;
136
-
137
- if (failingContainer) {
138
- return {
139
- status: POD_STATUS_CONTAINER_FAILING,
140
- message: this.getContainerStatusReason(failingContainer),
141
- };
142
- }
143
-
144
- return null;
145
- }
146
-
147
- get isNotReady() {
148
- const message = this.findPodFalseStatusConditionMessage;
149
-
150
- if (message) {
151
- return {
152
- status: POD_STATUS_NOT_READY,
153
- message,
154
- };
155
- }
156
-
157
- return null;
158
- }
159
-
160
- get hasOkStatus() {
161
- const status = okStatusMapper[this?.status?.phase];
162
-
163
- if (status) {
164
- return { status };
165
- }
166
-
167
- return null;
168
- }
169
-
170
- get findPodFalseStatusConditionMessage() {
171
- const notReadyConditions = this.getPodFalseStatusConditions;
172
-
173
- if (notReadyConditions.length > 0) {
174
- return notReadyConditions[0].message || `Step: ${ notReadyConditions[0].type }`;
175
- }
176
-
177
- return undefined;
178
- }
179
-
180
- get getPodFalseStatusConditions() {
181
- const conditions = get(this, 'status.conditions') || [];
182
-
183
- return conditions.filter(condition => condition.status !== 'True');
184
- }
185
- }