@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.
- package/assets/brand/suse/dark/rancher-logo.svg +1 -148
- package/assets/brand/suse/rancher-logo.svg +1 -130
- package/assets/images/featured/img1.jpg +0 -0
- package/assets/images/featured.jpg +0 -0
- package/assets/images/generic-plugin.svg +7 -0
- package/assets/styles/themes/_dark.scss +3 -0
- package/assets/styles/themes/_light.scss +3 -0
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/translations/en-us.yaml +209 -813
- package/assets/translations/zh-hans.yaml +28 -792
- package/components/ActionMenu.vue +3 -3
- package/components/AsyncButton.vue +17 -2
- package/components/ButtonDropdown.vue +4 -0
- package/components/Carousel.vue +291 -0
- package/components/CodeMirror.vue +6 -8
- package/components/CommunityLinks.vue +70 -19
- package/components/ContainerResourceLimit.vue +14 -0
- package/components/CruResource.vue +11 -3
- package/components/Dialog.vue +102 -0
- package/components/ExplorerMembers.vue +121 -0
- package/components/ExplorerProjectsNamespaces.vue +404 -0
- package/components/GrafanaDashboard.vue +17 -2
- package/components/IconMessage.vue +9 -1
- package/components/LocaleSelector.vue +114 -0
- package/components/PromptModal.vue +2 -3
- package/components/ResourceList/index.vue +1 -1
- package/components/ResourceTable.vue +9 -7
- package/components/SimpleBox.vue +6 -4
- package/components/SingleClusterInfo.vue +1 -1
- package/components/SortableTable/index.vue +18 -25
- package/components/SortableTable/selection.js +1 -0
- package/components/Tabbed/Tab.vue +5 -0
- package/components/Tabbed/index.vue +29 -2
- package/components/auth/AzureWarning.vue +5 -1
- package/components/auth/Principal.vue +2 -1
- package/components/auth/RoleDetailEdit.vue +18 -11
- package/components/fleet/FleetBundles.vue +8 -3
- package/components/fleet/FleetRepos.vue +0 -2
- package/components/fleet/FleetSummary.vue +6 -0
- package/components/form/KeyValue.vue +80 -58
- package/components/form/NameNsDescription.vue +12 -8
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/ResourceTabs/index.vue +5 -1
- package/components/form/WorkloadPorts.vue +1 -1
- package/components/formatter/ClusterLink.vue +3 -7
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/nav/Header.vue +9 -9
- package/components/nav/NamespaceFilter.vue +10 -7
- package/components/nav/TopLevelMenu.vue +10 -65
- package/components/nav/WindowManager/ContainerLogs.vue +1 -1
- package/config/footer.js +13 -14
- package/config/labels-annotations.js +2 -1
- package/config/product/explorer.js +5 -4
- package/config/product/harvester-manager.js +64 -2
- package/config/product/legacy.js +0 -47
- package/config/product/manager.js +9 -0
- package/config/product/multi-cluster-apps.js +0 -12
- package/config/product/settings.js +12 -1
- package/config/product/uiplugins.js +17 -0
- package/config/settings.js +37 -72
- package/config/table-headers.js +0 -1
- package/config/types.js +9 -25
- package/config/uiplugins.js +60 -0
- package/content/docs/en-us/getting-started.md +1 -26
- package/core/plugin-routes.ts +34 -22
- package/core/plugin.ts +15 -3
- package/core/plugins-loader.js +2 -0
- package/core/plugins.js +91 -36
- package/core/types.ts +7 -1
- package/detail/provisioning.cattle.io.cluster.vue +15 -2
- package/detail/workload/index.vue +11 -5
- package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
- package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
- package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
- package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
- package/dialog/DiagnosticTimingsDialog.vue +116 -0
- package/{components/dialog → dialog}/DrainNode.vue +0 -0
- package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
- package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
- package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
- package/{components/dialog → dialog}/RotateCertificatesDialog.vue +9 -3
- package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
- package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
- package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
- package/edit/auth/azuread.vue +44 -6
- package/edit/management.cattle.io.project.vue +2 -2
- package/edit/namespace.vue +17 -10
- package/edit/networking.k8s.io.ingress/index.vue +2 -2
- package/edit/persistentvolume/index.vue +3 -0
- package/edit/persistentvolumeclaim.vue +1 -0
- package/edit/pod.vue +27 -0
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
- package/edit/provisioning.cattle.io.cluster/rke2.vue +76 -5
- package/edit/service.vue +8 -6
- package/edit/workload/__tests__/Upgrading.test.ts +1 -0
- package/edit/workload/index.vue +375 -15
- package/edit/workload/mixins/workload.js +62 -7
- package/edit/workload/storage/ContainerMountPaths.vue +240 -0
- package/edit/workload/storage/Mount.vue +1 -0
- package/edit/workload/storage/awsElasticBlockStore.vue +20 -1
- package/edit/workload/storage/azureDisk.vue +22 -2
- package/edit/workload/storage/azureFile.vue +20 -2
- package/edit/workload/storage/csi/index.vue +23 -1
- package/edit/workload/storage/gcePersistentDisk.vue +20 -2
- package/edit/workload/storage/index.vue +23 -49
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
- package/edit/workload/storage/vsphereVolume.vue +11 -1
- package/layouts/default.vue +63 -32
- package/layouts/error.vue +5 -1
- package/layouts/home.vue +14 -5
- package/layouts/plain.vue +10 -5
- package/list/harvesterhci.io.management.cluster.vue +74 -33
- package/list/management.cattle.io.setting.vue +3 -3
- package/list/namespace.vue +3 -5
- package/list/provisioning.cattle.io.cluster.vue +1 -1
- package/machine-config/amazonec2.vue +2 -0
- package/machine-config/harvester.vue +100 -51
- package/middleware/authenticated.js +56 -52
- package/mixins/form-validation.js +1 -1
- package/mixins/resource-fetch.js +3 -1
- package/models/catalog.cattle.io.uiplugin.js +34 -0
- package/models/cluster/node.js +25 -2
- package/models/fleet.cattle.io.bundle.js +27 -20
- package/models/harvesterhci.io.management.cluster.js +200 -5
- package/models/management.cattle.io.cluster.js +1 -1
- package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
- package/models/management.cattle.io.project.js +23 -2
- package/models/namespace.js +19 -3
- package/models/pod.js +19 -2
- package/models/provisioning.cattle.io.cluster.js +16 -6
- package/models/workload.js +9 -246
- package/models/workload.service.js +314 -0
- package/nuxt.config.js +80 -34
- package/package.json +107 -108
- package/pages/auth/login.vue +11 -2
- package/pages/auth/setup.vue +1 -1
- package/pages/c/_cluster/_product/members/index.vue +3 -93
- package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
- package/pages/c/_cluster/apps/charts/index.vue +46 -1
- package/pages/c/_cluster/apps/charts/install.vue +10 -9
- package/pages/c/_cluster/explorer/index.vue +72 -9
- package/pages/c/_cluster/explorer/tools/index.vue +12 -5
- package/pages/c/_cluster/mcapps/index.vue +1 -1
- package/pages/c/_cluster/settings/brand.vue +0 -40
- package/pages/c/_cluster/settings/links.vue +200 -0
- package/pages/c/_cluster/settings/performance.vue +19 -16
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +232 -0
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +242 -0
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +284 -0
- package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +130 -0
- package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +253 -0
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +115 -0
- package/pages/c/_cluster/uiplugins/index.vue +694 -0
- package/pages/diagnostic.vue +185 -101
- package/pages/docs/_doc.vue +3 -1
- package/pages/fail-whale.vue +1 -10
- package/pages/home.vue +21 -56
- package/pages/index.vue +18 -4
- package/pages/prefs.vue +108 -86
- package/pages/safeMode.vue +17 -0
- package/pages/support/index.vue +23 -15
- package/pkg/auto-import.js +44 -7
- package/pkg/dynamic-importer.lib.js +4 -0
- package/pkg/dynamic-plugin-loader.js +28 -0
- package/pkg/import.js +2 -2
- package/pkg/model-loader-require.lib.js +3 -0
- package/pkg/vue.config.js +9 -6
- package/plugins/dashboard-store/model-loader-require.js +12 -0
- package/plugins/dashboard-store/model-loader.js +4 -1
- package/plugins/dashboard-store/resource-class.js +12 -5
- package/plugins/formatters.js +15 -0
- package/plugins/plugin.js +56 -4
- package/plugins/steve/actions.js +1 -1
- package/plugins/steve/index.js +6 -4
- package/plugins/steve/mutations.js +1 -1
- package/plugins/steve/subscribe.js +89 -56
- package/plugins/steve/web-worker.steve-sub-worker.js +24 -15
- package/promptRemove/management.cattle.io.globalrole.vue +47 -0
- package/promptRemove/management.cattle.io.roletemplate.vue +47 -0
- package/promptRemove/mixin/roleDeletionCheck.js +97 -0
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
- package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
- package/scripts/build-pkg.sh +48 -2
- package/scripts/drone-build-pkg.sh +31 -0
- package/scripts/publish-shell.sh +11 -12
- package/scripts/serve-pkgs +17 -10
- package/scripts/sync-shell-deps +37 -0
- package/store/catalog.js +12 -9
- package/store/i18n.js +26 -12
- package/store/index.js +4 -181
- package/store/prefs.js +46 -2
- package/store/type-map.js +47 -33
- package/store/uiplugins.ts +15 -61
- package/utils/__tests__/object.test.ts +0 -24
- package/utils/__tests__/selector.test.ts +1 -1
- package/utils/cluster.js +1 -1
- package/utils/custom-validators.js +1 -12
- package/utils/dynamic-importer.js +5 -1
- package/utils/grafana.js +2 -6
- package/utils/socket.js +41 -20
- package/utils/string.js +1 -7
- package/utils/validators/formRules/__tests__/index.test.ts +108 -0
- package/utils/validators/formRules/index.ts +9 -1
- package/utils/validators/setting.js +0 -35
- package/yarn-error.log +195 -0
- package/components/FilterLabel.vue +0 -254
- package/components/HarvesterUpgradeProgressBarList.vue +0 -109
- package/components/VMConsoleBar.vue +0 -87
- package/components/dialog/harvester/AddHotplugModal.vue +0 -159
- package/components/dialog/harvester/BackupModal.vue +0 -117
- package/components/dialog/harvester/CloneTemplate.vue +0 -125
- package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
- package/components/dialog/harvester/ExportImageDialog.vue +0 -152
- package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
- package/components/dialog/harvester/MigrationDialog.vue +0 -154
- package/components/dialog/harvester/RestoreDialog.vue +0 -153
- package/components/dialog/harvester/SupportBundle.vue +0 -217
- package/components/dialog/harvester/UnplugVolume.vue +0 -108
- package/components/form/SerialConsole/index.vue +0 -267
- package/components/formatter/AttachVMWithName.vue +0 -46
- package/components/formatter/CloudInitType.vue +0 -27
- package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
- package/components/formatter/HarvesterCPUUsed.vue +0 -122
- package/components/formatter/HarvesterDiskState.vue +0 -66
- package/components/formatter/HarvesterHostName.vue +0 -66
- package/components/formatter/HarvesterIpAddress.vue +0 -90
- package/components/formatter/HarvesterMemoryUsed.vue +0 -140
- package/components/formatter/HarvesterMigrationState.vue +0 -85
- package/components/formatter/HarvesterNodeName.vue +0 -49
- package/components/formatter/HarvesterStorageUsed.vue +0 -194
- package/components/formatter/HarvesterVmState.vue +0 -123
- package/components/nav/HarvesterUpgrade.vue +0 -232
- package/components/novnc/NovncConsole.vue +0 -93
- package/components/novnc/NovncConsoleItem.vue +0 -89
- package/components/novnc/NovncConsoleWrapper.vue +0 -243
- package/config/harvester-map.js +0 -44
- package/config/harvester-table-headers.js +0 -27
- package/config/product/harvester.js +0 -305
- package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
- package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
- package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
- package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
- package/detail/harvesterhci.io.host/index.vue +0 -243
- package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
- package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
- package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
- package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
- package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
- package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
- package/edit/harvesterhci.io.host/index.vue +0 -533
- package/edit/harvesterhci.io.keypair.vue +0 -112
- package/edit/harvesterhci.io.managedchart/index.vue +0 -25
- package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
- package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
- package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
- package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
- package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
- package/edit/harvesterhci.io.setting/index.vue +0 -201
- package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
- package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
- package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
- package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
- package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
- package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
- package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
- package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
- package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
- package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
- package/edit/harvesterhci.io.volume.vue +0 -195
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
- package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
- package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
- package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
- package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
- package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
- package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
- package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
- package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
- package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
- package/edit/workload/types/Deployment.vue +0 -377
- package/edit/workload/types/Generic.vue +0 -295
- package/list/harvesterhci.io.cloudtemplate.vue +0 -78
- package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
- package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
- package/list/harvesterhci.io.dashboard/index.vue +0 -752
- package/list/harvesterhci.io.host/index.vue +0 -186
- package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
- package/list/harvesterhci.io.setting.vue +0 -241
- package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
- package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
- package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
- package/list/harvesterhci.io.volume.vue +0 -122
- package/list/kubevirt.io.virtualmachine.vue +0 -193
- package/mixins/harvester-vm/impl.js +0 -267
- package/mixins/harvester-vm/index.js +0 -1357
- package/models/harvester/configmap.js +0 -32
- package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
- package/models/harvester/harvesterhci.io.keypair.js +0 -12
- package/models/harvester/harvesterhci.io.setting.js +0 -127
- package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
- package/models/harvester/harvesterhci.io.upgrade.js +0 -226
- package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
- package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
- package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
- package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
- package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
- package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
- package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
- package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
- package/models/harvester/management.cattle.io.managedchart.js +0 -191
- package/models/harvester/management.cattle.io.setting.js +0 -40
- package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
- package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
- package/models/harvester/node.js +0 -255
- package/models/harvester/persistentvolumeclaim.js +0 -166
- package/models/harvester/pod.js +0 -185
- package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
- package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
- package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
- package/pages/c/_cluster/harvester/index.vue +0 -24
- package/pages/c/_cluster/harvester/support/index.vue +0 -154
- package/pages/plugins.vue +0 -387
- package/pkg/model-loader.lib.js +0 -3
- package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
- package/server/verdaccio-middleware.js +0 -56
- package/store/harvester-common.js +0 -126
- package/utils/validators/vm-datavolumes.js +0 -38
- package/utils/validators/vm-image.js +0 -32
- 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 →
|
|
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>
|
package/core/plugin-routes.ts
CHANGED
|
@@ -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
|
|
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
|
|
75
|
-
|
|
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 =
|
|
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 =
|
|
100
|
+
existing = allRoutes.findIndex((route: any) => route.path === path);
|
|
90
101
|
} else {
|
|
91
102
|
// no parent route
|
|
92
|
-
existing =
|
|
103
|
+
existing = allRoutes.findIndex((route: any) => route.name === r.route.name);
|
|
93
104
|
}
|
|
94
105
|
|
|
95
106
|
if (existing >= 0) {
|
|
96
|
-
const existingRoute =
|
|
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
|
-
|
|
111
|
-
replaced++;
|
|
121
|
+
allRoutes.splice(existing, 1);
|
|
112
122
|
}
|
|
113
123
|
});
|
|
114
124
|
|
|
115
|
-
|
|
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:
|
|
118
|
-
})
|
|
135
|
+
routes: allRoutes
|
|
136
|
+
});
|
|
119
137
|
|
|
120
|
-
|
|
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
|
-
|
|
129
|
-
|
|
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
|
-
|
|
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
|
}
|
package/core/plugins-loader.js
CHANGED
|
@@ -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
|
-
|
|
47
|
-
|
|
60
|
+
// id is `<product>-<version>`.
|
|
61
|
+
const oldPlugin = Object.values(plugins).find(p => id.startsWith(p.name));
|
|
48
62
|
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
87
|
+
// name is the name of the plugin, including the version number
|
|
88
|
+
const plugin = new Plugin(id);
|
|
62
89
|
|
|
63
|
-
|
|
64
|
-
window[id].default(plugin, this.internal());
|
|
90
|
+
plugins[id] = plugin;
|
|
65
91
|
|
|
66
|
-
|
|
67
|
-
|
|
92
|
+
// Initialize the plugin
|
|
93
|
+
window[id].default(plugin, this.internal());
|
|
68
94
|
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
73
|
-
|
|
98
|
+
// Load all of the types etc from the plugin
|
|
99
|
+
this.applyPlugin(plugin);
|
|
74
100
|
|
|
75
|
-
|
|
76
|
-
|
|
101
|
+
// Add the plugin to the store
|
|
102
|
+
store.dispatch('uiplugins/addPlugin', plugin);
|
|
77
103
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
reject(e);
|
|
81
|
-
};
|
|
104
|
+
resolve();
|
|
105
|
+
};
|
|
82
106
|
|
|
83
|
-
|
|
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 || []).
|
|
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.
|
|
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 (
|
|
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
|
-
|
|
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() {
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|