@rancher/shell 0.1.1 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/translations/en-us.yaml +33 -769
- package/assets/translations/zh-hans.yaml +153 -781
- package/components/ActionMenu.vue +3 -3
- package/components/CodeMirror.vue +6 -8
- package/components/CommunityLinks.vue +1 -1
- package/components/ContainerResourceLimit.vue +14 -0
- package/components/ExplorerMembers.vue +123 -0
- package/components/ExplorerProjectsNamespaces.vue +405 -0
- package/components/GrafanaDashboard.vue +17 -2
- package/components/LocaleSelector.vue +81 -0
- package/components/PromptModal.vue +2 -3
- package/components/ResourceList/index.vue +1 -1
- package/components/ResourceTable.vue +3 -6
- package/components/SingleClusterInfo.vue +1 -1
- package/components/SortableTable/index.vue +23 -20
- package/components/SortableTable/selection.js +1 -0
- package/components/auth/AzureWarning.vue +5 -1
- package/components/auth/Principal.vue +1 -1
- package/components/auth/RoleDetailEdit.vue +32 -12
- package/components/fleet/FleetRepos.vue +0 -2
- package/components/form/NameNsDescription.vue +4 -6
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/ResourceTabs/index.vue +27 -18
- package/components/form/WorkloadPorts.vue +1 -1
- package/components/formatter/ClusterLink.vue +13 -0
- package/components/formatter/PodImages.vue +11 -1
- package/components/formatter/RKETemplateName.vue +37 -0
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/nav/Header.vue +9 -9
- package/components/nav/NamespaceFilter.vue +7 -4
- package/components/nav/TopLevelMenu.vue +6 -43
- package/components/nav/WindowManager/ContainerLogs.vue +1 -1
- package/config/product/harvester-manager.js +64 -2
- package/config/product/manager.js +9 -0
- package/config/settings.js +17 -71
- package/config/table-headers.js +0 -1
- package/config/types.js +8 -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 +79 -36
- package/core/types.ts +7 -1
- package/creators/app/tsconfig.json +6 -1
- package/creators/pkg/init +3 -0
- package/creators/pkg/tsconfig.json +7 -2
- package/detail/provisioning.cattle.io.cluster.vue +23 -0
- 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/{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 +0 -0
- 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 +20 -1
- package/edit/cloudcredential.vue +7 -1
- package/edit/management.cattle.io.project.vue +2 -2
- package/edit/namespace.vue +17 -10
- package/edit/networking.k8s.io.ingress/index.vue +2 -1
- package/edit/persistentvolumeclaim.vue +33 -2
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +34 -6
- package/edit/provisioning.cattle.io.cluster/index.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/rke2.vue +21 -6
- package/edit/service.vue +1 -1
- package/edit/workload/index.vue +363 -15
- package/edit/workload/mixins/workload.js +62 -7
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
- package/layouts/default.vue +52 -27
- package/layouts/error.vue +5 -1
- package/layouts/home.vue +6 -2
- package/list/harvesterhci.io.management.cluster.vue +74 -33
- package/list/namespace.vue +3 -5
- package/list/provisioning.cattle.io.cluster.vue +6 -0
- package/machine-config/amazonec2.vue +2 -0
- package/machine-config/harvester.vue +96 -49
- package/middleware/authenticated.js +56 -52
- package/mixins/brand.js +3 -4
- package/mixins/create-edit-view/impl.js +0 -8
- package/mixins/form-validation.js +1 -1
- package/mixins/resource-fetch.js +3 -1
- package/models/chart.js +1 -1
- package/models/cluster/node.js +12 -1
- package/models/fleet.cattle.io.bundle.js +26 -19
- package/models/harvesterhci.io.management.cluster.js +194 -5
- package/models/management.cattle.io.cluster.js +1 -1
- package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
- package/models/management.cattle.io.globalrole.js +0 -19
- package/models/management.cattle.io.project.js +23 -2
- package/models/management.cattle.io.roletemplate.js +2 -21
- package/models/namespace.js +19 -3
- package/models/pod.js +19 -2
- package/models/provisioning.cattle.io.cluster.js +71 -0
- package/models/service.js +5 -1
- package/models/workload.js +4 -243
- package/models/workload.service.js +314 -0
- package/nuxt.config.js +14 -12
- package/package.json +3 -3
- 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/install.vue +0 -6
- package/pages/c/_cluster/settings/performance.vue +19 -16
- package/pages/fail-whale.vue +1 -10
- package/pages/index.vue +18 -4
- package/pages/plugins.vue +2 -2
- package/pages/prefs.vue +8 -6
- package/pkg/auto-import.js +44 -7
- 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/console.js +10 -5
- package/plugins/dashboard-store/actions.js +8 -3
- package/plugins/dashboard-store/getters.js +7 -2
- 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 +10 -3
- package/plugins/steve/actions.js +1 -1
- package/plugins/steve/index.js +6 -4
- package/plugins/steve/steve-description-class.js +32 -0
- package/plugins/steve/subscribe.js +34 -23
- package/rancher-components/Banner/Banner.vue +2 -2
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
- package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +0 -2
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +2 -0
- package/rancher-components/Form/Radio/RadioButton.vue +14 -1
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +107 -0
- package/{components/form → rancher-components/Form/ToggleSwitch}/ToggleSwitch.vue +18 -8
- package/rancher-components/Form/ToggleSwitch/index.ts +1 -0
- package/rancher-components/Form/index.ts +1 -0
- package/scripts/build-pkg.sh +48 -2
- package/scripts/drone-build-pkg.sh +31 -0
- package/scripts/publish-shell.sh +10 -11
- package/scripts/serve-pkgs +17 -10
- package/scripts/test-plugins-build.sh +18 -1
- package/store/catalog.js +3 -1
- package/store/i18n.js +16 -11
- package/store/index.js +4 -181
- package/store/prefs.js +30 -2
- package/store/type-map.js +16 -29
- package/types/{index.d.ts → rancher/index.d.ts} +0 -0
- package/utils/cluster.js +1 -1
- package/utils/custom-validators.js +1 -12
- package/utils/dynamic-importer.js +1 -1
- package/utils/validators/setting.js +0 -35
- 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/pkg/model-loader.lib.js +0 -3
- package/plugins/lookup.js +0 -50
- package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
- 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
- package/yarn-error.log +0 -196
package/store/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import Steve from '@shell/plugins/steve';
|
|
2
2
|
import {
|
|
3
|
-
COUNT, NAMESPACE, NORMAN, MANAGEMENT, FLEET, UI, VIRTUAL_HARVESTER_PROVIDER,
|
|
3
|
+
COUNT, NAMESPACE, NORMAN, MANAGEMENT, FLEET, UI, VIRTUAL_HARVESTER_PROVIDER, DEFAULT_WORKSPACE
|
|
4
4
|
} from '@shell/config/types';
|
|
5
5
|
import { CLUSTER as CLUSTER_PREF, NAMESPACE_FILTERS, LAST_NAMESPACE, WORKSPACE } from '@shell/store/prefs';
|
|
6
6
|
import { allHash, allHashSettled } from '@shell/utils/promise';
|
|
@@ -14,7 +14,6 @@ import { setBrand, setVendor } from '@shell/config/private-label';
|
|
|
14
14
|
import { addParam } from '@shell/utils/url';
|
|
15
15
|
import { SETTING } from '@shell/config/settings';
|
|
16
16
|
import semver from 'semver';
|
|
17
|
-
import { NAME as VIRTUAL } from '@shell/config/product/harvester';
|
|
18
17
|
import { BACK_TO } from '@shell/config/local-storage';
|
|
19
18
|
import { STEVE_MODEL_TYPES } from '@shell/plugins/steve/getters';
|
|
20
19
|
import { BY_TYPE } from '@shell/plugins/dashboard-store/classify';
|
|
@@ -52,12 +51,6 @@ export const plugins = [
|
|
|
52
51
|
supportsStream: false, // The norman API doesn't support streaming
|
|
53
52
|
modelBaseClass: STEVE_MODEL_TYPES.NORMAN,
|
|
54
53
|
}),
|
|
55
|
-
Steve({
|
|
56
|
-
namespace: 'harvester',
|
|
57
|
-
baseUrl: '', // URL is dynamically set for the selected cluster
|
|
58
|
-
supportsStream: false, // true, -- Disabled due to report that it's sometimes much slower in Chrome
|
|
59
|
-
}),
|
|
60
|
-
|
|
61
54
|
];
|
|
62
55
|
|
|
63
56
|
const getActiveNamespaces = (state, getters) => {
|
|
@@ -450,47 +443,14 @@ export const getters = {
|
|
|
450
443
|
return '/';
|
|
451
444
|
},
|
|
452
445
|
|
|
453
|
-
isSingleProduct(state
|
|
446
|
+
isSingleProduct(state) {
|
|
454
447
|
if (state.isSingleProduct !== undefined) {
|
|
455
448
|
return state.isSingleProduct;
|
|
456
449
|
}
|
|
457
450
|
|
|
458
|
-
if (rootGetters.isSingleVirtualCluster) {
|
|
459
|
-
return {
|
|
460
|
-
logo: require('~shell/assets/images/providers/harvester.svg'),
|
|
461
|
-
productNameKey: 'product.harvester',
|
|
462
|
-
version: rootGetters['harvester/byId'](HCI.SETTING, 'server-version')?.value,
|
|
463
|
-
afterLoginRoute: {
|
|
464
|
-
name: 'c-cluster-product',
|
|
465
|
-
params: { product: VIRTUAL },
|
|
466
|
-
},
|
|
467
|
-
logoRoute: {
|
|
468
|
-
name: 'c-cluster-product-resource',
|
|
469
|
-
params: {
|
|
470
|
-
product: VIRTUAL,
|
|
471
|
-
resource: HCI.DASHBOARD,
|
|
472
|
-
}
|
|
473
|
-
},
|
|
474
|
-
enableSessionCheck: true
|
|
475
|
-
};
|
|
476
|
-
}
|
|
477
|
-
|
|
478
451
|
return false;
|
|
479
452
|
},
|
|
480
453
|
|
|
481
|
-
isSingleVirtualCluster(state, getters, rootState, rootGetters) {
|
|
482
|
-
const clusterId = getters.defaultClusterId;
|
|
483
|
-
const cluster = rootGetters['management/byId'](MANAGEMENT.CLUSTER, clusterId);
|
|
484
|
-
|
|
485
|
-
return !getters.isMultiCluster && cluster?.status?.provider === VIRTUAL_HARVESTER_PROVIDER;
|
|
486
|
-
},
|
|
487
|
-
|
|
488
|
-
isMultiVirtualCluster(state, getters, rootState, rootGetters) {
|
|
489
|
-
const localCluster = rootGetters['management/byId'](MANAGEMENT.CLUSTER, 'local');
|
|
490
|
-
|
|
491
|
-
return getters.isMultiCluster && localCluster?.status?.provider !== VIRTUAL_HARVESTER_PROVIDER;
|
|
492
|
-
},
|
|
493
|
-
|
|
494
454
|
isVirtualCluster(state, getters) {
|
|
495
455
|
const cluster = getters['currentCluster'];
|
|
496
456
|
|
|
@@ -509,9 +469,7 @@ export const mutations = {
|
|
|
509
469
|
state.clusterReady = ready;
|
|
510
470
|
},
|
|
511
471
|
|
|
512
|
-
updateNamespaces(state,
|
|
513
|
-
const { filters, all } = getters;
|
|
514
|
-
|
|
472
|
+
updateNamespaces(state, { filters, all }) {
|
|
515
473
|
state.namespaceFilters = filters.filter(x => !!x);
|
|
516
474
|
|
|
517
475
|
if ( all ) {
|
|
@@ -644,7 +602,7 @@ export const actions = {
|
|
|
644
602
|
}
|
|
645
603
|
|
|
646
604
|
res = await allHash(promises);
|
|
647
|
-
|
|
605
|
+
dispatch('i18n/init');
|
|
648
606
|
let isMultiCluster = true;
|
|
649
607
|
|
|
650
608
|
if ( res.clusters.length === 1 && res.clusters[0].metadata?.name === 'local' ) {
|
|
@@ -701,11 +659,6 @@ export const actions = {
|
|
|
701
659
|
return;
|
|
702
660
|
}
|
|
703
661
|
|
|
704
|
-
if (oldProduct === VIRTUAL) {
|
|
705
|
-
await dispatch('harvester/unsubscribe');
|
|
706
|
-
commit('harvester/reset');
|
|
707
|
-
}
|
|
708
|
-
|
|
709
662
|
const oldPkgClusterStore = oldPkg?.stores.find(
|
|
710
663
|
s => getters[`${ s.storeName }/isClusterStore`]
|
|
711
664
|
)?.storeName;
|
|
@@ -767,7 +720,6 @@ export const actions = {
|
|
|
767
720
|
// If we've entered a new store ensure everything has loaded correctly
|
|
768
721
|
if (newPkgClusterStore) {
|
|
769
722
|
// Mirror actions on the 'cluster' store for our specific pkg `cluster` store
|
|
770
|
-
dispatch(`${ newPkgClusterStore }/loadSchemas`, true);
|
|
771
723
|
await dispatch(`${ newPkgClusterStore }/loadCluster`, { id });
|
|
772
724
|
|
|
773
725
|
commit('clusterReady', true);
|
|
@@ -872,135 +824,6 @@ export const actions = {
|
|
|
872
824
|
commit('updateNamespaces', { filters: ids, ...getters });
|
|
873
825
|
},
|
|
874
826
|
|
|
875
|
-
async loadVirtual({
|
|
876
|
-
state, commit, dispatch, getters
|
|
877
|
-
}, { id, oldProduct }) {
|
|
878
|
-
const isMultiCluster = getters['isMultiCluster'];
|
|
879
|
-
|
|
880
|
-
if (isMultiCluster && id === 'local') {
|
|
881
|
-
return;
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
if ( state.clusterId && state.clusterId === id && oldProduct === VIRTUAL) {
|
|
885
|
-
// Do nothing, we're already connected/connecting to this cluster
|
|
886
|
-
return;
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
if (oldProduct !== VIRTUAL) {
|
|
890
|
-
await dispatch('cluster/unsubscribe');
|
|
891
|
-
commit('cluster/reset');
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
if ( state.clusterId && id ) {
|
|
895
|
-
commit('clusterReady', false);
|
|
896
|
-
|
|
897
|
-
await dispatch('harvester/unsubscribe');
|
|
898
|
-
commit('harvester/reset');
|
|
899
|
-
|
|
900
|
-
await dispatch('management/watch', {
|
|
901
|
-
type: MANAGEMENT.PROJECT,
|
|
902
|
-
namespace: state.clusterId,
|
|
903
|
-
stop: true
|
|
904
|
-
});
|
|
905
|
-
|
|
906
|
-
commit('management/forgetType', MANAGEMENT.PROJECT);
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
if (id) {
|
|
910
|
-
commit('clusterId', id);
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
console.log(`Loading ${ isMultiCluster ? 'ECM ' : '' }cluster...`); // eslint-disable-line no-console
|
|
914
|
-
|
|
915
|
-
// This is a workaround for a timing issue where the mgmt cluster schema may not be available
|
|
916
|
-
// Try and wait until the schema exists before proceeding
|
|
917
|
-
await dispatch('management/waitForSchema', { type: MANAGEMENT.CLUSTER });
|
|
918
|
-
|
|
919
|
-
// See if it really exists
|
|
920
|
-
const cluster = await dispatch('management/find', {
|
|
921
|
-
type: MANAGEMENT.CLUSTER,
|
|
922
|
-
id,
|
|
923
|
-
opt: { url: `${ MANAGEMENT.CLUSTER }s/${ escape(id) }` }
|
|
924
|
-
});
|
|
925
|
-
|
|
926
|
-
let virtualBase = `/k8s/clusters/${ escape(id) }/v1/harvester`;
|
|
927
|
-
|
|
928
|
-
if (id === 'local') {
|
|
929
|
-
virtualBase = `/v1/harvester`;
|
|
930
|
-
}
|
|
931
|
-
|
|
932
|
-
if ( !cluster ) {
|
|
933
|
-
commit('clusterId', null);
|
|
934
|
-
commit('harvester/applyConfig', { baseUrl: null });
|
|
935
|
-
throw new ClusterNotFoundError(id);
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
// Update the Steve client URLs
|
|
939
|
-
commit('harvester/applyConfig', { baseUrl: virtualBase });
|
|
940
|
-
|
|
941
|
-
await Promise.all([
|
|
942
|
-
dispatch('harvester/loadSchemas', true),
|
|
943
|
-
]);
|
|
944
|
-
|
|
945
|
-
dispatch('harvester/subscribe');
|
|
946
|
-
|
|
947
|
-
let isRancher = false;
|
|
948
|
-
const projectArgs = {
|
|
949
|
-
type: MANAGEMENT.PROJECT,
|
|
950
|
-
opt: {
|
|
951
|
-
url: `${ MANAGEMENT.PROJECT }/${ escape(id) }`,
|
|
952
|
-
watchNamespace: id
|
|
953
|
-
}
|
|
954
|
-
};
|
|
955
|
-
|
|
956
|
-
if (getters['management/schemaFor'](MANAGEMENT.PROJECT)) {
|
|
957
|
-
isRancher = true;
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
if (id !== 'local' && getters['harvester/schemaFor'](MANAGEMENT.SETTING)) { // multi-cluster
|
|
961
|
-
const settings = await dispatch('harvester/findAll', {
|
|
962
|
-
type: MANAGEMENT.SETTING,
|
|
963
|
-
id: SETTING.SYSTEM_NAMESPACES,
|
|
964
|
-
opt: { url: `${ virtualBase }/${ MANAGEMENT.SETTING }s/`, force: true }
|
|
965
|
-
});
|
|
966
|
-
|
|
967
|
-
const systemNamespaces = settings?.find(x => x.id === SETTING.SYSTEM_NAMESPACES);
|
|
968
|
-
|
|
969
|
-
if (systemNamespaces) {
|
|
970
|
-
const namespace = (systemNamespaces.value || systemNamespaces.default)?.split(',');
|
|
971
|
-
|
|
972
|
-
commit('setSystemNamespaces', namespace);
|
|
973
|
-
}
|
|
974
|
-
}
|
|
975
|
-
|
|
976
|
-
const hash = {
|
|
977
|
-
projects: isRancher && dispatch('management/findAll', projectArgs),
|
|
978
|
-
virtualCount: dispatch('harvester/findAll', { type: COUNT }),
|
|
979
|
-
virtualNamespaces: dispatch('harvester/findAll', { type: NAMESPACE }),
|
|
980
|
-
settings: dispatch('harvester/findAll', { type: HCI.SETTING }),
|
|
981
|
-
};
|
|
982
|
-
|
|
983
|
-
if (getters['harvester/schemaFor'](HCI.UPGRADE)) {
|
|
984
|
-
hash.upgrades = dispatch('harvester/findAll', { type: HCI.UPGRADE });
|
|
985
|
-
}
|
|
986
|
-
|
|
987
|
-
const res = await allHash(hash);
|
|
988
|
-
|
|
989
|
-
await dispatch('cleanNamespaces');
|
|
990
|
-
|
|
991
|
-
const filters = getters['prefs/get'](NAMESPACE_FILTERS)?.[id];
|
|
992
|
-
|
|
993
|
-
commit('updateNamespaces', {
|
|
994
|
-
filters: filters || [ALL_USER],
|
|
995
|
-
all: res.virtualNamespaces,
|
|
996
|
-
...getters
|
|
997
|
-
});
|
|
998
|
-
|
|
999
|
-
commit('clusterReady', true);
|
|
1000
|
-
|
|
1001
|
-
console.log('Done loading virtual cluster.'); // eslint-disable-line no-console
|
|
1002
|
-
},
|
|
1003
|
-
|
|
1004
827
|
async cleanNamespaces({ getters, dispatch }) {
|
|
1005
828
|
// Initialise / Remove any filters that the user no-longer has access to
|
|
1006
829
|
await dispatch('management/findAll', { type: MANAGEMENT.CLUSTER }); // So they can be got byId below
|
package/store/prefs.js
CHANGED
|
@@ -4,6 +4,11 @@ import { clone } from '@shell/utils/object';
|
|
|
4
4
|
import { SETTING } from '@shell/config/settings';
|
|
5
5
|
|
|
6
6
|
const definitions = {};
|
|
7
|
+
/**
|
|
8
|
+
* Key/value of prefrences are stored before login here and cookies due lack of access permission.
|
|
9
|
+
* Once user is logged in while setting asUserPreference, update stored before login Key/value to the backend in loadServer function.
|
|
10
|
+
*/
|
|
11
|
+
let prefsBeforeLogin = {};
|
|
7
12
|
|
|
8
13
|
export const create = function(name, def, opt = {}) {
|
|
9
14
|
const parseJSON = opt.parseJSON === true;
|
|
@@ -243,7 +248,7 @@ export const mutations = {
|
|
|
243
248
|
};
|
|
244
249
|
|
|
245
250
|
export const actions = {
|
|
246
|
-
async set({ dispatch, commit }, opt) {
|
|
251
|
+
async set({ dispatch, commit, rootGetters }, opt) {
|
|
247
252
|
let { key, value } = opt; // eslint-disable-line prefer-const
|
|
248
253
|
const definition = definitions[key];
|
|
249
254
|
let server;
|
|
@@ -264,6 +269,15 @@ export const actions = {
|
|
|
264
269
|
}
|
|
265
270
|
|
|
266
271
|
if ( definition.asUserPreference ) {
|
|
272
|
+
const checkLogin = rootGetters['auth/loggedIn'];
|
|
273
|
+
|
|
274
|
+
// Check for login status
|
|
275
|
+
if (!checkLogin) {
|
|
276
|
+
prefsBeforeLogin[key] = value;
|
|
277
|
+
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
|
|
267
281
|
try {
|
|
268
282
|
server = await dispatch('loadServer', key); // There's no watch on prefs, so get before set...
|
|
269
283
|
|
|
@@ -373,7 +387,9 @@ export const actions = {
|
|
|
373
387
|
}
|
|
374
388
|
},
|
|
375
389
|
|
|
376
|
-
async loadServer(
|
|
390
|
+
async loadServer( {
|
|
391
|
+
state, dispatch, commit, rootState, rootGetters
|
|
392
|
+
}, ignoreKey) {
|
|
377
393
|
let server = { data: {} };
|
|
378
394
|
|
|
379
395
|
try {
|
|
@@ -399,6 +415,18 @@ export const actions = {
|
|
|
399
415
|
return;
|
|
400
416
|
}
|
|
401
417
|
|
|
418
|
+
// if prefsBeforeLogin has values from login page, update the backend
|
|
419
|
+
if (Object.keys(prefsBeforeLogin).length > 0) {
|
|
420
|
+
Object.keys(prefsBeforeLogin).forEach((key) => {
|
|
421
|
+
server.data[key] = prefsBeforeLogin[key];
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
await server.save({ redirectUnauthorized: false });
|
|
425
|
+
|
|
426
|
+
// Clear prefsBeforeLogin, as we have now saved theses
|
|
427
|
+
prefsBeforeLogin = {};
|
|
428
|
+
}
|
|
429
|
+
|
|
402
430
|
for (const key in definitions) {
|
|
403
431
|
const definition = definitions[key];
|
|
404
432
|
let value = clone(server.data[key]);
|
package/store/type-map.js
CHANGED
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
// public, -- If true, show to all users. If false, only show when the Developer Tools pref is on (default true)
|
|
42
42
|
// category, -- Group to show the product in for the nav hamburger menu
|
|
43
43
|
// typeStoreMap, -- An object mapping types to the store that should be used to retrieve information about the type
|
|
44
|
+
// hideSystemResources -- Hide resources in namespaces where namespace.isSystem === true, or a namespace managed by fleet (per its annotation) and hide those namespaces from ns/project list and nsfilter (default false)
|
|
44
45
|
// })
|
|
45
46
|
//
|
|
46
47
|
// externalLink(stringOrFn) The product has an external page (function gets context object
|
|
@@ -130,8 +131,7 @@ import {
|
|
|
130
131
|
ensureRegex, escapeHtml, escapeRegex, ucFirst, pluralize
|
|
131
132
|
} from '@shell/utils/string';
|
|
132
133
|
import {
|
|
133
|
-
importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveDetail
|
|
134
|
-
|
|
134
|
+
importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveDetail, importDialog
|
|
135
135
|
} from '@shell/utils/dynamic-importer';
|
|
136
136
|
|
|
137
137
|
import { NAME as EXPLORER } from '@shell/config/product/explorer';
|
|
@@ -167,7 +167,6 @@ export const IF_HAVE = {
|
|
|
167
167
|
NO_PROJECT: 'no-project',
|
|
168
168
|
NOT_V1_ISTIO: 'not-v1-istio',
|
|
169
169
|
MULTI_CLUSTER: 'multi-cluster',
|
|
170
|
-
HARVESTER_SINGLE_CLUSTER: 'harv-multi-cluster',
|
|
171
170
|
NEUVECTOR_NAMESPACE: 'neuvector-namespace',
|
|
172
171
|
};
|
|
173
172
|
|
|
@@ -217,7 +216,7 @@ export function DSL(store, product, module = 'type-map') {
|
|
|
217
216
|
headers(type, headers) {
|
|
218
217
|
headers.forEach((header) => {
|
|
219
218
|
// If on the client, then use the value getter if there is one
|
|
220
|
-
if (
|
|
219
|
+
if (header.getValue) {
|
|
221
220
|
header.value = header.getValue;
|
|
222
221
|
}
|
|
223
222
|
|
|
@@ -1090,24 +1089,11 @@ export const getters = {
|
|
|
1090
1089
|
};
|
|
1091
1090
|
},
|
|
1092
1091
|
|
|
1093
|
-
hasCustomPromptRemove(state, getters) {
|
|
1094
|
-
return (rawType) => {
|
|
1095
|
-
const
|
|
1096
|
-
|
|
1097
|
-
const cache = state.cache.promptRemove;
|
|
1098
|
-
|
|
1099
|
-
if ( cache[type] !== undefined ) {
|
|
1100
|
-
return cache[type];
|
|
1101
|
-
}
|
|
1102
|
-
|
|
1103
|
-
try {
|
|
1104
|
-
require.resolve(`@shell/promptRemove/${ type }`);
|
|
1105
|
-
cache[type] = true;
|
|
1106
|
-
} catch (e) {
|
|
1107
|
-
cache[type] = false;
|
|
1108
|
-
}
|
|
1092
|
+
hasCustomPromptRemove(state, getters, rootState) {
|
|
1093
|
+
return (rawType, subType) => {
|
|
1094
|
+
const key = getters.componentFor(rawType, subType);
|
|
1109
1095
|
|
|
1110
|
-
return
|
|
1096
|
+
return hasCustom(state, rootState, 'promptRemove', key, () => require.resolve(`@shell/promptRemove/${ key }`));
|
|
1111
1097
|
};
|
|
1112
1098
|
},
|
|
1113
1099
|
|
|
@@ -1125,6 +1111,12 @@ export const getters = {
|
|
|
1125
1111
|
};
|
|
1126
1112
|
},
|
|
1127
1113
|
|
|
1114
|
+
importDialog(state, getters, rootState) {
|
|
1115
|
+
return (rawType, subType) => {
|
|
1116
|
+
return loadExtension(rootState, 'dialog', getters.componentFor(rawType, subType), importDialog);
|
|
1117
|
+
};
|
|
1118
|
+
},
|
|
1119
|
+
|
|
1128
1120
|
importList(state, getters, rootState) {
|
|
1129
1121
|
return (rawType) => {
|
|
1130
1122
|
return loadExtension(rootState, 'list', getters.componentFor(rawType), importList);
|
|
@@ -1143,11 +1135,9 @@ export const getters = {
|
|
|
1143
1135
|
};
|
|
1144
1136
|
},
|
|
1145
1137
|
|
|
1146
|
-
importCustomPromptRemove(state, getters) {
|
|
1147
|
-
return (rawType) => {
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
return importCustomPromptRemove(type);
|
|
1138
|
+
importCustomPromptRemove(state, getters, rootState) {
|
|
1139
|
+
return (rawType, subType) => {
|
|
1140
|
+
return loadExtension(rootState, 'promptRemove', getters.componentFor(rawType, subType), importCustomPromptRemove);
|
|
1151
1141
|
};
|
|
1152
1142
|
},
|
|
1153
1143
|
|
|
@@ -1739,9 +1729,6 @@ function ifHave(getters, option) {
|
|
|
1739
1729
|
case IF_HAVE.MULTI_CLUSTER: {
|
|
1740
1730
|
return getters.isMultiCluster;
|
|
1741
1731
|
}
|
|
1742
|
-
case IF_HAVE.HARVESTER_SINGLE_CLUSTER: {
|
|
1743
|
-
return getters.isSingleVirtualCluster;
|
|
1744
|
-
}
|
|
1745
1732
|
case IF_HAVE.NEUVECTOR_NAMESPACE: {
|
|
1746
1733
|
return getters[`cluster/all`](NAMESPACE).find(n => n.metadata.name === NEU_VECTOR_NAMESPACE);
|
|
1747
1734
|
}
|
|
File without changes
|
package/utils/cluster.js
CHANGED
|
@@ -13,7 +13,7 @@ export function filterOnlyKubernetesClusters(mgmtClusters) {
|
|
|
13
13
|
|
|
14
14
|
export function isHarvesterCluster(mgmtCluster) {
|
|
15
15
|
// Use the provider if it is set otherwise use the label
|
|
16
|
-
const provider = mgmtCluster?.
|
|
16
|
+
const provider = mgmtCluster?.metadata?.labels?.[CAPI.PROVIDER] || mgmtCluster?.status?.provider;
|
|
17
17
|
|
|
18
18
|
return provider === VIRTUAL_HARVESTER_PROVIDER;
|
|
19
19
|
}
|
|
@@ -8,12 +8,7 @@ import { cronSchedule } from '@shell/utils/validators/cron-schedule';
|
|
|
8
8
|
import { podAffinity } from '@shell/utils/validators/pod-affinity';
|
|
9
9
|
import { roleTemplateRules } from '@shell/utils/validators/role-template';
|
|
10
10
|
import { clusterName } from '@shell/utils/validators/cluster-name';
|
|
11
|
-
import { isHttps
|
|
12
|
-
|
|
13
|
-
import { imageUrl, fileRequired } from '@shell/utils/validators/vm-image';
|
|
14
|
-
|
|
15
|
-
import { vmNetworks, vmDisks } from '@shell/utils/validators/vm';
|
|
16
|
-
import { dataVolumeSize } from '@shell/utils/validators/vm-datavolumes';
|
|
11
|
+
import { isHttps } from '@shell/utils/validators/setting';
|
|
17
12
|
|
|
18
13
|
/**
|
|
19
14
|
* Custom validation functions beyond normal scalr types
|
|
@@ -36,10 +31,4 @@ export default {
|
|
|
36
31
|
podAffinity,
|
|
37
32
|
roleTemplateRules,
|
|
38
33
|
isHttps,
|
|
39
|
-
backupTarget,
|
|
40
|
-
imageUrl,
|
|
41
|
-
dataVolumeSize,
|
|
42
|
-
vmNetworks,
|
|
43
|
-
vmDisks,
|
|
44
|
-
fileRequired,
|
|
45
34
|
};
|
|
@@ -63,7 +63,7 @@ export function importDialog(name) {
|
|
|
63
63
|
throw new Error('Name required');
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
-
return () => import(/* webpackChunkName: "dialog" */ `@shell/
|
|
66
|
+
return () => import(/* webpackChunkName: "dialog" */ `@shell/dialog/${name}`);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
export function importWindowComponent(name) {
|
|
@@ -11,38 +11,3 @@ export function isHttps(value, getters, errors, validatorArgs, displayKey) {
|
|
|
11
11
|
|
|
12
12
|
return errors;
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
export function backupTarget(value, getters, errors, validatorArgs) {
|
|
16
|
-
const t = getters['i18n/t'];
|
|
17
|
-
|
|
18
|
-
const parseValue = JSON.parse(value);
|
|
19
|
-
const type = parseValue.type;
|
|
20
|
-
|
|
21
|
-
if (!type) {
|
|
22
|
-
return errors;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (type === 's3') {
|
|
26
|
-
if (!parseValue.accessKeyId) {
|
|
27
|
-
errors.push(t('validation.required', { key: 'accessKeyId' }));
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (!parseValue.secretAccessKey) {
|
|
31
|
-
errors.push(t('validation.required', { key: 'secretAccessKey' }));
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (!parseValue.bucketRegion) {
|
|
35
|
-
errors.push(t('validation.required', { key: 'bucketRegion' }));
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
if (!parseValue.bucketName) {
|
|
39
|
-
errors.push(t('validation.required', { key: 'bucketName' }));
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (!parseValue.endpoint) {
|
|
44
|
-
errors.push(t('validation.required', { key: 'endpoint' }));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return errors;
|
|
48
|
-
}
|