@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
@@ -3,9 +3,60 @@ import { HARVESTER, MULTI_CLUSTER } from '@shell/store/features';
3
3
  import { DSL } from '@shell/store/type-map';
4
4
  import { STATE, NAME as NAME_COL, AGE, VERSION } from '@shell/config/table-headers';
5
5
  import { allHash } from '@shell/utils/promise';
6
+ import dynamicPluginLoader from '@shell/pkg/dynamic-plugin-loader';
7
+ import { BLANK_CLUSTER } from '@shell/store';
8
+
9
+ dynamicPluginLoader.register({
10
+ load: async({ route, store }) => {
11
+ // Check that we've either got here either
12
+ // - directly (page refresh/load -> have path but no name)
13
+ // - via router name (have name but no path)
14
+ let clusterId;
15
+ const pathParts = route.path.split('/');
16
+
17
+ if (pathParts?.[1] === HARVESTER_NAME && pathParts?.[3] ) {
18
+ clusterId = pathParts?.[3];
19
+ } else {
20
+ const nameParts = route.name?.split('-');
21
+
22
+ if (nameParts?.[0] === HARVESTER_NAME) {
23
+ clusterId = route.params?.cluster;
24
+ }
25
+ }
26
+
27
+ // If we have a cluster id, try to load the plugin via the harvester cluster's `loadClusterPlugin`
28
+ if (clusterId) {
29
+ const provClusters = await store.dispatch('management/findAll', { type: CAPI.RANCHER_CLUSTER });
30
+ const provCluster = provClusters.find(p => p.mgmt.id === clusterId);
31
+
32
+ if (provCluster) {
33
+ const harvCluster = await store.dispatch('management/create', {
34
+ ...provCluster,
35
+ type: HCI.CLUSTER
36
+ });
37
+
38
+ if (harvCluster) {
39
+ try {
40
+ await harvCluster.loadClusterPlugin();
41
+
42
+ return route;
43
+ } catch (err) {
44
+ // If we've failed to load the harvester plugin nav to the harvester cluster list (probably got here from a bookmarked
45
+ // harvester instance that hasn't been updated to serve a plugin)
46
+ console.error('Failed to load harvester package: ', typeof error === 'object' ? JSON.stringify(err) : err); // eslint-disable-line no-console
47
+
48
+ return harvesterClustersLocation;
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ });
6
55
 
7
56
  export const NAME = 'harvesterManager';
8
57
 
58
+ export const HARVESTER_NAME = 'harvester';
59
+
9
60
  const MACHINE_POOLS = {
10
61
  name: 'summary',
11
62
  labelKey: 'tableHeaders.machines',
@@ -16,6 +67,15 @@ const MACHINE_POOLS = {
16
67
  width: 100,
17
68
  };
18
69
 
70
+ const harvesterClustersLocation = {
71
+ name: 'c-cluster-product-resource',
72
+ params: {
73
+ cluster: BLANK_CLUSTER,
74
+ product: NAME,
75
+ resource: HCI.CLUSTER
76
+ }
77
+ };
78
+
19
79
  export function init(store) {
20
80
  const {
21
81
  product,
@@ -33,6 +93,7 @@ export function init(store) {
33
93
  removable: false,
34
94
  showClusterSwitcher: false,
35
95
  weight: 100,
96
+ to: harvesterClustersLocation,
36
97
  });
37
98
 
38
99
  configureType(HCI.CLUSTER, { showListMasthead: false });
@@ -41,7 +102,8 @@ export function init(store) {
41
102
  NAME_COL,
42
103
  {
43
104
  ...VERSION,
44
- value: 'kubernetesVersion'
105
+ value: 'kubernetesVersion',
106
+ getValue: row => row.kubernetesVersion
45
107
  },
46
108
  MACHINE_POOLS,
47
109
  AGE,
@@ -54,7 +116,7 @@ export function init(store) {
54
116
  ]);
55
117
  basicType([HCI.CLUSTER]);
56
118
  spoofedType({
57
- label: store.getters['i18n/t']('harvester.manager.cluster.label'),
119
+ label: store.getters['i18n/t']('harvesterManager.cluster.label'),
58
120
  name: HCI.CLUSTER,
59
121
  type: HCI.CLUSTER,
60
122
  namespaced: false,
@@ -7,6 +7,7 @@ import {
7
7
  } from '@shell/config/types';
8
8
  import { MULTI_CLUSTER } from '@shell/store/features';
9
9
  import { DSL } from '@shell/store/type-map';
10
+ import { BLANK_CLUSTER } from '@shell/store';
10
11
 
11
12
  export const NAME = 'manager';
12
13
 
@@ -28,6 +29,14 @@ export function init(store) {
28
29
  icon: 'cluster-management',
29
30
  removable: false,
30
31
  showClusterSwitcher: false,
32
+ to: {
33
+ name: 'c-cluster-product-resource',
34
+ params: {
35
+ cluster: BLANK_CLUSTER,
36
+ product: NAME,
37
+ resource: CAPI.RANCHER_CLUSTER
38
+ }
39
+ },
31
40
  });
32
41
 
33
42
  virtualType({
@@ -1,5 +1,6 @@
1
1
  // Settings
2
2
  import { MANAGEMENT } from './types';
3
+
3
4
  // Adapted from: https://github.com/rancher/ui/blob/08c379a9529f740666a704b52522a468986c3520/lib/shared/addon/utils/constants.js#L564
4
5
  // Setting IDs
5
6
  export const SETTING = {
@@ -15,12 +16,12 @@ export const SETTING = {
15
16
  API_HOST: 'api-host',
16
17
  CA_CERTS: 'cacerts',
17
18
 
18
- // Allow the local cluste to be hidden
19
+ // Allow the local cluster to be hidden
19
20
  HIDE_LOCAL_CLUSTER: 'hide-local-cluster',
20
21
  AUTH_TOKEN_MAX_TTL_MINUTES: 'auth-token-max-ttl-minutes',
21
22
  KUBECONFIG_GENERATE_TOKEN: 'kubeconfig-generate-token',
22
23
  KUBECONFIG_TOKEN_TTL_MINUTES: 'kubeconfig-token-ttl-minutes',
23
- KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES: 'kubeconfig-default-token-ttl-minutes',
24
+ KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES: 'kubeconfig-default-token-ttl-minutes',
24
25
  ENGINE_URL: 'engine-install-url',
25
26
  ENGINE_ISO_URL: 'engine-iso-url',
26
27
  FIRST_LOGIN: 'first-login',
@@ -33,9 +34,11 @@ export const SETTING = {
33
34
  AUTH_USER_SESSION_TTL_MINUTES: 'auth-user-session-ttl-minutes',
34
35
  AUTH_USER_INFO_RESYNC_CRON: 'auth-user-info-resync-cron',
35
36
  AUTH_LOCAL_VALIDATE_DESC: 'auth-password-requirements-description',
37
+ CATTLE_PASSWORD_MIN_LENGTH: 'password-min-length',
36
38
  CLUSTER_TEMPLATE_ENFORCEMENT: 'cluster-template-enforcement',
37
39
  UI_INDEX: 'ui-index',
38
40
  UI_DASHBOARD_INDEX: 'ui-dashboard-index',
41
+ UI_DASHBOARD_HARVESTER_LEGACY_PLUGIN: 'ui-dashboard-harvester-legacy-plugin',
39
42
  UI_OFFLINE_PREFERRED: 'ui-offline-preferred',
40
43
  SYSTEM_DEFAULT_REGISTRY: 'system-default-registry',
41
44
  UI_ISSUES: 'ui-issues',
@@ -63,11 +66,9 @@ export const SETTING = {
63
66
  // These are the settings that are allowed to be edited via the UI
64
67
  export const ALLOWED_SETTINGS = {
65
68
  [SETTING.CA_CERTS]: { kind: 'multiline', readOnly: true },
66
- // [SETTING.CLUSTER_DEFAULTS]: { kind: 'json' },
67
69
  [SETTING.ENGINE_URL]: {},
68
70
  [SETTING.ENGINE_ISO_URL]: {},
69
- // [SETTING.PL]: {},
70
- // [SETTING.ISSUES]: {},
71
+ [SETTING.CATTLE_PASSWORD_MIN_LENGTH]: { kind: 'integer' },
71
72
  [SETTING.INGRESS_IP_DOMAIN]: {},
72
73
  [SETTING.AUTH_USER_INFO_MAX_AGE_SECONDS]: {},
73
74
  [SETTING.AUTH_USER_SESSION_TTL_MINUTES]: {},
@@ -78,7 +79,6 @@ export const ALLOWED_SETTINGS = {
78
79
  [SETTING.AUTH_USER_INFO_RESYNC_CRON]: {},
79
80
  [SETTING.SERVER_URL]: { kind: 'url', canReset: true },
80
81
  [SETTING.RKE_METADATA_CONFIG]: { kind: 'json' },
81
- // [SETTING.BANNERS]: { kind: 'json' },
82
82
  [SETTING.SYSTEM_DEFAULT_REGISTRY]: {},
83
83
  [SETTING.UI_INDEX]: {},
84
84
  [SETTING.UI_DASHBOARD_INDEX]: {},
@@ -94,74 +94,19 @@ export const ALLOWED_SETTINGS = {
94
94
  },
95
95
  [SETTING.HIDE_LOCAL_CLUSTER]: { kind: 'boolean' },
96
96
  };
97
- // harvester Settings ID
98
- export const HCI_SETTING = {
99
- BACKUP_TARGET: 'backup-target',
100
- LOG_LEVEL: 'log-level',
101
- SERVER_VERSION: 'server-version',
102
- UI_INDEX: 'ui-index',
103
- UPGRADE_CHECKER_ENABLED: 'upgrade-checker-enabled',
104
- UPGRADE_CHECKER_URL: 'upgrade-checker-url',
105
- VLAN: 'vlan',
106
- UI_SOURCE: 'ui-source',
107
- HTTP_PROXY: 'http-proxy',
108
- ADDITIONAL_CA: 'additional-ca',
109
- OVERCOMMIT_CONFIG: 'overcommit-config',
110
- CLUSTER_REGISTRATION_URL: 'cluster-registration-url',
111
- DEFAULT_STORAGE_CLASS: 'default-storage-class',
112
- VIP: 'vip-pools',
113
- SUPPORT_BUNDLE_TIMEOUT: 'support-bundle-timeout',
114
- SUPPORT_BUNDLE_IMAGE: 'support-bundle-image',
115
- VM_FORCE_RESET_POLICY: 'vm-force-reset-policy',
116
- SSL_CERTIFICATES: 'ssl-certificates',
117
- SSL_PARAMETERS: 'ssl-parameters',
118
- SUPPORT_BUNDLE_NAMESPACES: 'support-bundle-namespaces',
119
- AUTO_DISK_PROVISION_PATHS: 'auto-disk-provision-paths',
120
- RANCHER_MONITORING: 'fleet-local/rancher-monitoring',
121
- RELEASE_DOWNLOAD_URL: 'release-download-url'
122
- };
123
- export const HCI_ALLOWED_SETTINGS = {
124
- [HCI_SETTING.BACKUP_TARGET]: { kind: 'json', from: 'import' },
125
- [HCI_SETTING.LOG_LEVEL]: {
126
- kind: 'enum',
127
- options: ['info', 'debug', 'trace']
128
- },
129
- [HCI_SETTING.VLAN]: {
130
- kind: 'custom', from: 'import', alias: 'vlan'
131
- },
132
- [HCI_SETTING.SERVER_VERSION]: { readOnly: true },
133
- [HCI_SETTING.UPGRADE_CHECKER_ENABLED]: { kind: 'boolean' },
134
- [HCI_SETTING.UPGRADE_CHECKER_URL]: { kind: 'url' },
135
- [HCI_SETTING.HTTP_PROXY]: { kind: 'json', from: 'import' },
136
- [HCI_SETTING.ADDITIONAL_CA]: {
137
- kind: 'multiline', canReset: true, from: 'import'
138
- },
139
- [HCI_SETTING.OVERCOMMIT_CONFIG]: { kind: 'json', from: 'import' },
140
- [HCI_SETTING.SUPPORT_BUNDLE_TIMEOUT]: {},
141
- [HCI_SETTING.SUPPORT_BUNDLE_IMAGE]: { kind: 'json', from: 'import' },
142
- [HCI_SETTING.VM_FORCE_RESET_POLICY]: { kind: 'json', from: 'import' },
143
- [HCI_SETTING.SSL_CERTIFICATES]: { kind: 'json', from: 'import' },
144
- [HCI_SETTING.VIP]: {
145
- kind: 'json', from: 'import', canReset: true
146
- },
147
- [HCI_SETTING.SSL_PARAMETERS]: {
148
- kind: 'json', from: 'import', canReset: true
149
- },
150
- [HCI_SETTING.SUPPORT_BUNDLE_NAMESPACES]: { from: 'import', canReset: true },
151
- [HCI_SETTING.AUTO_DISK_PROVISION_PATHS]: { canReset: true },
152
- [HCI_SETTING.RANCHER_MONITORING]: {
153
- kind: 'custom', from: 'import', canReset: true, customFormatter: 'json', alias: 'harvester-monitoring'
97
+
98
+ export const DEFAULT_PERF_SETTING = {
99
+ incrementalLoading: {
100
+ enabled: true,
101
+ threshold: 1500,
154
102
  },
155
- [HCI_SETTING.RELEASE_DOWNLOAD_URL]: { kind: 'url' },
156
- };
157
- export const HCI_SINGLE_CLUSTER_ALLOWED_SETTING = {
158
- [HCI_SETTING.UI_SOURCE]: {
159
- kind: 'enum',
160
- options: ['auto', 'external', 'bundled']
103
+ manualRefresh: {
104
+ enabled: false,
105
+ threshold: 1500,
161
106
  },
162
- [HCI_SETTING.UI_INDEX]: { kind: 'url' },
163
- [HCI_SETTING.CLUSTER_REGISTRATION_URL]: { kind: 'url' },
107
+ disableWebsocketNotification: false
164
108
  };
109
+
165
110
  export const fetchOrCreateSetting = async(store, id, val, save = true) => {
166
111
  let setting;
167
112
 
@@ -181,6 +126,7 @@ export const fetchOrCreateSetting = async(store, id, val, save = true) => {
181
126
 
182
127
  return setting;
183
128
  };
129
+
184
130
  export const setSetting = async(store, id, val) => {
185
131
  const setting = await fetchOrCreateSetting(store, id, val, false);
186
132
 
@@ -870,7 +870,6 @@ export const FEATURE_DESCRIPTION = {
870
870
  value: 'status.description',
871
871
  align: 'left',
872
872
  sort: ['status.description'],
873
- width: 300,
874
873
  formatter: 'Translate',
875
874
  formatterOpts: { prefix: 'featureFlags.description' },
876
875
  };
package/config/types.js CHANGED
@@ -79,7 +79,8 @@ export const WORKLOAD_TYPES = {
79
79
  JOB: 'batch.job',
80
80
  STATEFUL_SET: 'apps.statefulset',
81
81
  REPLICA_SET: 'apps.replicaset',
82
- REPLICATION_CONTROLLER: 'replicationcontroller'
82
+ REPLICATION_CONTROLLER: 'replicationcontroller',
83
+ POD: 'pod'
83
84
  };
84
85
 
85
86
  const {
@@ -267,30 +268,9 @@ export const VIRTUAL_TYPES = {
267
268
 
268
269
  // harvester
269
270
  export const HCI = {
270
- VM: 'kubevirt.io.virtualmachine',
271
- VMI: 'kubevirt.io.virtualmachineinstance',
272
- VMIM: 'kubevirt.io.virtualmachineinstancemigration',
273
- VM_TEMPLATE: 'harvesterhci.io.virtualmachinetemplate',
274
- VM_VERSION: 'harvesterhci.io.virtualmachinetemplateversion',
275
- IMAGE: 'harvesterhci.io.virtualmachineimage',
276
- SSH: 'harvesterhci.io.keypair',
277
- VOLUME: 'harvesterhci.io.volume',
278
- USER: 'harvesterhci.io.user',
279
- SETTING: 'harvesterhci.io.setting',
280
- UPGRADE: 'harvesterhci.io.upgrade',
281
- BACKUP: 'harvesterhci.io.virtualmachinebackup',
282
- RESTORE: 'harvesterhci.io.virtualmachinerestore',
283
- NODE_NETWORK: 'network.harvesterhci.io.nodenetwork',
284
- CLUSTER_NETWORK: 'network.harvesterhci.io.clusternetwork',
285
- SUPPORT_BUNDLE: 'harvesterhci.io.supportbundle',
286
- NETWORK_ATTACHMENT: 'harvesterhci.io.networkattachmentdefinition',
287
- CLUSTER: 'harvesterhci.io.management.cluster',
288
- DASHBOARD: 'harvesterhci.io.dashboard',
289
- BLOCK_DEVICE: 'harvesterhci.io.blockdevice',
290
- CLOUD_TEMPLATE: 'harvesterhci.io.cloudtemplate',
291
- HOST: 'harvesterhci.io.host',
292
- VERSION: 'harvesterhci.io.version',
293
- MANAGED_CHART: 'harvesterhci.io.managedchart',
271
+ CLUSTER: 'harvesterhci.io.management.cluster',
272
+ DASHBOARD: 'harvesterhci.io.dashboard',
273
+ IMAGE: 'harvesterhci.io.virtualmachineimage',
294
274
  };
295
275
 
296
276
  export const VIRTUAL_HARVESTER_PROVIDER = 'harvester';
@@ -16,6 +16,7 @@ type RouteInstallHistory = {
16
16
 
17
17
  export class PluginRoutes {
18
18
  router: Router;
19
+ pluginRoutes: RouteConfig[] = [];
19
20
 
20
21
  replacedRoutes: RouteInstallHistory = {};
21
22
 
@@ -53,7 +54,7 @@ export class PluginRoutes {
53
54
 
54
55
  break;
55
56
  } else {
56
- // Need to updare the previous item so that when it is removed, it restores the correct route
57
+ // Need to update the previous item so that when it is removed, it restores the correct route
57
58
  const previous = info[index - 1];
58
59
 
59
60
  previous.route = savedRoute.route;
@@ -65,14 +66,24 @@ export class PluginRoutes {
65
66
  }
66
67
  });
67
68
 
69
+ // Remove routes from pluginRoutes, update matcher (to avoid dupes when re-adding plugin routes)
70
+ this.pluginRoutes = this.pluginRoutes.filter(pR => !plugin.routes.find((r: any) => pR === r.route));
71
+ this.updateMatcher([], [
72
+ ...this.pluginRoutes,
73
+ ...(this.router.options.routes || [])
74
+ ]);
75
+
76
+ // Restore appropriate routes
68
77
  if (restore.length > 0) {
69
78
  this.addRoutes(null, restore);
70
79
  }
71
80
  }
72
81
 
73
82
  public addRoutes(plugin: any, routes: RouteInfo[]) {
74
- const appRoutes = this.router.options.routes || [];
75
- let replaced = 0;
83
+ const allRoutes = [
84
+ ...this.pluginRoutes,
85
+ ...(this.router.options.routes || [])
86
+ ];
76
87
 
77
88
  // Need to take into account if routes are being replaced
78
89
  // Despite what the docs say, routes are not replaced, so we use a workaround
@@ -82,18 +93,18 @@ export class PluginRoutes {
82
93
  let existing: any;
83
94
 
84
95
  if (r.parent) {
85
- const pExisting = appRoutes.findIndex((route: any) => route.name === r.parent) as any;
96
+ const pExisting = allRoutes.findIndex((route: any) => route.name === r.parent) as any;
86
97
  const path = `${ pExisting.path }${ r.route.path }`;
87
98
 
88
99
  // TODO: Validate
89
- existing = appRoutes.findIndex((route: any) => route.path === path);
100
+ existing = allRoutes.findIndex((route: any) => route.path === path);
90
101
  } else {
91
102
  // no parent route
92
- existing = appRoutes.findIndex((route: any) => route.name === r.route.name);
103
+ existing = allRoutes.findIndex((route: any) => route.name === r.route.name);
93
104
  }
94
105
 
95
106
  if (existing >= 0) {
96
- const existingRoute = appRoutes[existing];
107
+ const existingRoute = allRoutes[existing];
97
108
 
98
109
  // Store the route so we can restore it on uninstall
99
110
  if (plugin && existingRoute?.name) {
@@ -107,32 +118,33 @@ export class PluginRoutes {
107
118
  });
108
119
  }
109
120
 
110
- appRoutes.splice(existing, 1);
111
- replaced++;
121
+ allRoutes.splice(existing, 1);
112
122
  }
113
123
  });
114
124
 
115
- const newRouter: Router = replaced > 0 ? new Router({
125
+ this.updateMatcher(routes, allRoutes);
126
+ }
127
+
128
+ private updateMatcher(newRoutes: RouteInfo[], allRoutes: RouteConfig[]) {
129
+ // Note - Always use a new router and replace the existing router's matching
130
+ // Using the existing router and adding routes to it will force nuxt middleware (specifically authenticated on default layout) to
131
+ // execute many times (nuxt middleware boils down to router.beforeEach). This issue was seen refreshing in a harvester cluster with a
132
+ // dynamically loaded cluster
133
+ const newRouter: Router = new Router({
116
134
  mode: 'history',
117
- routes: appRoutes
118
- }) : this.router;
135
+ routes: allRoutes
136
+ });
119
137
 
120
- routes.forEach((r: any) => {
138
+ newRoutes.forEach((r: any) => {
121
139
  if (r.parent) {
122
140
  newRouter.addRoute(r.parent, r.route);
123
141
  } else {
124
142
  newRouter.addRoute(r.route);
125
143
  }
144
+ this.pluginRoutes.push(r.route);
126
145
  });
127
146
 
128
- if (replaced > 0) {
129
- // Typing is incorrect
130
- (this.router as any).matcher = (newRouter as any).matcher;
131
- }
132
-
133
- // If we replaced any routes, then we should reload on uninstall
134
- if (plugin) {
135
- plugin.reloadOnUninstall = replaced > 0;
136
- }
147
+ // Typing is incorrect
148
+ (this.router as any).matcher = (newRouter as any).matcher;
137
149
  }
138
150
  }
package/core/plugin.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { RouteConfig } from 'vue-router';
2
2
  import { DSL as STORE_DSL } from '@shell/store/type-map';
3
- import { IPlugin } from './types';
3
+ import { CoreStoreInit, IPlugin } from './types';
4
4
  import coreStore, { coreStoreModule, coreStoreState } from '@shell/plugins/dashboard-store';
5
5
  import {
6
6
  PluginRouteConfig, RegisterStore, UnregisterStore, CoreStoreSpecifics, CoreStoreConfig, OnNavToPackage, OnNavAwayFromPackage, OnLogOut
@@ -23,6 +23,8 @@ export class Plugin implements IPlugin {
23
23
  // Plugin metadata (plugin package.json)
24
24
  public _metadata: any = {};
25
25
 
26
+ public _validators: {[key:string]: Function } = {}
27
+
26
28
  // Is this a built-in plugin (bundled with the application)
27
29
  public builtin = false;
28
30
 
@@ -43,6 +45,14 @@ export class Plugin implements IPlugin {
43
45
  this.name = this._metadata.name || this.id;
44
46
  }
45
47
 
48
+ get validators() {
49
+ return this._validators;
50
+ }
51
+
52
+ set validators(vals: {[key:string]: Function }) {
53
+ this._validators = vals;
54
+ }
55
+
46
56
  // Track which products the plugin creates
47
57
  DSL(store: any, productName: string) {
48
58
  const storeDSL = STORE_DSL(store, productName);
@@ -104,13 +114,14 @@ export class Plugin implements IPlugin {
104
114
  });
105
115
  }
106
116
 
107
- addDashboardStore(storeName: string, storeSpecifics: CoreStoreSpecifics, config: CoreStoreConfig) {
117
+ addDashboardStore(storeName: string, storeSpecifics: CoreStoreSpecifics, config: CoreStoreConfig, init?: CoreStoreInit) {
108
118
  this.stores.push({
109
119
  storeName,
110
120
  register: () => {
111
121
  return coreStore(
112
122
  this.storeFactory(storeSpecifics, config),
113
123
  config,
124
+ init,
114
125
  );
115
126
  },
116
127
  unregister: (store: any) => {
@@ -167,7 +178,8 @@ export class Plugin implements IPlugin {
167
178
  const nparts = name.split('/');
168
179
 
169
180
  // Support components in a sub-folder - component_name/index.vue (and ignore other componnets in that folder)
170
- if (nparts.length === 2) {
181
+ // Allow store-scoped models via sub-folder - pkgname/models/storename/type will be registered as storename/type to avoid overwriting shell/models/type
182
+ if (nparts.length === 2 && type !== 'models') {
171
183
  if (nparts[1] !== 'index') {
172
184
  return;
173
185
  }
@@ -1,4 +1,5 @@
1
1
  import Vue from 'vue';
2
+ import $ from 'jquery';
2
3
  import JSZip from 'jszip';
3
4
  import jsyaml from 'js-yaml';
4
5
 
@@ -25,6 +26,7 @@ export default function({
25
26
  window.Vue = Vue;
26
27
 
27
28
  // Global libraries - allows us to externalise these to reduce package bundle size
29
+ window.$ = $;
28
30
  window.__jszip = JSZip;
29
31
  window.__jsyaml = jsyaml;
30
32
  }