@rancher/shell 0.1.1 → 0.1.3

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 (294) hide show
  1. package/assets/translations/en-us.yaml +33 -769
  2. package/assets/translations/zh-hans.yaml +153 -781
  3. package/components/ActionMenu.vue +3 -3
  4. package/components/CodeMirror.vue +6 -8
  5. package/components/CommunityLinks.vue +1 -1
  6. package/components/ContainerResourceLimit.vue +14 -0
  7. package/components/ExplorerMembers.vue +123 -0
  8. package/components/ExplorerProjectsNamespaces.vue +405 -0
  9. package/components/GrafanaDashboard.vue +17 -2
  10. package/components/LocaleSelector.vue +81 -0
  11. package/components/PromptModal.vue +2 -3
  12. package/components/ResourceList/index.vue +1 -1
  13. package/components/ResourceTable.vue +3 -6
  14. package/components/SingleClusterInfo.vue +1 -1
  15. package/components/SortableTable/index.vue +23 -20
  16. package/components/SortableTable/selection.js +1 -0
  17. package/components/auth/AzureWarning.vue +5 -1
  18. package/components/auth/Principal.vue +1 -1
  19. package/components/auth/RoleDetailEdit.vue +32 -12
  20. package/components/fleet/FleetRepos.vue +0 -2
  21. package/components/form/NameNsDescription.vue +4 -6
  22. package/components/form/NodeScheduling.vue +1 -1
  23. package/components/form/ResourceTabs/index.vue +27 -18
  24. package/components/form/WorkloadPorts.vue +1 -1
  25. package/components/formatter/ClusterLink.vue +13 -0
  26. package/components/formatter/PodImages.vue +11 -1
  27. package/components/formatter/RKETemplateName.vue +37 -0
  28. package/components/formatter/WorkloadHealthScale.vue +1 -1
  29. package/components/nav/Header.vue +9 -9
  30. package/components/nav/NamespaceFilter.vue +7 -4
  31. package/components/nav/TopLevelMenu.vue +6 -43
  32. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  33. package/config/product/harvester-manager.js +64 -2
  34. package/config/product/manager.js +9 -0
  35. package/config/settings.js +17 -71
  36. package/config/table-headers.js +0 -1
  37. package/config/types.js +8 -26
  38. package/core/plugin-routes.ts +34 -22
  39. package/core/plugin.ts +15 -3
  40. package/core/plugins-loader.js +2 -0
  41. package/core/plugins.js +79 -36
  42. package/core/types.ts +7 -1
  43. package/creators/app/tsconfig.json +6 -1
  44. package/creators/pkg/init +3 -0
  45. package/creators/pkg/tsconfig.json +7 -2
  46. package/detail/provisioning.cattle.io.cluster.vue +23 -0
  47. package/detail/workload/index.vue +11 -5
  48. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  49. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  50. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  51. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  52. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  53. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  54. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  55. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  56. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
  57. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  58. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  59. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  60. package/edit/auth/azuread.vue +20 -1
  61. package/edit/cloudcredential.vue +7 -1
  62. package/edit/management.cattle.io.project.vue +2 -2
  63. package/edit/namespace.vue +17 -10
  64. package/edit/networking.k8s.io.ingress/index.vue +2 -1
  65. package/edit/persistentvolumeclaim.vue +33 -2
  66. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  67. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +34 -6
  68. package/edit/provisioning.cattle.io.cluster/index.vue +1 -1
  69. package/edit/provisioning.cattle.io.cluster/rke2.vue +21 -6
  70. package/edit/service.vue +1 -1
  71. package/edit/workload/index.vue +363 -15
  72. package/edit/workload/mixins/workload.js +62 -7
  73. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  74. package/layouts/default.vue +52 -27
  75. package/layouts/error.vue +5 -1
  76. package/layouts/home.vue +6 -2
  77. package/list/harvesterhci.io.management.cluster.vue +74 -33
  78. package/list/namespace.vue +3 -5
  79. package/list/provisioning.cattle.io.cluster.vue +6 -0
  80. package/machine-config/amazonec2.vue +2 -0
  81. package/machine-config/harvester.vue +96 -49
  82. package/middleware/authenticated.js +56 -52
  83. package/mixins/brand.js +3 -4
  84. package/mixins/create-edit-view/impl.js +0 -8
  85. package/mixins/form-validation.js +1 -1
  86. package/mixins/resource-fetch.js +3 -1
  87. package/models/chart.js +1 -1
  88. package/models/cluster/node.js +12 -1
  89. package/models/fleet.cattle.io.bundle.js +26 -19
  90. package/models/harvesterhci.io.management.cluster.js +194 -5
  91. package/models/management.cattle.io.cluster.js +1 -1
  92. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  93. package/models/management.cattle.io.globalrole.js +0 -19
  94. package/models/management.cattle.io.project.js +23 -2
  95. package/models/management.cattle.io.roletemplate.js +2 -21
  96. package/models/namespace.js +19 -3
  97. package/models/pod.js +19 -2
  98. package/models/provisioning.cattle.io.cluster.js +71 -0
  99. package/models/service.js +5 -1
  100. package/models/workload.js +4 -243
  101. package/models/workload.service.js +314 -0
  102. package/nuxt.config.js +14 -12
  103. package/package.json +3 -3
  104. package/pages/auth/login.vue +11 -2
  105. package/pages/auth/setup.vue +1 -1
  106. package/pages/c/_cluster/_product/members/index.vue +3 -93
  107. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  108. package/pages/c/_cluster/apps/charts/install.vue +0 -6
  109. package/pages/c/_cluster/settings/performance.vue +19 -16
  110. package/pages/fail-whale.vue +1 -10
  111. package/pages/index.vue +18 -4
  112. package/pages/plugins.vue +2 -2
  113. package/pages/prefs.vue +8 -6
  114. package/pkg/auto-import.js +44 -7
  115. package/pkg/dynamic-plugin-loader.js +28 -0
  116. package/pkg/import.js +2 -2
  117. package/pkg/model-loader-require.lib.js +3 -0
  118. package/pkg/vue.config.js +9 -6
  119. package/plugins/console.js +10 -5
  120. package/plugins/dashboard-store/actions.js +8 -3
  121. package/plugins/dashboard-store/getters.js +7 -2
  122. package/plugins/dashboard-store/model-loader-require.js +12 -0
  123. package/plugins/dashboard-store/model-loader.js +4 -1
  124. package/plugins/dashboard-store/resource-class.js +10 -3
  125. package/plugins/steve/actions.js +1 -1
  126. package/plugins/steve/index.js +6 -4
  127. package/plugins/steve/steve-description-class.js +32 -0
  128. package/plugins/steve/subscribe.js +34 -23
  129. package/rancher-components/Banner/Banner.vue +2 -2
  130. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  131. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  132. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +0 -2
  133. package/rancher-components/Form/LabeledInput/LabeledInput.vue +2 -0
  134. package/rancher-components/Form/Radio/RadioButton.vue +14 -1
  135. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +107 -0
  136. package/{components/form → rancher-components/Form/ToggleSwitch}/ToggleSwitch.vue +18 -8
  137. package/rancher-components/Form/ToggleSwitch/index.ts +1 -0
  138. package/rancher-components/Form/index.ts +1 -0
  139. package/scripts/build-pkg.sh +48 -2
  140. package/scripts/drone-build-pkg.sh +31 -0
  141. package/scripts/publish-shell.sh +10 -11
  142. package/scripts/serve-pkgs +17 -10
  143. package/scripts/test-plugins-build.sh +18 -1
  144. package/store/catalog.js +3 -1
  145. package/store/i18n.js +16 -11
  146. package/store/index.js +4 -181
  147. package/store/prefs.js +30 -2
  148. package/store/type-map.js +16 -29
  149. package/types/{index.d.ts → rancher/index.d.ts} +0 -0
  150. package/utils/cluster.js +1 -1
  151. package/utils/custom-validators.js +1 -12
  152. package/utils/dynamic-importer.js +1 -1
  153. package/utils/validators/setting.js +0 -35
  154. package/components/FilterLabel.vue +0 -254
  155. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  156. package/components/VMConsoleBar.vue +0 -87
  157. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  158. package/components/dialog/harvester/BackupModal.vue +0 -117
  159. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  160. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  161. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  162. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  163. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  164. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  165. package/components/dialog/harvester/SupportBundle.vue +0 -217
  166. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  167. package/components/form/SerialConsole/index.vue +0 -267
  168. package/components/formatter/AttachVMWithName.vue +0 -46
  169. package/components/formatter/CloudInitType.vue +0 -27
  170. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  171. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  172. package/components/formatter/HarvesterDiskState.vue +0 -66
  173. package/components/formatter/HarvesterHostName.vue +0 -66
  174. package/components/formatter/HarvesterIpAddress.vue +0 -90
  175. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  176. package/components/formatter/HarvesterMigrationState.vue +0 -85
  177. package/components/formatter/HarvesterNodeName.vue +0 -49
  178. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  179. package/components/formatter/HarvesterVmState.vue +0 -123
  180. package/components/nav/HarvesterUpgrade.vue +0 -232
  181. package/components/novnc/NovncConsole.vue +0 -93
  182. package/components/novnc/NovncConsoleItem.vue +0 -89
  183. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  184. package/config/harvester-map.js +0 -44
  185. package/config/harvester-table-headers.js +0 -27
  186. package/config/product/harvester.js +0 -305
  187. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  188. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  189. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  190. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  191. package/detail/harvesterhci.io.host/index.vue +0 -243
  192. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  193. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  194. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  195. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  196. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  197. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  198. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  199. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  200. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  201. package/edit/harvesterhci.io.host/index.vue +0 -533
  202. package/edit/harvesterhci.io.keypair.vue +0 -112
  203. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  204. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  205. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  206. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  207. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  208. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  209. package/edit/harvesterhci.io.setting/index.vue +0 -201
  210. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  211. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  212. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  213. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  214. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  215. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  216. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  217. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  218. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  219. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  220. package/edit/harvesterhci.io.volume.vue +0 -195
  221. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  222. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  223. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  224. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  225. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  226. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  227. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  228. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  229. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  230. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  231. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  232. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  233. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  234. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  235. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  236. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  237. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  238. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  239. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  240. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  241. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  242. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  243. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  244. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  245. package/edit/workload/types/Deployment.vue +0 -377
  246. package/edit/workload/types/Generic.vue +0 -295
  247. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  248. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  249. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  250. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  251. package/list/harvesterhci.io.host/index.vue +0 -186
  252. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  253. package/list/harvesterhci.io.setting.vue +0 -241
  254. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  255. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  256. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  257. package/list/harvesterhci.io.volume.vue +0 -122
  258. package/list/kubevirt.io.virtualmachine.vue +0 -193
  259. package/mixins/harvester-vm/impl.js +0 -267
  260. package/mixins/harvester-vm/index.js +0 -1357
  261. package/models/harvester/configmap.js +0 -32
  262. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  263. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  264. package/models/harvester/harvesterhci.io.setting.js +0 -127
  265. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  266. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  267. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  268. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  269. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  270. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  271. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  272. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  273. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  274. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  275. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  276. package/models/harvester/management.cattle.io.setting.js +0 -40
  277. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  278. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  279. package/models/harvester/node.js +0 -255
  280. package/models/harvester/persistentvolumeclaim.js +0 -166
  281. package/models/harvester/pod.js +0 -185
  282. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  283. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  284. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  285. package/pages/c/_cluster/harvester/index.vue +0 -24
  286. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  287. package/pkg/model-loader.lib.js +0 -3
  288. package/plugins/lookup.js +0 -50
  289. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  290. package/store/harvester-common.js +0 -126
  291. package/utils/validators/vm-datavolumes.js +0 -38
  292. package/utils/validators/vm-image.js +0 -32
  293. package/utils/validators/vm.js +0 -221
  294. package/yarn-error.log +0 -196
@@ -16,19 +16,20 @@ import FixedBanner from '@shell/components/FixedBanner';
16
16
  import AwsComplianceBanner from '@shell/components/AwsComplianceBanner';
17
17
  import AzureWarning from '@shell/components/auth/AzureWarning';
18
18
  import {
19
- COUNT, SCHEMA, MANAGEMENT, UI, CATALOG, HCI
19
+ COUNT, SCHEMA, MANAGEMENT, UI, CATALOG
20
20
  } from '@shell/config/types';
21
21
  import { BASIC, FAVORITE, USED } from '@shell/store/type-map';
22
22
  import { addObjects, replaceWith, clear, addObject } from '@shell/utils/array';
23
23
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
24
24
  import { NAME as NAVLINKS } from '@shell/config/product/navlinks';
25
- import { NAME as HARVESTER } from '@shell/config/product/harvester';
25
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
26
26
  import isEqual from 'lodash/isEqual';
27
27
  import { ucFirst } from '@shell/utils/string';
28
28
  import { getVersionInfo, markSeenReleaseNotes } from '@shell/utils/version';
29
29
  import { sortBy } from '@shell/utils/sort';
30
30
  import PageHeaderActions from '@shell/mixins/page-actions';
31
31
  import BrowserTabVisibility from '@shell/mixins/browser-tab-visibility';
32
+ import { getProductFromRoute } from '@shell/middleware/authenticated';
32
33
 
33
34
  const SET_LOGIN_ACTION = 'set-as-login';
34
35
 
@@ -51,15 +52,19 @@ export default {
51
52
 
52
53
  mixins: [PageHeaderActions, Brand, BrowserTabVisibility],
53
54
 
55
+ // Note - This will not run on route change
54
56
  data() {
55
57
  return {
56
- groups: [],
57
- gettingGroups: false,
58
- wantNavSync: false,
58
+ groups: [],
59
+ gettingGroups: false,
60
+ wantNavSync: false,
59
61
  };
60
62
  },
61
63
 
62
- middleware: ['authenticated'],
64
+ // Note - These will run on route change
65
+ middleware: [
66
+ 'authenticated'
67
+ ],
63
68
 
64
69
  computed: {
65
70
  ...mapState(['managementReady', 'clusterReady']),
@@ -98,7 +103,7 @@ export default {
98
103
  },
99
104
 
100
105
  allSchemas() {
101
- const managementReady = this.$store.getters['managementReady'];
106
+ const managementReady = this.managementReady;
102
107
  const product = this.$store.getters['currentProduct'];
103
108
 
104
109
  if ( !managementReady || !product ) {
@@ -117,7 +122,7 @@ export default {
117
122
  },
118
123
 
119
124
  counts() {
120
- const managementReady = this.$store.getters['managementReady'];
125
+ const managementReady = this.managementReady;
121
126
  const product = this.$store.getters['currentProduct'];
122
127
 
123
128
  if ( !managementReady || !product ) {
@@ -143,14 +148,12 @@ export default {
143
148
  },
144
149
 
145
150
  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';
151
+ if (this.isSingleProduct?.getVersionInfo) {
152
+ return this.isSingleProduct?.getVersionInfo(this.$store);
152
153
  }
153
154
 
155
+ const { displayVersion } = getVersionInfo(this.$store);
156
+
154
157
  return displayVersion;
155
158
  },
156
159
 
@@ -167,32 +170,54 @@ export default {
167
170
  },
168
171
 
169
172
  supportLink() {
170
- const product = this.$store.getters['currentProduct'].name;
173
+ const product = this.$store.getters['currentProduct'];
174
+
175
+ if (product?.supportRoute) {
176
+ return { ...product.supportRoute, params: { ...product.supportRoute.params, cluster: this.clusterId } };
177
+ }
171
178
 
172
- return { name: `c-cluster-${ product }-support` };
179
+ return { name: `c-cluster-${ product?.name }-support` };
173
180
  },
174
181
 
175
182
  unmatchedRoute() {
176
183
  return !this.$route?.matched?.length;
177
- }
184
+ },
185
+
186
+ /**
187
+ * When navigation involves unloading one cluster and loading another, clusterReady toggles from true->false->true in middleware (before new route content renders)
188
+ * Prevent rendering "outlet" until the route changes to avoid re-rendering old route content after its cluster is unloaded
189
+ */
190
+ clusterAndRouteReady() {
191
+ return this.clusterReady &&
192
+ this.clusterId === this.$route?.params?.cluster &&
193
+ this.currentProduct?.name === getProductFromRoute(this.$route);
194
+ },
178
195
 
179
196
  },
180
197
 
181
198
  watch: {
182
- counts() {
183
- this.queueUpdate();
199
+ counts(a, b) {
200
+ if ( a !== b ) {
201
+ this.queueUpdate();
202
+ }
184
203
  },
185
204
 
186
- allSchemas() {
187
- this.queueUpdate();
205
+ allSchemas(a, b) {
206
+ if ( a !== b ) {
207
+ this.queueUpdate();
208
+ }
188
209
  },
189
210
 
190
- allNavLinks() {
191
- this.queueUpdate();
211
+ allNavLinks(a, b) {
212
+ if ( a !== b ) {
213
+ this.queueUpdate();
214
+ }
192
215
  },
193
216
 
194
- favoriteTypes() {
195
- this.queueUpdate();
217
+ favoriteTypes(a, b) {
218
+ if ( !isEqual(a, b) ) {
219
+ this.queueUpdate();
220
+ }
196
221
  },
197
222
 
198
223
  locale(a, b) {
@@ -315,7 +340,6 @@ export default {
315
340
  if ( this.gettingGroups ) {
316
341
  return;
317
342
  }
318
-
319
343
  this.gettingGroups = true;
320
344
 
321
345
  if ( !this.clusterReady ) {
@@ -370,6 +394,7 @@ export default {
370
394
 
371
395
  for ( const mode of modes ) {
372
396
  const types = this.$store.getters['type-map/allTypes'](productId, mode) || {};
397
+
373
398
  const more = this.$store.getters['type-map/getTree'](productId, mode, types, clusterId, namespaceMode, namespaces, currentType);
374
399
 
375
400
  if ( productId === EXPLORER || !this.isExplorer ) {
@@ -615,7 +640,7 @@ export default {
615
640
  {{ displayVersion }}
616
641
  </div>
617
642
  </nav>
618
- <main v-if="clusterReady">
643
+ <main v-if="clusterAndRouteReady">
619
644
  <nuxt class="outlet" />
620
645
  <ActionMenu />
621
646
  <PromptRemove />
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
@@ -7,6 +7,7 @@ import { mapPref, DEV } 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
 
@@ -29,7 +30,10 @@ export default {
29
30
  };
30
31
  },
31
32
 
32
- computed: { dev: mapPref(DEV) },
33
+ computed: {
34
+ dev: mapPref(DEV),
35
+ ...mapState(['managementReady']),
36
+ },
33
37
 
34
38
  methods: {
35
39
  toggleTheme() {
@@ -47,7 +51,7 @@ export default {
47
51
  <AzureWarning />
48
52
 
49
53
  <div class="dashboard-content">
50
- <Header :simple="true" />
54
+ <Header v-if="managementReady" :simple="true" />
51
55
 
52
56
  <main>
53
57
  <nuxt class="outlet" />
@@ -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>
@@ -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;
@@ -41,6 +41,12 @@ export default {
41
41
  hash.machineDeployments = this.$store.dispatch('management/findAll', { type: CAPI.MACHINE_DEPLOYMENT });
42
42
  }
43
43
 
44
+ // Fetch RKE template revisions so we can show when an updated template is available
45
+ // This request does not need to be blocking
46
+ if ( this.$store.getters['management/canList'](MANAGEMENT.RKE_TEMPLATE_REVISION) ) {
47
+ this.$store.dispatch('management/findAll', { type: MANAGEMENT.RKE_TEMPLATE_REVISION });
48
+ }
49
+
44
50
  const res = await allHash(hash);
45
51
 
46
52
  this.mgmtClusters = res.mgmtClusters;
@@ -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')"