@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,7 +1,12 @@
1
1
  <script>
2
2
  import debounce from 'lodash/debounce';
3
3
  import { mapState, mapGetters } from 'vuex';
4
- import { mapPref, DEV, FAVORITE_TYPES, AFTER_LOGIN_ROUTE } from '@shell/store/prefs';
4
+ import {
5
+ mapPref,
6
+ FAVORITE_TYPES,
7
+ AFTER_LOGIN_ROUTE,
8
+ THEME_SHORTCUT
9
+ } from '@shell/store/prefs';
5
10
  import ActionMenu from '@shell/components/ActionMenu';
6
11
  import GrowlManager from '@shell/components/GrowlManager';
7
12
  import WindowManager from '@shell/components/nav/WindowManager';
@@ -16,19 +21,20 @@ import FixedBanner from '@shell/components/FixedBanner';
16
21
  import AwsComplianceBanner from '@shell/components/AwsComplianceBanner';
17
22
  import AzureWarning from '@shell/components/auth/AzureWarning';
18
23
  import {
19
- COUNT, SCHEMA, MANAGEMENT, UI, CATALOG, HCI
24
+ COUNT, SCHEMA, MANAGEMENT, UI, CATALOG
20
25
  } from '@shell/config/types';
21
26
  import { BASIC, FAVORITE, USED } from '@shell/store/type-map';
22
27
  import { addObjects, replaceWith, clear, addObject } from '@shell/utils/array';
23
28
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
24
29
  import { NAME as NAVLINKS } from '@shell/config/product/navlinks';
25
- import { NAME as HARVESTER } from '@shell/config/product/harvester';
30
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
26
31
  import isEqual from 'lodash/isEqual';
27
32
  import { ucFirst } from '@shell/utils/string';
28
33
  import { getVersionInfo, markSeenReleaseNotes } from '@shell/utils/version';
29
34
  import { sortBy } from '@shell/utils/sort';
30
35
  import PageHeaderActions from '@shell/mixins/page-actions';
31
36
  import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
37
+ import { getProductFromRoute } from '@shell/middleware/authenticated';
32
38
 
33
39
  const SET_LOGIN_ACTION = 'set-as-login';
34
40
 
@@ -51,15 +57,20 @@ export default {
51
57
 
52
58
  mixins: [PageHeaderActions, Brand, BrowserTabVisibility],
53
59
 
60
+ // Note - This will not run on route change
54
61
  data() {
55
62
  return {
56
- groups: [],
57
- gettingGroups: false,
58
- wantNavSync: false,
63
+ noLocaleShortcut: process.env.dev || false,
64
+ groups: [],
65
+ gettingGroups: false,
66
+ wantNavSync: false,
59
67
  };
60
68
  },
61
69
 
62
- middleware: ['authenticated'],
70
+ // Note - These will run on route change
71
+ middleware: [
72
+ 'authenticated'
73
+ ],
63
74
 
64
75
  computed: {
65
76
  ...mapState(['managementReady', 'clusterReady']),
@@ -73,8 +84,8 @@ export default {
73
84
  return this.$store.getters['activeNamespaceCache'];
74
85
  },
75
86
 
76
- dev: mapPref(DEV),
77
- favoriteTypes: mapPref(FAVORITE_TYPES),
87
+ themeShortcut: mapPref(THEME_SHORTCUT),
88
+ favoriteTypes: mapPref(FAVORITE_TYPES),
78
89
 
79
90
  pageActions() {
80
91
  const pageActions = [];
@@ -98,7 +109,7 @@ export default {
98
109
  },
99
110
 
100
111
  allSchemas() {
101
- const managementReady = this.$store.getters['managementReady'];
112
+ const managementReady = this.managementReady;
102
113
  const product = this.$store.getters['currentProduct'];
103
114
 
104
115
  if ( !managementReady || !product ) {
@@ -117,7 +128,7 @@ export default {
117
128
  },
118
129
 
119
130
  counts() {
120
- const managementReady = this.$store.getters['managementReady'];
131
+ const managementReady = this.managementReady;
121
132
  const product = this.$store.getters['currentProduct'];
122
133
 
123
134
  if ( !managementReady || !product ) {
@@ -143,14 +154,12 @@ export default {
143
154
  },
144
155
 
145
156
  displayVersion() {
146
- let { displayVersion } = getVersionInfo(this.$store);
147
-
148
- if (this.isVirtualProduct && this.isSingleProduct) {
149
- const setting = this.$store.getters['harvester/byId'](HCI.SETTING, 'server-version');
150
-
151
- displayVersion = setting?.value || 'unknown';
157
+ if (this.isSingleProduct?.getVersionInfo) {
158
+ return this.isSingleProduct?.getVersionInfo(this.$store);
152
159
  }
153
160
 
161
+ const { displayVersion } = getVersionInfo(this.$store);
162
+
154
163
  return displayVersion;
155
164
  },
156
165
 
@@ -167,32 +176,54 @@ export default {
167
176
  },
168
177
 
169
178
  supportLink() {
170
- const product = this.$store.getters['currentProduct'].name;
179
+ const product = this.$store.getters['currentProduct'];
171
180
 
172
- return { name: `c-cluster-${ product }-support` };
181
+ if (product?.supportRoute) {
182
+ return { ...product.supportRoute, params: { ...product.supportRoute.params, cluster: this.clusterId } };
183
+ }
184
+
185
+ return { name: `c-cluster-${ product?.name }-support` };
173
186
  },
174
187
 
175
188
  unmatchedRoute() {
176
189
  return !this.$route?.matched?.length;
177
- }
190
+ },
191
+
192
+ /**
193
+ * When navigation involves unloading one cluster and loading another, clusterReady toggles from true->false->true in middleware (before new route content renders)
194
+ * Prevent rendering "outlet" until the route changes to avoid re-rendering old route content after its cluster is unloaded
195
+ */
196
+ clusterAndRouteReady() {
197
+ return this.clusterReady &&
198
+ this.clusterId === this.$route?.params?.cluster &&
199
+ this.currentProduct?.name === getProductFromRoute(this.$route);
200
+ },
178
201
 
179
202
  },
180
203
 
181
204
  watch: {
182
- counts() {
183
- this.queueUpdate();
205
+ counts(a, b) {
206
+ if ( a !== b ) {
207
+ this.queueUpdate();
208
+ }
184
209
  },
185
210
 
186
- allSchemas() {
187
- this.queueUpdate();
211
+ allSchemas(a, b) {
212
+ if ( a !== b ) {
213
+ this.queueUpdate();
214
+ }
188
215
  },
189
216
 
190
- allNavLinks() {
191
- this.queueUpdate();
217
+ allNavLinks(a, b) {
218
+ if ( a !== b ) {
219
+ this.queueUpdate();
220
+ }
192
221
  },
193
222
 
194
- favoriteTypes() {
195
- this.queueUpdate();
223
+ favoriteTypes(a, b) {
224
+ if ( !isEqual(a, b) ) {
225
+ this.queueUpdate();
226
+ }
196
227
  },
197
228
 
198
229
  locale(a, b) {
@@ -315,7 +346,6 @@ export default {
315
346
  if ( this.gettingGroups ) {
316
347
  return;
317
348
  }
318
-
319
349
  this.gettingGroups = true;
320
350
 
321
351
  if ( !this.clusterReady ) {
@@ -370,6 +400,7 @@ export default {
370
400
 
371
401
  for ( const mode of modes ) {
372
402
  const types = this.$store.getters['type-map/allTypes'](productId, mode) || {};
403
+
373
404
  const more = this.$store.getters['type-map/getTree'](productId, mode, types, clusterId, namespaceMode, namespaces, currentType);
374
405
 
375
406
  if ( productId === EXPLORER || !this.isExplorer ) {
@@ -615,15 +646,15 @@ export default {
615
646
  {{ displayVersion }}
616
647
  </div>
617
648
  </nav>
618
- <main v-if="clusterReady">
649
+ <main v-if="clusterAndRouteReady">
619
650
  <nuxt class="outlet" />
620
651
  <ActionMenu />
621
652
  <PromptRemove />
622
653
  <PromptRestore />
623
654
  <AssignTo />
624
655
  <PromptModal />
625
- <button v-if="dev" v-shortkey.once="['shift','l']" class="hide" @shortkey="toggleNoneLocale()" />
626
- <button v-if="dev" v-shortkey.once="['shift','t']" class="hide" @shortkey="toggleTheme()" />
656
+ <button v-if="noLocaleShortcut" v-shortkey.once="['shift','l']" class="hide" @shortkey="toggleNoneLocale()" />
657
+ <button v-if="themeShortcut" v-shortkey.once="['shift','t']" class="hide" @shortkey="toggleTheme()" />
627
658
  <button v-shortkey.once="['f8']" class="hide" @shortkey="wheresMyDebugger()" />
628
659
  <button v-shortkey.once="['`']" class="hide" @shortkey="toggleShell" />
629
660
  </main>
package/layouts/error.vue CHANGED
@@ -35,7 +35,11 @@ export default {
35
35
  return;
36
36
  }
37
37
 
38
- this.ready = true;
38
+ // Avoid scenarios where the 404 error will blip up whilst the authenticated middleware is determining if there's an alternative valid
39
+ // route
40
+ setTimeout(() => {
41
+ this.ready = true;
42
+ }, 1000);
39
43
  },
40
44
 
41
45
  head() {
package/layouts/home.vue CHANGED
@@ -3,10 +3,11 @@ import Header from '@shell/components/nav/Header';
3
3
  import Brand from '@shell/mixins/brand';
4
4
  import FixedBanner from '@shell/components/FixedBanner';
5
5
  import GrowlManager from '@shell/components/GrowlManager';
6
- import { mapPref, DEV } from '@shell/store/prefs';
6
+ import { mapPref, THEME_SHORTCUT } from '@shell/store/prefs';
7
7
  import AwsComplianceBanner from '@shell/components/AwsComplianceBanner';
8
8
  import AzureWarning from '@shell/components/auth/AzureWarning';
9
9
  import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
10
+ import { mapState } from 'vuex';
10
11
 
11
12
  export default {
12
13
 
@@ -25,16 +26,23 @@ export default {
25
26
  data() {
26
27
  return {
27
28
  // Assume home pages have routes where the name is the key to use for string lookup
28
- name: this.$route.name
29
+ name: this.$route.name,
30
+ noLocaleShortcut: process.env.dev || false
29
31
  };
30
32
  },
31
33
 
32
- computed: { dev: mapPref(DEV) },
34
+ computed: {
35
+ themeShortcut: mapPref(THEME_SHORTCUT),
36
+ ...mapState(['managementReady']),
37
+ },
33
38
 
34
39
  methods: {
35
40
  toggleTheme() {
36
41
  this.$store.dispatch('prefs/toggleTheme');
37
42
  },
43
+ toggleNoneLocale() {
44
+ this.$store.dispatch('i18n/toggleNone');
45
+ },
38
46
  }
39
47
 
40
48
  };
@@ -47,7 +55,7 @@ export default {
47
55
  <AzureWarning />
48
56
 
49
57
  <div class="dashboard-content">
50
- <Header :simple="true" />
58
+ <Header v-if="managementReady" :simple="true" />
51
59
 
52
60
  <main>
53
61
  <nuxt class="outlet" />
@@ -55,7 +63,8 @@ export default {
55
63
  </div>
56
64
  <FixedBanner :footer="true" />
57
65
  <GrowlManager />
58
- <button v-if="dev" v-shortkey.once="['shift','t']" class="hide" @shortkey="toggleTheme()" />
66
+ <button v-if="themeShortcut" v-shortkey.once="['shift','t']" class="hide" @shortkey="toggleTheme()" />
67
+ <button v-if="noLocaleShortcut" v-shortkey.once="['shift','l']" class="hide" @shortkey="toggleNoneLocale()" />
59
68
  </div>
60
69
  </template>
61
70
 
package/layouts/plain.vue CHANGED
@@ -1,5 +1,5 @@
1
1
  <script>
2
- import { mapPref, DEV } from '@shell/store/prefs';
2
+ import { mapPref, THEME_SHORTCUT } from '@shell/store/prefs';
3
3
  import ActionMenu from '@shell/components/ActionMenu';
4
4
  import Header from '@shell/components/nav/Header';
5
5
  import PromptRemove from '@shell/components/PromptRemove';
@@ -33,16 +33,20 @@ export default {
33
33
  data() {
34
34
  return {
35
35
  // Assume home pages have routes where the name is the key to use for string lookup
36
- name: this.$route.name,
36
+ name: this.$route.name,
37
+ noLocaleShortcut: process.env.dev || false,
37
38
  };
38
39
  },
39
40
 
40
- computed: { dev: mapPref(DEV) },
41
+ computed: { themeShortcut: mapPref(THEME_SHORTCUT) },
41
42
 
42
43
  methods: {
43
44
  toggleTheme() {
44
45
  this.$store.dispatch('prefs/toggleTheme');
45
- }
46
+ },
47
+ toggleNoneLocale() {
48
+ this.$store.dispatch('i18n/toggleNone');
49
+ },
46
50
  }
47
51
  };
48
52
  </script>
@@ -62,7 +66,8 @@ export default {
62
66
  <ActionMenu />
63
67
  <PromptRemove />
64
68
  <AssignTo />
65
- <button v-if="dev" v-shortkey.once="['shift','t']" class="hide" @shortkey="toggleTheme()" />
69
+ <button v-if="themeShortcut" v-shortkey.once="['shift','t']" class="hide" @shortkey="toggleTheme()" />
70
+ <button v-if="noLocaleShortcut" v-shortkey.once="['shift','l']" class="hide" @shortkey="toggleNoneLocale()" />
66
71
  </main>
67
72
  </div>
68
73
 
@@ -3,16 +3,19 @@ import BrandImage from '@shell/components/BrandImage';
3
3
  import TypeDescription from '@shell/components/TypeDescription';
4
4
  import ResourceTable from '@shell/components/ResourceTable';
5
5
  import Masthead from '@shell/components/ResourceList/Masthead';
6
- import { NAME as VIRTUAL } from '@shell/config/product/harvester';
7
- import { CAPI, HCI, VIRTUAL_HARVESTER_PROVIDER, MANAGEMENT } from '@shell/config/types';
6
+ import Loading from '@shell/components/Loading';
7
+ import { HARVESTER_NAME as VIRTUAL } from '@shell/config/product/harvester-manager';
8
+ import { CAPI, HCI, MANAGEMENT } from '@shell/config/types';
8
9
  import { isHarvesterCluster } from '@shell/utils/cluster';
10
+ import { allHash } from '@shell/utils/promise';
9
11
 
10
12
  export default {
11
13
  components: {
12
14
  BrandImage,
13
15
  ResourceTable,
14
16
  Masthead,
15
- TypeDescription
17
+ TypeDescription,
18
+ Loading
16
19
  },
17
20
 
18
21
  props: {
@@ -22,14 +25,30 @@ export default {
22
25
  },
23
26
  },
24
27
 
28
+ async fetch() {
29
+ const inStore = this.$store.getters['currentProduct'].inStore;
30
+
31
+ const hash = await allHash({
32
+ hciClusters: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.CLUSTER }),
33
+ mgmtClusters: this.$store.dispatch(`${ inStore }/findAll`, { type: MANAGEMENT.CLUSTER })
34
+ });
35
+
36
+ this.hciClusters = hash.hciClusters;
37
+ this.mgmtClusters = hash.mgmtClusters;
38
+ },
39
+
25
40
  data() {
26
41
  const resource = CAPI.RANCHER_CLUSTER;
27
42
 
28
43
  return {
44
+ navigating: false,
29
45
  VIRTUAL,
46
+ hciDashboard: HCI.DASHBOARD,
30
47
  resource,
31
- hResource: HCI.CLUSTER,
32
- realSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
48
+ hResource: HCI.CLUSTER,
49
+ realSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
50
+ hciClusters: [],
51
+ mgmtClusters: []
33
52
  };
34
53
  },
35
54
 
@@ -51,16 +70,8 @@ export default {
51
70
  },
52
71
 
53
72
  rows() {
54
- const inStore = this.$store.getters['currentProduct'].inStore;
55
- const clusters = this.$store.getters[`${ inStore }/all`](HCI.CLUSTER);
56
- const manageClusters = this.$store.getters[`${ inStore }/all`](MANAGEMENT.CLUSTER);
57
-
58
- return clusters.filter((c) => {
59
- const cluster = manageClusters.find(cluster => cluster?.metadata?.name === c?.status?.clusterName);
60
-
61
- if (cluster?.status?.provider && cluster?.status?.provider !== VIRTUAL_HARVESTER_PROVIDER) {
62
- return false;
63
- }
73
+ return this.hciClusters.filter((c) => {
74
+ const cluster = this.mgmtClusters.find(cluster => cluster?.metadata?.name === c?.status?.clusterName);
64
75
 
65
76
  return isHarvesterCluster(cluster);
66
77
  });
@@ -69,12 +80,33 @@ export default {
69
80
  typeDisplay() {
70
81
  return this.t(`typeLabel."${ HCI.CLUSTER }"`, { count: this.row?.length || 0 });
71
82
  },
83
+ },
84
+
85
+ methods: {
86
+ async goToCluster(row) {
87
+ const timeout = setTimeout(() => {
88
+ // Don't show loading indicator for quickly fetched plugins
89
+ this.navigating = row.id;
90
+ }, 1000);
91
+
92
+ try {
93
+ await row.goToCluster();
94
+
95
+ clearTimeout(timeout);
96
+ this.navigating = false;
97
+ } catch {
98
+ // The error handling is carried out within goToCluster, but just in case something happens before the promise chain can catch it...
99
+ clearTimeout(timeout);
100
+ this.navigating = false;
101
+ }
102
+ }
72
103
  }
73
104
  };
74
105
  </script>
75
106
 
76
107
  <template>
77
- <div>
108
+ <Loading v-if="$fetchState.pending" />
109
+ <div v-else>
78
110
  <Masthead
79
111
  :schema="realSchema"
80
112
  :resource="resource"
@@ -99,27 +131,17 @@ export default {
99
131
  v-if="rows && rows.length"
100
132
  :schema="schema"
101
133
  :rows="rows"
102
- :sub-rows="true"
103
134
  :is-creatable="true"
104
135
  :namespaced="false"
105
136
  >
106
137
  <template #col:name="{row}">
107
138
  <td>
108
- <span>
109
- <n-link
110
- v-if="row.isReady"
111
- :to="{
112
- name: `c-cluster-${VIRTUAL}`,
113
- params: {
114
- cluster: row.status.clusterName,
115
- }
116
- }"
117
- >
118
- {{ row.nameDisplay }}
119
- </n-link>
139
+ <span class="cluster-link">
140
+ <a v-if="row.isReady" class="link" :disabled="navigating" @click="goToCluster(row)">{{ row.nameDisplay }}</a>
120
141
  <span v-else>
121
142
  {{ row.nameDisplay }}
122
143
  </span>
144
+ <i class="icon icon-spinner icon-spin ml-5" :class="{'navigating': navigating === row.id}" />
123
145
  </span>
124
146
  </td>
125
147
  </template>
@@ -129,29 +151,43 @@ export default {
129
151
  class="btn btn-sm role-primary"
130
152
  :to="row.detailLocation"
131
153
  >
132
- {{ t('harvester.virtualizationManagement.manage') }}
154
+ {{ t('harvesterManager.manage') }}
133
155
  </n-link>
134
156
  </template>
135
157
  </ResourceTable>
136
158
  <div v-else>
137
159
  <div class="no-clusters">
138
- {{ t('harvester.manager.cluster.none') }}
160
+ {{ t('harvesterManager.cluster.none') }}
139
161
  </div>
140
162
  <hr class="info-section" />
141
163
  <div class="logo">
142
164
  <BrandImage file-name="harvester.png" height="64" />
143
165
  </div>
144
166
  <div class="tagline">
145
- <div>{{ t('harvester.manager.cluster.description') }}</div>
167
+ <div>{{ t('harvesterManager.cluster.description') }}</div>
146
168
  </div>
147
169
  <div class="tagline sub-tagline">
148
- <div v-html="t('harvester.manager.cluster.learnMore', {}, true)"></div>
170
+ <div v-html="t('harvesterManager.cluster.learnMore', {}, true)"></div>
149
171
  </div>
150
172
  </div>
151
173
  </div>
152
174
  </template>
153
175
 
154
176
  <style lang="scss" scoped>
177
+ .cluster-link {
178
+ display: flex;
179
+ align-items: center;
180
+
181
+ .icon {
182
+ // Use visibility to avoid the columns re-adjusting when the icon is shown
183
+ visibility: hidden;
184
+
185
+ &.navigating {
186
+ visibility: visible;
187
+ }
188
+ }
189
+
190
+ }
155
191
  .no-clusters {
156
192
  text-align: center;
157
193
  }
@@ -178,4 +214,9 @@ export default {
178
214
  text-align: center;
179
215
  }
180
216
  }
217
+
218
+ .link {
219
+ cursor: pointer;
220
+ }
221
+
181
222
  </style>
@@ -4,13 +4,13 @@ import { MANAGEMENT } from '@shell/config/types';
4
4
  import { ALLOWED_SETTINGS } from '@shell/config/settings';
5
5
  import { Banner } from '@components/Banner';
6
6
  import Loading from '@shell/components/Loading';
7
- import { DEV } from '@shell/store/prefs';
7
+ import { VIEW_IN_API } from '@shell/store/prefs';
8
8
 
9
9
  export default {
10
10
  components: { Banner, Loading },
11
11
 
12
12
  async fetch() {
13
- const isDev = this.$store.getters['prefs/get'](DEV);
13
+ const viewInApi = this.$store.getters['prefs/get'](VIEW_IN_API);
14
14
  const rows = await this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.SETTING });
15
15
  const t = this.$store.getters['i18n/t'];
16
16
  // Map settings from array to object keyed by id
@@ -51,7 +51,7 @@ export default {
51
51
  }
52
52
  // There are only 2 actions that can be enabled - Edit Setting or View in API
53
53
  // If neither is available for this setting then we hide the action menu button
54
- s.hasActions = (!s.readOnly || isDev) && setting.availableActions?.length;
54
+ s.hasActions = (!s.readOnly || viewInApi) && setting.availableActions?.length;
55
55
  settings.push(s);
56
56
  }
57
57
 
@@ -17,14 +17,12 @@ export default {
17
17
  },
18
18
 
19
19
  computed: {
20
- ...mapGetters(['isVirtualCluster']),
20
+ ...mapGetters(['currentProduct']),
21
21
 
22
22
  filterRow() {
23
- if (this.isVirtualCluster) {
23
+ if (this.currentProduct.hideSystemResources) {
24
24
  return this.rows.filter( (N) => {
25
- const isSettingSystemNamespace = this.$store.getters['systemNamespaces'].includes(N.metadata.name);
26
-
27
- return !N.isSystem && !N.isFleetManaged && !isSettingSystemNamespace;
25
+ return !N.isSystem && !N.isFleetManaged;
28
26
  });
29
27
  } else {
30
28
  return this.rows;
@@ -149,7 +149,7 @@ export default {
149
149
  <template #cell:explorer="{row}">
150
150
  <span v-if="row.mgmt && row.mgmt.isHarvester"></span>
151
151
  <n-link
152
- v-else-if="row.mgmt && row.mgmt.isReady"
152
+ v-else-if="row.mgmt && row.mgmt.isReady && !row.hasError"
153
153
  data-testid="cluster-manager-list-explore-management"
154
154
  class="btn btn-sm role-secondary"
155
155
  :to="{name: 'c-cluster', params: {cluster: row.mgmt.id}}"
@@ -632,6 +632,7 @@ export default {
632
632
  <div>
633
633
  <Checkbox
634
634
  v-model="value.httpEndpoint"
635
+ value-when-true="enabled"
635
636
  :mode="mode"
636
637
  :disabled="disabled"
637
638
  :label="t('cluster.machineConfig.amazonEc2.httpEndpoint')"
@@ -640,6 +641,7 @@ export default {
640
641
  <div>
641
642
  <Checkbox
642
643
  v-model="value.httpTokens"
644
+ value-when-true="required"
643
645
  :mode="mode"
644
646
  :disabled="!value.httpEndpoint || disabled"
645
647
  :label="t('cluster.machineConfig.amazonEc2.httpTokens')"