@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
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { clone } from '@shell/utils/object';
|
|
2
|
-
import { HCI } from '@shell/config/types';
|
|
3
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
4
|
-
|
|
5
|
-
export default class HciConfigMap extends SteveModel {
|
|
6
|
-
get detailLocation() {
|
|
7
|
-
const detailLocation = clone(this._detailLocation);
|
|
8
|
-
|
|
9
|
-
detailLocation.params.resource = HCI.CLOUD_TEMPLATE;
|
|
10
|
-
|
|
11
|
-
return detailLocation;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
get doneOverride() {
|
|
15
|
-
const detailLocation = clone(this._detailLocation);
|
|
16
|
-
|
|
17
|
-
delete detailLocation.params.namespace;
|
|
18
|
-
delete detailLocation.params.id;
|
|
19
|
-
detailLocation.params.resource = HCI.CLOUD_TEMPLATE;
|
|
20
|
-
detailLocation.name = 'c-cluster-product-resource';
|
|
21
|
-
|
|
22
|
-
return detailLocation;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
get parentNameOverride() {
|
|
26
|
-
return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.CLOUD_TEMPLATE }"`, { count: 1 })?.trim();
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
get parentLocationOverride() {
|
|
30
|
-
return this.doneOverride;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { HCI } from '@shell/config/types';
|
|
2
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
3
|
-
|
|
4
|
-
export default class HciBlockDevice extends SteveModel {
|
|
5
|
-
get childParts() {
|
|
6
|
-
const inStore = this.$rootGetters['currentProduct'].inStore;
|
|
7
|
-
const bds = this.$rootGetters[`${ inStore }/all`](HCI.BLOCK_DEVICE);
|
|
8
|
-
|
|
9
|
-
const parts = bds.filter((b) => {
|
|
10
|
-
return b.status?.deviceStatus?.parentDevice === this.spec?.devPath &&
|
|
11
|
-
b.spec.nodeName === this.spec.nodeName;
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
return parts;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
get isChildPartProvisioned() {
|
|
18
|
-
const parts = this.childParts.filter(p => p.spec?.fileSystem?.provisioned) || [];
|
|
19
|
-
|
|
20
|
-
return parts.length > 0;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
get provisionPhase() {
|
|
24
|
-
const label = this?.status?.provisionPhase;
|
|
25
|
-
let color = '';
|
|
26
|
-
let icon = '';
|
|
27
|
-
|
|
28
|
-
switch (label) {
|
|
29
|
-
case 'Provisioned':
|
|
30
|
-
color = 'bg-success';
|
|
31
|
-
icon = 'icon-checkmark';
|
|
32
|
-
break;
|
|
33
|
-
case 'Unprovisioning':
|
|
34
|
-
color = 'bg-warning';
|
|
35
|
-
icon = 'icon-warning';
|
|
36
|
-
break;
|
|
37
|
-
case 'NotProvisioned':
|
|
38
|
-
color = 'bg-error';
|
|
39
|
-
icon = 'icon-warning';
|
|
40
|
-
break;
|
|
41
|
-
default:
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
label,
|
|
47
|
-
color,
|
|
48
|
-
icon,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
get displayName() {
|
|
53
|
-
return this.status?.deviceStatus?.devPath || this?.metadata?.name;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { get } from '@shell/utils/object';
|
|
2
|
-
import { findBy } from '@shell/utils/array';
|
|
3
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
4
|
-
|
|
5
|
-
export default class HciKeypair extends SteveModel {
|
|
6
|
-
get stateDisplay() {
|
|
7
|
-
const conditions = get(this, 'status.conditions');
|
|
8
|
-
const status = (findBy(conditions, 'type', 'validated') || {}).status ;
|
|
9
|
-
|
|
10
|
-
return status === 'True' ? 'Validated' : 'Not Validated';
|
|
11
|
-
}
|
|
12
|
-
}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { findBy } from '@shell/utils/array';
|
|
2
|
-
import { HCI } from '@shell/config/types';
|
|
3
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
4
|
-
import { HCI_ALLOWED_SETTINGS, HCI_SETTING } from '@shell/config/settings';
|
|
5
|
-
|
|
6
|
-
export default class HciSetting extends SteveModel {
|
|
7
|
-
get _availableActions() {
|
|
8
|
-
const toFilter = ['cloneYaml', 'download', 'goToEditYaml', 'goToViewYaml', 'goToViewConfig', 'promptRemove'];
|
|
9
|
-
const settingMetadata = HCI_ALLOWED_SETTINGS[this.id];
|
|
10
|
-
|
|
11
|
-
let out = super._availableActions;
|
|
12
|
-
|
|
13
|
-
// Some settings are not editable
|
|
14
|
-
if ( settingMetadata?.readOnly || this.fromEnv ) {
|
|
15
|
-
toFilter.push('goToEdit');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
out = out.filter((action) => {
|
|
19
|
-
return (!toFilter.includes(action.action));
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
// Change the label on the first action (edit)
|
|
23
|
-
const editAction = out.find(action => action.action === 'goToEdit');
|
|
24
|
-
|
|
25
|
-
if (editAction) {
|
|
26
|
-
editAction.label = this.t('advancedSettings.edit.label');
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const schema = this.$getters['schemaFor'](HCI.UPGRADE);
|
|
30
|
-
const hasUpgradeAccess = !!schema?.collectionMethods.find(x => ['post'].includes(x.toLowerCase()));
|
|
31
|
-
|
|
32
|
-
if (this.id === HCI_SETTING.SERVER_VERSION && hasUpgradeAccess) {
|
|
33
|
-
const latestUpgrade = this.$getters['all'](HCI.UPGRADE).find(upgrade => upgrade.isLatestUpgrade);
|
|
34
|
-
|
|
35
|
-
out.unshift({
|
|
36
|
-
action: 'goToAirgapUpgrade',
|
|
37
|
-
enabled: true,
|
|
38
|
-
icon: 'icon icon-refresh',
|
|
39
|
-
label: this.t('harvester.upgradePage.upgrade'),
|
|
40
|
-
disabled: !!latestUpgrade && !latestUpgrade?.isUpgradeSucceeded
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return out;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
goToAirgapUpgrade() {
|
|
48
|
-
const router = this.currentRouter();
|
|
49
|
-
|
|
50
|
-
router.push({
|
|
51
|
-
name: 'c-cluster-harvester-airgapupgrade',
|
|
52
|
-
params: { cluster: this.$rootGetters['currentCluster'].id, product: 'harvester' },
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
get backupTargetIsEmpty() {
|
|
57
|
-
return !this.value;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
get errMessage() {
|
|
61
|
-
if (this.metadata?.state?.error === true) {
|
|
62
|
-
return this.metadata.state.message;
|
|
63
|
-
} else {
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
get configuredCondition() {
|
|
69
|
-
return findBy((this?.status?.conditions || []), 'type', 'configured') || {};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
get valueOrDefaultValue() {
|
|
73
|
-
return this.value || this.default;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
get currentVersion() {
|
|
77
|
-
return this.value || '';
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
get displayValue() { // Select the field you want to display
|
|
81
|
-
if (this.id === 'backup-target') {
|
|
82
|
-
return this.parseValue?.endpoint || ' ';
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
get parseValue() {
|
|
89
|
-
let parseDefaultValue = {};
|
|
90
|
-
|
|
91
|
-
try {
|
|
92
|
-
parseDefaultValue = JSON.parse(this.value);
|
|
93
|
-
} catch (err) {
|
|
94
|
-
parseDefaultValue = JSON.parse(this.default);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return parseDefaultValue;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
get isS3() {
|
|
101
|
-
return this.parseValue.type === 's3';
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
get isNFS() {
|
|
105
|
-
return this.parseValue.type === 'nfs';
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
get customValidationRules() {
|
|
109
|
-
const id = this.id;
|
|
110
|
-
|
|
111
|
-
const out = [];
|
|
112
|
-
|
|
113
|
-
switch (id) {
|
|
114
|
-
case 'backup-target':
|
|
115
|
-
out.push( {
|
|
116
|
-
nullable: false,
|
|
117
|
-
path: 'value',
|
|
118
|
-
required: true,
|
|
119
|
-
type: 'string',
|
|
120
|
-
validators: ['backupTarget'],
|
|
121
|
-
});
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return out;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
2
|
-
|
|
3
|
-
export default class HciSupportBundle extends SteveModel {
|
|
4
|
-
get bundleState() {
|
|
5
|
-
const state = this?.status?.state;
|
|
6
|
-
|
|
7
|
-
// ready、generating
|
|
8
|
-
return state;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
get bundleMessage() {
|
|
12
|
-
const state = this?.metadata?.state;
|
|
13
|
-
|
|
14
|
-
if (state.error) {
|
|
15
|
-
return state?.message;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
get precent() {
|
|
22
|
-
return this?.status?.progress / 100 || 0;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
get customValidationRules() {
|
|
26
|
-
return [
|
|
27
|
-
{
|
|
28
|
-
nullable: false,
|
|
29
|
-
path: 'spec.description',
|
|
30
|
-
required: true,
|
|
31
|
-
translationKey: 'harvester.modal.bundle.description',
|
|
32
|
-
},
|
|
33
|
-
];
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import jsyaml from 'js-yaml';
|
|
2
|
-
import { NODE } from '@shell/config/types';
|
|
3
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
4
|
-
import { colorForState } from '@shell/plugins/dashboard-store/resource-class';
|
|
5
|
-
import { HCI } from '@shell/config/labels-annotations';
|
|
6
|
-
|
|
7
|
-
export default class HciUpgrade extends SteveModel {
|
|
8
|
-
get isLatestUpgrade() {
|
|
9
|
-
return this?.metadata?.labels?.[HCI.LATEST_UPGRADE] === 'true';
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
get isUpgradeSucceeded() {
|
|
13
|
-
return this?.metadata?.labels?.[HCI.UPGRADE_STATE] === 'Succeeded';
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
get hasReadMessage() {
|
|
17
|
-
return this?.metadata?.labels?.[HCI.REAY_MESSAGE] === 'true';
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
get repoInfo() {
|
|
21
|
-
const repoInfo = this?.status?.repoInfo;
|
|
22
|
-
|
|
23
|
-
if (repoInfo) {
|
|
24
|
-
try {
|
|
25
|
-
return jsyaml.load(repoInfo);
|
|
26
|
-
} catch (e) {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
get stateDisplay() {
|
|
35
|
-
const conditions = this?.status?.conditions || [];
|
|
36
|
-
const completedCondition = conditions.find( cond => cond.type === 'Completed');
|
|
37
|
-
const status = completedCondition?.status;
|
|
38
|
-
|
|
39
|
-
if (status === 'True') {
|
|
40
|
-
return 'Success';
|
|
41
|
-
} else if (status === 'False') {
|
|
42
|
-
return 'Fail';
|
|
43
|
-
} else {
|
|
44
|
-
return 'on-going';
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
get stateColor() {
|
|
49
|
-
return colorForState(this.stateDisplay);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
get nodes() {
|
|
53
|
-
return this.$rootGetters['harvester/all'](NODE);
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
get upgradeImage() {
|
|
57
|
-
return this?.status?.imageID;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
get upgradeMessage() {
|
|
61
|
-
const upgradeMessage = [];
|
|
62
|
-
const nodeStatuses = this?.status?.nodeStatuses || {};
|
|
63
|
-
const conditions = this?.status?.conditions || [];
|
|
64
|
-
|
|
65
|
-
for (const key in nodeStatuses) {
|
|
66
|
-
const state = nodeStatuses[key]?.state;
|
|
67
|
-
|
|
68
|
-
if (nodeStatuses[key] && state !== 'Succeeded' && state !== 'succeeded') {
|
|
69
|
-
upgradeMessage.push({
|
|
70
|
-
id: key,
|
|
71
|
-
message: `The node ${ key } is ${ nodeStatuses[key]?.state }`
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
for (let i = 0; i < conditions.length; i++) {
|
|
77
|
-
const type = conditions[i].type;
|
|
78
|
-
|
|
79
|
-
if (type === 'systemServiceUpgraded' && conditions[i]?.status !== 'True') {
|
|
80
|
-
upgradeMessage.push({
|
|
81
|
-
id: 'systemService',
|
|
82
|
-
message: `The systemService is upgrading`
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (this.metadata?.state?.message && this.metadata?.state?.error) {
|
|
88
|
-
upgradeMessage.push({
|
|
89
|
-
id: 'message',
|
|
90
|
-
message: `${ this.metadata.state.message }`
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return upgradeMessage;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
get createRepo() {
|
|
98
|
-
const conditions = this?.status?.conditions || [];
|
|
99
|
-
const repoCondition = conditions.find( cond => cond.type === 'RepoReady');
|
|
100
|
-
const isReady = repoCondition?.status === 'True';
|
|
101
|
-
|
|
102
|
-
return {
|
|
103
|
-
isReady,
|
|
104
|
-
message: repoCondition?.message || repoCondition?.reason
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
get overallMessage() {
|
|
109
|
-
const conditions = this?.status?.conditions || [];
|
|
110
|
-
const completedCondition = conditions.find( cond => cond.type === 'Completed');
|
|
111
|
-
const hasError = completedCondition?.status === 'False';
|
|
112
|
-
const message = completedCondition?.message || completedCondition?.reason;
|
|
113
|
-
|
|
114
|
-
return hasError ? message : '';
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
get upgradeImageMessage() {
|
|
118
|
-
const conditions = this?.status?.conditions || [];
|
|
119
|
-
const imageReady = conditions.find( cond => cond.type === 'ImageReady');
|
|
120
|
-
const hasError = imageReady?.status === 'False';
|
|
121
|
-
const message = imageReady?.message || imageReady?.reason;
|
|
122
|
-
|
|
123
|
-
return hasError ? message : '';
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
get nodeUpgradeMessage() {
|
|
127
|
-
const message = [];
|
|
128
|
-
const nodeStatuses = this?.status?.nodeStatuses || {};
|
|
129
|
-
|
|
130
|
-
for (const key in nodeStatuses) {
|
|
131
|
-
const state = nodeStatuses[key]?.state;
|
|
132
|
-
const _message = nodeStatuses[key]?.message;
|
|
133
|
-
|
|
134
|
-
let percent = 0;
|
|
135
|
-
|
|
136
|
-
if (state === 'Upgrading') {
|
|
137
|
-
percent = 50;
|
|
138
|
-
} else if (state === 'Succeeded' || state === 'succeeded') {
|
|
139
|
-
percent = 100;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
message.push({
|
|
143
|
-
name: key,
|
|
144
|
-
state,
|
|
145
|
-
percent,
|
|
146
|
-
message: _message
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
for (const node of this.nodes) {
|
|
151
|
-
const hasNode = message.find( O => O.name === node.id);
|
|
152
|
-
|
|
153
|
-
if (!hasNode) {
|
|
154
|
-
message.push({
|
|
155
|
-
name: node.id,
|
|
156
|
-
state: 'Pending',
|
|
157
|
-
percent: 0,
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return message;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
get nodeTotalPercent() {
|
|
166
|
-
let out = 0;
|
|
167
|
-
|
|
168
|
-
for (let i = 0; i < this.nodeUpgradeMessage.length; i++) {
|
|
169
|
-
out += this.nodeUpgradeMessage[i].percent;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
out = Math.floor(out / this.nodeUpgradeMessage.length);
|
|
173
|
-
const conditions = this?.status?.conditions || [];
|
|
174
|
-
const nodeUpgradedCondition = conditions.find( cond => cond.type === 'NodesUpgraded');
|
|
175
|
-
|
|
176
|
-
if (out === 100 && !nodeUpgradedCondition) {
|
|
177
|
-
out = 99;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
return out;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
get sysServiceUpgradeMessage() {
|
|
184
|
-
let percent = 0;
|
|
185
|
-
let state = 'Pending';
|
|
186
|
-
const message = [];
|
|
187
|
-
const conditions = this?.status?.conditions || [];
|
|
188
|
-
|
|
189
|
-
for (let i = 0; i < conditions.length; i++) {
|
|
190
|
-
const type = conditions[i].type;
|
|
191
|
-
|
|
192
|
-
if (type === 'SystemServicesUpgraded') {
|
|
193
|
-
if (conditions[i].status === 'True') {
|
|
194
|
-
percent = 100;
|
|
195
|
-
state = 'Succeeded';
|
|
196
|
-
} else {
|
|
197
|
-
percent = 50;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
message.push({
|
|
201
|
-
name: 'system services',
|
|
202
|
-
state,
|
|
203
|
-
percent,
|
|
204
|
-
message: conditions[i]?.message
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (message.length === 0) {
|
|
210
|
-
message.push({
|
|
211
|
-
name: 'system services',
|
|
212
|
-
state,
|
|
213
|
-
percent,
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
return message;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
get totalPercent() {
|
|
221
|
-
const nodePercent = this.nodeTotalPercent * this.nodeUpgradeMessage.length;
|
|
222
|
-
const servicePercent = this.sysServiceUpgradeMessage?.[0].percent;
|
|
223
|
-
|
|
224
|
-
return Math.floor((nodePercent + servicePercent) / (this.nodeUpgradeMessage.length + 1));
|
|
225
|
-
}
|
|
226
|
-
}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { HCI } from '@shell/config/types';
|
|
2
|
-
import { get } from '@shell/utils/object';
|
|
3
|
-
import { findBy } from '@shell/utils/array';
|
|
4
|
-
import { colorForState } from '@shell/plugins/dashboard-store/resource-class';
|
|
5
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
6
|
-
import { _CREATE } from '@shell/config/query-params';
|
|
7
|
-
|
|
8
|
-
export default class HciVmBackup extends SteveModel {
|
|
9
|
-
detailPageHeaderActionOverride(realMode) {
|
|
10
|
-
if (realMode === _CREATE) {
|
|
11
|
-
return this.t('harvester.backup.title');
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
get _availableActions() {
|
|
16
|
-
const toFilter = ['goToEdit', 'cloneYaml', 'goToClone', 'download'];
|
|
17
|
-
|
|
18
|
-
const out = super._availableActions.filter((action) => {
|
|
19
|
-
if (!toFilter.includes(action.action)) {
|
|
20
|
-
return action;
|
|
21
|
-
}
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
const schema = this.$getters['schemaFor'](HCI.VM);
|
|
25
|
-
let canCreateVM = true;
|
|
26
|
-
|
|
27
|
-
if ( schema && !schema?.collectionMethods.find(x => ['post'].includes(x.toLowerCase())) ) {
|
|
28
|
-
canCreateVM = false;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return [
|
|
32
|
-
{
|
|
33
|
-
action: 'restoreExistingVM',
|
|
34
|
-
enabled: canCreateVM && this.attachVmExisting && this?.status?.readyToUse,
|
|
35
|
-
icon: 'icons icon-refresh',
|
|
36
|
-
label: this.t('harvester.action.restoreExistingVM'),
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
action: 'restoreNewVM',
|
|
40
|
-
enabled: canCreateVM && this?.status?.readyToUse,
|
|
41
|
-
icon: 'icons icon-backup',
|
|
42
|
-
label: this.t('harvester.action.restoreNewVM'),
|
|
43
|
-
},
|
|
44
|
-
...out
|
|
45
|
-
];
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
restoreExistingVM(resource = this) {
|
|
49
|
-
const router = this.currentRouter();
|
|
50
|
-
|
|
51
|
-
router.push({
|
|
52
|
-
name: `c-cluster-product-resource-create`,
|
|
53
|
-
params: { resource: HCI.BACKUP },
|
|
54
|
-
query: { restoreMode: 'existing', backupName: resource.name }
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
restoreNewVM(resource = this) {
|
|
59
|
-
const router = this.currentRouter();
|
|
60
|
-
|
|
61
|
-
router.push({
|
|
62
|
-
name: `c-cluster-product-resource-create`,
|
|
63
|
-
params: { resource: HCI.BACKUP },
|
|
64
|
-
query: { restoreMode: 'new', backupName: resource.name }
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
get state() {
|
|
69
|
-
let out = 'Pending';
|
|
70
|
-
const conditions = get(this, 'status.conditions');
|
|
71
|
-
const isProgress = findBy(conditions, 'type', 'InProgress')?.status === 'True';
|
|
72
|
-
const isReady = findBy(conditions, 'type', 'Ready')?.status === 'True';
|
|
73
|
-
|
|
74
|
-
if (this?.status?.readyToUse) {
|
|
75
|
-
out = 'Ready';
|
|
76
|
-
} else if (isProgress) {
|
|
77
|
-
out = 'Progressing';
|
|
78
|
-
} else if (!isReady) {
|
|
79
|
-
out = 'error';
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return out;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
get stateColor() {
|
|
86
|
-
const state = this.state;
|
|
87
|
-
|
|
88
|
-
return colorForState(state);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
get attachVM() {
|
|
92
|
-
return this.spec.source.name;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
get backupContentName() {
|
|
96
|
-
return this?.status?.virtualMachineBackupContentName || '';
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
get backupTarget() {
|
|
100
|
-
return this?.status?.backupTarget?.endpoint || '';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
get attachVmExisting() {
|
|
104
|
-
const vmList = this.$rootGetters['harvester/all'](HCI.VM);
|
|
105
|
-
|
|
106
|
-
return !!vmList.find( V => V.metadata.name === this.attachVM);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
remove() {
|
|
110
|
-
const opt = { ...arguments };
|
|
111
|
-
|
|
112
|
-
opt.params = { propagationPolicy: 'Foreground' };
|
|
113
|
-
|
|
114
|
-
return this._remove(opt);
|
|
115
|
-
}
|
|
116
|
-
}
|