@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
@@ -13,14 +13,36 @@ import { Banner } from '@components/Banner';
13
13
  import { get } from '@shell/utils/object';
14
14
  import { mapGetters } from 'vuex';
15
15
  import {
16
- HCI, NAMESPACE, MANAGEMENT, CONFIG_MAP, NORMAN, NODE
16
+ HCI,
17
+ NAMESPACE,
18
+ MANAGEMENT,
19
+ CONFIG_MAP,
20
+ NORMAN,
21
+ NODE
17
22
  } from '@shell/config/types';
18
23
  import { base64Decode, base64Encode } from '@shell/utils/crypto';
19
24
  import { allHashSettled } from '@shell/utils/promise';
20
25
  import { podAffinity as podAffinityValidator } from '@shell/utils/validators/pod-affinity';
21
26
  import { stringify, exceptionToErrorsArray } from '@shell/utils/error';
22
27
  import { HCI as HCI_ANNOTATIONS } from '@shell/config/labels-annotations';
23
- import { isReady } from '@shell/models/harvester/harvesterhci.io.virtualmachineimage';
28
+
29
+ export function isReady() {
30
+ function getStatusConditionOfType(type, defaultValue = []) {
31
+ const conditions = Array.isArray(get(this, 'status.conditions')) ? this.status.conditions : defaultValue;
32
+
33
+ return conditions.find( cond => cond.type === type);
34
+ }
35
+
36
+ const initialized = getStatusConditionOfType.call(this, 'Initialized');
37
+ const imported = getStatusConditionOfType.call(this, 'Imported');
38
+ const isCompleted = this.status?.progress === 100;
39
+
40
+ if ([initialized?.status, imported?.status].includes('False')) {
41
+ return false;
42
+ } else {
43
+ return isCompleted && true;
44
+ }
45
+ }
24
46
 
25
47
  export default {
26
48
  name: 'ConfigComponentHarvester',
@@ -34,12 +56,12 @@ export default {
34
56
  props: {
35
57
  credentialId: {
36
58
  type: String,
37
- required: true,
59
+ required: true
38
60
  },
39
61
 
40
62
  uuid: {
41
63
  type: String,
42
- required: true,
64
+ required: true
43
65
  },
44
66
 
45
67
  disabled: {
@@ -49,47 +71,55 @@ export default {
49
71
 
50
72
  poolIndex: {
51
73
  type: Number,
52
- required: true,
74
+ required: true
53
75
  },
54
76
 
55
77
  machinePools: {
56
78
  type: Array,
57
79
  default: () => []
58
- },
80
+ }
59
81
  },
60
82
 
61
83
  async fetch() {
62
84
  this.errors = [];
63
85
 
64
86
  try {
65
- this.credential = await this.$store.dispatch('rancher/find', { type: NORMAN.CLOUD_CREDENTIAL, id: this.credentialId });
87
+ this.credential = await this.$store.dispatch('rancher/find', {
88
+ type: NORMAN.CLOUD_CREDENTIAL,
89
+ id: this.credentialId
90
+ });
66
91
  const clusterId = get(this.credential, 'decodedData.clusterId');
67
92
 
68
93
  const url = `/k8s/clusters/${ clusterId }/v1`;
69
94
 
70
- const isImportCluster = this.credential.decodedData.clusterType === 'imported';
95
+ const isImportCluster =
96
+ this.credential.decodedData.clusterType === 'imported';
71
97
 
72
98
  this.isImportCluster = isImportCluster;
73
99
 
74
100
  if (clusterId && isImportCluster) {
75
101
  const res = await allHashSettled({
76
- namespaces: this.$store.dispatch('harvester/findAll', { type: NAMESPACE, opt: { url: `${ url }/${ NAMESPACE }s` } }),
102
+ namespaces: this.$store.dispatch('cluster/request', { url: `${ url }/${ NAMESPACE }s` }),
77
103
  images: this.$store.dispatch('cluster/request', { url: `${ url }/${ HCI.IMAGE }s` }),
78
104
  configMaps: this.$store.dispatch('cluster/request', { url: `${ url }/${ CONFIG_MAP }s` }),
79
105
  networks: this.$store.dispatch('cluster/request', { url: `${ url }/k8s.cni.cncf.io.network-attachment-definitions` }),
80
106
  });
81
107
 
82
- for ( const key of Object.keys(res) ) {
108
+ for (const key of Object.keys(res)) {
83
109
  const obj = res[key];
84
110
 
85
- if ( obj.status === 'rejected' ) {
111
+ if (obj.status === 'rejected') {
86
112
  this.errors.push(stringify(obj.reason));
87
113
  continue;
88
114
  }
89
115
  }
90
116
 
91
- if (this.errors.length > 0) { // If an error is reported in the request data, see if it is due to a cluster error
92
- const cluster = await this.$store.dispatch('management/find', { type: MANAGEMENT.CLUSTER, id: clusterId });
117
+ if (this.errors.length > 0) {
118
+ // If an error is reported in the request data, see if it is due to a cluster error
119
+ const cluster = await this.$store.dispatch('management/find', {
120
+ type: MANAGEMENT.CLUSTER,
121
+ id: clusterId
122
+ });
93
123
 
94
124
  if (cluster.stateDescription && !cluster.isReady) {
95
125
  this.errors = [cluster.stateDescription];
@@ -100,7 +130,8 @@ export default {
100
130
  const networkDataOptions = [];
101
131
 
102
132
  (res.configMaps.value?.data || []).map((O) => {
103
- const cloudTemplate = O.metadata?.labels?.[HCI_ANNOTATIONS.CLOUD_INIT];
133
+ const cloudTemplate =
134
+ O.metadata?.labels?.[HCI_ANNOTATIONS.CLOUD_INIT];
104
135
 
105
136
  if (cloudTemplate === 'user') {
106
137
  userDataOptions.push({
@@ -120,7 +151,7 @@ export default {
120
151
  this.userDataOptions = userDataOptions;
121
152
  this.networkDataOptions = networkDataOptions;
122
153
  this.images = res.images.value?.data;
123
- this.networkOptions = (res.networks.value?.data || []).map( (O) => {
154
+ this.networkOptions = (res.networks.value?.data || []).map((O) => {
124
155
  let value;
125
156
  let label;
126
157
 
@@ -139,7 +170,7 @@ export default {
139
170
  };
140
171
  });
141
172
 
142
- (res.namespaces.value || []).forEach((namespace) => {
173
+ (res.namespaces.value.data || []).forEach((namespace) => {
143
174
  if (!namespace.isSystem) {
144
175
  const value = namespace.metadata.name;
145
176
  const label = namespace.metadata.name;
@@ -239,11 +270,11 @@ export default {
239
270
 
240
271
  namespaceDisabled() {
241
272
  return this.disabledEdit || this.poolIndex > 0;
242
- },
273
+ }
243
274
  },
244
275
 
245
276
  watch: {
246
- 'credentialId'() {
277
+ credentialId() {
247
278
  if (!this.isEdit) {
248
279
  this.imageOptions = [];
249
280
  this.networkOptions = [];
@@ -277,7 +308,7 @@ export default {
277
308
  this.value.vmNamespace = vmNamespace;
278
309
  }
279
310
  },
280
- deep: true,
311
+ deep: true
281
312
  }
282
313
  },
283
314
 
@@ -288,43 +319,57 @@ export default {
288
319
  const errors = [];
289
320
 
290
321
  if (!this.value.cpuCount) {
291
- const message = this.validatorRequiredField(this.t('cluster.credential.harvester.cpu'));
322
+ const message = this.validatorRequiredField(
323
+ this.t('cluster.credential.harvester.cpu')
324
+ );
292
325
 
293
326
  errors.push(message);
294
327
  }
295
328
 
296
329
  if (!this.value.vmNamespace) {
297
- const message = this.validatorRequiredField(this.t('cluster.credential.harvester.namespace'));
330
+ const message = this.validatorRequiredField(
331
+ this.t('cluster.credential.harvester.namespace')
332
+ );
298
333
 
299
334
  errors.push(message);
300
335
  }
301
336
 
302
337
  if (!this.value.memorySize) {
303
- const message = this.validatorRequiredField(this.t('cluster.credential.harvester.memory'));
338
+ const message = this.validatorRequiredField(
339
+ this.t('cluster.credential.harvester.memory')
340
+ );
304
341
 
305
342
  errors.push(message);
306
343
  }
307
344
 
308
345
  if (!this.value.diskSize) {
309
- const message = this.validatorRequiredField(this.t('cluster.credential.harvester.disk'));
346
+ const message = this.validatorRequiredField(
347
+ this.t('cluster.credential.harvester.disk')
348
+ );
310
349
 
311
350
  errors.push(message);
312
351
  }
313
352
 
314
353
  if (!this.value.imageName) {
315
- const message = this.validatorRequiredField(this.t('cluster.credential.harvester.image'));
354
+ const message = this.validatorRequiredField(
355
+ this.t('cluster.credential.harvester.image')
356
+ );
316
357
 
317
358
  errors.push(message);
318
359
  }
319
360
 
320
361
  if (!this.value.sshUser) {
321
- const message = this.validatorRequiredField(this.t('cluster.credential.harvester.sshUser'));
362
+ const message = this.validatorRequiredField(
363
+ this.t('cluster.credential.harvester.sshUser')
364
+ );
322
365
 
323
366
  errors.push(message);
324
367
  }
325
368
 
326
369
  if (!this.value.networkName) {
327
- const message = this.validatorRequiredField(this.t('cluster.credential.harvester.network'));
370
+ const message = this.validatorRequiredField(
371
+ this.t('cluster.credential.harvester.network')
372
+ );
328
373
 
329
374
  errors.push(message);
330
375
  }
@@ -384,7 +429,7 @@ export default {
384
429
 
385
430
  this.updateScheduling(this.vmAffinity);
386
431
  }
387
- },
432
+ }
388
433
  };
389
434
  </script>
390
435
 
@@ -447,7 +492,9 @@ export default {
447
492
  :required="true"
448
493
  :disabled="namespaceDisabled"
449
494
  label-key="cluster.credential.harvester.namespace"
450
- :placeholder="t('cluster.harvester.machinePool.namespace.placeholder')"
495
+ :placeholder="
496
+ t('cluster.harvester.machinePool.namespace.placeholder')
497
+ "
451
498
  />
452
499
 
453
500
  <LabeledInput
@@ -457,7 +504,9 @@ export default {
457
504
  :required="true"
458
505
  :mode="mode"
459
506
  :disabled="namespaceDisabled"
460
- :placeholder="t('cluster.harvester.machinePool.namespace.placeholder')"
507
+ :placeholder="
508
+ t('cluster.harvester.machinePool.namespace.placeholder')
509
+ "
461
510
  />
462
511
  </div>
463
512
  </div>
@@ -485,7 +534,9 @@ export default {
485
534
  :required="true"
486
535
  :disabled="disabledEdit"
487
536
  label-key="cluster.credential.harvester.network"
488
- :placeholder="t('cluster.harvester.machinePool.network.placeholder')"
537
+ :placeholder="
538
+ t('cluster.harvester.machinePool.network.placeholder')
539
+ "
489
540
  />
490
541
  </div>
491
542
  </div>
@@ -522,7 +573,9 @@ export default {
522
573
  :required="true"
523
574
  :mode="mode"
524
575
  :disabled="disabled"
525
- :placeholder="t('cluster.harvester.machinePool.sshUser.placeholder')"
576
+ :placeholder="
577
+ t('cluster.harvester.machinePool.sshUser.placeholder')
578
+ "
526
579
  tooltip-key="cluster.harvester.machinePool.sshUser.toolTip"
527
580
  />
528
581
  </div>
@@ -574,7 +627,7 @@ export default {
574
627
  />
575
628
  </div>
576
629
 
577
- <h3>{{ t("cluster.credential.harvester.networkData.title") }}</h3>
630
+ <h3>{{ t('cluster.credential.harvester.networkData.title') }}</h3>
578
631
  <div>
579
632
  <LabeledSelect
580
633
  v-if="isImportCluster && isCreate"
@@ -599,29 +652,23 @@ export default {
599
652
  </portal>
600
653
  </div>
601
654
  <div v-if="errors.length">
602
- <div
603
- v-for="(err, idx) in errors"
604
- :key="idx"
605
- >
606
- <Banner
607
- color="error"
608
- :label="stringify(err.Message || err)"
609
- />
655
+ <div v-for="(err, idx) in errors" :key="idx">
656
+ <Banner color="error" :label="stringify(err.Message || err)" />
610
657
  </div>
611
658
  </div>
612
659
  </div>
613
660
  </template>
614
661
 
615
662
  <style lang="scss" scoped>
616
- $yaml-height: 200px;
617
-
618
- ::v-deep .yaml-editor{
619
- flex: 1;
663
+ $yaml-height: 200px;
664
+
665
+ ::v-deep .yaml-editor {
666
+ flex: 1;
667
+ min-height: $yaml-height;
668
+ & .code-mirror .CodeMirror {
669
+ position: initial;
670
+ height: auto;
620
671
  min-height: $yaml-height;
621
- & .code-mirror .CodeMirror {
622
- position: initial;
623
- height: auto;
624
- min-height: $yaml-height;
625
- }
626
672
  }
673
+ }
627
674
  </style>
@@ -10,10 +10,10 @@ import { applyProducts } from '@shell/store/type-map';
10
10
  import { findBy } from '@shell/utils/array';
11
11
  import { ClusterNotFoundError } from '@shell/utils/error';
12
12
  import { get } from '@shell/utils/object';
13
+ import { setFavIcon, haveSetFavIcon } from '@shell/utils/favicon';
14
+ import dynamicPluginLoader from '@shell/pkg/dynamic-plugin-loader';
13
15
  import { AFTER_LOGIN_ROUTE, WORKSPACE } from '@shell/store/prefs';
14
- import { NAME as VIRTUAL } from '@shell/config/product/harvester';
15
16
  import { BACK_TO } from '@shell/config/local-storage';
16
- import { setFavIcon, haveSetFavIcon } from '@shell/utils/favicon';
17
17
  import { NAME as FLEET_NAME } from '@shell/config/product/fleet.js';
18
18
 
19
19
  const getPackageFromRoute = (route) => {
@@ -28,7 +28,7 @@ const getPackageFromRoute = (route) => {
28
28
 
29
29
  let beforeEachSetup = false;
30
30
 
31
- function getProduct(to) {
31
+ export function getProductFromRoute(to) {
32
32
  let product = to.params?.product;
33
33
 
34
34
  if ( !product ) {
@@ -43,7 +43,7 @@ function getProduct(to) {
43
43
  }
44
44
 
45
45
  function setProduct(store, to) {
46
- let product = getProduct(to);
46
+ let product = getProductFromRoute(to);
47
47
 
48
48
  if ( !product ) {
49
49
  product = EXPLORER;
@@ -66,7 +66,7 @@ function setProduct(store, to) {
66
66
  }
67
67
 
68
68
  export default async function({
69
- route, app, store, redirect, $cookies, req, isDev, from, $plugin
69
+ route, app, store, redirect, $cookies, req, isDev, from, $plugin, next
70
70
  }) {
71
71
  if ( route.path && typeof route.path === 'string') {
72
72
  // Ignore webpack hot module reload requests
@@ -245,10 +245,8 @@ export default async function({
245
245
  window.location.href = backTo;
246
246
  }
247
247
  }
248
-
249
248
  // Load stuff
250
249
  await applyProducts(store, $plugin);
251
-
252
250
  // Setup a beforeEach hook once to keep track of the current product
253
251
  if ( !beforeEachSetup ) {
254
252
  beforeEachSetup = true;
@@ -276,10 +274,10 @@ export default async function({
276
274
  let clusterId = get(route, 'params.cluster');
277
275
 
278
276
  const pkg = getPackageFromRoute(route);
279
- const product = getProduct(route);
277
+ const product = getProductFromRoute(route);
280
278
 
281
279
  const oldPkg = getPackageFromRoute(from);
282
- const oldProduct = getProduct(from);
280
+ const oldProduct = getProductFromRoute(from);
283
281
 
284
282
  // Leave an old pkg where we weren't before?
285
283
  const oldPkgPlugin = oldPkg ? Object.values($plugin.getPlugins()).find(p => p.name === oldPkg) : null;
@@ -316,6 +314,24 @@ export default async function({
316
314
  });
317
315
  }
318
316
 
317
+ if (!route.matched?.length) {
318
+ // If there are no matching routes we could be trying to nav to a page belonging to a dynamic plugin which needs loading
319
+ await Promise.all([
320
+ ...always,
321
+ ]);
322
+
323
+ // If a plugin claims the route and is loaded correctly we'll get a route back
324
+ const newLocation = await dynamicPluginLoader.check({ route, store });
325
+
326
+ // If we have a new location, double check that it's actually valid
327
+ const resolvedRoute = newLocation ? store.app.router.resolve(newLocation) : null;
328
+
329
+ if (resolvedRoute?.route.matched.length) {
330
+ // Note - don't use `redirect` or `store.app.route` (breaks feature by failing to run middleware in default layout)
331
+ return next(newLocation);
332
+ }
333
+ }
334
+
319
335
  // Ensure that the activeNamespaceCache is updated given the change of context either from or to a place where it uses workspaces
320
336
  // When fleet moves to it's own package this should be moved to pkg onEnter/onLeave
321
337
  if ((oldProduct === FLEET_NAME || product === FLEET_NAME) && oldProduct !== product) {
@@ -327,49 +343,37 @@ export default async function({
327
343
  });
328
344
  }
329
345
 
330
- if (product === VIRTUAL || route.name === `c-cluster-${ VIRTUAL }` || route.name?.startsWith(`c-cluster-${ VIRTUAL }-`)) {
331
- setProduct(store, route);
332
- const res = [
333
- ...always,
334
- store.dispatch('loadVirtual', {
335
- id: clusterId,
336
- oldProduct,
337
- }),
338
- ];
339
-
340
- await Promise.all(res);
341
- } else {
342
- // Always run loadCluster, it handles 'unload' as well
343
- // Run them in parallel
344
- await Promise.all([
345
- ...always,
346
- store.dispatch('loadCluster', {
347
- id: clusterId,
348
- oldPkg: oldPkgPlugin,
349
- newPkg: newPkgPlugin,
350
- product,
351
- oldProduct,
352
- })]);
353
-
354
- if (!clusterId) {
355
- clusterId = store.getters['defaultClusterId']; // This needs the cluster list, so no parallel
356
- const isSingleProduct = store.getters['isSingleProduct'];
357
-
358
- if (isSingleProduct?.afterLoginRoute) {
359
- const value = {
360
- name: 'c-cluster-product',
361
- ...isSingleProduct.afterLoginRoute,
362
- params: {
363
- cluster: clusterId,
364
- ...isSingleProduct.afterLoginRoute?.params
365
- },
366
- };
367
-
368
- await store.dispatch('prefs/set', {
369
- key: AFTER_LOGIN_ROUTE,
370
- value,
371
- });
372
- }
346
+ // Always run loadCluster, it handles 'unload' as well
347
+ // Run them in parallel
348
+ await Promise.all([
349
+ ...always,
350
+ store.dispatch('loadCluster', {
351
+ id: clusterId,
352
+ oldPkg: oldPkgPlugin,
353
+ newPkg: newPkgPlugin,
354
+ product,
355
+ oldProduct,
356
+ })
357
+ ]);
358
+
359
+ if (!clusterId) {
360
+ clusterId = store.getters['defaultClusterId']; // This needs the cluster list, so no parallel
361
+ const isSingleProduct = store.getters['isSingleProduct'];
362
+
363
+ if (isSingleProduct?.afterLoginRoute) {
364
+ const value = {
365
+ name: 'c-cluster-product',
366
+ ...isSingleProduct.afterLoginRoute,
367
+ params: {
368
+ cluster: clusterId,
369
+ ...isSingleProduct.afterLoginRoute?.params
370
+ },
371
+ };
372
+
373
+ await store.dispatch('prefs/set', {
374
+ key: AFTER_LOGIN_ROUTE,
375
+ value,
376
+ });
373
377
  }
374
378
  }
375
379
  } catch (e) {
package/mixins/brand.js CHANGED
@@ -12,16 +12,15 @@ export default {
12
12
  this.apps = await this.$store.dispatch('management/findAll', { type: CATALOG.APP });
13
13
  }
14
14
  } catch (e) {}
15
+
16
+ this.globalSettings = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.SETTING });
15
17
  },
16
18
 
17
19
  data() {
18
- return { apps: [] };
20
+ return { apps: [], globalSettings: [] };
19
21
  },
20
22
 
21
23
  computed: {
22
- globalSettings() {
23
- return this.$store.getters['management/all'](MANAGEMENT.SETTING);
24
- },
25
24
 
26
25
  brand() {
27
26
  const setting = findBy(this.globalSettings, 'id', SETTING.BRAND);
@@ -12,14 +12,6 @@ export default {
12
12
 
13
13
  mixins: [ChildHook],
14
14
 
15
- mounted() {
16
- // For easy access debugging...
17
- if ( typeof window !== 'undefined' ) {
18
- window.v = this.value;
19
- window.c = this;
20
- }
21
- },
22
-
23
15
  data() {
24
16
  // Keep label and annotation filters in data so each resource CRUD page can alter individually
25
17
  return { errors: [] };
@@ -1,5 +1,5 @@
1
1
  import { getAllValues } from '@shell/utils/object';
2
- import formRulesGenerator from '@shell/utils/validators/formRules';
2
+ import formRulesGenerator from '@shell/utils/validators/formRules/index';
3
3
 
4
4
  export default {
5
5
  data() {
@@ -2,7 +2,7 @@ import { mapGetters } from 'vuex';
2
2
  import {
3
3
  COUNT, MANAGEMENT, POD, WORKLOAD_TYPES, WORKLOAD, SECRET
4
4
  } from '@shell/config/types';
5
- import { SETTING } from '@shell/config/settings';
5
+ import { SETTING, DEFAULT_PERF_SETTING } from '@shell/config/settings';
6
6
 
7
7
  // Number of pages to fetch when loading incrementally
8
8
  const PAGES = 4;
@@ -33,6 +33,8 @@ export default {
33
33
  } catch (e) {
34
34
  console.warn('ui-performance setting contains invalid data'); // eslint-disable-line no-console
35
35
  }
36
+ } else {
37
+ perfConfig = DEFAULT_PERF_SETTING;
36
38
  }
37
39
 
38
40
  return {
package/models/chart.js CHANGED
@@ -10,7 +10,7 @@ export default class Chart extends SteveModel {
10
10
  let version;
11
11
  const chartVersions = this.versions;
12
12
  const currentCluster = this.$rootGetters['currentCluster'];
13
- const workerOSs = currentCluster.workerOSs;
13
+ const workerOSs = currentCluster?.workerOSs;
14
14
  const compatibleVersions = compatibleVersionsFor(this, workerOSs);
15
15
 
16
16
  if (compatibleVersions.length) {
@@ -7,6 +7,7 @@ import { parseSi } from '@shell/utils/units';
7
7
  import findLast from 'lodash/findLast';
8
8
 
9
9
  import SteveModel from '@shell/plugins/steve/steve-class';
10
+ import { LOCAL } from '@shell/config/query-params';
10
11
 
11
12
  export default class ClusterNode extends SteveModel {
12
13
  get _availableActions() {
@@ -254,10 +255,20 @@ export default class ClusterNode extends SteveModel {
254
255
  }));
255
256
  }
256
257
 
258
+ /**
259
+ *Find the node's cluster id from it's url
260
+ */
257
261
  get clusterId() {
258
262
  const parts = this.links.self.split('/');
259
263
 
260
- return parts[parts.length - 4];
264
+ // Local cluster url links omit `/k8s/clusters/<cluster id>`
265
+ // `/v1/nodes` vs `k8s/clusters/c-m-274kcrc4/v1/nodes`
266
+ // Be safe when determining this, so work back through the url from a known point
267
+ if (parts.length > 6 && parts[parts.length - 6] === 'k8s' && parts[parts.length - 5] === 'clusters') {
268
+ return parts[parts.length - 4];
269
+ }
270
+
271
+ return LOCAL;
261
272
  }
262
273
 
263
274
  get normanNodeId() {