@rancher/shell 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/translations/en-us.yaml +27 -769
- package/assets/translations/zh-hans.yaml +8 -769
- 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 +18 -11
- package/components/fleet/FleetRepos.vue +0 -2
- package/components/form/NameNsDescription.vue +4 -6
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/WorkloadPorts.vue +1 -1
- 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 +5 -25
- 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/detail/provisioning.cattle.io.cluster.vue +13 -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/management.cattle.io.project.vue +2 -2
- package/edit/namespace.vue +17 -10
- package/edit/persistentvolumeclaim.vue +1 -0
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
- 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/machine-config/amazonec2.vue +2 -0
- package/machine-config/harvester.vue +96 -49
- package/middleware/authenticated.js +56 -52
- package/mixins/form-validation.js +1 -1
- package/mixins/resource-fetch.js +3 -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.project.js +23 -2
- package/models/namespace.js +19 -3
- package/models/pod.js +19 -2
- package/models/provisioning.cattle.io.cluster.js +4 -0
- package/models/workload.js +4 -243
- package/models/workload.service.js +314 -0
- package/nuxt.config.js +11 -9
- 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/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/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/subscribe.js +34 -23
- 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 +10 -11
- package/scripts/serve-pkgs +17 -10
- 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/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/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
|
@@ -3,9 +3,60 @@ import { HARVESTER, MULTI_CLUSTER } from '@shell/store/features';
|
|
|
3
3
|
import { DSL } from '@shell/store/type-map';
|
|
4
4
|
import { STATE, NAME as NAME_COL, AGE, VERSION } from '@shell/config/table-headers';
|
|
5
5
|
import { allHash } from '@shell/utils/promise';
|
|
6
|
+
import dynamicPluginLoader from '@shell/pkg/dynamic-plugin-loader';
|
|
7
|
+
import { BLANK_CLUSTER } from '@shell/store';
|
|
8
|
+
|
|
9
|
+
dynamicPluginLoader.register({
|
|
10
|
+
load: async({ route, store }) => {
|
|
11
|
+
// Check that we've either got here either
|
|
12
|
+
// - directly (page refresh/load -> have path but no name)
|
|
13
|
+
// - via router name (have name but no path)
|
|
14
|
+
let clusterId;
|
|
15
|
+
const pathParts = route.path.split('/');
|
|
16
|
+
|
|
17
|
+
if (pathParts?.[1] === HARVESTER_NAME && pathParts?.[3] ) {
|
|
18
|
+
clusterId = pathParts?.[3];
|
|
19
|
+
} else {
|
|
20
|
+
const nameParts = route.name?.split('-');
|
|
21
|
+
|
|
22
|
+
if (nameParts?.[0] === HARVESTER_NAME) {
|
|
23
|
+
clusterId = route.params?.cluster;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// If we have a cluster id, try to load the plugin via the harvester cluster's `loadClusterPlugin`
|
|
28
|
+
if (clusterId) {
|
|
29
|
+
const provClusters = await store.dispatch('management/findAll', { type: CAPI.RANCHER_CLUSTER });
|
|
30
|
+
const provCluster = provClusters.find(p => p.mgmt.id === clusterId);
|
|
31
|
+
|
|
32
|
+
if (provCluster) {
|
|
33
|
+
const harvCluster = await store.dispatch('management/create', {
|
|
34
|
+
...provCluster,
|
|
35
|
+
type: HCI.CLUSTER
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (harvCluster) {
|
|
39
|
+
try {
|
|
40
|
+
await harvCluster.loadClusterPlugin();
|
|
41
|
+
|
|
42
|
+
return route;
|
|
43
|
+
} catch (err) {
|
|
44
|
+
// If we've failed to load the harvester plugin nav to the harvester cluster list (probably got here from a bookmarked
|
|
45
|
+
// harvester instance that hasn't been updated to serve a plugin)
|
|
46
|
+
console.error('Failed to load harvester package: ', typeof error === 'object' ? JSON.stringify(err) : err); // eslint-disable-line no-console
|
|
47
|
+
|
|
48
|
+
return harvesterClustersLocation;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
6
55
|
|
|
7
56
|
export const NAME = 'harvesterManager';
|
|
8
57
|
|
|
58
|
+
export const HARVESTER_NAME = 'harvester';
|
|
59
|
+
|
|
9
60
|
const MACHINE_POOLS = {
|
|
10
61
|
name: 'summary',
|
|
11
62
|
labelKey: 'tableHeaders.machines',
|
|
@@ -16,6 +67,15 @@ const MACHINE_POOLS = {
|
|
|
16
67
|
width: 100,
|
|
17
68
|
};
|
|
18
69
|
|
|
70
|
+
const harvesterClustersLocation = {
|
|
71
|
+
name: 'c-cluster-product-resource',
|
|
72
|
+
params: {
|
|
73
|
+
cluster: BLANK_CLUSTER,
|
|
74
|
+
product: NAME,
|
|
75
|
+
resource: HCI.CLUSTER
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
19
79
|
export function init(store) {
|
|
20
80
|
const {
|
|
21
81
|
product,
|
|
@@ -33,6 +93,7 @@ export function init(store) {
|
|
|
33
93
|
removable: false,
|
|
34
94
|
showClusterSwitcher: false,
|
|
35
95
|
weight: 100,
|
|
96
|
+
to: harvesterClustersLocation,
|
|
36
97
|
});
|
|
37
98
|
|
|
38
99
|
configureType(HCI.CLUSTER, { showListMasthead: false });
|
|
@@ -41,7 +102,8 @@ export function init(store) {
|
|
|
41
102
|
NAME_COL,
|
|
42
103
|
{
|
|
43
104
|
...VERSION,
|
|
44
|
-
value:
|
|
105
|
+
value: 'kubernetesVersion',
|
|
106
|
+
getValue: row => row.kubernetesVersion
|
|
45
107
|
},
|
|
46
108
|
MACHINE_POOLS,
|
|
47
109
|
AGE,
|
|
@@ -54,7 +116,7 @@ export function init(store) {
|
|
|
54
116
|
]);
|
|
55
117
|
basicType([HCI.CLUSTER]);
|
|
56
118
|
spoofedType({
|
|
57
|
-
label: store.getters['i18n/t']('
|
|
119
|
+
label: store.getters['i18n/t']('harvesterManager.cluster.label'),
|
|
58
120
|
name: HCI.CLUSTER,
|
|
59
121
|
type: HCI.CLUSTER,
|
|
60
122
|
namespaced: false,
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
} from '@shell/config/types';
|
|
8
8
|
import { MULTI_CLUSTER } from '@shell/store/features';
|
|
9
9
|
import { DSL } from '@shell/store/type-map';
|
|
10
|
+
import { BLANK_CLUSTER } from '@shell/store';
|
|
10
11
|
|
|
11
12
|
export const NAME = 'manager';
|
|
12
13
|
|
|
@@ -28,6 +29,14 @@ export function init(store) {
|
|
|
28
29
|
icon: 'cluster-management',
|
|
29
30
|
removable: false,
|
|
30
31
|
showClusterSwitcher: false,
|
|
32
|
+
to: {
|
|
33
|
+
name: 'c-cluster-product-resource',
|
|
34
|
+
params: {
|
|
35
|
+
cluster: BLANK_CLUSTER,
|
|
36
|
+
product: NAME,
|
|
37
|
+
resource: CAPI.RANCHER_CLUSTER
|
|
38
|
+
}
|
|
39
|
+
},
|
|
31
40
|
});
|
|
32
41
|
|
|
33
42
|
virtualType({
|
package/config/settings.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Settings
|
|
2
2
|
import { MANAGEMENT } from './types';
|
|
3
|
+
|
|
3
4
|
// Adapted from: https://github.com/rancher/ui/blob/08c379a9529f740666a704b52522a468986c3520/lib/shared/addon/utils/constants.js#L564
|
|
4
5
|
// Setting IDs
|
|
5
6
|
export const SETTING = {
|
|
@@ -15,12 +16,12 @@ export const SETTING = {
|
|
|
15
16
|
API_HOST: 'api-host',
|
|
16
17
|
CA_CERTS: 'cacerts',
|
|
17
18
|
|
|
18
|
-
// Allow the local
|
|
19
|
+
// Allow the local cluster to be hidden
|
|
19
20
|
HIDE_LOCAL_CLUSTER: 'hide-local-cluster',
|
|
20
21
|
AUTH_TOKEN_MAX_TTL_MINUTES: 'auth-token-max-ttl-minutes',
|
|
21
22
|
KUBECONFIG_GENERATE_TOKEN: 'kubeconfig-generate-token',
|
|
22
23
|
KUBECONFIG_TOKEN_TTL_MINUTES: 'kubeconfig-token-ttl-minutes',
|
|
23
|
-
KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES:
|
|
24
|
+
KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES: 'kubeconfig-default-token-ttl-minutes',
|
|
24
25
|
ENGINE_URL: 'engine-install-url',
|
|
25
26
|
ENGINE_ISO_URL: 'engine-iso-url',
|
|
26
27
|
FIRST_LOGIN: 'first-login',
|
|
@@ -33,9 +34,11 @@ export const SETTING = {
|
|
|
33
34
|
AUTH_USER_SESSION_TTL_MINUTES: 'auth-user-session-ttl-minutes',
|
|
34
35
|
AUTH_USER_INFO_RESYNC_CRON: 'auth-user-info-resync-cron',
|
|
35
36
|
AUTH_LOCAL_VALIDATE_DESC: 'auth-password-requirements-description',
|
|
37
|
+
CATTLE_PASSWORD_MIN_LENGTH: 'password-min-length',
|
|
36
38
|
CLUSTER_TEMPLATE_ENFORCEMENT: 'cluster-template-enforcement',
|
|
37
39
|
UI_INDEX: 'ui-index',
|
|
38
40
|
UI_DASHBOARD_INDEX: 'ui-dashboard-index',
|
|
41
|
+
UI_DASHBOARD_HARVESTER_LEGACY_PLUGIN: 'ui-dashboard-harvester-legacy-plugin',
|
|
39
42
|
UI_OFFLINE_PREFERRED: 'ui-offline-preferred',
|
|
40
43
|
SYSTEM_DEFAULT_REGISTRY: 'system-default-registry',
|
|
41
44
|
UI_ISSUES: 'ui-issues',
|
|
@@ -63,11 +66,9 @@ export const SETTING = {
|
|
|
63
66
|
// These are the settings that are allowed to be edited via the UI
|
|
64
67
|
export const ALLOWED_SETTINGS = {
|
|
65
68
|
[SETTING.CA_CERTS]: { kind: 'multiline', readOnly: true },
|
|
66
|
-
// [SETTING.CLUSTER_DEFAULTS]: { kind: 'json' },
|
|
67
69
|
[SETTING.ENGINE_URL]: {},
|
|
68
70
|
[SETTING.ENGINE_ISO_URL]: {},
|
|
69
|
-
|
|
70
|
-
// [SETTING.ISSUES]: {},
|
|
71
|
+
[SETTING.CATTLE_PASSWORD_MIN_LENGTH]: { kind: 'integer' },
|
|
71
72
|
[SETTING.INGRESS_IP_DOMAIN]: {},
|
|
72
73
|
[SETTING.AUTH_USER_INFO_MAX_AGE_SECONDS]: {},
|
|
73
74
|
[SETTING.AUTH_USER_SESSION_TTL_MINUTES]: {},
|
|
@@ -78,7 +79,6 @@ export const ALLOWED_SETTINGS = {
|
|
|
78
79
|
[SETTING.AUTH_USER_INFO_RESYNC_CRON]: {},
|
|
79
80
|
[SETTING.SERVER_URL]: { kind: 'url', canReset: true },
|
|
80
81
|
[SETTING.RKE_METADATA_CONFIG]: { kind: 'json' },
|
|
81
|
-
// [SETTING.BANNERS]: { kind: 'json' },
|
|
82
82
|
[SETTING.SYSTEM_DEFAULT_REGISTRY]: {},
|
|
83
83
|
[SETTING.UI_INDEX]: {},
|
|
84
84
|
[SETTING.UI_DASHBOARD_INDEX]: {},
|
|
@@ -94,74 +94,19 @@ export const ALLOWED_SETTINGS = {
|
|
|
94
94
|
},
|
|
95
95
|
[SETTING.HIDE_LOCAL_CLUSTER]: { kind: 'boolean' },
|
|
96
96
|
};
|
|
97
|
-
|
|
98
|
-
export const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
UI_INDEX: 'ui-index',
|
|
103
|
-
UPGRADE_CHECKER_ENABLED: 'upgrade-checker-enabled',
|
|
104
|
-
UPGRADE_CHECKER_URL: 'upgrade-checker-url',
|
|
105
|
-
VLAN: 'vlan',
|
|
106
|
-
UI_SOURCE: 'ui-source',
|
|
107
|
-
HTTP_PROXY: 'http-proxy',
|
|
108
|
-
ADDITIONAL_CA: 'additional-ca',
|
|
109
|
-
OVERCOMMIT_CONFIG: 'overcommit-config',
|
|
110
|
-
CLUSTER_REGISTRATION_URL: 'cluster-registration-url',
|
|
111
|
-
DEFAULT_STORAGE_CLASS: 'default-storage-class',
|
|
112
|
-
VIP: 'vip-pools',
|
|
113
|
-
SUPPORT_BUNDLE_TIMEOUT: 'support-bundle-timeout',
|
|
114
|
-
SUPPORT_BUNDLE_IMAGE: 'support-bundle-image',
|
|
115
|
-
VM_FORCE_RESET_POLICY: 'vm-force-reset-policy',
|
|
116
|
-
SSL_CERTIFICATES: 'ssl-certificates',
|
|
117
|
-
SSL_PARAMETERS: 'ssl-parameters',
|
|
118
|
-
SUPPORT_BUNDLE_NAMESPACES: 'support-bundle-namespaces',
|
|
119
|
-
AUTO_DISK_PROVISION_PATHS: 'auto-disk-provision-paths',
|
|
120
|
-
RANCHER_MONITORING: 'fleet-local/rancher-monitoring',
|
|
121
|
-
RELEASE_DOWNLOAD_URL: 'release-download-url'
|
|
122
|
-
};
|
|
123
|
-
export const HCI_ALLOWED_SETTINGS = {
|
|
124
|
-
[HCI_SETTING.BACKUP_TARGET]: { kind: 'json', from: 'import' },
|
|
125
|
-
[HCI_SETTING.LOG_LEVEL]: {
|
|
126
|
-
kind: 'enum',
|
|
127
|
-
options: ['info', 'debug', 'trace']
|
|
128
|
-
},
|
|
129
|
-
[HCI_SETTING.VLAN]: {
|
|
130
|
-
kind: 'custom', from: 'import', alias: 'vlan'
|
|
131
|
-
},
|
|
132
|
-
[HCI_SETTING.SERVER_VERSION]: { readOnly: true },
|
|
133
|
-
[HCI_SETTING.UPGRADE_CHECKER_ENABLED]: { kind: 'boolean' },
|
|
134
|
-
[HCI_SETTING.UPGRADE_CHECKER_URL]: { kind: 'url' },
|
|
135
|
-
[HCI_SETTING.HTTP_PROXY]: { kind: 'json', from: 'import' },
|
|
136
|
-
[HCI_SETTING.ADDITIONAL_CA]: {
|
|
137
|
-
kind: 'multiline', canReset: true, from: 'import'
|
|
138
|
-
},
|
|
139
|
-
[HCI_SETTING.OVERCOMMIT_CONFIG]: { kind: 'json', from: 'import' },
|
|
140
|
-
[HCI_SETTING.SUPPORT_BUNDLE_TIMEOUT]: {},
|
|
141
|
-
[HCI_SETTING.SUPPORT_BUNDLE_IMAGE]: { kind: 'json', from: 'import' },
|
|
142
|
-
[HCI_SETTING.VM_FORCE_RESET_POLICY]: { kind: 'json', from: 'import' },
|
|
143
|
-
[HCI_SETTING.SSL_CERTIFICATES]: { kind: 'json', from: 'import' },
|
|
144
|
-
[HCI_SETTING.VIP]: {
|
|
145
|
-
kind: 'json', from: 'import', canReset: true
|
|
146
|
-
},
|
|
147
|
-
[HCI_SETTING.SSL_PARAMETERS]: {
|
|
148
|
-
kind: 'json', from: 'import', canReset: true
|
|
149
|
-
},
|
|
150
|
-
[HCI_SETTING.SUPPORT_BUNDLE_NAMESPACES]: { from: 'import', canReset: true },
|
|
151
|
-
[HCI_SETTING.AUTO_DISK_PROVISION_PATHS]: { canReset: true },
|
|
152
|
-
[HCI_SETTING.RANCHER_MONITORING]: {
|
|
153
|
-
kind: 'custom', from: 'import', canReset: true, customFormatter: 'json', alias: 'harvester-monitoring'
|
|
97
|
+
|
|
98
|
+
export const DEFAULT_PERF_SETTING = {
|
|
99
|
+
incrementalLoading: {
|
|
100
|
+
enabled: true,
|
|
101
|
+
threshold: 1500,
|
|
154
102
|
},
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
[HCI_SETTING.UI_SOURCE]: {
|
|
159
|
-
kind: 'enum',
|
|
160
|
-
options: ['auto', 'external', 'bundled']
|
|
103
|
+
manualRefresh: {
|
|
104
|
+
enabled: false,
|
|
105
|
+
threshold: 1500,
|
|
161
106
|
},
|
|
162
|
-
|
|
163
|
-
[HCI_SETTING.CLUSTER_REGISTRATION_URL]: { kind: 'url' },
|
|
107
|
+
disableWebsocketNotification: false
|
|
164
108
|
};
|
|
109
|
+
|
|
165
110
|
export const fetchOrCreateSetting = async(store, id, val, save = true) => {
|
|
166
111
|
let setting;
|
|
167
112
|
|
|
@@ -181,6 +126,7 @@ export const fetchOrCreateSetting = async(store, id, val, save = true) => {
|
|
|
181
126
|
|
|
182
127
|
return setting;
|
|
183
128
|
};
|
|
129
|
+
|
|
184
130
|
export const setSetting = async(store, id, val) => {
|
|
185
131
|
const setting = await fetchOrCreateSetting(store, id, val, false);
|
|
186
132
|
|
package/config/table-headers.js
CHANGED
package/config/types.js
CHANGED
|
@@ -79,7 +79,8 @@ export const WORKLOAD_TYPES = {
|
|
|
79
79
|
JOB: 'batch.job',
|
|
80
80
|
STATEFUL_SET: 'apps.statefulset',
|
|
81
81
|
REPLICA_SET: 'apps.replicaset',
|
|
82
|
-
REPLICATION_CONTROLLER: 'replicationcontroller'
|
|
82
|
+
REPLICATION_CONTROLLER: 'replicationcontroller',
|
|
83
|
+
POD: 'pod'
|
|
83
84
|
};
|
|
84
85
|
|
|
85
86
|
const {
|
|
@@ -267,30 +268,9 @@ export const VIRTUAL_TYPES = {
|
|
|
267
268
|
|
|
268
269
|
// harvester
|
|
269
270
|
export const HCI = {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
VM_TEMPLATE: 'harvesterhci.io.virtualmachinetemplate',
|
|
274
|
-
VM_VERSION: 'harvesterhci.io.virtualmachinetemplateversion',
|
|
275
|
-
IMAGE: 'harvesterhci.io.virtualmachineimage',
|
|
276
|
-
SSH: 'harvesterhci.io.keypair',
|
|
277
|
-
VOLUME: 'harvesterhci.io.volume',
|
|
278
|
-
USER: 'harvesterhci.io.user',
|
|
279
|
-
SETTING: 'harvesterhci.io.setting',
|
|
280
|
-
UPGRADE: 'harvesterhci.io.upgrade',
|
|
281
|
-
BACKUP: 'harvesterhci.io.virtualmachinebackup',
|
|
282
|
-
RESTORE: 'harvesterhci.io.virtualmachinerestore',
|
|
283
|
-
NODE_NETWORK: 'network.harvesterhci.io.nodenetwork',
|
|
284
|
-
CLUSTER_NETWORK: 'network.harvesterhci.io.clusternetwork',
|
|
285
|
-
SUPPORT_BUNDLE: 'harvesterhci.io.supportbundle',
|
|
286
|
-
NETWORK_ATTACHMENT: 'harvesterhci.io.networkattachmentdefinition',
|
|
287
|
-
CLUSTER: 'harvesterhci.io.management.cluster',
|
|
288
|
-
DASHBOARD: 'harvesterhci.io.dashboard',
|
|
289
|
-
BLOCK_DEVICE: 'harvesterhci.io.blockdevice',
|
|
290
|
-
CLOUD_TEMPLATE: 'harvesterhci.io.cloudtemplate',
|
|
291
|
-
HOST: 'harvesterhci.io.host',
|
|
292
|
-
VERSION: 'harvesterhci.io.version',
|
|
293
|
-
MANAGED_CHART: 'harvesterhci.io.managedchart',
|
|
271
|
+
CLUSTER: 'harvesterhci.io.management.cluster',
|
|
272
|
+
DASHBOARD: 'harvesterhci.io.dashboard',
|
|
273
|
+
IMAGE: 'harvesterhci.io.virtualmachineimage',
|
|
294
274
|
};
|
|
295
275
|
|
|
296
276
|
export const VIRTUAL_HARVESTER_PROVIDER = 'harvester';
|
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
|
}
|