@rancher/shell 0.1.2 → 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 (258) hide show
  1. package/assets/translations/en-us.yaml +27 -769
  2. package/assets/translations/zh-hans.yaml +8 -769
  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 +18 -11
  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/WorkloadPorts.vue +1 -1
  24. package/components/formatter/WorkloadHealthScale.vue +1 -1
  25. package/components/nav/Header.vue +9 -9
  26. package/components/nav/NamespaceFilter.vue +7 -4
  27. package/components/nav/TopLevelMenu.vue +6 -43
  28. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  29. package/config/product/harvester-manager.js +64 -2
  30. package/config/product/manager.js +9 -0
  31. package/config/settings.js +17 -71
  32. package/config/table-headers.js +0 -1
  33. package/config/types.js +5 -25
  34. package/core/plugin-routes.ts +34 -22
  35. package/core/plugin.ts +15 -3
  36. package/core/plugins-loader.js +2 -0
  37. package/core/plugins.js +79 -36
  38. package/core/types.ts +7 -1
  39. package/detail/provisioning.cattle.io.cluster.vue +13 -0
  40. package/detail/workload/index.vue +11 -5
  41. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  42. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  43. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  44. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  45. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  46. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  47. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  48. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  49. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
  50. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  51. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  52. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  53. package/edit/auth/azuread.vue +20 -1
  54. package/edit/management.cattle.io.project.vue +2 -2
  55. package/edit/namespace.vue +17 -10
  56. package/edit/persistentvolumeclaim.vue +1 -0
  57. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  58. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  59. package/edit/service.vue +1 -1
  60. package/edit/workload/index.vue +363 -15
  61. package/edit/workload/mixins/workload.js +62 -7
  62. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  63. package/layouts/default.vue +52 -27
  64. package/layouts/error.vue +5 -1
  65. package/layouts/home.vue +6 -2
  66. package/list/harvesterhci.io.management.cluster.vue +74 -33
  67. package/list/namespace.vue +3 -5
  68. package/machine-config/amazonec2.vue +2 -0
  69. package/machine-config/harvester.vue +96 -49
  70. package/middleware/authenticated.js +56 -52
  71. package/mixins/form-validation.js +1 -1
  72. package/mixins/resource-fetch.js +3 -1
  73. package/models/fleet.cattle.io.bundle.js +26 -19
  74. package/models/harvesterhci.io.management.cluster.js +194 -5
  75. package/models/management.cattle.io.cluster.js +1 -1
  76. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  77. package/models/management.cattle.io.project.js +23 -2
  78. package/models/namespace.js +19 -3
  79. package/models/pod.js +19 -2
  80. package/models/provisioning.cattle.io.cluster.js +4 -0
  81. package/models/workload.js +4 -243
  82. package/models/workload.service.js +314 -0
  83. package/nuxt.config.js +11 -9
  84. package/package.json +3 -3
  85. package/pages/auth/login.vue +11 -2
  86. package/pages/auth/setup.vue +1 -1
  87. package/pages/c/_cluster/_product/members/index.vue +3 -93
  88. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  89. package/pages/c/_cluster/settings/performance.vue +19 -16
  90. package/pages/fail-whale.vue +1 -10
  91. package/pages/index.vue +18 -4
  92. package/pages/plugins.vue +2 -2
  93. package/pages/prefs.vue +8 -6
  94. package/pkg/auto-import.js +44 -7
  95. package/pkg/dynamic-plugin-loader.js +28 -0
  96. package/pkg/import.js +2 -2
  97. package/pkg/model-loader-require.lib.js +3 -0
  98. package/pkg/vue.config.js +9 -6
  99. package/plugins/dashboard-store/model-loader-require.js +12 -0
  100. package/plugins/dashboard-store/model-loader.js +4 -1
  101. package/plugins/dashboard-store/resource-class.js +10 -3
  102. package/plugins/steve/actions.js +1 -1
  103. package/plugins/steve/index.js +6 -4
  104. package/plugins/steve/subscribe.js +34 -23
  105. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  106. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  107. package/scripts/build-pkg.sh +48 -2
  108. package/scripts/drone-build-pkg.sh +31 -0
  109. package/scripts/publish-shell.sh +10 -11
  110. package/scripts/serve-pkgs +17 -10
  111. package/store/catalog.js +3 -1
  112. package/store/i18n.js +16 -11
  113. package/store/index.js +4 -181
  114. package/store/prefs.js +30 -2
  115. package/store/type-map.js +16 -29
  116. package/utils/cluster.js +1 -1
  117. package/utils/custom-validators.js +1 -12
  118. package/utils/dynamic-importer.js +1 -1
  119. package/utils/validators/setting.js +0 -35
  120. package/components/FilterLabel.vue +0 -254
  121. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  122. package/components/VMConsoleBar.vue +0 -87
  123. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  124. package/components/dialog/harvester/BackupModal.vue +0 -117
  125. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  126. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  127. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  128. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  129. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  130. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  131. package/components/dialog/harvester/SupportBundle.vue +0 -217
  132. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  133. package/components/form/SerialConsole/index.vue +0 -267
  134. package/components/formatter/AttachVMWithName.vue +0 -46
  135. package/components/formatter/CloudInitType.vue +0 -27
  136. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  137. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  138. package/components/formatter/HarvesterDiskState.vue +0 -66
  139. package/components/formatter/HarvesterHostName.vue +0 -66
  140. package/components/formatter/HarvesterIpAddress.vue +0 -90
  141. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  142. package/components/formatter/HarvesterMigrationState.vue +0 -85
  143. package/components/formatter/HarvesterNodeName.vue +0 -49
  144. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  145. package/components/formatter/HarvesterVmState.vue +0 -123
  146. package/components/nav/HarvesterUpgrade.vue +0 -232
  147. package/components/novnc/NovncConsole.vue +0 -93
  148. package/components/novnc/NovncConsoleItem.vue +0 -89
  149. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  150. package/config/harvester-map.js +0 -44
  151. package/config/harvester-table-headers.js +0 -27
  152. package/config/product/harvester.js +0 -305
  153. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  154. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  155. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  156. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  157. package/detail/harvesterhci.io.host/index.vue +0 -243
  158. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  159. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  160. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  161. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  162. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  163. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  164. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  165. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  166. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  167. package/edit/harvesterhci.io.host/index.vue +0 -533
  168. package/edit/harvesterhci.io.keypair.vue +0 -112
  169. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  170. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  171. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  172. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  173. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  174. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  175. package/edit/harvesterhci.io.setting/index.vue +0 -201
  176. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  177. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  178. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  179. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  180. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  181. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  182. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  183. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  184. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  185. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  186. package/edit/harvesterhci.io.volume.vue +0 -195
  187. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  188. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  189. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  190. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  191. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  192. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  193. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  194. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  195. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  196. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  197. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  198. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  199. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  200. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  201. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  202. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  203. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  204. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  205. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  206. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  207. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  208. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  209. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  210. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  211. package/edit/workload/types/Deployment.vue +0 -377
  212. package/edit/workload/types/Generic.vue +0 -295
  213. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  214. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  215. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  216. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  217. package/list/harvesterhci.io.host/index.vue +0 -186
  218. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  219. package/list/harvesterhci.io.setting.vue +0 -241
  220. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  221. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  222. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  223. package/list/harvesterhci.io.volume.vue +0 -122
  224. package/list/kubevirt.io.virtualmachine.vue +0 -193
  225. package/mixins/harvester-vm/impl.js +0 -267
  226. package/mixins/harvester-vm/index.js +0 -1357
  227. package/models/harvester/configmap.js +0 -32
  228. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  229. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  230. package/models/harvester/harvesterhci.io.setting.js +0 -127
  231. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  232. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  233. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  234. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  235. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  236. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  237. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  238. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  239. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  240. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  241. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  242. package/models/harvester/management.cattle.io.setting.js +0 -40
  243. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  244. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  245. package/models/harvester/node.js +0 -255
  246. package/models/harvester/persistentvolumeclaim.js +0 -166
  247. package/models/harvester/pod.js +0 -185
  248. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  249. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  250. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  251. package/pages/c/_cluster/harvester/index.vue +0 -24
  252. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  253. package/pkg/model-loader.lib.js +0 -3
  254. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  255. package/store/harvester-common.js +0 -126
  256. package/utils/validators/vm-datavolumes.js +0 -38
  257. package/utils/validators/vm-image.js +0 -32
  258. package/utils/validators/vm.js +0 -221
package/store/catalog.js CHANGED
@@ -652,7 +652,9 @@ export function filterAndArrangeCharts(charts, {
652
652
  const searchTokens = searchQuery.split(/\s*[, ]\s*/).map(x => ensureRegex(x, false));
653
653
 
654
654
  for ( const token of searchTokens ) {
655
- if ( !c.chartNameDisplay.match(token) && (c.chartDescription && !c.chartDescription.match(token)) ) {
655
+ const chartDescription = c.chartDescription || '';
656
+
657
+ if ( !c.chartNameDisplay.match(token) && !chartDescription.match(token) ) {
656
658
  return false;
657
659
  }
658
660
  }
package/store/i18n.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import merge from 'lodash/merge';
2
2
  import IntlMessageFormat from 'intl-messageformat';
3
- import { LOCALE } from '@shell/config/cookies';
4
3
  import { get } from '@shell/utils/object';
5
4
  import en from '@shell/assets/translations/en-us.yaml';
6
5
  import { getProduct, getVendor, DOCS_BASE } from '@shell/config/private-label';
@@ -208,8 +207,10 @@ export const mutations = {
208
207
  };
209
208
 
210
209
  export const actions = {
211
- init({ state, commit, dispatch }) {
212
- let selected = this.$cookies.get(LOCALE, { parseJSON: false });
210
+ init({
211
+ state, commit, dispatch, rootGetters
212
+ }) {
213
+ let selected = rootGetters['prefs/get']('locale');
213
214
 
214
215
  // We might be using a locale that is loaded by a plugin that is no longer loaded
215
216
  const exists = !!state.available.find(loc => loc === selected);
@@ -259,8 +260,11 @@ export const actions = {
259
260
  state,
260
261
  rootState,
261
262
  commit,
262
- dispatch
263
+ dispatch,
264
+ getters
263
265
  }, locale) {
266
+ const currentLocale = getters['current']();
267
+
264
268
  if ( locale === NONE ) {
265
269
  commit('setSelected', locale);
266
270
 
@@ -308,13 +312,14 @@ export const actions = {
308
312
  }
309
313
 
310
314
  commit('setSelected', locale);
311
- this.$cookies.set(LOCALE, locale, {
312
- encode: x => x,
313
- maxAge: 86400 * 365,
314
- path: '/',
315
- sameSite: true,
316
- secure: true,
317
- });
315
+
316
+ // Ony update the preference if the locale changed
317
+ if (currentLocale !== locale) {
318
+ dispatch('prefs/set', {
319
+ key: 'locale',
320
+ value: state.selected
321
+ }, { root: true });
322
+ }
318
323
  },
319
324
 
320
325
  toggleNone({ state, dispatch }) {
package/store/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import Steve from '@shell/plugins/steve';
2
2
  import {
3
- COUNT, NAMESPACE, NORMAN, MANAGEMENT, FLEET, UI, VIRTUAL_HARVESTER_PROVIDER, HCI, DEFAULT_WORKSPACE
3
+ COUNT, NAMESPACE, NORMAN, MANAGEMENT, FLEET, UI, VIRTUAL_HARVESTER_PROVIDER, DEFAULT_WORKSPACE
4
4
  } from '@shell/config/types';
5
5
  import { CLUSTER as CLUSTER_PREF, NAMESPACE_FILTERS, LAST_NAMESPACE, WORKSPACE } from '@shell/store/prefs';
6
6
  import { allHash, allHashSettled } from '@shell/utils/promise';
@@ -14,7 +14,6 @@ import { setBrand, setVendor } from '@shell/config/private-label';
14
14
  import { addParam } from '@shell/utils/url';
15
15
  import { SETTING } from '@shell/config/settings';
16
16
  import semver from 'semver';
17
- import { NAME as VIRTUAL } from '@shell/config/product/harvester';
18
17
  import { BACK_TO } from '@shell/config/local-storage';
19
18
  import { STEVE_MODEL_TYPES } from '@shell/plugins/steve/getters';
20
19
  import { BY_TYPE } from '@shell/plugins/dashboard-store/classify';
@@ -52,12 +51,6 @@ export const plugins = [
52
51
  supportsStream: false, // The norman API doesn't support streaming
53
52
  modelBaseClass: STEVE_MODEL_TYPES.NORMAN,
54
53
  }),
55
- Steve({
56
- namespace: 'harvester',
57
- baseUrl: '', // URL is dynamically set for the selected cluster
58
- supportsStream: false, // true, -- Disabled due to report that it's sometimes much slower in Chrome
59
- }),
60
-
61
54
  ];
62
55
 
63
56
  const getActiveNamespaces = (state, getters) => {
@@ -450,47 +443,14 @@ export const getters = {
450
443
  return '/';
451
444
  },
452
445
 
453
- isSingleProduct(state, rootGetters) {
446
+ isSingleProduct(state) {
454
447
  if (state.isSingleProduct !== undefined) {
455
448
  return state.isSingleProduct;
456
449
  }
457
450
 
458
- if (rootGetters.isSingleVirtualCluster) {
459
- return {
460
- logo: require('~shell/assets/images/providers/harvester.svg'),
461
- productNameKey: 'product.harvester',
462
- version: rootGetters['harvester/byId'](HCI.SETTING, 'server-version')?.value,
463
- afterLoginRoute: {
464
- name: 'c-cluster-product',
465
- params: { product: VIRTUAL },
466
- },
467
- logoRoute: {
468
- name: 'c-cluster-product-resource',
469
- params: {
470
- product: VIRTUAL,
471
- resource: HCI.DASHBOARD,
472
- }
473
- },
474
- enableSessionCheck: true
475
- };
476
- }
477
-
478
451
  return false;
479
452
  },
480
453
 
481
- isSingleVirtualCluster(state, getters, rootState, rootGetters) {
482
- const clusterId = getters.defaultClusterId;
483
- const cluster = rootGetters['management/byId'](MANAGEMENT.CLUSTER, clusterId);
484
-
485
- return !getters.isMultiCluster && cluster?.status?.provider === VIRTUAL_HARVESTER_PROVIDER;
486
- },
487
-
488
- isMultiVirtualCluster(state, getters, rootState, rootGetters) {
489
- const localCluster = rootGetters['management/byId'](MANAGEMENT.CLUSTER, 'local');
490
-
491
- return getters.isMultiCluster && localCluster?.status?.provider !== VIRTUAL_HARVESTER_PROVIDER;
492
- },
493
-
494
454
  isVirtualCluster(state, getters) {
495
455
  const cluster = getters['currentCluster'];
496
456
 
@@ -509,9 +469,7 @@ export const mutations = {
509
469
  state.clusterReady = ready;
510
470
  },
511
471
 
512
- updateNamespaces(state, getters) {
513
- const { filters, all } = getters;
514
-
472
+ updateNamespaces(state, { filters, all }) {
515
473
  state.namespaceFilters = filters.filter(x => !!x);
516
474
 
517
475
  if ( all ) {
@@ -644,7 +602,7 @@ export const actions = {
644
602
  }
645
603
 
646
604
  res = await allHash(promises);
647
-
605
+ dispatch('i18n/init');
648
606
  let isMultiCluster = true;
649
607
 
650
608
  if ( res.clusters.length === 1 && res.clusters[0].metadata?.name === 'local' ) {
@@ -701,11 +659,6 @@ export const actions = {
701
659
  return;
702
660
  }
703
661
 
704
- if (oldProduct === VIRTUAL) {
705
- await dispatch('harvester/unsubscribe');
706
- commit('harvester/reset');
707
- }
708
-
709
662
  const oldPkgClusterStore = oldPkg?.stores.find(
710
663
  s => getters[`${ s.storeName }/isClusterStore`]
711
664
  )?.storeName;
@@ -767,7 +720,6 @@ export const actions = {
767
720
  // If we've entered a new store ensure everything has loaded correctly
768
721
  if (newPkgClusterStore) {
769
722
  // Mirror actions on the 'cluster' store for our specific pkg `cluster` store
770
- dispatch(`${ newPkgClusterStore }/loadSchemas`, true);
771
723
  await dispatch(`${ newPkgClusterStore }/loadCluster`, { id });
772
724
 
773
725
  commit('clusterReady', true);
@@ -872,135 +824,6 @@ export const actions = {
872
824
  commit('updateNamespaces', { filters: ids, ...getters });
873
825
  },
874
826
 
875
- async loadVirtual({
876
- state, commit, dispatch, getters
877
- }, { id, oldProduct }) {
878
- const isMultiCluster = getters['isMultiCluster'];
879
-
880
- if (isMultiCluster && id === 'local') {
881
- return;
882
- }
883
-
884
- if ( state.clusterId && state.clusterId === id && oldProduct === VIRTUAL) {
885
- // Do nothing, we're already connected/connecting to this cluster
886
- return;
887
- }
888
-
889
- if (oldProduct !== VIRTUAL) {
890
- await dispatch('cluster/unsubscribe');
891
- commit('cluster/reset');
892
- }
893
-
894
- if ( state.clusterId && id ) {
895
- commit('clusterReady', false);
896
-
897
- await dispatch('harvester/unsubscribe');
898
- commit('harvester/reset');
899
-
900
- await dispatch('management/watch', {
901
- type: MANAGEMENT.PROJECT,
902
- namespace: state.clusterId,
903
- stop: true
904
- });
905
-
906
- commit('management/forgetType', MANAGEMENT.PROJECT);
907
- }
908
-
909
- if (id) {
910
- commit('clusterId', id);
911
- }
912
-
913
- console.log(`Loading ${ isMultiCluster ? 'ECM ' : '' }cluster...`); // eslint-disable-line no-console
914
-
915
- // This is a workaround for a timing issue where the mgmt cluster schema may not be available
916
- // Try and wait until the schema exists before proceeding
917
- await dispatch('management/waitForSchema', { type: MANAGEMENT.CLUSTER });
918
-
919
- // See if it really exists
920
- const cluster = await dispatch('management/find', {
921
- type: MANAGEMENT.CLUSTER,
922
- id,
923
- opt: { url: `${ MANAGEMENT.CLUSTER }s/${ escape(id) }` }
924
- });
925
-
926
- let virtualBase = `/k8s/clusters/${ escape(id) }/v1/harvester`;
927
-
928
- if (id === 'local') {
929
- virtualBase = `/v1/harvester`;
930
- }
931
-
932
- if ( !cluster ) {
933
- commit('clusterId', null);
934
- commit('harvester/applyConfig', { baseUrl: null });
935
- throw new ClusterNotFoundError(id);
936
- }
937
-
938
- // Update the Steve client URLs
939
- commit('harvester/applyConfig', { baseUrl: virtualBase });
940
-
941
- await Promise.all([
942
- dispatch('harvester/loadSchemas', true),
943
- ]);
944
-
945
- dispatch('harvester/subscribe');
946
-
947
- let isRancher = false;
948
- const projectArgs = {
949
- type: MANAGEMENT.PROJECT,
950
- opt: {
951
- url: `${ MANAGEMENT.PROJECT }/${ escape(id) }`,
952
- watchNamespace: id
953
- }
954
- };
955
-
956
- if (getters['management/schemaFor'](MANAGEMENT.PROJECT)) {
957
- isRancher = true;
958
- }
959
-
960
- if (id !== 'local' && getters['harvester/schemaFor'](MANAGEMENT.SETTING)) { // multi-cluster
961
- const settings = await dispatch('harvester/findAll', {
962
- type: MANAGEMENT.SETTING,
963
- id: SETTING.SYSTEM_NAMESPACES,
964
- opt: { url: `${ virtualBase }/${ MANAGEMENT.SETTING }s/`, force: true }
965
- });
966
-
967
- const systemNamespaces = settings?.find(x => x.id === SETTING.SYSTEM_NAMESPACES);
968
-
969
- if (systemNamespaces) {
970
- const namespace = (systemNamespaces.value || systemNamespaces.default)?.split(',');
971
-
972
- commit('setSystemNamespaces', namespace);
973
- }
974
- }
975
-
976
- const hash = {
977
- projects: isRancher && dispatch('management/findAll', projectArgs),
978
- virtualCount: dispatch('harvester/findAll', { type: COUNT }),
979
- virtualNamespaces: dispatch('harvester/findAll', { type: NAMESPACE }),
980
- settings: dispatch('harvester/findAll', { type: HCI.SETTING }),
981
- };
982
-
983
- if (getters['harvester/schemaFor'](HCI.UPGRADE)) {
984
- hash.upgrades = dispatch('harvester/findAll', { type: HCI.UPGRADE });
985
- }
986
-
987
- const res = await allHash(hash);
988
-
989
- await dispatch('cleanNamespaces');
990
-
991
- const filters = getters['prefs/get'](NAMESPACE_FILTERS)?.[id];
992
-
993
- commit('updateNamespaces', {
994
- filters: filters || [ALL_USER],
995
- all: res.virtualNamespaces,
996
- ...getters
997
- });
998
-
999
- commit('clusterReady', true);
1000
-
1001
- console.log('Done loading virtual cluster.'); // eslint-disable-line no-console
1002
- },
1003
-
1004
827
  async cleanNamespaces({ getters, dispatch }) {
1005
828
  // Initialise / Remove any filters that the user no-longer has access to
1006
829
  await dispatch('management/findAll', { type: MANAGEMENT.CLUSTER }); // So they can be got byId below
package/store/prefs.js CHANGED
@@ -4,6 +4,11 @@ import { clone } from '@shell/utils/object';
4
4
  import { SETTING } from '@shell/config/settings';
5
5
 
6
6
  const definitions = {};
7
+ /**
8
+ * Key/value of prefrences are stored before login here and cookies due lack of access permission.
9
+ * Once user is logged in while setting asUserPreference, update stored before login Key/value to the backend in loadServer function.
10
+ */
11
+ let prefsBeforeLogin = {};
7
12
 
8
13
  export const create = function(name, def, opt = {}) {
9
14
  const parseJSON = opt.parseJSON === true;
@@ -243,7 +248,7 @@ export const mutations = {
243
248
  };
244
249
 
245
250
  export const actions = {
246
- async set({ dispatch, commit }, opt) {
251
+ async set({ dispatch, commit, rootGetters }, opt) {
247
252
  let { key, value } = opt; // eslint-disable-line prefer-const
248
253
  const definition = definitions[key];
249
254
  let server;
@@ -264,6 +269,15 @@ export const actions = {
264
269
  }
265
270
 
266
271
  if ( definition.asUserPreference ) {
272
+ const checkLogin = rootGetters['auth/loggedIn'];
273
+
274
+ // Check for login status
275
+ if (!checkLogin) {
276
+ prefsBeforeLogin[key] = value;
277
+
278
+ return;
279
+ }
280
+
267
281
  try {
268
282
  server = await dispatch('loadServer', key); // There's no watch on prefs, so get before set...
269
283
 
@@ -373,7 +387,9 @@ export const actions = {
373
387
  }
374
388
  },
375
389
 
376
- async loadServer({ state, dispatch, commit }, ignoreKey) {
390
+ async loadServer( {
391
+ state, dispatch, commit, rootState, rootGetters
392
+ }, ignoreKey) {
377
393
  let server = { data: {} };
378
394
 
379
395
  try {
@@ -399,6 +415,18 @@ export const actions = {
399
415
  return;
400
416
  }
401
417
 
418
+ // if prefsBeforeLogin has values from login page, update the backend
419
+ if (Object.keys(prefsBeforeLogin).length > 0) {
420
+ Object.keys(prefsBeforeLogin).forEach((key) => {
421
+ server.data[key] = prefsBeforeLogin[key];
422
+ });
423
+
424
+ await server.save({ redirectUnauthorized: false });
425
+
426
+ // Clear prefsBeforeLogin, as we have now saved theses
427
+ prefsBeforeLogin = {};
428
+ }
429
+
402
430
  for (const key in definitions) {
403
431
  const definition = definitions[key];
404
432
  let value = clone(server.data[key]);
package/store/type-map.js CHANGED
@@ -41,6 +41,7 @@
41
41
  // public, -- If true, show to all users. If false, only show when the Developer Tools pref is on (default true)
42
42
  // category, -- Group to show the product in for the nav hamburger menu
43
43
  // typeStoreMap, -- An object mapping types to the store that should be used to retrieve information about the type
44
+ // hideSystemResources -- Hide resources in namespaces where namespace.isSystem === true, or a namespace managed by fleet (per its annotation) and hide those namespaces from ns/project list and nsfilter (default false)
44
45
  // })
45
46
  //
46
47
  // externalLink(stringOrFn) The product has an external page (function gets context object
@@ -130,8 +131,7 @@ import {
130
131
  ensureRegex, escapeHtml, escapeRegex, ucFirst, pluralize
131
132
  } from '@shell/utils/string';
132
133
  import {
133
- importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveDetail
134
-
134
+ importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveDetail, importDialog
135
135
  } from '@shell/utils/dynamic-importer';
136
136
 
137
137
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
@@ -167,7 +167,6 @@ export const IF_HAVE = {
167
167
  NO_PROJECT: 'no-project',
168
168
  NOT_V1_ISTIO: 'not-v1-istio',
169
169
  MULTI_CLUSTER: 'multi-cluster',
170
- HARVESTER_SINGLE_CLUSTER: 'harv-multi-cluster',
171
170
  NEUVECTOR_NAMESPACE: 'neuvector-namespace',
172
171
  };
173
172
 
@@ -217,7 +216,7 @@ export function DSL(store, product, module = 'type-map') {
217
216
  headers(type, headers) {
218
217
  headers.forEach((header) => {
219
218
  // If on the client, then use the value getter if there is one
220
- if (process.client && header.getValue) {
219
+ if (header.getValue) {
221
220
  header.value = header.getValue;
222
221
  }
223
222
 
@@ -1090,24 +1089,11 @@ export const getters = {
1090
1089
  };
1091
1090
  },
1092
1091
 
1093
- hasCustomPromptRemove(state, getters) {
1094
- return (rawType) => {
1095
- const type = getters.componentFor(rawType);
1096
-
1097
- const cache = state.cache.promptRemove;
1098
-
1099
- if ( cache[type] !== undefined ) {
1100
- return cache[type];
1101
- }
1102
-
1103
- try {
1104
- require.resolve(`@shell/promptRemove/${ type }`);
1105
- cache[type] = true;
1106
- } catch (e) {
1107
- cache[type] = false;
1108
- }
1092
+ hasCustomPromptRemove(state, getters, rootState) {
1093
+ return (rawType, subType) => {
1094
+ const key = getters.componentFor(rawType, subType);
1109
1095
 
1110
- return cache[type];
1096
+ return hasCustom(state, rootState, 'promptRemove', key, () => require.resolve(`@shell/promptRemove/${ key }`));
1111
1097
  };
1112
1098
  },
1113
1099
 
@@ -1125,6 +1111,12 @@ export const getters = {
1125
1111
  };
1126
1112
  },
1127
1113
 
1114
+ importDialog(state, getters, rootState) {
1115
+ return (rawType, subType) => {
1116
+ return loadExtension(rootState, 'dialog', getters.componentFor(rawType, subType), importDialog);
1117
+ };
1118
+ },
1119
+
1128
1120
  importList(state, getters, rootState) {
1129
1121
  return (rawType) => {
1130
1122
  return loadExtension(rootState, 'list', getters.componentFor(rawType), importList);
@@ -1143,11 +1135,9 @@ export const getters = {
1143
1135
  };
1144
1136
  },
1145
1137
 
1146
- importCustomPromptRemove(state, getters) {
1147
- return (rawType) => {
1148
- const type = getters.componentFor(rawType);
1149
-
1150
- return importCustomPromptRemove(type);
1138
+ importCustomPromptRemove(state, getters, rootState) {
1139
+ return (rawType, subType) => {
1140
+ return loadExtension(rootState, 'promptRemove', getters.componentFor(rawType, subType), importCustomPromptRemove);
1151
1141
  };
1152
1142
  },
1153
1143
 
@@ -1739,9 +1729,6 @@ function ifHave(getters, option) {
1739
1729
  case IF_HAVE.MULTI_CLUSTER: {
1740
1730
  return getters.isMultiCluster;
1741
1731
  }
1742
- case IF_HAVE.HARVESTER_SINGLE_CLUSTER: {
1743
- return getters.isSingleVirtualCluster;
1744
- }
1745
1732
  case IF_HAVE.NEUVECTOR_NAMESPACE: {
1746
1733
  return getters[`cluster/all`](NAMESPACE).find(n => n.metadata.name === NEU_VECTOR_NAMESPACE);
1747
1734
  }
package/utils/cluster.js CHANGED
@@ -13,7 +13,7 @@ export function filterOnlyKubernetesClusters(mgmtClusters) {
13
13
 
14
14
  export function isHarvesterCluster(mgmtCluster) {
15
15
  // Use the provider if it is set otherwise use the label
16
- const provider = mgmtCluster?.status?.provider || mgmtCluster?.metadata?.labels?.[CAPI.PROVIDER];
16
+ const provider = mgmtCluster?.metadata?.labels?.[CAPI.PROVIDER] || mgmtCluster?.status?.provider;
17
17
 
18
18
  return provider === VIRTUAL_HARVESTER_PROVIDER;
19
19
  }
@@ -8,12 +8,7 @@ import { cronSchedule } from '@shell/utils/validators/cron-schedule';
8
8
  import { podAffinity } from '@shell/utils/validators/pod-affinity';
9
9
  import { roleTemplateRules } from '@shell/utils/validators/role-template';
10
10
  import { clusterName } from '@shell/utils/validators/cluster-name';
11
- import { isHttps, backupTarget } from '@shell/utils/validators/setting';
12
-
13
- import { imageUrl, fileRequired } from '@shell/utils/validators/vm-image';
14
-
15
- import { vmNetworks, vmDisks } from '@shell/utils/validators/vm';
16
- import { dataVolumeSize } from '@shell/utils/validators/vm-datavolumes';
11
+ import { isHttps } from '@shell/utils/validators/setting';
17
12
 
18
13
  /**
19
14
  * Custom validation functions beyond normal scalr types
@@ -36,10 +31,4 @@ export default {
36
31
  podAffinity,
37
32
  roleTemplateRules,
38
33
  isHttps,
39
- backupTarget,
40
- imageUrl,
41
- dataVolumeSize,
42
- vmNetworks,
43
- vmDisks,
44
- fileRequired,
45
34
  };
@@ -63,7 +63,7 @@ export function importDialog(name) {
63
63
  throw new Error('Name required');
64
64
  }
65
65
 
66
- return () => import(/* webpackChunkName: "dialog" */ `@shell/components/dialog/${name}`);
66
+ return () => import(/* webpackChunkName: "dialog" */ `@shell/dialog/${name}`);
67
67
  }
68
68
 
69
69
  export function importWindowComponent(name) {
@@ -11,38 +11,3 @@ export function isHttps(value, getters, errors, validatorArgs, displayKey) {
11
11
 
12
12
  return errors;
13
13
  }
14
-
15
- export function backupTarget(value, getters, errors, validatorArgs) {
16
- const t = getters['i18n/t'];
17
-
18
- const parseValue = JSON.parse(value);
19
- const type = parseValue.type;
20
-
21
- if (!type) {
22
- return errors;
23
- }
24
-
25
- if (type === 's3') {
26
- if (!parseValue.accessKeyId) {
27
- errors.push(t('validation.required', { key: 'accessKeyId' }));
28
- }
29
-
30
- if (!parseValue.secretAccessKey) {
31
- errors.push(t('validation.required', { key: 'secretAccessKey' }));
32
- }
33
-
34
- if (!parseValue.bucketRegion) {
35
- errors.push(t('validation.required', { key: 'bucketRegion' }));
36
- }
37
-
38
- if (!parseValue.bucketName) {
39
- errors.push(t('validation.required', { key: 'bucketName' }));
40
- }
41
- }
42
-
43
- if (!parseValue.endpoint) {
44
- errors.push(t('validation.required', { key: 'endpoint' }));
45
- }
46
-
47
- return errors;
48
- }