@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
package/models/harvester/node.js
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
import pickBy from 'lodash/pickBy';
|
|
2
|
-
import { HCI, LONGHORN, POD, NODE } from '@shell/config/types';
|
|
3
|
-
import { HCI as HCI_ANNOTATIONS } from '@shell/config/labels-annotations';
|
|
4
|
-
import { clone } from '@shell/utils/object';
|
|
5
|
-
import findLast from 'lodash/findLast';
|
|
6
|
-
import { colorForState, stateDisplay } from '@shell/plugins/dashboard-store/resource-class';
|
|
7
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
8
|
-
import { parseSi } from '@shell/utils/units';
|
|
9
|
-
|
|
10
|
-
const ALLOW_SYSTEM_LABEL_KEYS = [
|
|
11
|
-
'topology.kubernetes.io/zone',
|
|
12
|
-
'topology.kubernetes.io/region',
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
export default class HciNode extends SteveModel {
|
|
16
|
-
get _availableActions() {
|
|
17
|
-
const cordon = {
|
|
18
|
-
action: 'cordon',
|
|
19
|
-
enabled: this.hasAction('cordon') && !this.isCordoned,
|
|
20
|
-
icon: 'icon icon-fw icon-pause',
|
|
21
|
-
label: this.t('harvester.action.cordon'),
|
|
22
|
-
total: 1,
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
const uncordon = {
|
|
26
|
-
action: 'uncordon',
|
|
27
|
-
enabled: this.hasAction('uncordon'),
|
|
28
|
-
icon: 'icon icon-fw icon-play',
|
|
29
|
-
label: this.t('harvester.action.uncordon'),
|
|
30
|
-
total: 1,
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
const enableMaintenance = {
|
|
34
|
-
action: 'enableMaintenanceMode',
|
|
35
|
-
enabled: this.hasAction('enableMaintenanceMode'),
|
|
36
|
-
icon: 'icon icon-fw icon-unlock',
|
|
37
|
-
label: this.t('harvester.action.enableMaintenance'),
|
|
38
|
-
total: 1
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const disableMaintenance = {
|
|
42
|
-
action: 'disableMaintenanceMode',
|
|
43
|
-
enabled: this.hasAction('disableMaintenanceMode'),
|
|
44
|
-
icon: 'icon icon-fw icon-lock',
|
|
45
|
-
label: this.t('harvester.action.disableMaintenance'),
|
|
46
|
-
total: 1
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
return [
|
|
50
|
-
cordon,
|
|
51
|
-
uncordon,
|
|
52
|
-
enableMaintenance,
|
|
53
|
-
disableMaintenance,
|
|
54
|
-
...super._availableActions
|
|
55
|
-
];
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
get confirmRemove() {
|
|
59
|
-
return true;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
get filteredSystemLabels() {
|
|
63
|
-
const reg = /(k3s|kubernetes|kubevirt|harvesterhci|k3os)+\.io/;
|
|
64
|
-
|
|
65
|
-
const labels = pickBy(this.labels, (value, key) => {
|
|
66
|
-
return !reg.test(key);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
ALLOW_SYSTEM_LABEL_KEYS.map((key) => {
|
|
70
|
-
const value = this?.metadata?.labels?.[key];
|
|
71
|
-
|
|
72
|
-
if (value) {
|
|
73
|
-
labels[key] = value;
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
return labels;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
get nameDisplay() {
|
|
81
|
-
return this.metadata?.annotations?.[HCI_ANNOTATIONS.HOST_CUSTOM_NAME] || this.name;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
get stateDisplay() {
|
|
85
|
-
if (this.isEnteringMaintenance) {
|
|
86
|
-
return 'Entering maintenance mode';
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (this.isMaintenance) {
|
|
90
|
-
return 'Maintenance';
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
if (this.isCordoned ) {
|
|
94
|
-
return 'Cordoned';
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return stateDisplay(this.state);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
get stateBackground() {
|
|
101
|
-
return colorForState(this.stateDisplay, this.stateObj?.error, this.stateObj?.transitioning).replace('text-', 'bg-');
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
get stateDescription() {
|
|
105
|
-
const currentIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.CURRENT_IP];
|
|
106
|
-
const initIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.INIT_IP];
|
|
107
|
-
|
|
108
|
-
if (initIP && currentIP && currentIP !== initIP) {
|
|
109
|
-
return this.t('harvester.host.inconsistentIP', { currentIP, initIP });
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return super.stateDescription;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
get stateObj() {
|
|
116
|
-
const currentIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.CURRENT_IP];
|
|
117
|
-
const initIP = this.metadata?.annotations?.[HCI_ANNOTATIONS.INIT_IP];
|
|
118
|
-
|
|
119
|
-
if (initIP && currentIP && currentIP !== initIP) {
|
|
120
|
-
this.metadata.state.error = true;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return this.metadata?.state;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
get detailLocation() {
|
|
127
|
-
const detailLocation = clone(this._detailLocation);
|
|
128
|
-
|
|
129
|
-
detailLocation.params.resource = HCI.HOST;
|
|
130
|
-
|
|
131
|
-
return detailLocation;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
get doneOverride() {
|
|
135
|
-
const detailLocation = clone(this._detailLocation);
|
|
136
|
-
|
|
137
|
-
delete detailLocation.params.namespace;
|
|
138
|
-
delete detailLocation.params.id;
|
|
139
|
-
detailLocation.params.resource = HCI.HOST;
|
|
140
|
-
detailLocation.name = 'c-cluster-product-resource';
|
|
141
|
-
|
|
142
|
-
return detailLocation;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
get parentNameOverride() {
|
|
146
|
-
return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.HOST }"`, { count: 1 })?.trim();
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
get parentLocationOverride() {
|
|
150
|
-
return this.doneOverride;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
get internalIp() {
|
|
154
|
-
const addresses = this.status?.addresses || [];
|
|
155
|
-
|
|
156
|
-
return findLast(addresses, address => address.type === 'InternalIP')?.address;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
get isMaster() {
|
|
160
|
-
return this.metadata?.labels?.[HCI_ANNOTATIONS.NODE_ROLE_MASTER] !== undefined || this.metadata?.labels?.[HCI_ANNOTATIONS.NODE_ROLE_CONTROL_PLANE] !== undefined;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
cordon() {
|
|
164
|
-
this.doAction('cordon', {});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
uncordon() {
|
|
168
|
-
this.doAction('uncordon', {});
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
enableMaintenanceMode(resources = this) {
|
|
172
|
-
this.$dispatch('promptModal', {
|
|
173
|
-
resources,
|
|
174
|
-
component: 'harvester/MaintenanceDialog'
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
disableMaintenanceMode() {
|
|
179
|
-
this.doAction('disableMaintenanceMode', {});
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
get isUnSchedulable() {
|
|
183
|
-
return this.metadata?.labels?.[HCI_ANNOTATIONS.NODE_SCHEDULABLE] === 'false' || this.spec.unschedulable;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
get isMigratable() {
|
|
187
|
-
const states = ['in-progress', 'unavailable'];
|
|
188
|
-
|
|
189
|
-
return !this.metadata?.annotations?.[HCI_ANNOTATIONS.MAINTENANCE_STATUS] && !this.isUnSchedulable && !states.includes(this.state);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
get isCordoned() {
|
|
193
|
-
return this.isUnSchedulable;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
get isEnteringMaintenance() {
|
|
197
|
-
return this.metadata?.annotations?.[HCI_ANNOTATIONS.MAINTENANCE_STATUS] === 'running';
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
get isMaintenance() {
|
|
201
|
-
return this.metadata?.annotations?.[HCI_ANNOTATIONS.MAINTENANCE_STATUS] === 'completed';
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
get longhornDisks() {
|
|
205
|
-
const inStore = this.$rootGetters['currentProduct'].inStore;
|
|
206
|
-
const longhornNode = this.$rootGetters[`${ inStore }/byId`](LONGHORN.NODES, `longhorn-system/${ this.id }`);
|
|
207
|
-
const diskStatus = longhornNode?.status?.diskStatus || {};
|
|
208
|
-
const diskSpec = longhornNode?.spec?.disks || {};
|
|
209
|
-
|
|
210
|
-
const longhornDisks = Object.keys(diskStatus).map((key) => {
|
|
211
|
-
return {
|
|
212
|
-
...diskSpec[key],
|
|
213
|
-
...diskStatus[key],
|
|
214
|
-
name: key,
|
|
215
|
-
storageReserved: diskSpec[key]?.storageReserved,
|
|
216
|
-
storageAvailable: diskStatus[key]?.storageAvailable,
|
|
217
|
-
storageMaximum: diskStatus[key]?.storageMaximum,
|
|
218
|
-
storageScheduled: diskStatus[key]?.storageScheduled,
|
|
219
|
-
readyCondiction: diskStatus[key]?.conditions?.Ready || {},
|
|
220
|
-
schedulableCondiction: diskStatus[key]?.conditions?.Schedulable || {},
|
|
221
|
-
};
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
return longhornDisks;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
get pods() {
|
|
228
|
-
const inStore = this.$rootGetters['currentProduct'].inStore;
|
|
229
|
-
const pods = this.$rootGetters[`${ inStore }/all`](POD) || [];
|
|
230
|
-
|
|
231
|
-
return pods.filter(p => p?.spec?.nodeName === this.id && p?.metadata?.name !== 'removing');
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
get reserved() {
|
|
235
|
-
try {
|
|
236
|
-
return JSON.parse(this.metadata.annotations[HCI_ANNOTATIONS.HOST_REQUEST] || '{}');
|
|
237
|
-
} catch {
|
|
238
|
-
return {};
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
get cpuReserved() {
|
|
243
|
-
return parseSi(this.reserved.cpu || '0');
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
get memoryReserved() {
|
|
247
|
-
return parseSi(this.reserved.memory || '0');
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
get canDelete() {
|
|
251
|
-
const nodes = this.$rootGetters['harvester/all'](NODE) || [];
|
|
252
|
-
|
|
253
|
-
return nodes.length > 1;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
import Vue from 'vue';
|
|
2
|
-
import { _CLONE } from '@shell/config/query-params';
|
|
3
|
-
import pick from 'lodash/pick';
|
|
4
|
-
import { HCI } from '@shell/config/types';
|
|
5
|
-
import { HCI as HCI_ANNOTATIONS, DESCRIPTION } from '@shell/config/labels-annotations';
|
|
6
|
-
import { findBy } from '@shell/utils/array';
|
|
7
|
-
import { get, clone } from '@shell/utils/object';
|
|
8
|
-
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
9
|
-
import { colorForState } from '@shell/plugins/dashboard-store/resource-class';
|
|
10
|
-
|
|
11
|
-
export default class HciPv extends SteveModel {
|
|
12
|
-
applyDefaults(_, realMode) {
|
|
13
|
-
const accessModes = realMode === _CLONE ? this.spec.accessModes : [];
|
|
14
|
-
const storage = realMode === _CLONE ? this.spec.resources.requests.storage : null;
|
|
15
|
-
|
|
16
|
-
Vue.set(this, 'spec', {
|
|
17
|
-
accessModes,
|
|
18
|
-
storageClassName: '',
|
|
19
|
-
volumeName: '',
|
|
20
|
-
resources: { requests: { storage } }
|
|
21
|
-
});
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
get availableActions() {
|
|
25
|
-
return [
|
|
26
|
-
{
|
|
27
|
-
action: 'exportImage',
|
|
28
|
-
enabled: this.hasAction('export'),
|
|
29
|
-
icon: 'icon icon-copy',
|
|
30
|
-
label: this.t('harvester.action.exportImage'),
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
action: 'cancelExpand',
|
|
34
|
-
enabled: this.hasAction('cancelExpand'),
|
|
35
|
-
icon: 'icon icon-backup',
|
|
36
|
-
label: this.t('harvester.action.cancelExpand'),
|
|
37
|
-
},
|
|
38
|
-
...super._availableActions
|
|
39
|
-
];
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
exportImage(resources = this) {
|
|
43
|
-
this.$dispatch('promptModal', {
|
|
44
|
-
resources,
|
|
45
|
-
component: 'harvester/ExportImageDialog'
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
cancelExpand(resources = this) {
|
|
50
|
-
this.doActionGrowl('cancelExpand', {});
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
cleanForNew() {
|
|
54
|
-
this.$dispatch(`cleanForNew`, this);
|
|
55
|
-
|
|
56
|
-
delete this.metadata.finalizers;
|
|
57
|
-
const keys = [HCI_ANNOTATIONS.IMAGE_ID, DESCRIPTION];
|
|
58
|
-
|
|
59
|
-
this.metadata.annotations = pick(this.metadata.annotations, keys);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
get canUpdate() {
|
|
63
|
-
return this.hasLink('update');
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
get stateDisplay() {
|
|
67
|
-
const ownedBy = this?.metadata?.annotations?.[HCI_ANNOTATIONS.OWNED_BY];
|
|
68
|
-
const status = this?.status?.phase === 'Bound' ? 'Ready' : 'NotReady';
|
|
69
|
-
|
|
70
|
-
const conditions = this?.status?.conditions || [];
|
|
71
|
-
|
|
72
|
-
if (findBy(conditions, 'type', 'Resizing')?.status === 'True') {
|
|
73
|
-
return 'Resizing';
|
|
74
|
-
} else if (ownedBy) {
|
|
75
|
-
return 'In-use';
|
|
76
|
-
} else {
|
|
77
|
-
return status;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
get state() {
|
|
82
|
-
let status = this?.status?.phase === 'Bound' ? 'Ready' : 'NotReady';
|
|
83
|
-
|
|
84
|
-
const conditions = this?.status?.conditions || [];
|
|
85
|
-
|
|
86
|
-
if (findBy(conditions, 'type', 'Resizing')?.status === 'True') {
|
|
87
|
-
status = 'Resizing';
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return status;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
get stateColor() {
|
|
94
|
-
const state = this.stateDisplay;
|
|
95
|
-
|
|
96
|
-
return colorForState(state);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
get stateDescription() {
|
|
100
|
-
return this.metadata?.annotations?.[HCI_ANNOTATIONS.VM_VOLUME_STATUS] || super.stateDescription;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
get detailLocation() {
|
|
104
|
-
const detailLocation = clone(this._detailLocation);
|
|
105
|
-
|
|
106
|
-
detailLocation.params.resource = HCI.VOLUME;
|
|
107
|
-
|
|
108
|
-
return detailLocation;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
get doneOverride() {
|
|
112
|
-
const detailLocation = clone(this._detailLocation);
|
|
113
|
-
|
|
114
|
-
delete detailLocation.params.namespace;
|
|
115
|
-
delete detailLocation.params.id;
|
|
116
|
-
detailLocation.params.resource = HCI.VOLUME;
|
|
117
|
-
detailLocation.name = 'c-cluster-product-resource';
|
|
118
|
-
|
|
119
|
-
return detailLocation;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
get parentNameOverride() {
|
|
123
|
-
return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.VOLUME }"`, { count: 1 }).trim();
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
get parentLocationOverride() {
|
|
127
|
-
return this.doneOverride;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
get phaseState() {
|
|
131
|
-
return this.status?.phase || 'N/A';
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
get attachVM() {
|
|
135
|
-
const allVMs = this.$rootGetters['harvester/all'](HCI.VM);
|
|
136
|
-
const ownedBy = get(this, `metadata.annotations."${ HCI_ANNOTATIONS.OWNED_BY }"`) || '';
|
|
137
|
-
|
|
138
|
-
if (!ownedBy) {
|
|
139
|
-
return null;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const ownedId = JSON.parse(ownedBy)[0]?.refs?.[0];
|
|
143
|
-
|
|
144
|
-
return allVMs.find( D => D.id === ownedId);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
get isAvailable() {
|
|
148
|
-
return this.stateDisplay !== 'Resizing';
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
get volumeSort() {
|
|
152
|
-
const volume = this.spec?.resources?.requests?.storage || 0;
|
|
153
|
-
|
|
154
|
-
return parseInt(volume);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
get isSystemResource() {
|
|
158
|
-
const systemNamespaces = this.$rootGetters['systemNamespaces'];
|
|
159
|
-
|
|
160
|
-
if ( systemNamespaces.includes(this.metadata?.namespace) ) {
|
|
161
|
-
return true;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
}
|
package/models/harvester/pod.js
DELETED
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import includes from 'lodash/includes';
|
|
2
|
-
import { findBy } from '@shell/utils/array';
|
|
3
|
-
import { get } from '@shell/utils/object';
|
|
4
|
-
import { NODE } from '@shell/config/types';
|
|
5
|
-
import Resource from '@shell/plugins/dashboard-store/resource-class';
|
|
6
|
-
|
|
7
|
-
const POD_STATUS_NOT_SCHEDULABLE = 'POD_NOT_SCHEDULABLE';
|
|
8
|
-
|
|
9
|
-
const POD_STATUS_FAILED = 'POD_FAILED';
|
|
10
|
-
const POD_STATUS_CRASHLOOP_BACKOFF = 'POD_CRASHLOOP_BACKOFF';
|
|
11
|
-
const POD_STATUS_UNKNOWN = 'POD_STATUS_UNKNOWN';
|
|
12
|
-
const POD_STATUS_CONTAINER_FAILING = 'POD_CONTAINER_FAILING';
|
|
13
|
-
const POD_STATUS_NOT_READY = 'POD_NOT_READY';
|
|
14
|
-
|
|
15
|
-
const POD_STATUS_PENDING = 'POD_STATUS_PENDING';
|
|
16
|
-
const POD_STATUS_COMPLETED = 'POD_STATUS_COMPLETED';
|
|
17
|
-
const POD_STATUS_SUCCEEDED = 'POD_STATUS_SUCCEEDED';
|
|
18
|
-
const POD_STATUS_RUNNING = 'POD_STATUS_RUNNING';
|
|
19
|
-
|
|
20
|
-
const failedWaitingContainerReasons = ['ImagePullBackOff', 'ErrImagePull', 'CrashLoopBackOff'];
|
|
21
|
-
const failedTerminationContainerReasons = ['Error'];
|
|
22
|
-
|
|
23
|
-
const errorStatusMapper = {
|
|
24
|
-
Failed: POD_STATUS_FAILED,
|
|
25
|
-
CrashLoopBackOff: POD_STATUS_CRASHLOOP_BACKOFF,
|
|
26
|
-
Unknown: POD_STATUS_UNKNOWN,
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
const okStatusMapper = {
|
|
30
|
-
Pending: POD_STATUS_PENDING,
|
|
31
|
-
Running: POD_STATUS_RUNNING,
|
|
32
|
-
Completed: POD_STATUS_COMPLETED,
|
|
33
|
-
Succeeded: POD_STATUS_SUCCEEDED,
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const stateReasonResolver = {
|
|
37
|
-
terminated: ({ reason, exitCode }) => `Terminated with ${ reason }${ exitCode ? ` (exit code ${ exitCode }).` : '.' }`,
|
|
38
|
-
waiting: ({ reason }) => `Waiting (${ reason }).`,
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export default class HciPod extends Resource {
|
|
42
|
-
get inStore() {
|
|
43
|
-
return this.$rootGetters['currentProduct'].inStore;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
get nodes() {
|
|
47
|
-
return this.$rootGetters[`${ this.inStore }/all`](NODE);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
get node() {
|
|
51
|
-
const { nodeName } = this.spec;
|
|
52
|
-
|
|
53
|
-
return this.nodes.filter((node) => {
|
|
54
|
-
return node?.metadata?.name === nodeName;
|
|
55
|
-
})[0];
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
get getPodStatus() {
|
|
59
|
-
return this.isNotSchedulable ||
|
|
60
|
-
this.hasErrorStatus ||
|
|
61
|
-
this.isContainerFailing ||
|
|
62
|
-
this.isNotReady ||
|
|
63
|
-
this.hasOkStatus || { status: POD_STATUS_UNKNOWN };
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
get isNotSchedulable() {
|
|
67
|
-
if (!this.isPodSchedulable) {
|
|
68
|
-
const conditions = get(this, 'status.conditions');
|
|
69
|
-
const podScheduledCond = findBy(conditions, 'type', 'PodScheduled');
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
status: POD_STATUS_NOT_SCHEDULABLE,
|
|
73
|
-
message: podScheduledCond.message || 'Pod scheduling failed.',
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
get hasErrorStatus() {
|
|
81
|
-
const status = errorStatusMapper[this?.status?.phase];
|
|
82
|
-
|
|
83
|
-
if (status) {
|
|
84
|
-
return {
|
|
85
|
-
status,
|
|
86
|
-
message: this.getContainerStatusReason(this.findFailingContainerStatus),
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return null;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
get isPodSchedulable() {
|
|
94
|
-
const conditions = get(this, 'status.conditions');
|
|
95
|
-
const podScheduledCond = findBy(conditions, 'type', 'PodScheduled');
|
|
96
|
-
|
|
97
|
-
return !(
|
|
98
|
-
podScheduledCond &&
|
|
99
|
-
podScheduledCond.status !== 'True' &&
|
|
100
|
-
podScheduledCond.reason === 'Unschedulable'
|
|
101
|
-
);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
get findFailingContainerStatus() {
|
|
105
|
-
return (get(this, 'status.containerStatuses'), []).find((container) => {
|
|
106
|
-
return !container.ready &&
|
|
107
|
-
(includes(failedWaitingContainerReasons, get(container, 'state.waiting.reason')) ||
|
|
108
|
-
includes(failedTerminationContainerReasons, get(container, 'state.terminated.reason')));
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
get getContainerStatusReason() {
|
|
113
|
-
return (containerStatus) => {
|
|
114
|
-
if (containerStatus) {
|
|
115
|
-
const stateName = Object.getOwnPropertyNames(containerStatus.state).find(
|
|
116
|
-
pn => !!containerStatus.state[pn].reason,
|
|
117
|
-
);
|
|
118
|
-
|
|
119
|
-
if (stateName) {
|
|
120
|
-
const state = containerStatus.state[stateName];
|
|
121
|
-
|
|
122
|
-
return (
|
|
123
|
-
state.message ||
|
|
124
|
-
(stateReasonResolver[stateName] && stateReasonResolver[stateName](state)) ||
|
|
125
|
-
stateName
|
|
126
|
-
);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return undefined;
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
get isContainerFailing() {
|
|
135
|
-
const failingContainer = this.findFailingContainerStatus;
|
|
136
|
-
|
|
137
|
-
if (failingContainer) {
|
|
138
|
-
return {
|
|
139
|
-
status: POD_STATUS_CONTAINER_FAILING,
|
|
140
|
-
message: this.getContainerStatusReason(failingContainer),
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
get isNotReady() {
|
|
148
|
-
const message = this.findPodFalseStatusConditionMessage;
|
|
149
|
-
|
|
150
|
-
if (message) {
|
|
151
|
-
return {
|
|
152
|
-
status: POD_STATUS_NOT_READY,
|
|
153
|
-
message,
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return null;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
get hasOkStatus() {
|
|
161
|
-
const status = okStatusMapper[this?.status?.phase];
|
|
162
|
-
|
|
163
|
-
if (status) {
|
|
164
|
-
return { status };
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
get findPodFalseStatusConditionMessage() {
|
|
171
|
-
const notReadyConditions = this.getPodFalseStatusConditions;
|
|
172
|
-
|
|
173
|
-
if (notReadyConditions.length > 0) {
|
|
174
|
-
return notReadyConditions[0].message || `Step: ${ notReadyConditions[0].type }`;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
return undefined;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
get getPodFalseStatusConditions() {
|
|
181
|
-
const conditions = get(this, 'status.conditions') || [];
|
|
182
|
-
|
|
183
|
-
return conditions.filter(condition => condition.status !== 'True');
|
|
184
|
-
}
|
|
185
|
-
}
|