@rancher/shell 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/assets/brand/suse/dark/rancher-logo.svg +1 -148
  2. package/assets/brand/suse/rancher-logo.svg +1 -130
  3. package/assets/images/featured/img1.jpg +0 -0
  4. package/assets/images/featured.jpg +0 -0
  5. package/assets/images/generic-plugin.svg +7 -0
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/translations/en-us.yaml +209 -813
  10. package/assets/translations/zh-hans.yaml +28 -792
  11. package/components/ActionMenu.vue +3 -3
  12. package/components/AsyncButton.vue +17 -2
  13. package/components/ButtonDropdown.vue +4 -0
  14. package/components/Carousel.vue +291 -0
  15. package/components/CodeMirror.vue +6 -8
  16. package/components/CommunityLinks.vue +70 -19
  17. package/components/ContainerResourceLimit.vue +14 -0
  18. package/components/CruResource.vue +11 -3
  19. package/components/Dialog.vue +102 -0
  20. package/components/ExplorerMembers.vue +121 -0
  21. package/components/ExplorerProjectsNamespaces.vue +404 -0
  22. package/components/GrafanaDashboard.vue +17 -2
  23. package/components/IconMessage.vue +9 -1
  24. package/components/LocaleSelector.vue +114 -0
  25. package/components/PromptModal.vue +2 -3
  26. package/components/ResourceList/index.vue +1 -1
  27. package/components/ResourceTable.vue +9 -7
  28. package/components/SimpleBox.vue +6 -4
  29. package/components/SingleClusterInfo.vue +1 -1
  30. package/components/SortableTable/index.vue +18 -25
  31. package/components/SortableTable/selection.js +1 -0
  32. package/components/Tabbed/Tab.vue +5 -0
  33. package/components/Tabbed/index.vue +29 -2
  34. package/components/auth/AzureWarning.vue +5 -1
  35. package/components/auth/Principal.vue +2 -1
  36. package/components/auth/RoleDetailEdit.vue +18 -11
  37. package/components/fleet/FleetBundles.vue +8 -3
  38. package/components/fleet/FleetRepos.vue +0 -2
  39. package/components/fleet/FleetSummary.vue +6 -0
  40. package/components/form/KeyValue.vue +80 -58
  41. package/components/form/NameNsDescription.vue +12 -8
  42. package/components/form/NodeScheduling.vue +1 -1
  43. package/components/form/ResourceTabs/index.vue +5 -1
  44. package/components/form/WorkloadPorts.vue +1 -1
  45. package/components/formatter/ClusterLink.vue +3 -7
  46. package/components/formatter/WorkloadHealthScale.vue +1 -1
  47. package/components/nav/Header.vue +9 -9
  48. package/components/nav/NamespaceFilter.vue +10 -7
  49. package/components/nav/TopLevelMenu.vue +10 -65
  50. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  51. package/config/footer.js +13 -14
  52. package/config/labels-annotations.js +2 -1
  53. package/config/product/explorer.js +5 -4
  54. package/config/product/harvester-manager.js +64 -2
  55. package/config/product/legacy.js +0 -47
  56. package/config/product/manager.js +9 -0
  57. package/config/product/multi-cluster-apps.js +0 -12
  58. package/config/product/settings.js +12 -1
  59. package/config/product/uiplugins.js +17 -0
  60. package/config/settings.js +37 -72
  61. package/config/table-headers.js +0 -1
  62. package/config/types.js +9 -25
  63. package/config/uiplugins.js +60 -0
  64. package/content/docs/en-us/getting-started.md +1 -26
  65. package/core/plugin-routes.ts +34 -22
  66. package/core/plugin.ts +15 -3
  67. package/core/plugins-loader.js +2 -0
  68. package/core/plugins.js +91 -36
  69. package/core/types.ts +7 -1
  70. package/detail/provisioning.cattle.io.cluster.vue +15 -2
  71. package/detail/workload/index.vue +11 -5
  72. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  73. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  74. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  75. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  76. package/dialog/DiagnosticTimingsDialog.vue +116 -0
  77. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  78. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  79. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  80. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  81. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +9 -3
  82. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  83. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  84. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  85. package/edit/auth/azuread.vue +44 -6
  86. package/edit/management.cattle.io.project.vue +2 -2
  87. package/edit/namespace.vue +17 -10
  88. package/edit/networking.k8s.io.ingress/index.vue +2 -2
  89. package/edit/persistentvolume/index.vue +3 -0
  90. package/edit/persistentvolumeclaim.vue +1 -0
  91. package/edit/pod.vue +27 -0
  92. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  93. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  94. package/edit/provisioning.cattle.io.cluster/rke2.vue +76 -5
  95. package/edit/service.vue +8 -6
  96. package/edit/workload/__tests__/Upgrading.test.ts +1 -0
  97. package/edit/workload/index.vue +375 -15
  98. package/edit/workload/mixins/workload.js +62 -7
  99. package/edit/workload/storage/ContainerMountPaths.vue +240 -0
  100. package/edit/workload/storage/Mount.vue +1 -0
  101. package/edit/workload/storage/awsElasticBlockStore.vue +20 -1
  102. package/edit/workload/storage/azureDisk.vue +22 -2
  103. package/edit/workload/storage/azureFile.vue +20 -2
  104. package/edit/workload/storage/csi/index.vue +23 -1
  105. package/edit/workload/storage/gcePersistentDisk.vue +20 -2
  106. package/edit/workload/storage/index.vue +23 -49
  107. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  108. package/edit/workload/storage/vsphereVolume.vue +11 -1
  109. package/layouts/default.vue +63 -32
  110. package/layouts/error.vue +5 -1
  111. package/layouts/home.vue +14 -5
  112. package/layouts/plain.vue +10 -5
  113. package/list/harvesterhci.io.management.cluster.vue +74 -33
  114. package/list/management.cattle.io.setting.vue +3 -3
  115. package/list/namespace.vue +3 -5
  116. package/list/provisioning.cattle.io.cluster.vue +1 -1
  117. package/machine-config/amazonec2.vue +2 -0
  118. package/machine-config/harvester.vue +100 -51
  119. package/middleware/authenticated.js +56 -52
  120. package/mixins/form-validation.js +1 -1
  121. package/mixins/resource-fetch.js +3 -1
  122. package/models/catalog.cattle.io.uiplugin.js +34 -0
  123. package/models/cluster/node.js +25 -2
  124. package/models/fleet.cattle.io.bundle.js +27 -20
  125. package/models/harvesterhci.io.management.cluster.js +200 -5
  126. package/models/management.cattle.io.cluster.js +1 -1
  127. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  128. package/models/management.cattle.io.project.js +23 -2
  129. package/models/namespace.js +19 -3
  130. package/models/pod.js +19 -2
  131. package/models/provisioning.cattle.io.cluster.js +16 -6
  132. package/models/workload.js +9 -246
  133. package/models/workload.service.js +314 -0
  134. package/nuxt.config.js +80 -34
  135. package/package.json +107 -108
  136. package/pages/auth/login.vue +11 -2
  137. package/pages/auth/setup.vue +1 -1
  138. package/pages/c/_cluster/_product/members/index.vue +3 -93
  139. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  140. package/pages/c/_cluster/apps/charts/index.vue +46 -1
  141. package/pages/c/_cluster/apps/charts/install.vue +10 -9
  142. package/pages/c/_cluster/explorer/index.vue +72 -9
  143. package/pages/c/_cluster/explorer/tools/index.vue +12 -5
  144. package/pages/c/_cluster/mcapps/index.vue +1 -1
  145. package/pages/c/_cluster/settings/brand.vue +0 -40
  146. package/pages/c/_cluster/settings/links.vue +200 -0
  147. package/pages/c/_cluster/settings/performance.vue +19 -16
  148. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +232 -0
  149. package/pages/c/_cluster/uiplugins/InstallDialog.vue +242 -0
  150. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +284 -0
  151. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +130 -0
  152. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +253 -0
  153. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +115 -0
  154. package/pages/c/_cluster/uiplugins/index.vue +694 -0
  155. package/pages/diagnostic.vue +185 -101
  156. package/pages/docs/_doc.vue +3 -1
  157. package/pages/fail-whale.vue +1 -10
  158. package/pages/home.vue +21 -56
  159. package/pages/index.vue +18 -4
  160. package/pages/prefs.vue +108 -86
  161. package/pages/safeMode.vue +17 -0
  162. package/pages/support/index.vue +23 -15
  163. package/pkg/auto-import.js +44 -7
  164. package/pkg/dynamic-importer.lib.js +4 -0
  165. package/pkg/dynamic-plugin-loader.js +28 -0
  166. package/pkg/import.js +2 -2
  167. package/pkg/model-loader-require.lib.js +3 -0
  168. package/pkg/vue.config.js +9 -6
  169. package/plugins/dashboard-store/model-loader-require.js +12 -0
  170. package/plugins/dashboard-store/model-loader.js +4 -1
  171. package/plugins/dashboard-store/resource-class.js +12 -5
  172. package/plugins/formatters.js +15 -0
  173. package/plugins/plugin.js +56 -4
  174. package/plugins/steve/actions.js +1 -1
  175. package/plugins/steve/index.js +6 -4
  176. package/plugins/steve/mutations.js +1 -1
  177. package/plugins/steve/subscribe.js +89 -56
  178. package/plugins/steve/web-worker.steve-sub-worker.js +24 -15
  179. package/promptRemove/management.cattle.io.globalrole.vue +47 -0
  180. package/promptRemove/management.cattle.io.roletemplate.vue +47 -0
  181. package/promptRemove/mixin/roleDeletionCheck.js +97 -0
  182. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  183. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  184. package/scripts/build-pkg.sh +48 -2
  185. package/scripts/drone-build-pkg.sh +31 -0
  186. package/scripts/publish-shell.sh +11 -12
  187. package/scripts/serve-pkgs +17 -10
  188. package/scripts/sync-shell-deps +37 -0
  189. package/store/catalog.js +12 -9
  190. package/store/i18n.js +26 -12
  191. package/store/index.js +4 -181
  192. package/store/prefs.js +46 -2
  193. package/store/type-map.js +47 -33
  194. package/store/uiplugins.ts +15 -61
  195. package/utils/__tests__/object.test.ts +0 -24
  196. package/utils/__tests__/selector.test.ts +1 -1
  197. package/utils/cluster.js +1 -1
  198. package/utils/custom-validators.js +1 -12
  199. package/utils/dynamic-importer.js +5 -1
  200. package/utils/grafana.js +2 -6
  201. package/utils/socket.js +41 -20
  202. package/utils/string.js +1 -7
  203. package/utils/validators/formRules/__tests__/index.test.ts +108 -0
  204. package/utils/validators/formRules/index.ts +9 -1
  205. package/utils/validators/setting.js +0 -35
  206. package/yarn-error.log +195 -0
  207. package/components/FilterLabel.vue +0 -254
  208. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  209. package/components/VMConsoleBar.vue +0 -87
  210. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  211. package/components/dialog/harvester/BackupModal.vue +0 -117
  212. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  213. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  214. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  215. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  216. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  217. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  218. package/components/dialog/harvester/SupportBundle.vue +0 -217
  219. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  220. package/components/form/SerialConsole/index.vue +0 -267
  221. package/components/formatter/AttachVMWithName.vue +0 -46
  222. package/components/formatter/CloudInitType.vue +0 -27
  223. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  224. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  225. package/components/formatter/HarvesterDiskState.vue +0 -66
  226. package/components/formatter/HarvesterHostName.vue +0 -66
  227. package/components/formatter/HarvesterIpAddress.vue +0 -90
  228. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  229. package/components/formatter/HarvesterMigrationState.vue +0 -85
  230. package/components/formatter/HarvesterNodeName.vue +0 -49
  231. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  232. package/components/formatter/HarvesterVmState.vue +0 -123
  233. package/components/nav/HarvesterUpgrade.vue +0 -232
  234. package/components/novnc/NovncConsole.vue +0 -93
  235. package/components/novnc/NovncConsoleItem.vue +0 -89
  236. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  237. package/config/harvester-map.js +0 -44
  238. package/config/harvester-table-headers.js +0 -27
  239. package/config/product/harvester.js +0 -305
  240. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  241. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  242. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  243. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  244. package/detail/harvesterhci.io.host/index.vue +0 -243
  245. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  246. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  247. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  248. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  249. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  250. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  251. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  252. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  253. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  254. package/edit/harvesterhci.io.host/index.vue +0 -533
  255. package/edit/harvesterhci.io.keypair.vue +0 -112
  256. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  257. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  258. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  259. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  260. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  261. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  262. package/edit/harvesterhci.io.setting/index.vue +0 -201
  263. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  264. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  265. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  266. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  267. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  268. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  269. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  270. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  271. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  272. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  273. package/edit/harvesterhci.io.volume.vue +0 -195
  274. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  275. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  276. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  277. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  278. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  279. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  280. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  281. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  282. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  283. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  284. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  285. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  286. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  287. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  288. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  289. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  290. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  291. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  292. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  293. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  294. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  295. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  296. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  297. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  298. package/edit/workload/types/Deployment.vue +0 -377
  299. package/edit/workload/types/Generic.vue +0 -295
  300. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  301. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  302. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  303. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  304. package/list/harvesterhci.io.host/index.vue +0 -186
  305. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  306. package/list/harvesterhci.io.setting.vue +0 -241
  307. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  308. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  309. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  310. package/list/harvesterhci.io.volume.vue +0 -122
  311. package/list/kubevirt.io.virtualmachine.vue +0 -193
  312. package/mixins/harvester-vm/impl.js +0 -267
  313. package/mixins/harvester-vm/index.js +0 -1357
  314. package/models/harvester/configmap.js +0 -32
  315. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  316. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  317. package/models/harvester/harvesterhci.io.setting.js +0 -127
  318. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  319. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  320. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  321. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  322. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  323. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  324. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  325. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  326. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  327. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  328. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  329. package/models/harvester/management.cattle.io.setting.js +0 -40
  330. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  331. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  332. package/models/harvester/node.js +0 -255
  333. package/models/harvester/persistentvolumeclaim.js +0 -166
  334. package/models/harvester/pod.js +0 -185
  335. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  336. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  337. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  338. package/pages/c/_cluster/harvester/index.vue +0 -24
  339. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  340. package/pages/plugins.vue +0 -387
  341. package/pkg/model-loader.lib.js +0 -3
  342. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  343. package/server/verdaccio-middleware.js +0 -56
  344. package/store/harvester-common.js +0 -126
  345. package/utils/validators/vm-datavolumes.js +0 -38
  346. package/utils/validators/vm-image.js +0 -32
  347. package/utils/validators/vm.js +0 -221
@@ -72,11 +72,6 @@ As of version 2.6, Cluster Manager is no longer provided as a separate UI. The d
72
72
  <tr class="table-group">
73
73
  <td colspan="3">Global</td>
74
74
  </tr>
75
- <tr>
76
- <td>Apps</td>
77
- <td>Global → Apps</td>
78
- <td>Menu → Multi-cluster Apps → Apps</td>
79
- </tr>
80
75
  <tr>
81
76
  <td>Settings</td>
82
77
  <td>Global → Settings</td>
@@ -100,7 +95,7 @@ As of version 2.6, Cluster Manager is no longer provided as a separate UI. The d
100
95
  <tr>
101
96
  <td>Pod Security Policies</td>
102
97
  <td>Global → Security → Pod Security Policies</td>
103
- <td>Menu → Cluster Management → Advanced → Pod Security Policies</td>
98
+ <td>Menu → Cluster Management → Pod Security Policies</td>
104
99
  </tr>
105
100
  <!-- -->
106
101
  <tr class="table-group">
@@ -136,26 +131,11 @@ As of version 2.6, Cluster Manager is no longer provided as a separate UI. The d
136
131
  <td>(Cluster) → Tools → Notifiers</td>
137
132
  <td>Menu → (Cluster) → Legacy -> Notifiers</td>
138
133
  </tr>
139
- <tr>
140
- <td>Logging (V1)</td>
141
- <td>(Cluster) → Tools → Logging</td>
142
- <td>Menu → (Cluster) → Cluster Tools -> Logging (Legacy)</td>
143
- </tr>
144
134
  <tr>
145
135
  <td>Monitoring (V1)</td>
146
136
  <td>(Cluster) → Tools → Monitoring</td>
147
137
  <td>Menu → (Cluster) → Cluster Tools -> Monitoring (Legacy)</td>
148
138
  </tr>
149
- <tr>
150
- <td>Istio (V1)</td>
151
- <td>(Cluster) → Tools → Istio</td>
152
- <td>Menu → (Cluster) → Cluster Tools -> Istio (Legacy)</td>
153
- </tr>
154
- <tr>
155
- <td>CIS Scans (V1)</td>
156
- <td>(Cluster) → Tools → CIS Scans</td>
157
- <td>Menu → (Cluster) → Legacy -> CIS Scans</td>
158
- </tr>
159
139
  <tr class="table-group">
160
140
  <td colspan="3">V1 Monitoring</td>
161
141
  <tr>
@@ -212,11 +192,6 @@ As of version 2.6, Cluster Manager is no longer provided as a separate UI. The d
212
192
  <td>(Cluster) → (Project) → Tools → Monitoring</td>
213
193
  <td>Menu → (Cluster) → Legacy → Project → (Project) → Monitoring</td>
214
194
  </tr>
215
- <tr>
216
- <td>Pipeline</td>
217
- <td>(Cluster) → (Project) → Tools → Pipeline</td>
218
- <td>Menu → (Cluster) → Legacy → Project → (Project) → Pipelines → Configuration</td>
219
- </tr>
220
195
  <tr class="table-group">
221
196
  <td colspan="3">Other</td>
222
197
  </tr>
@@ -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
  }
package/core/plugins.js CHANGED
@@ -2,6 +2,7 @@ import { productsLoaded } from '@shell/store/type-map';
2
2
  import { clearModelCache } from '@shell/plugins/dashboard-store/model-loader';
3
3
  import { Plugin } from './plugin';
4
4
  import { PluginRoutes } from './plugin-routes';
5
+ import { UI_PLUGIN_BASE_URL } from '@shell/config/uiplugins';
5
6
 
6
7
  const MODEL_TYPE = 'models';
7
8
 
@@ -12,10 +13,12 @@ export default function({
12
13
  redirect
13
14
  }, inject) {
14
15
  const dynamic = {};
16
+ const validators = {};
15
17
  let _lastLoaded = 0;
16
18
 
17
19
  // Track which plugin loaded what, so we can unload stuff
18
20
  const plugins = {};
21
+
19
22
  const pluginRoutes = new PluginRoutes(app.router);
20
23
 
21
24
  inject('plugin', {
@@ -33,6 +36,17 @@ export default function({
33
36
  return internal;
34
37
  },
35
38
 
39
+ // Load a plugin from a UI package
40
+ loadAsyncByNameAndVersion(name, version, url) {
41
+ const id = `${ name }-${ version }`;
42
+
43
+ if (!url) {
44
+ url = `${ UI_PLUGIN_BASE_URL }/${ name }/${ version }/plugin/${ id }.umd.min.js`;
45
+ }
46
+
47
+ return this.loadAsync(id, url);
48
+ },
49
+
36
50
  // Load a plugin from a UI package
37
51
  loadAsync(id, mainFile) {
38
52
  return new Promise((resolve, reject) => {
@@ -43,44 +57,69 @@ export default function({
43
57
  element.type = 'text/javascript';
44
58
  element.async = true;
45
59
 
46
- element.onload = () => {
47
- element.parentElement.removeChild(element);
60
+ // id is `<product>-<version>`.
61
+ const oldPlugin = Object.values(plugins).find(p => id.startsWith(p.name));
48
62
 
49
- if (!window[id]) {
50
- return reject(new Error('Could not load plugin code'));
51
- }
63
+ let removed = Promise.resolve();
64
+
65
+ if (oldPlugin) {
66
+ // Uninstall existing plugin if there is one. This ensures that last loaded plugin is not always used
67
+ // (nav harv1-->harv2-->harv1 and harv2 would be shown)
68
+ removed = this.removePlugin(oldPlugin.name).then(() => {
69
+ delete window[oldPlugin.id];
52
70
 
53
- // Update the timestamp that new plugins were loaded - may be needed
54
- // to update caches when new plugins are loaded
55
- _lastLoaded = new Date().getTime();
71
+ delete plugins[oldPlugin.id];
72
+ });
73
+ }
74
+
75
+ removed.then(() => {
76
+ element.onload = () => {
77
+ element.parentElement.removeChild(element);
78
+
79
+ if (!window[id]) {
80
+ return reject(new Error('Could not load plugin code'));
81
+ }
56
82
 
57
- // TODO: Error if we are loading a plugin already loaded?
58
- // name is the name of the plugin, including the version number
59
- const plugin = new Plugin(id);
83
+ // Update the timestamp that new plugins were loaded - may be needed
84
+ // to update caches when new plugins are loaded
85
+ _lastLoaded = new Date().getTime();
60
86
 
61
- plugins[id] = plugin;
87
+ // name is the name of the plugin, including the version number
88
+ const plugin = new Plugin(id);
62
89
 
63
- // Initialize the plugin
64
- window[id].default(plugin, this.internal());
90
+ plugins[id] = plugin;
65
91
 
66
- // Uninstall existing plugin if there is one
67
- this.removePlugin(plugin.name);
92
+ // Initialize the plugin
93
+ window[id].default(plugin, this.internal());
68
94
 
69
- // Load all of the types etc from the plugin
70
- this.applyPlugin(plugin);
95
+ // Uninstall existing plugin if there is one
96
+ this.removePlugin(plugin.name); // Removing this causes the plugin to not load on refresh
71
97
 
72
- // Add the plugin to the store
73
- store.dispatch('uiplugins/addPlugin', plugin);
98
+ // Load all of the types etc from the plugin
99
+ this.applyPlugin(plugin);
74
100
 
75
- resolve();
76
- };
101
+ // Add the plugin to the store
102
+ store.dispatch('uiplugins/addPlugin', plugin);
77
103
 
78
- element.onerror = (e) => {
79
- element.parentElement.removeChild(element);
80
- reject(e);
81
- };
104
+ resolve();
105
+ };
82
106
 
83
- document.head.appendChild(element);
107
+ element.onerror = (e) => {
108
+ element.parentElement.removeChild(element);
109
+ // Massage the error into something useful
110
+ const errorMessage = `Failed to load script from '${ e.target.src }'`;
111
+
112
+ console.error(errorMessage, e); // eslint-disable-line no-console
113
+ reject(new Error(errorMessage)); // This is more useful where it's used
114
+ };
115
+
116
+ document.head.appendChild(element);
117
+ }).catch((e) => {
118
+ const errorMessage = `Failed to unload old plugin${ oldPlugin?.id }`;
119
+
120
+ console.error(errorMessage, e); // eslint-disable-line no-console
121
+ reject(new Error(errorMessage)); // This is more useful where it's used
122
+ });
84
123
  });
85
124
  },
86
125
 
@@ -114,15 +153,17 @@ export default function({
114
153
  },
115
154
 
116
155
  // Remove the plugin
117
- removePlugin(name) {
156
+ async removePlugin(name) {
118
157
  const plugin = Object.values(plugins).find(p => p.name === name);
119
158
 
120
159
  if (!plugin) {
121
160
  return;
122
161
  }
123
162
 
163
+ const promises = [];
164
+
124
165
  plugin.productNames.forEach((product) => {
125
- store.dispatch('type-map/removeProduct', { product, plugin });
166
+ promises.push(store.dispatch('type-map/removeProduct', { product, plugin }));
126
167
  });
127
168
 
128
169
  // Remove all of the types
@@ -138,13 +179,13 @@ export default function({
138
179
 
139
180
  // Remove locales
140
181
  plugin.locales.forEach((localeObj) => {
141
- store.dispatch('i18n/removeLocale', localeObj);
182
+ promises.push(store.dispatch('i18n/removeLocale', localeObj));
142
183
  });
143
184
 
144
185
  if (plugin.types.models) {
145
186
  // Ask the Steve stores to forget any data it has for models that we are removing
146
- this.removeTypeFromStore(store, 'rancher', Object.keys(plugin.types.models));
147
- this.removeTypeFromStore(store, 'management', Object.keys(plugin.types.models));
187
+ promises.push(...this.removeTypeFromStore(store, 'rancher', Object.keys(plugin.types.models)));
188
+ promises.push(...this.removeTypeFromStore(store, 'management', Object.keys(plugin.types.models)));
148
189
  }
149
190
 
150
191
  // Uninstall routes
@@ -154,19 +195,24 @@ export default function({
154
195
  plugin.uninstallHooks.forEach(fn => fn(plugin, this.internal()));
155
196
 
156
197
  // Remove the plugin itself
157
- store.dispatch('uiplugins/removePlugin', name);
198
+ promises.push( store.dispatch('uiplugins/removePlugin', name));
158
199
 
159
200
  // Unregister vuex stores
160
201
  plugin.stores.forEach(pStore => pStore.unregister(store));
161
202
 
203
+ // Remove validators
204
+ Object.keys(plugin.validators).forEach((key) => {
205
+ delete validators[key];
206
+ });
207
+
208
+ await Promise.all(promises);
209
+
162
210
  // Update last load since we removed a plugin
163
211
  _lastLoaded = new Date().getTime();
164
212
  },
165
213
 
166
214
  removeTypeFromStore(store, storeName, types) {
167
- (types || []).forEach((type) => {
168
- store.commit(`${ storeName }/forgetType`, type);
169
- });
215
+ return (types || []).map(type => store.commit(`${ storeName }/forgetType`, type));
170
216
  },
171
217
 
172
218
  // Apply the plugin based on its metadata
@@ -200,6 +246,11 @@ export default function({
200
246
 
201
247
  // Routes
202
248
  pluginRoutes.addRoutes(plugin, plugin.routes);
249
+
250
+ // Validators
251
+ Object.keys(plugin.validators).forEach((key) => {
252
+ validators[key] = plugin.validators[key];
253
+ });
203
254
  },
204
255
 
205
256
  /**
@@ -252,6 +303,10 @@ export default function({
252
303
  return dynamic[typeName]?.[name];
253
304
  },
254
305
 
306
+ getValidator(name) {
307
+ return validators[name];
308
+ },
309
+
255
310
  // Timestamp that a UI package was last loaded
256
311
  // Typically used to invalidate caches (e.g. i18n) when new plugins are loaded
257
312
  get lastLoad() {
package/core/types.ts CHANGED
@@ -18,6 +18,7 @@ export interface PackageMetadata {
18
18
  export type VuexStoreObject = { [key: string]: any }
19
19
  export type CoreStoreSpecifics = { state: () => VuexStoreObject, getters: VuexStoreObject, mutations: VuexStoreObject, actions: VuexStoreObject }
20
20
  export type CoreStoreConfig = { namespace: string, baseUrl?: string, modelBaseClass?: string, supportsStream?: boolean, isClusterStore?: boolean }
21
+ export type CoreStoreInit = (store: any, ctx: any) => void;
21
22
  export type RegisterStore = () => (store: any) => void
22
23
  export type UnregisterStore = (store: any) => void
23
24
 
@@ -56,6 +57,11 @@ export interface IPlugin {
56
57
  */
57
58
  metadata: PackageMetadata;
58
59
 
60
+ /**
61
+ * Validators used in the same manner as shell/utils/custom-validators
62
+ */
63
+ validators: {[key: string]: Function};
64
+
59
65
  /**
60
66
  * Add a module contains localisations for a specific locale
61
67
  */
@@ -91,7 +97,7 @@ export interface IPlugin {
91
97
  * actions, will eventually call a `request` action which will make the raw http request. This is a pkg specific feature so needs the
92
98
  * `request` action needs to be supplied in the `storeSpecifics`
93
99
  */
94
- addDashboardStore(storeName: string, storeSpecifics: CoreStoreSpecifics, config: CoreStoreConfig): void;
100
+ addDashboardStore(storeName: string, storeSpecifics: CoreStoreSpecifics, config: CoreStoreConfig, init?: CoreStoreInit): void;
95
101
 
96
102
  /**
97
103
  * Add hooks that will execute when a user navigates
@@ -93,7 +93,7 @@ export default {
93
93
  fetchOne.snapshots = this.$store.dispatch('management/findAll', { type: SNAPSHOT });
94
94
  }
95
95
 
96
- if ( this.value.isImported || this.value.isCustom || this.value.isAKS || this.value.isEKS ) {
96
+ if ( this.value.isImported || this.value.isCustom || this.value.isHostedKubernetesProvider ) {
97
97
  fetchOne.clusterToken = this.value.getOrCreateToken();
98
98
  }
99
99
 
@@ -321,6 +321,18 @@ export default {
321
321
  return false;
322
322
  },
323
323
 
324
+ showEksNodeGroupWarning() {
325
+ if ( this.value.provisioner === 'EKS' ) {
326
+ const desiredTotal = this.value.eksNodeGroups.filter(g => g.desiredSize === 0);
327
+
328
+ if ( desiredTotal.length === this.value.eksNodeGroups.length ) {
329
+ return true;
330
+ }
331
+ }
332
+
333
+ return false;
334
+ },
335
+
324
336
  machineHeaders() {
325
337
  return [
326
338
  STATE,
@@ -439,7 +451,7 @@ export default {
439
451
  return true;
440
452
  }
441
453
 
442
- if ( ( this.value.isAKS || this.value.isEKS ) && !this.isClusterReady ) {
454
+ if ( this.value.isHostedKubernetesProvider && !this.isClusterReady ) {
443
455
  return true;
444
456
  }
445
457
 
@@ -585,6 +597,7 @@ export default {
585
597
  <Loading v-if="$fetchState.pending" />
586
598
  <div v-else>
587
599
  <Banner v-if="showWindowsWarning" color="error" :label="t('cluster.banner.os', { newOS: 'Windows', existingOS: 'Linux' })" />
600
+ <Banner v-if="showEksNodeGroupWarning" color="error" :label="t('cluster.banner.desiredNodeGroupWarning')" />
588
601
 
589
602
  <Banner v-if="$fetchState.error" color="error" :label="$fetchState.error" />
590
603
  <ResourceTabs v-model="value" :default-tab="defaultTab">
@@ -120,6 +120,10 @@ export default {
120
120
  return this.value.type === WORKLOAD_TYPES.CRON_JOB;
121
121
  },
122
122
 
123
+ isPod() {
124
+ return this.value.type === POD;
125
+ },
126
+
123
127
  podSchema() {
124
128
  return this.$store.getters['cluster/schemaFor'](POD);
125
129
  },
@@ -133,13 +137,15 @@ export default {
133
137
  },
134
138
 
135
139
  podTemplateSpec() {
136
- const isCronJob = this.value.type === WORKLOAD_TYPES.CRON_JOB;
137
-
138
- if ( isCronJob ) {
140
+ if ( this.value.type === WORKLOAD_TYPES.CRON_JOB ) {
139
141
  return this.value.spec.jobTemplate.spec.template.spec;
140
- } else {
141
- return this.value.spec?.template?.spec;
142
142
  }
143
+
144
+ if ( this.value.type === POD ) {
145
+ return this.value;
146
+ }
147
+
148
+ return this.value.spec?.template?.spec;
143
149
  },
144
150
 
145
151
  container() {