diff --git a/.github/mergify.yml b/.github/mergify.yml new file mode 100644 index 00000000000..6897b57df0b --- /dev/null +++ b/.github/mergify.yml @@ -0,0 +1,33 @@ +pull_request_rules: +- name: Automatically open backport PR to release-harvester-v1.3 + conditions: + - base=master + - label="Require backport v1.3" + actions: + backport: + branches: + - "release-harvester-v1.3" + assignees: + - "{{ author }}" + labels: + - "Backport to v1.3" + +- name: Automatically open backport PR to release-harvester-v1.4 + conditions: + - base=master + - label="Require backport v1.4" + actions: + backport: + branches: + - "release-harvester-v1.4" + assignees: + - "{{ author }}" + labels: + - "Backport to v1.4" + +- name: Ask to resolve conflict + conditions: + - conflict + actions: + comment: + message: This pull request is now in conflict. Could you fix it @{{author}}? 🙏 \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index f157f08f7e9..de3c518c60e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -9,7 +9,11 @@ - Are backend engineers aware of UI changes? - [ ] Yes, the backend owner is: +<<<<<<< HEAD Fixes # +======= +Related Issue # +>>>>>>> b5455bcb (fix: separate used/allocated units) ### Occurred changes and/or fixed issues diff --git a/.github/workflows/check-plugins.yaml b/.github/workflows/check-plugins.yaml index 0e11a682a77..d528d109831 100644 --- a/.github/workflows/check-plugins.yaml +++ b/.github/workflows/check-plugins.yaml @@ -13,7 +13,11 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v2 with: +<<<<<<< HEAD node-version: '14.x' +======= + node-version: '16.x' +>>>>>>> b5455bcb (fix: separate used/allocated units) - name: Validate Plugin build system run: ./shell/scripts/test-plugins-build.sh shell: bash diff --git a/README.md b/README.md index 20ea3e8f63a..b8152e26f45 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,10 @@ # Harvester Dashboard +<<<<<<< HEAD [![Build Status](http://drone-publish.rancher.io/api/badges/harvester/dashboard/status.svg)](http://drone-publish.rancher.io/harvester/dashboard) +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) Harvester Dashboard UI, Harvester is an open-source hyper-converged infrastructure (HCI) software built on Kubernetes. ## Running for Development @@ -33,7 +36,11 @@ In this mode, you need to have Rancher and import Harvester, more detail in [Har yarn build-pkg harvester && yarn serve-pkgs # Open another terminal +<<<<<<< HEAD HARVESTER_PKG_URL=http://127.0.0.1:4500/harvester-${version}/harvester-${version}.umd.min.js API=https://your-rancher-ip yarn mem-dev +======= +HARVESTER_PKG_URL=http://127.0.0.1:4500/harvester-${version}/harvester-${version}.umd.min.js API=https://your-rancher-ip RANCHER_ENV=harvester yarn mem-dev +>>>>>>> b5455bcb (fix: separate used/allocated units) # Example # HARVESTER_PKG_URL=http://127.0.0.1:4500/harvester-1.2.0/harvester-1.2.0.umd.min.js API=https://192.168.1.122 yarn mem-dev diff --git a/package.json b/package.json index 4c90ba699c8..349905a9263 100644 --- a/package.json +++ b/package.json @@ -69,8 +69,13 @@ "clipboard-polyfill": "4.0.1", "cookie": "0.5.0", "cookie-universal-nuxt": "2.1.4", +<<<<<<< HEAD "cron-validator": "1.2.0", "cronstrue": "1.95.0", +======= + "cron-validator": "1.3.1", + "cronstrue": "2.50.0", +>>>>>>> b5455bcb (fix: separate used/allocated units) "cross-env": "6.0.3", "d3": "7.3.0", "d3-selection": "1.4.1", diff --git a/pkg/harvester/components/FilterVMSchedule.vue b/pkg/harvester/components/FilterVMSchedule.vue new file mode 100644 index 00000000000..0cf6002a67b --- /dev/null +++ b/pkg/harvester/components/FilterVMSchedule.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/pkg/harvester/components/HarvesterUpgrade.vue b/pkg/harvester/components/HarvesterUpgrade.vue index 9996a6e1dc8..f0fd1b4fb08 100644 --- a/pkg/harvester/components/HarvesterUpgrade.vue +++ b/pkg/harvester/components/HarvesterUpgrade.vue @@ -188,7 +188,11 @@ export default { +<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units) {{ errors }} diff --git a/pkg/harvester/components/SettingList.vue b/pkg/harvester/components/SettingList.vue index b2bba63ea47..321e5f33db8 100644 --- a/pkg/harvester/components/SettingList.vue +++ b/pkg/harvester/components/SettingList.vue @@ -34,6 +34,7 @@ export default { }, data() { +<<<<<<< HEAD const categorySettings = this.settings.filter((s) => { if (this.category !== 'advanced') { return (CATEGORY[this.category] || []).find(item => item === s.id); @@ -43,6 +44,9 @@ export default { return !allCategory.some(category => (CATEGORY[category] || []).find(item => item === s.id)); } }) || []; +======= + const categorySettings = this.filterCategorySettings(); +>>>>>>> b5455bcb (fix: separate used/allocated units) return { HCI_SETTING, @@ -52,7 +56,31 @@ export default { computed: { ...mapGetters({ t: 'i18n/t' }) }, +<<<<<<< HEAD methods: { +======= + watch: { + settings: { + deep: true, + handler() { + this.$set(this, 'categorySettings', this.filterCategorySettings()); + } + } + }, + + methods: { + filterCategorySettings() { + return this.settings.filter((s) => { + if (this.category !== 'advanced') { + return (CATEGORY[this.category] || []).find(item => item === s.id); + } else if (this.category === 'advanced') { + const allCategory = Object.keys(CATEGORY); + + return !allCategory.some(category => (CATEGORY[category] || []).find(item => item === s.id)); + } + }) || []; + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) showActionMenu(e, setting) { const actionElement = e.srcElement; @@ -112,6 +140,12 @@ export default { Modified +<<<<<<< HEAD +======= + + Experimental + +>>>>>>> b5455bcb (fix: separate used/allocated units)

@@ -200,4 +234,15 @@ export default { padding: 2px 10px; font-size: 12px; } +<<<<<<< HEAD +======= + +.experimental { + margin-left: 10px; + border: 1px solid var(--error); + border-radius: 5px; + padding: 2px 10px; + font-size: 12px; +} +>>>>>>> b5455bcb (fix: separate used/allocated units) diff --git a/pkg/harvester/components/UpgradeInfo.vue b/pkg/harvester/components/UpgradeInfo.vue index 192eb406848..e70e400254d 100644 --- a/pkg/harvester/components/UpgradeInfo.vue +++ b/pkg/harvester/components/UpgradeInfo.vue @@ -1,5 +1,9 @@ + + diff --git a/pkg/harvester/components/settings/csi-driver-config.vue b/pkg/harvester/components/settings/csi-driver-config.vue index 02638fdd3bb..4ecc8fe388d 100644 --- a/pkg/harvester/components/settings/csi-driver-config.vue +++ b/pkg/harvester/components/settings/csi-driver-config.vue @@ -4,8 +4,12 @@ import LabeledSelect from '@shell/components/form/LabeledSelect'; import InfoBox from '@shell/components/InfoBox'; import { CSI_DRIVER, VOLUME_SNAPSHOT_CLASS } from '../../types'; import { allHash } from '@shell/utils/promise'; +<<<<<<< HEAD const LONGHORN_DRIVER = 'driver.longhorn.io'; +======= +import { LONGHORN_DRIVER } from '@shell/models/persistentvolume'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default { name: 'HarvesterCsiDriver', diff --git a/pkg/harvester/components/settings/storage-network.vue b/pkg/harvester/components/settings/storage-network.vue index 81af513614c..1231621b677 100644 --- a/pkg/harvester/components/settings/storage-network.vue +++ b/pkg/harvester/components/settings/storage-network.vue @@ -10,6 +10,10 @@ import Tip from '@shell/components/Tip'; import { HCI } from '../../types'; import { allHash } from '@shell/utils/promise'; import { NODE } from '@shell/config/types'; +<<<<<<< HEAD +======= +import { DOC_LINKS } from '../../config/doc-links'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default { name: 'HarvesterEditStorageNetwork', @@ -85,6 +89,12 @@ export default { }, computed: { +<<<<<<< HEAD +======= + storageNetworkExampleLink() { + return DOC_LINKS.STORAGE_NETWORK_EXAMPLE; + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) clusterNetworkOptions() { const inStore = this.$store.getters['currentProduct'].inStore; const clusterNetworks = this.$store.getters[`${ inStore }/all`](HCI.CLUSTER_NETWORK) || []; @@ -206,8 +216,13 @@ export default { :placeholder="t('harvester.setting.storageNetwork.range.placeholder')" label-key="harvester.setting.storageNetwork.range.label" /> +<<<<<<< HEAD +======= + + +>>>>>>> b5455bcb (fix: separate used/allocated units) >>>>>> b5455bcb (fix: separate used/allocated units) ATTACH_VOLUME: 'Existing Volume', CONTAINER: 'Container' }; @@ -41,7 +45,18 @@ export const ACCESS_CREDENTIALS = { INJECT_SSH: 'sshPublicKey' }; +<<<<<<< HEAD export const RunStrategys = ['Always', 'RerunOnFailure', 'Manual', 'Halted']; +======= +export const runStrategies = ['Always', 'RerunOnFailure', 'Manual', 'Halted']; + +export const maintenanceStrategies = [ + 'Migrate', + 'ShutdownAndRestartAfterEnable', + 'ShutdownAndRestartAfterDisable', + 'Shutdown' +]; +>>>>>>> b5455bcb (fix: separate used/allocated units) export const VOLUME_DATA_SOURCE_KIND = { VolumeSnapshot: 'VolumeSnapshot', @@ -61,4 +76,17 @@ export const ADD_ONS = { RANCHER_LOGGING: 'rancher-logging', RANCHER_MONITORING: 'rancher-monitoring', VM_IMPORT_CONTROLLER: 'vm-import-controller', +<<<<<<< HEAD +======= + LVM_DRIVER: 'lvm.driver.harvesterhci.io' +}; + +export const CSI_SECRETS = { + CSI_PROVISIONER_SECRET_NAME: 'csi.storage.k8s.io/provisioner-secret-name', + CSI_PROVISIONER_SECRET_NAMESPACE: 'csi.storage.k8s.io/provisioner-secret-namespace', + CSI_NODE_PUBLISH_SECRET_NAME: 'csi.storage.k8s.io/node-publish-secret-name', + CSI_NODE_PUBLISH_SECRET_NAMESPACE: 'csi.storage.k8s.io/node-publish-secret-namespace', + CSI_NODE_STAGE_SECRET_NAME: 'csi.storage.k8s.io/node-stage-secret-name', + CSI_NODE_STAGE_SECRET_NAMESPACE: 'csi.storage.k8s.io/node-stage-secret-namespace', +>>>>>>> b5455bcb (fix: separate used/allocated units) }; diff --git a/pkg/harvester/config/harvester.js b/pkg/harvester/config/harvester.js index 3d54eb0c1e8..d1c8eda4b92 100644 --- a/pkg/harvester/config/harvester.js +++ b/pkg/harvester/config/harvester.js @@ -28,6 +28,10 @@ import { import { IMAGE_DOWNLOAD_SIZE, +<<<<<<< HEAD +======= + IMAGE_VIRTUAL_SIZE, +>>>>>>> b5455bcb (fix: separate used/allocated units) FINGERPRINT, IMAGE_PROGRESS, SNAPSHOT_TARGET_VOLUME, @@ -36,8 +40,13 @@ import { import { IF_HAVE } from '@shell/store/type-map'; const TEMPLATE = HCI.VM_VERSION; +<<<<<<< HEAD const MONITORING_GROUP = 'Monitoring & Logging::Monitoring'; const LOGGING_GROUP = 'Monitoring & Logging::Logging'; +======= +const MONITORING_GROUP = 'Monitoring and Logging::Monitoring'; +const LOGGING_GROUP = 'Monitoring and Logging::Logging'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export const PRODUCT_NAME = 'harvester'; @@ -220,6 +229,10 @@ export function init($plugin, store) { NAMESPACE_COL, IMAGE_PROGRESS, IMAGE_DOWNLOAD_SIZE, +<<<<<<< HEAD +======= + IMAGE_VIRTUAL_SIZE, +>>>>>>> b5455bcb (fix: separate used/allocated units) AGE ]); virtualType({ @@ -235,6 +248,10 @@ export function init($plugin, store) { exact: false }); +<<<<<<< HEAD +======= + // show Projects/Namespace nav when integrated in Rancher dashboard +>>>>>>> b5455bcb (fix: separate used/allocated units) basicType(['projects-namespaces']); virtualType({ ifHave: IF_HAVE.MULTI_CLUSTER, @@ -418,6 +435,10 @@ export function init($plugin, store) { basicType( [ +<<<<<<< HEAD +======= + HCI.SCHEDULE_VM_BACKUP, +>>>>>>> b5455bcb (fix: separate used/allocated units) HCI.BACKUP, HCI.SNAPSHOT, HCI.VM_SNAPSHOT, @@ -439,6 +460,10 @@ export function init($plugin, store) { HCI.PCI_DEVICE, HCI.SR_IOVGPU_DEVICE, HCI.VGPU_DEVICE, +<<<<<<< HEAD +======= + HCI.USB_DEVICE, +>>>>>>> b5455bcb (fix: separate used/allocated units) HCI.ADD_ONS, HCI.SECRET, HCI.SETTING @@ -464,6 +489,23 @@ export function init($plugin, store) { exact: false }); +<<<<<<< HEAD +======= + configureType(HCI.SCHEDULE_VM_BACKUP, { showListMasthead: false, showConfigView: false }); + virtualType({ + labelKey: 'harvester.schedule.label', + name: HCI.SCHEDULE_VM_BACKUP, + namespaced: true, + weight: 201, + route: { + name: `${ PRODUCT_NAME }-c-cluster-resource`, + params: { resource: HCI.SCHEDULE_VM_BACKUP } + }, + exact: false, + ifHaveType: HCI.SCHEDULE_VM_BACKUP, + }); + +>>>>>>> b5455bcb (fix: separate used/allocated units) configureType(HCI.BACKUP, { showListMasthead: false, showConfigView: false }); virtualType({ labelKey: 'harvester.backup.label', @@ -772,6 +814,44 @@ export function init($plugin, store) { ] }); +<<<<<<< HEAD +======= + virtualType({ + labelKey: 'harvester.usb.label', + group: 'advanced', + weight: 11, + name: HCI.USB_DEVICE, + namespaced: false, + route: { + name: `${ PRODUCT_NAME }-c-cluster-resource`, + params: { resource: HCI.USB_DEVICE } + }, + exact: false, + ifHaveType: HCI.USB_DEVICE, + }); + + configureType(HCI.USB_DEVICE, { + isCreatable: false, + hiddenNamespaceGroupButton: true, + listGroups: [ + { + icon: 'icon-list-grouped', + value: 'description', + field: 'groupByDevice', + hideColumn: 'description', + tooltipKey: 'resourceTable.groupBy.device' + }, + { + icon: 'icon-cluster', + value: 'node', + field: 'groupByNode', + hideColumn: 'node', + tooltipKey: 'resourceTable.groupBy.node' + } + ] + }); + +>>>>>>> b5455bcb (fix: separate used/allocated units) configureType(HCI.ADD_ONS, { isCreatable: false, isRemovable: false, @@ -779,7 +859,11 @@ export function init($plugin, store) { }); virtualType({ +<<<<<<< HEAD label: 'Addons', +======= + label: 'Add-ons', +>>>>>>> b5455bcb (fix: separate used/allocated units) group: 'advanced', name: HCI.ADD_ONS, ifHaveType: HCI.ADD_ONS, diff --git a/pkg/harvester/config/labels-annotations.js b/pkg/harvester/config/labels-annotations.js index b1fc3e46820..be64ab8154e 100644 --- a/pkg/harvester/config/labels-annotations.js +++ b/pkg/harvester/config/labels-annotations.js @@ -1,7 +1,10 @@ export const HCI = { CLOUD_INIT: 'harvesterhci.io/cloud-init-template', CURRENT_IP: 'rke2.io/internal-ip', +<<<<<<< HEAD OWNED_BY: 'harvesterhci.io/owned-by', +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) IMAGE_ID: 'harvesterhci.io/imageId', SSH_NAMES: 'harvesterhci.io/sshNames', NETWORK_IPS: 'network.harvesterhci.io/ips', @@ -54,4 +57,9 @@ export const HCI = { NODE_CPU_MANAGER_UPDATE_STATUS: 'harvesterhci.io/cpu-manager-update-status', CPU_MANAGER: 'cpumanager', VM_DEVICE_ALLOCATION_DETAILS: 'harvesterhci.io/deviceAllocationDetails', +<<<<<<< HEAD +======= + SVM_BACKUP_ID: 'harvesterhci.io/svmbackupId', + DISABLE_LONGHORN_V2_ENGINE: 'node.longhorn.io/disable-v2-data-engine' +>>>>>>> b5455bcb (fix: separate used/allocated units) }; diff --git a/pkg/harvester/config/settings.js b/pkg/harvester/config/settings.js index 9822838c970..80cda161e84 100644 --- a/pkg/harvester/config/settings.js +++ b/pkg/harvester/config/settings.js @@ -31,7 +31,13 @@ export const HCI_SETTING = { VM_TERMINATION_PERIOD: 'default-vm-termination-grace-period-seconds', NTP_SERVERS: 'ntp-servers', AUTO_ROTATE_RKE2_CERTS: 'auto-rotate-rke2-certs', +<<<<<<< HEAD KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES: 'kubeconfig-default-token-ttl-minutes' +======= + KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES: 'kubeconfig-default-token-ttl-minutes', + LONGHORN_V2_DATA_ENGINE_ENABLED: 'longhorn-v2-data-engine-enabled', + ADDITIONAL_GUEST_MEMORY_OVERHEAD_RATIO: 'additional-guest-memory-overhead-ratio' +>>>>>>> b5455bcb (fix: separate used/allocated units) }; export const HCI_ALLOWED_SETTINGS = { @@ -82,7 +88,13 @@ export const HCI_ALLOWED_SETTINGS = { [HCI_SETTING.NTP_SERVERS]: { kind: 'json', from: 'import', canReset: true }, +<<<<<<< HEAD [HCI_SETTING.KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES]: {}, +======= + [HCI_SETTING.KUBECONFIG_DEFAULT_TOKEN_TTL_MINUTES]: {}, + [HCI_SETTING.LONGHORN_V2_DATA_ENGINE_ENABLED]: { kind: 'boolean', experimental: true }, + [HCI_SETTING.ADDITIONAL_GUEST_MEMORY_OVERHEAD_RATIO]: { kind: 'string', from: 'import' }, +>>>>>>> b5455bcb (fix: separate used/allocated units) }; export const HCI_SINGLE_CLUSTER_ALLOWED_SETTING = { diff --git a/pkg/harvester/config/table-headers.js b/pkg/harvester/config/table-headers.js index ecd7afa808c..5981b984c7f 100644 --- a/pkg/harvester/config/table-headers.js +++ b/pkg/harvester/config/table-headers.js @@ -8,7 +8,17 @@ export const IMAGE_DOWNLOAD_SIZE = { labelKey: 'tableHeaders.size', value: 'downSize', sort: 'status.size', +<<<<<<< HEAD width: 120 +======= +}; + +export const IMAGE_VIRTUAL_SIZE = { + name: 'virtualSize', + labelKey: 'harvester.tableHeaders.virtualSize', + value: 'virtualSize', + sort: 'status.virtualSize', +>>>>>>> b5455bcb (fix: separate used/allocated units) }; export const IMAGE_PROGRESS = { @@ -34,3 +44,43 @@ export const SNAPSHOT_TARGET_VOLUME = { sort: 'spec.source.persistentVolumeClaimName', formatter: 'SnapshotTargetVolume', }; +<<<<<<< HEAD +======= + +// The column of cron expression volume on VM schedules list page +export const VM_SCHEDULE_CRON = { + name: 'CronExpression', + labelKey: 'harvester.tableHeaders.cronExpression', + value: 'spec.cron', + align: 'center', + sort: 'spec.cron', + formatter: 'HarvesterCronExpression', +}; + +// The column of retain on VM schedules list page +export const VM_SCHEDULE_RETAIN = { + name: 'Retain', + labelKey: 'harvester.tableHeaders.retain', + value: 'spec.retain', + sort: 'spec.retain', + align: 'center', +}; + +// The column of maxFailure on VM schedules list page +export const VM_SCHEDULE_MAX_FAILURE = { + name: 'MaxFailure', + labelKey: 'harvester.tableHeaders.maxFailure', + value: 'spec.maxFailure', + sort: 'spec.maxFailure', + align: 'center', +}; + +// The column of type on VM schedules list page +export const VM_SCHEDULE_TYPE = { + name: 'Type', + labelKey: 'harvester.tableHeaders.scheduleType', + value: 'spec.vmbackup.type', + sort: 'spec.vmbackup.type', + align: 'center', +}; +>>>>>>> b5455bcb (fix: separate used/allocated units) diff --git a/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostBasic.vue b/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostBasic.vue index 28d9f486922..06c346964f8 100644 --- a/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostBasic.vue +++ b/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostBasic.vue @@ -48,6 +48,16 @@ export default { customName() { return this.value.metadata?.annotations?.[HCI_ANNOTATIONS.HOST_CUSTOM_NAME]; }, +<<<<<<< HEAD +======= + cpuManagerStatus() { + if (this.value.isCPUManagerEnableInProgress) { + return this.t('generic.loading'); + } + + return this.t(`generic.${ this.value.isCPUManagerEnabled ? 'enabled' : 'disabled' }`); + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) consoleUrl() { const consoleUrl = this.value.metadata?.annotations?.[HCI_ANNOTATIONS.HOST_CONSOLE_URL]; @@ -224,6 +234,12 @@ export default {
+<<<<<<< HEAD +======= +
+ +
+>>>>>>> b5455bcb (fix: separate used/allocated units)
{{ consoleUrl.display }} diff --git a/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue b/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue index 93c4821a6b7..44c36961732 100644 --- a/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue +++ b/pkg/harvester/detail/harvesterhci.io.host/HarvesterHostDisk.vue @@ -6,6 +6,11 @@ import { Banner } from '@components/Banner'; import HarvesterDisk from '../../mixins/harvester-disk'; import { RadioGroup } from '@components/Form/Radio'; +<<<<<<< HEAD +======= +import { LONGHORN_VERSION_V1 } from '@shell/models/persistentvolume'; + +>>>>>>> b5455bcb (fix: separate used/allocated units) export default { components: { LabelValue, @@ -84,6 +89,23 @@ export default { return ''; } }, +<<<<<<< HEAD +======= + + provisioner() { + let labelKey = `harvester.host.disk.storage.longhorn.${ LONGHORN_VERSION_V1 }.label`; + + if (this.value?.blockDevice?.spec?.provisioner.longhorn) { + labelKey = `harvester.host.disk.storage.longhorn.${ this.value.blockDevice.spec.provisioner.longhorn.engineVersion }.label`; + } + + if (this.value?.blockDevice?.spec?.provisioner.lvm) { + labelKey = 'harvester.host.disk.storage.lvm.label'; + } + + return this.t(labelKey); + } +>>>>>>> b5455bcb (fix: separate used/allocated units) }, methods: { update() { @@ -196,12 +218,25 @@ export default { :value="value.displayName" />
+<<<<<<< HEAD
+======= +
+>>>>>>> b5455bcb (fix: separate used/allocated units)
+<<<<<<< HEAD +======= +
+ +
+>>>>>>> b5455bcb (fix: separate used/allocated units)
diff --git a/pkg/harvester/detail/harvesterhci.io.host/index.vue b/pkg/harvester/detail/harvesterhci.io.host/index.vue index 8bd8c34467c..02fd54008a4 100644 --- a/pkg/harvester/detail/harvesterhci.io.host/index.vue +++ b/pkg/harvester/detail/harvesterhci.io.host/index.vue @@ -103,11 +103,18 @@ export default { const blockDevices = this.$store.getters[`${ inStore }/all`](HCI.BLOCK_DEVICE); const provisionedBlockDevices = blockDevices.filter((d) => { +<<<<<<< HEAD const provisioned = d?.spec?.fileSystem?.provisioned; const isCurrentNode = d?.spec?.nodeName === this.value.id; const isLonghornMounted = findBy(this.longhornDisks, 'name', d.metadata.name); return provisioned && isCurrentNode && !isLonghornMounted; +======= + const isCurrentNode = d?.spec?.nodeName === this.value.id; + const isLonghornMounted = findBy(this.longhornDisks, 'name', d.metadata.name); + + return d?.isProvisioned && isCurrentNode && !isLonghornMounted; +>>>>>>> b5455bcb (fix: separate used/allocated units) }) .map((d) => { return { diff --git a/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/BackupList.vue b/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/BackupList.vue new file mode 100644 index 00000000000..1ae77e55bf0 --- /dev/null +++ b/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/BackupList.vue @@ -0,0 +1,130 @@ + + + diff --git a/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/SnapshotList.vue b/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/SnapshotList.vue new file mode 100644 index 00000000000..9fa3111dcc0 --- /dev/null +++ b/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/SnapshotList.vue @@ -0,0 +1,98 @@ + + + diff --git a/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/index.vue b/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/index.vue new file mode 100644 index 00000000000..274bcf5eefd --- /dev/null +++ b/pkg/harvester/detail/harvesterhci.io.schedulevmbackup/index.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue b/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue index f97206f2b42..0a405409e96 100644 --- a/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue +++ b/pkg/harvester/detail/harvesterhci.io.virtualmachinebackup/index.vue @@ -127,16 +127,25 @@ export default {
+<<<<<<< HEAD
+======= +
+ +
+ +
+>>>>>>> b5455bcb (fix: separate used/allocated units)
+<<<<<<< HEAD
@@ -150,6 +159,21 @@ export default {
+======= +
+ +
+ +
+ +
+
+
+ +
+
+
+>>>>>>> b5455bcb (fix: separate used/allocated units)
+<<<<<<< HEAD
+======= +
+>>>>>>> b5455bcb (fix: separate used/allocated units)
@@ -97,6 +116,10 @@ export default { {{ t('generic.cancel') }} >>>>>> b5455bcb (fix: separate used/allocated units) mode="create" :disabled="disableSave" @click="save" diff --git a/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue b/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue index 3391ff17c54..c852cc37d3e 100644 --- a/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue +++ b/pkg/harvester/edit/harvesterhci.io.host/HarvesterDisk.vue @@ -1,22 +1,52 @@ + + diff --git a/pkg/harvester/edit/harvesterhci.io.storage/index.vue b/pkg/harvester/edit/harvesterhci.io.storage/index.vue index 34dbc90bf17..ad505648688 100644 --- a/pkg/harvester/edit/harvesterhci.io.storage/index.vue +++ b/pkg/harvester/edit/harvesterhci.io.storage/index.vue @@ -14,12 +14,29 @@ import Loading from '@shell/components/Loading'; import { _CREATE, _VIEW } from '@shell/config/query-params'; import { mapFeature, UNSUPPORTED_STORAGE_DRIVERS } from '@shell/store/features'; +<<<<<<< HEAD import { STORAGE_CLASS, LONGHORN } from '@shell/config/types'; import { CSI_DRIVER } from '../../types'; import { allHash } from '@shell/utils/promise'; import { clone } from '@shell/utils/object'; const LONGHORN_DRIVER = 'driver.longhorn.io'; +======= +import { STORAGE_CLASS, LONGHORN, SECRET, NAMESPACE } from '@shell/config/types'; +import { CSI_DRIVER } from '../../types'; +import { allHash } from '@shell/utils/promise'; +import { clone } from '@shell/utils/object'; +import { LONGHORN_DRIVER } from '@shell/models/persistentvolume'; +import { LVM_DRIVER } from '../../models/harvester/storage.k8s.io.storageclass'; +import { DATA_ENGINE_V1, DATA_ENGINE_V2 } from '../../models/harvester/persistentvolumeclaim'; + +const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine'; + +export const LVM_TOPOLOGY_LABEL = 'topology.lvm.csi/node'; + +const VOLUME_BINDING_MODE_IMMEDIATE = 'Immediate'; +const VOLUME_BINDING_MODE_WAIT = 'WaitForFirstConsumer'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default { name: 'HarvesterStorage', @@ -62,6 +79,7 @@ export default { const volumeBindingModeOptions = [ { label: this.t('storageClass.customize.volumeBindingMode.now'), +<<<<<<< HEAD value: 'Immediate' }, { @@ -71,31 +89,73 @@ export default { ]; const allowedTopologies = clone(this.value.allowedTopologies?.[0]?.matchLabelExpressions || []); +======= + value: VOLUME_BINDING_MODE_IMMEDIATE + }, + { + label: this.t('harvester.storage.customize.volumeBindingMode.later'), + value: VOLUME_BINDING_MODE_WAIT + } + ]; + + const allowedTopologies = clone(this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter(t => t.key !== LVM_TOPOLOGY_LABEL); +>>>>>>> b5455bcb (fix: separate used/allocated units) this.$set(this.value, 'parameters', this.value.parameters || {}); this.$set(this.value, 'provisioner', this.value.provisioner || LONGHORN_DRIVER); this.$set(this.value, 'allowVolumeExpansion', this.value.allowVolumeExpansion || allowVolumeExpansionOptions[0].value); this.$set(this.value, 'reclaimPolicy', this.value.reclaimPolicy || reclaimPolicyOptions[0].value); +<<<<<<< HEAD this.$set(this.value, 'volumeBindingMode', this.value.volumeBindingMode || volumeBindingModeOptions[0].value); return { +======= + + if (this.value.provisioner === LONGHORN_DRIVER) { + this.$set(this.value.parameters, 'dataEngine', this.value.longhornVersion); + this.$set(this.value, 'volumeBindingMode', this.value.volumeBindingMode || VOLUME_BINDING_MODE_IMMEDIATE); + } + + if (this.value.provisioner === LVM_DRIVER) { + this.$set(this.value, 'volumeBindingMode', this.value.volumeBindingMode || VOLUME_BINDING_MODE_WAIT); + } + + let provisioner = `${ this.value.provisioner || LONGHORN_DRIVER }`; + + if (provisioner === LONGHORN_DRIVER) { + provisioner = `${ provisioner }_${ this.value.longhornVersion }`; + } + + return { + LVM_DRIVER, +>>>>>>> b5455bcb (fix: separate used/allocated units) reclaimPolicyOptions, allowVolumeExpansionOptions, volumeBindingModeOptions, mountOptions: [], +<<<<<<< HEAD provisioner: LONGHORN_DRIVER, STORAGE_CLASS, +======= + STORAGE_CLASS, + provisioner, +>>>>>>> b5455bcb (fix: separate used/allocated units) allowedTopologies, defaultAddValue: { key: '', values: [], +<<<<<<< HEAD } +======= + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }, async fetch() { const inStore = this.$store.getters['currentProduct'].inStore; +<<<<<<< HEAD const hash = { storages: this.$store.dispatch(`${ inStore }/findAll`, { type: STORAGE_CLASS }), longhornNodes: this.$store.dispatch(`${ inStore }/findAll`, { type: LONGHORN.NODES }), @@ -103,6 +163,16 @@ export default { }; await allHash(hash); +======= + await allHash({ + namespaces: this.$store.dispatch(`${ inStore }/findAll`, { type: NAMESPACE }), + secrets: this.$store.dispatch(`${ inStore }/findAll`, { type: SECRET }), + storages: this.$store.dispatch(`${ inStore }/findAll`, { type: STORAGE_CLASS }), + longhornNodes: this.$store.dispatch(`${ inStore }/findAll`, { type: LONGHORN.NODES }), + csiDrivers: this.$store.dispatch(`${ inStore }/findAll`, { type: CSI_DRIVER }), + longhornV2DataEngine: this.$store.dispatch(`${ inStore }/find`, { type: LONGHORN.SETTINGS, id: LONGHORN_V2_DATA_ENGINE }), + }); +>>>>>>> b5455bcb (fix: separate used/allocated units) }, computed: { @@ -116,6 +186,7 @@ export default { return this.isCreate ? _CREATE : _VIEW; }, +<<<<<<< HEAD provisionerWatch() { return this.value.provisioner; }, @@ -130,6 +201,39 @@ export default { value: provisioner.name, }; }); +======= + provisioners() { + const out = []; + + const inStore = this.$store.getters['currentProduct'].inStore; + const csiDrivers = this.$store.getters[`${ inStore }/all`](CSI_DRIVER) || []; + + csiDrivers.forEach(({ name }) => { + switch (name) { + case LONGHORN_DRIVER: + out.push({ + label: `harvester.storage.storageClass.longhorn.${ DATA_ENGINE_V1 }.label`, + value: `${ name }_${ DATA_ENGINE_V1 }`, + }); + + if (this.longhornSystemVersion === DATA_ENGINE_V2 || this.value.longhornVersion === DATA_ENGINE_V2) { + out.push({ + label: `harvester.storage.storageClass.longhorn.${ DATA_ENGINE_V2 }.label`, + value: `${ name }_${ DATA_ENGINE_V2 }`, + }); + } + break; + case LVM_DRIVER: + out.push({ + label: 'harvester.storage.storageClass.lvm.label', + value: name, + }); + break; + } + }); + + return out; +>>>>>>> b5455bcb (fix: separate used/allocated units) }, schema() { @@ -137,6 +241,7 @@ export default { return this.$store.getters[`${ inStore }/schemaFor`](STORAGE_CLASS); }, +<<<<<<< HEAD }, watch: { @@ -146,6 +251,47 @@ export default { }, created() { +======= + + longhornSystemVersion() { + const inStore = this.$store.getters['currentProduct'].inStore; + const v2DataEngine = this.$store.getters[`${ inStore }/byId`](LONGHORN.SETTINGS, LONGHORN_V2_DATA_ENGINE) || {}; + + return v2DataEngine.value === 'true' ? DATA_ENGINE_V2 : DATA_ENGINE_V1; + }, + }, + + watch: { + provisioner(neu) { + const [provisioner, dataEngine] = neu?.split('_'); + + let parameters = {}; + + if (provisioner === LVM_DRIVER) { + const matchLabelExpressions = (this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter(t => t.key !== LVM_TOPOLOGY_LABEL); + + if (matchLabelExpressions.length > 0) { + this.$set(this.value, 'allowedTopologies', [{ matchLabelExpressions }]); + } else { + delete this.value.allowedTopologies; + } + + this.$set(this.value, 'volumeBindingMode', VOLUME_BINDING_MODE_WAIT); + } + + if (provisioner === LONGHORN_DRIVER) { + parameters = { dataEngine }; + this.$set(this.value, 'volumeBindingMode', VOLUME_BINDING_MODE_IMMEDIATE); + } + + this.$set(this.value, 'provisioner', provisioner); + this.$set(this.value, 'allowVolumeExpansion', this.value.provisioner === LONGHORN_DRIVER); + this.$set(this.value, 'parameters', parameters); + } + }, + + created(neu) { +>>>>>>> b5455bcb (fix: separate used/allocated units) this.registerBeforeHook(this.willSave, 'willSave'); }, @@ -158,11 +304,14 @@ export default { } }, +<<<<<<< HEAD updateProvisioner(provisioner) { this.$set(this.value, 'provisioner', provisioner); this.$set(this.value, 'allowVolumeExpansion', provisioner === LONGHORN_DRIVER); }, +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) willSave() { Object.keys(this.value.parameters).forEach((key) => { if (this.value.parameters[key] === null || this.value.parameters[key] === '') { @@ -174,10 +323,22 @@ export default { }, formatAllowedTopoloties() { +<<<<<<< HEAD const neu = this.allowedTopologies; if (!neu || neu.length === 0) { delete this.value.allowedTopologies; +======= + const neu = this.allowedTopologies.filter(t => t.key !== LVM_TOPOLOGY_LABEL); + const lvmMatchExpression = (this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter(t => t.key === LVM_TOPOLOGY_LABEL); + + if (!neu || neu.length === 0) { + if (lvmMatchExpression.length > 0) { + this.value.allowedTopologies = [{ matchLabelExpressions: lvmMatchExpression }]; + } else { + delete this.value.allowedTopologies; + } +>>>>>>> b5455bcb (fix: separate used/allocated units) return; } @@ -185,7 +346,11 @@ export default { const matchLabelExpressions = neu.filter(R => !!R.key.trim() && (R.values.length > 0 && !R.values.find(V => !V.trim()))); if (matchLabelExpressions.length > 0) { +<<<<<<< HEAD this.value.allowedTopologies = [{ matchLabelExpressions }]; +======= + this.value.allowedTopologies = [{ matchLabelExpressions: [...matchLabelExpressions, ...lvmMatchExpression] }]; +>>>>>>> b5455bcb (fix: separate used/allocated units) } } } @@ -214,7 +379,11 @@ export default { :register-before-hook="registerBeforeHook" /> >>>>>> b5455bcb (fix: separate used/allocated units) label="Provisioner" :options="provisioners" :localized-label="true" @@ -222,13 +391,21 @@ export default { :searchable="true" :taggable="true" class="mb-20" +<<<<<<< HEAD @input="updateProvisioner($event)" +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) /> >>>>>> b5455bcb (fix: separate used/allocated units) :value="value" :mode="modeOverride" :real-mode="realMode" @@ -263,6 +440,10 @@ export default { :label="t('storageClass.customize.volumeBindingMode.label')" :mode="modeOverride" :options="volumeBindingModeOptions" +<<<<<<< HEAD +======= + :disabled="provisioner === LVM_DRIVER" +>>>>>>> b5455bcb (fix: separate used/allocated units) />
diff --git a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v1.vue b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v1.vue new file mode 100644 index 00000000000..d41f914fd27 --- /dev/null +++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v1.vue @@ -0,0 +1,350 @@ + + + + diff --git a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v2.vue b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v2.vue new file mode 100644 index 00000000000..f495998198d --- /dev/null +++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/driver.longhorn.io_v2.vue @@ -0,0 +1,352 @@ + + + + diff --git a/pkg/harvester/edit/harvesterhci.io.storage/provisioners/lvm.driver.harvesterhci.io.vue b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/lvm.driver.harvesterhci.io.vue new file mode 100644 index 00000000000..dd714bca8e1 --- /dev/null +++ b/pkg/harvester/edit/harvesterhci.io.storage/provisioners/lvm.driver.harvesterhci.io.vue @@ -0,0 +1,169 @@ + + + + diff --git a/pkg/harvester/edit/harvesterhci.io.virtualmachinebackup.vue b/pkg/harvester/edit/harvesterhci.io.virtualmachinebackup.vue index 05b4c1b3139..d73a5f62bc6 100644 --- a/pkg/harvester/edit/harvesterhci.io.virtualmachinebackup.vue +++ b/pkg/harvester/edit/harvesterhci.io.virtualmachinebackup.vue @@ -159,6 +159,13 @@ export default { }, methods: { +<<<<<<< HEAD +======= + cancelAction() { + this.$router.go(-1); + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) async saveRestore(buttonCb) { this.update(); @@ -261,7 +268,11 @@ export default { />
+<<<<<<< HEAD
+======= +
+>>>>>>> b5455bcb (fix: separate used/allocated units)
diff --git a/pkg/harvester/edit/harvesterhci.io.virtualmachineimage.vue b/pkg/harvester/edit/harvesterhci.io.virtualmachineimage.vue index 23f28082c12..7572e748961 100644 --- a/pkg/harvester/edit/harvesterhci.io.virtualmachineimage.vue +++ b/pkg/harvester/edit/harvesterhci.io.virtualmachineimage.vue @@ -8,7 +8,10 @@ import NameNsDescription from '@shell/components/form/NameNsDescription'; import { RadioGroup } from '@components/Form/Radio'; import Select from '@shell/components/form/Select'; import LabeledSelect from '@shell/components/form/LabeledSelect'; +<<<<<<< HEAD +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) import CreateEditView from '@shell/mixins/create-edit-view'; import { OS } from '../mixins/harvester-vm'; import { VM_IMAGE_FILE_FORMAT } from '../validators/vm-image'; @@ -17,7 +20,15 @@ import { exceptionToErrorsArray } from '@shell/utils/error'; import { allHash } from '@shell/utils/promise'; import { STORAGE_CLASS } from '@shell/config/types'; import { HCI } from '../types'; +<<<<<<< HEAD +======= +import { LVM_DRIVER } from '../models/harvester/storage.k8s.io.storageclass'; + +const ENCRYPT = 'encrypt'; +const DECRYPT = 'decrypt'; +const CLONE = 'clone'; +>>>>>>> b5455bcb (fix: separate used/allocated units) const DOWNLOAD = 'download'; const UPLOAD = 'upload'; const rawORqcow2 = 'raw_qcow2'; @@ -57,11 +68,41 @@ export default { const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find(s => s.isDefault); this.$set(this, 'storageClassName', this.storageClassName || defaultStorage?.metadata?.name || 'longhorn'); +<<<<<<< HEAD }, data() { if ( !this.value.spec ) { this.$set(this.value, 'spec', { sourceType: DOWNLOAD }); +======= + this.images = this.$store.getters[`${ inStore }/all`](HCI.IMAGE); + + const { securityParameters } = this.value.spec; + + // edit and view mode should show the source image + if (securityParameters) { + // image ns/name = image.id + const sourceImage = `${ securityParameters.sourceImageNamespace }/${ securityParameters.sourceImageName }`; + + this.selectedImage = this.images.find(image => image.id === sourceImage); + } + }, + + data() { + // pass from Encrypt Image / Decrypt Image actions + const { image, sourceType, cryptoOperation } = this.$route.query || {}; + + if ( !this.value.spec ) { + this.$set(this.value, 'spec', { sourceType: sourceType || DOWNLOAD }); + } + + if (image && cryptoOperation) { + this.$set(this.value.spec, 'securityParameters', { + cryptoOperation, + sourceImageName: image.metadata.name, + sourceImageNamespace: image.metadata.namespace + }); +>>>>>>> b5455bcb (fix: separate used/allocated units) } if (!this.value.metadata.name) { @@ -69,12 +110,23 @@ export default { } return { +<<<<<<< HEAD url: this.value.spec.url, files: [], resource: '', headers: {}, fileUrl: '', file: '', +======= + selectedImage: image || null, + images: [], + url: this.value.spec.url, + files: [], + resource: '', + headers: {}, + fileUrl: '', + file: '', +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }, @@ -92,13 +144,27 @@ export default { }, showEditAsYaml() { +<<<<<<< HEAD return this.value.spec.sourceType === DOWNLOAD; }, +======= + return this.value.spec.sourceType === DOWNLOAD || this.value.spec.sourceType === CLONE; + }, + radioGroupOptions() { + return [ + DOWNLOAD, + UPLOAD, + ENCRYPT, + DECRYPT + ]; + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) storageClassOptions() { const inStore = this.$store.getters['currentProduct'].inStore; const storages = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS); +<<<<<<< HEAD const out = storages.filter(s => !s.parameters?.backingImage).map((s) => { const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name; @@ -109,6 +175,18 @@ export default { }) || []; return out; +======= + return storages + .filter(s => !s.parameters?.backingImage && s.provisioner !== LVM_DRIVER) // Lvm storage is not supported. + .map((s) => { + const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name; + + return { + label, + value: s.name, + }; + }) || []; +>>>>>>> b5455bcb (fix: separate used/allocated units) }, storageClassName: { @@ -120,6 +198,62 @@ export default { this.value.metadata.annotations[HCI_ANNOTATIONS.STORAGE_CLASS] = nue; } }, +<<<<<<< HEAD +======= + sourceImageOptions() { + let options = []; + + if (this.value.spec.sourceType !== CLONE) { + return options; + } + if (this.value.spec.securityParameters.cryptoOperation === ENCRYPT) { + options = this.images.filter(image => !image.isEncrypted); + } else { + options = this.images.filter(image => image.isEncrypted); + } + + return options.map(image => image.displayNameWithNamespace); + }, + sourceImage: { + get() { + if (this.selectedImage) { + return this.selectedImage.displayNameWithNamespace; + } + + return ''; + }, + set(neu) { + this.selectedImage = this.images.find(i => i.displayNameWithNamespace === neu); + // sourceImageName should bring the name of the image + this.value.spec.securityParameters.sourceImageName = this.selectedImage?.metadata.name || ''; + this.value.spec.securityParameters.sourceImageNamespace = this.selectedImage?.metadata.namespace || ''; + } + }, + sourceType: { + get() { + if (this.value.spec.sourceType === CLONE) { + return this.value.spec?.securityParameters?.cryptoOperation; + } else { + return this.value.spec.sourceType; + } + }, + + set(neu) { + if (neu === DECRYPT || neu === ENCRYPT) { + this.value.spec.sourceType = CLONE; + this.$set(this.value.spec, 'securityParameters', { + cryptoOperation: neu, + sourceImageName: '', + sourceImageNamespace: this.value.metadata.namespace + }); + this.selectedImage = null; + } else { + this.$delete(this.value.spec, 'securityParameters'); + this.value.spec.sourceType = neu; + } + } + } +>>>>>>> b5455bcb (fix: separate used/allocated units) }, watch: { @@ -297,6 +431,7 @@ export default { > @@ -331,7 +476,11 @@ export default { :tooltip="t('harvester.image.urlTip', {}, true)" /> +<<<<<<< HEAD
+======= +
+>>>>>>> b5455bcb (fix: separate used/allocated units) +<<<<<<< HEAD +======= + + +>>>>>>> b5455bcb (fix: separate used/allocated units)
@@ -412,6 +574,7 @@ export default { @focusKey="focusKey" @input="value.setLabels($event)" > +<<<<<<< HEAD +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) diff --git a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue index 935697d6546..d194691f586 100644 --- a/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +++ b/pkg/harvester/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue @@ -1,9 +1,16 @@ + + diff --git a/pkg/harvester/formatters/HarvesterCPUPinning.vue b/pkg/harvester/formatters/HarvesterCPUPinning.vue new file mode 100644 index 00000000000..32b338a898d --- /dev/null +++ b/pkg/harvester/formatters/HarvesterCPUPinning.vue @@ -0,0 +1,44 @@ + + + diff --git a/pkg/harvester/formatters/HarvesterCronExpression.vue b/pkg/harvester/formatters/HarvesterCronExpression.vue new file mode 100644 index 00000000000..6755314f185 --- /dev/null +++ b/pkg/harvester/formatters/HarvesterCronExpression.vue @@ -0,0 +1,32 @@ + + + diff --git a/pkg/harvester/formatters/HarvesterMigrationState.vue b/pkg/harvester/formatters/HarvesterMigrationState.vue index 8bcd5c23693..da42ebdc222 100644 --- a/pkg/harvester/formatters/HarvesterMigrationState.vue +++ b/pkg/harvester/formatters/HarvesterMigrationState.vue @@ -25,13 +25,25 @@ export default { return vmi; }, +<<<<<<< HEAD state() { return this.vmiResource?.migrationState?.status || ''; +======= + migrationState() { + return this.vmiResource?.migrationState?.status || ''; + }, + migrationBackground() { + return this.vmiResource?.migrationStateBackground || ''; +>>>>>>> b5455bcb (fix: separate used/allocated units) } }, watch: { +<<<<<<< HEAD state(neu) { +======= + migrationState(neu) { +>>>>>>> b5455bcb (fix: separate used/allocated units) this.$emit('state-changed', neu); } }, @@ -39,9 +51,15 @@ export default { diff --git a/pkg/harvester/formatters/HarvesterStorageUsed.vue b/pkg/harvester/formatters/HarvesterStorageUsed.vue index e37f27c98b9..cb139854826 100644 --- a/pkg/harvester/formatters/HarvesterStorageUsed.vue +++ b/pkg/harvester/formatters/HarvesterStorageUsed.vue @@ -72,17 +72,35 @@ export default { return stats; }, +<<<<<<< HEAD units() { +======= + allocatedUnits() { + const exponent = exponentNeeded(this.storageStats.total, 1024); + + return `${ UNITS[exponent] }iB`; + }, + + usedUnits() { +>>>>>>> b5455bcb (fix: separate used/allocated units) const exponent = exponentNeeded(this.storageStats.maximum, 1024); return `${ UNITS[exponent] }iB`; }, +<<<<<<< HEAD used() { let out = this.formatter(this.storageStats.used); if (!Number.parseFloat(out) > 0) { out = this.formatter(this.storageStats.used, { canRoundToZero: false }); +======= + formatUsed() { + let out = this.formatter(this.storageStats.used); + + if (!Number.parseFloat(out) > 0) { + out = this.formatter(this.storageStats.used, { canRoundToZero: true }); +>>>>>>> b5455bcb (fix: separate used/allocated units) } return out; @@ -92,7 +110,11 @@ export default { let out = this.formatter(this.storageStats.scheduled); if (!Number.parseFloat(out) > 0) { +<<<<<<< HEAD out = this.formatter(this.storageStats.scheduled, { canRoundToZero: false }); +======= + out = this.formatter(this.storageStats.scheduled, { canRoundToZero: true }); +>>>>>>> b5455bcb (fix: separate used/allocated units) } return out; @@ -100,9 +122,15 @@ export default { usedAmountTemplateValues() { return { +<<<<<<< HEAD used: this.used, total: this.formatter(this.storageStats.maximum), unit: this.units, +======= + used: this.formatUsed, + total: this.formatter(this.storageStats.maximum), + unit: this.usedUnits, +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }, @@ -110,7 +138,11 @@ export default { return { used: this.formatAllocated, total: this.formatter(this.storageStats.total), +<<<<<<< HEAD unit: this.units, +======= + unit: this.allocatedUnits, +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }, }, @@ -141,7 +173,11 @@ export default { >>>>>> b5455bcb (fix: separate used/allocated units) :number-formatter="formatter" :resource-name="resourceName" > @@ -161,7 +197,11 @@ export default { >>>>>> b5455bcb (fix: separate used/allocated units) :number-formatter="formatter" :resource-name="showAllocated ? '' : resourceName" :class="{ diff --git a/pkg/harvester/l10n/en-us.yaml b/pkg/harvester/l10n/en-us.yaml index d15fa9b7394..b7f57d02379 100644 --- a/pkg/harvester/l10n/en-us.yaml +++ b/pkg/harvester/l10n/en-us.yaml @@ -6,14 +6,25 @@ generic: labels: Labels inProgress: In Progress basic: Basic +<<<<<<< HEAD +======= + loading: Loading... +>>>>>>> b5455bcb (fix: separate used/allocated units) nav: group: networks: Networks +<<<<<<< HEAD backupAndSnapshot: Backup & Snapshot Monitoring: Monitoring Logging: Logging 'Monitoring & Logging': Monitoring & Logging +======= + backupAndSnapshot: Backup and Snapshots + Monitoring: Monitoring + Logging: Logging + 'Monitoring and Logging': Monitoring and Logging +>>>>>>> b5455bcb (fix: separate used/allocated units) resourceTable: groupBy: @@ -28,7 +39,11 @@ members: asyncButton: restart: +<<<<<<< HEAD action: Save & Restart +======= + action: Save and Restart +>>>>>>> b5455bcb (fix: separate used/allocated units) success: Restarted waiting: Restarting… @@ -38,9 +53,19 @@ harvester: backup: success: 'Backup { backUpName } has been initiated.' addBackup: Add Backup +<<<<<<< HEAD restore: success: 'Restore { name } created successfully.' title: Backup and restore +======= + quota: + editVMQuota: Edit VM Quota + editQuota: Edit Quota + bannerMessage: Set to empty string or 0 to remove total snapshot size quota. + restore: + success: 'Restore { name } created successfully.' + title: Backup and Restore +>>>>>>> b5455bcb (fix: separate used/allocated units) selectBackup: Select Backup message: backup: Please select the backup that needs to be restored. @@ -52,23 +77,49 @@ harvester: tip: Please enter a template name! success: 'Template { templateName } created successfully.' failed: 'Failed generated template!' +<<<<<<< HEAD cloneVM: title: Clone VM name: New VM Name type: clone volume data +======= + schedule: + title: Create Schedule + message: + tip: Please enter a schedule name! + success: 'Schedule { name } created successfully.' + failed: 'Failed create schedule!' + cloneVM: + title: Clone Virtual Machine + name: New Virtual Machine Name + type: Clone volume data +>>>>>>> b5455bcb (fix: separate used/allocated units) action: create: Create clone: Clone message: +<<<<<<< HEAD tip: Please enter a VM name! success: 'VM { name } cloned successfully.' failed: 'Failed clone VM!' +======= + tip: Please enter a virtual machine name! + success: 'Virtual machine { name } cloned successfully.' + failed: 'Failed clone virtual machine!' + support: + longhorn: The virtual machine uses Longhorn v2 volumes, which do not support the Clone action. +>>>>>>> b5455bcb (fix: separate used/allocated units) exportImage: title: Export to Image name: Name namespace: Namespace message: success: 'Image { name } created successfully.' +<<<<<<< HEAD +======= + support: + longhorn: The volume uses Longhorn V2 engine, which does not support the Export Image action. +>>>>>>> b5455bcb (fix: separate used/allocated units) migration: failedMessage: Latest migration failed! title: Migration @@ -77,11 +128,16 @@ harvester: label: Target Node placeholder: Choose Target Node ejectCDROM: +<<<<<<< HEAD title: Eject CDROM +======= + title: Eject CD-ROM +>>>>>>> b5455bcb (fix: separate used/allocated units) warnTip: Eject volume will restart the virtual machine. operationTip: 'Select the volume you want to delete:' delete: Delete bundle: +<<<<<<< HEAD title: Generate Support Bundle url: Issue URL description: Description @@ -92,27 +148,61 @@ harvester: title: Add Volume hotunplug: success: 'Volume { name } is detach successfully.' +======= + title: Generate a Support Bundle + url: Issue URL + description: Description + requiredDesc: Description is required! + titleDescription: Collect system-related logs in Harvester to help with troubleshooting and support. + hotplug: + success: 'Volume { diskName } is mounted to the virtual machine { vm }.' + title: Add Volume + hotunplug: + success: 'Volume { name } is detached successfully.' +>>>>>>> b5455bcb (fix: separate used/allocated units) snapshot: title: Take Snapshot name: Name message: success: 'Take Snapshot { name } successfully.' +<<<<<<< HEAD +======= + support: + longhorn: The volume uses Longhorn V2 engine, which does not support the Take Snapshot action. +>>>>>>> b5455bcb (fix: separate used/allocated units) volumeClone: title: Clone Volume name: Name message: success: 'New Volume { name } cloned successfully.' +<<<<<<< HEAD +======= + support: + longhorn: The volume uses Longhorn V2 engine, which does not support the Clone action. +>>>>>>> b5455bcb (fix: separate used/allocated units) restoreSnapshot: title: Restore Snapshot name: 'New Volume Name' success: 'New Volume { name } restored successfully.' vmSnapshot: +<<<<<<< HEAD title: Take VM Snapshot name: Name success: 'Take VM Snapshot { name } successfully.' restart: title: Restart VM tip: Restart the Virtual Machine now for configuration changes to take effect. +======= + title: Take Virtual Machine Snapshot + name: Name + message: + success: 'Take virtual machine Snapshot { name } successfully.' + support: + longhorn: The VM uses Longhorn v2 volumes, which do not support the Take Snapshot action. + restart: + title: Restart Virtual Machine + tip: Restart the virtual machine for configuration changes to take effect. +>>>>>>> b5455bcb (fix: separate used/allocated units) cancel: Save notification: title: @@ -121,7 +211,11 @@ harvester: warning: Warning error: Error action: +<<<<<<< HEAD createVM: Create a Virtual Machine +======= + createVM: Create Virtual Machine +>>>>>>> b5455bcb (fix: separate used/allocated units) start: Start restart: Restart softreboot: Soft Reboot @@ -130,6 +224,7 @@ harvester: deepClone: Clone shallowClone: Clone Template unpause: Unpause +<<<<<<< HEAD ejectCDROM: Eject CDROM launchFormTemplate: Launch instance from template modifyTemplate: Modify template (Create new version) @@ -138,12 +233,33 @@ harvester: backup: Take Backup restore: Restore restoreNewVM: Restore New +======= + encryptImage: Encrypt Image + decryptImage: Decrypt Image + ejectCDROM: Eject CD-ROM + editVMQuota: Edit Virtual Machine Quota + launchFormTemplate: Launch instance from template + modifyTemplate: Modify template (Create new version) + setDefaultVersion: Set default version + addTemplateVersion: Add template version + backup: Take Backup + createSchedule: Create Schedule + restore: Restore + restoreNewVM: Restore New + resumeSchedule: Resume + suspendSchedule: Suspend +>>>>>>> b5455bcb (fix: separate used/allocated units) restoreExistingVM: Replace Existing migrate: Migrate abortMigration: Abort Migration createTemplate: Generate Template enableMaintenance: Enable Maintenance Mode disableMaintenance: Disable Maintenance Mode +<<<<<<< HEAD +======= + enableCPUManager: Enable CPU Manager + disableCPUManager: Disable CPU Manager +>>>>>>> b5455bcb (fix: separate used/allocated units) cordon: Cordon uncordon: Uncordon addHotplug: Add Volume @@ -152,23 +268,48 @@ harvester: cancelExpand: Cancel Expand snapshot: Take Snapshot pvcClone: Clone Volume +<<<<<<< HEAD vmSnapshot: Take VM Snapshot +======= + vmSnapshot: Take Virtual Machine Snapshot +>>>>>>> b5455bcb (fix: separate used/allocated units) shutdown: Shut Down powerOn: Power On reboot: Reboot forceStop: Force Stop tableHeaders: +<<<<<<< HEAD size: Size progress: Progress message: Message phase: Phase attachedVM: Attached VM +======= + imageEncryption: Encryption + size: Size + virtualSize: Virtual Size + progress: Progress + message: Message + phase: Phase + attachedVM: Attached Virtual Machine + cpuManager: CPU Manager +>>>>>>> b5455bcb (fix: separate used/allocated units) fingerprint: Fingerprint value: Value actions: Actions readyToUse: Ready To Use backupTarget: Backup Target +<<<<<<< HEAD targetVm: Target VM +======= + targetVm: Target Virtual Machine + cronExpression: Cron Expression + retain: Retain + scheduleType: Type + maxFailure: Max Failure + sourceVm: Source Virtual Machine + vmSchedule: Virtual Machine Schedule +>>>>>>> b5455bcb (fix: separate used/allocated units) hostIp: Host IP vm: ipAddress: IP Address @@ -176,10 +317,18 @@ harvester: defaultVersion: Default Version network: type: Type +<<<<<<< HEAD vlan: Vlan ID snapshotTargetVolume: Original Volume volumeSnapshotCounts: Snapshot Counts networkState: Network State +======= + vlan: VLAN ID + snapshotTargetVolume: Original Volume + volumeSnapshotCounts: Snapshot Counts + networkState: Network State + totalSnapshotQuota: Total Snapshot Quota +>>>>>>> b5455bcb (fix: separate used/allocated units) storageClass: Storage Class restore: Restore tab: @@ -188,8 +337,16 @@ harvester: advanced: Advanced Options accessCredentials: Access Credentials pciDevices: PCI Devices +<<<<<<< HEAD vGpuDevices: VGPU Devices vmScheduling: VM Scheduling +======= + vGpuDevices: vGPU Devices + usbDevices: USB Devices + vmScheduling: Virtual Machine Scheduling + quotas: Quotas + snapshots: Snapshots +>>>>>>> b5455bcb (fix: separate used/allocated units) instanceLabel: Instance Labels fields: version: Version @@ -200,6 +357,7 @@ harvester: volume: Volume network: Network model: Model +<<<<<<< HEAD macAddress: Mac Address port: Port protocol: Protocol @@ -213,11 +371,31 @@ harvester: filterLabels: Filter Labels storageClass: Storage Class dockerImage: Docker Image +======= + macAddress: MAC address + port: Port + protocol: Protocol + remove: Remove + PhysicalNic: Physical NIC + cpu: CPU + memory: Memory + virtualName: Virtual machine name + promiscuous: Promiscuous + ipv4Address: IPv4 address + filterLabels: Filter labels + filterSchedule: Filter schedule + storageClass: Storage class + dockerImage: Docker image +>>>>>>> b5455bcb (fix: separate used/allocated units) pci: available: Available Devices compatibleNodes: Compatible Nodes impossibleSelection: 'There are no hosts with all of the selected devices.' +<<<<<<< HEAD howToUseDevice: 'Use the table below to enable PCI passthrough on each device you want to use in this VM.' +======= + howToUseDevice: 'Use the table below to enable PCI passthrough on each device you want to use in this virtual machine.' +>>>>>>> b5455bcb (fix: separate used/allocated units) deviceInTheSameHost: 'You can only select devices on the same host.' oldFormatDevices: help: |- @@ -228,11 +406,19 @@ harvester: {oldFormatDevicesHTML}

+<<<<<<< HEAD Please use the following instructions to update the VM:

  1. Stop the VM, edit the VM YAML, and remove the hostDevices section, and save VM the changes to the YAML file.
  2. Edit the VM, and add the already enabled PCIDevice from the list of available PCIDevices, and save and start VM.
  3. +======= + Please use the following instructions to update the virtual machine: +

    +
      +
    1. Stop the virtual machine, edit the virtual machine YAML, and remove the hostDevices section, and save virtual machine the changes to the YAML file.
    2. +
    3. Edit the virtual machine, and add the already enabled PCI Device from the list of available PCIDevices, and save and start VM.
    4. +>>>>>>> b5455bcb (fix: separate used/allocated units)
    showCompatibility: Show device compatibility matrix hideCompatibility: Hide device compatibility matrix @@ -241,6 +427,7 @@ harvester: cantUnclaim: You cannot disable passthrough on a device claimed by another user. enableGroup: Enable Group disableGroup: Disable Group +<<<<<<< HEAD labelRequired: "This rule should not be manually altered: it ensures that the PCI devices selected for this virtual machine are available on the VM's host." goSetting: prefix: The pcidevices-controller addon is not enabled, click @@ -250,6 +437,20 @@ harvester: enablePassthroughWarning: Please be careful not to use host-owned PCI devices (e.g., management and VLAN NICs). Incorrect device allocation may cause damage to your cluster, including node failure. matrixHostName: Host Name matrixDeviceClaimName: Device Claim Name +======= + labelRequired: "This rule should not be manually altered: it ensures that the PCI devices selected for this virtual machine are available on the virtual machine's host." + goSetting: + prefix: The pcidevices-controller add-on is not enabled, click + middle: here + suffix: to enable the add-on to successfully manage your PCI devices. + noPCIPermission: Please contact your system administrator to enable the PCI devices first. + enablePassthroughWarning: Please be careful not to use host-owned PCI devices (e.g., management and VLAN NICs). Incorrect device allocation may cause damage to your cluster, including node failure. + + devices: + matrixHostName: Host Name + matrixDeviceClaimName: Device Claim Name + +>>>>>>> b5455bcb (fix: separate used/allocated units) generic: close: Close open: Open @@ -300,13 +501,18 @@ harvester: events: label: Events vmMetrics: +<<<<<<< HEAD label: VM Metrics +======= + label: Virtual Machine Metrics +>>>>>>> b5455bcb (fix: separate used/allocated units) version: Version host: console: Console label: Hosts inconsistentIP: "Host IP is inconsistent, current IP: { currentIP }, initial IP: { initIP }" +<<<<<<< HEAD promote: none: ' ' running: promoting @@ -314,6 +520,16 @@ harvester: unknown: promote halted promoteRestart: restarting promoteSucceed: promote completed +======= + noConsoleUrl: 'Console URL not specified' + promote: + none: ' ' + running: Promoting + failed: Promote failed + unknown: Promote halted + promoteRestart: Restarting + promoteSucceed: Promote completed +>>>>>>> b5455bcb (fix: separate used/allocated units) tabs: network: Network overview: Overview @@ -323,10 +539,17 @@ harvester: storage: Storage labels: Labels ksmtuned: Ksmtuned +<<<<<<< HEAD seeder: Out-of-Band Access detail: kvm: disableMessage: Hardware-based virtualization is disabled or not supported. Hardware-based virtualization must be enabled before creating any Virtual Machines. +======= + seeder: Out-of-band Access + detail: + kvm: + disableMessage: Hardware-based virtualization is disabled or not supported. Hardware-based virtualization must be enabled before creating any virtual machines. +>>>>>>> b5455bcb (fix: separate used/allocated units) title: network: Network Configuration hostIP: Host IP @@ -350,10 +573,18 @@ harvester: serialNumber: Serial Number model: Model etcd: Witness Node +<<<<<<< HEAD enableMaintenance: title: Enable Maintenance Mode protip: The operation will migrate all virtual machines on this node to other nodes. shutDownVMs: Check Force option to shutdown VMs which cannot be migrated in live mode. +======= + cpuManager: CPU Manager + enableMaintenance: + title: Enable Maintenance Mode + protip: The operation will migrate all virtual machines on this node to other nodes. + shutDownVMs: Check Force option to shutdown virtual machines which cannot be migrated in live mode. +>>>>>>> b5455bcb (fix: separate used/allocated units) force: Force cordon: title: Cordon @@ -362,17 +593,29 @@ harvester: run: Run Strategy configure: Configure mode: Mode +<<<<<<< HEAD modeLink: Mode thresCoef: Threshold Coefficient enableMergeNodes: Enable Merge Across Nodes +======= + modeLink: Mode + thresCoef: Threshold Coefficient + enableMergeNodes: Enable merging across nodes +>>>>>>> b5455bcb (fix: separate used/allocated units) enable: Enable disable: Disable ksmStatus: KSM Status modeOption: standard: Standard +<<<<<<< HEAD high: High-Perfomanace customized: Customized parameters: +======= + high: High-performance + customized: Customized + parameters: +>>>>>>> b5455bcb (fix: separate used/allocated units) title: Ksmtuned Parameters boost: Boost decay: Decay @@ -407,7 +650,11 @@ harvester: label: Eviction Requested forceFormatted: label: Force Formatted +<<<<<<< HEAD toolTip: Force formatted will cleanup disk data, make sure you backup all available data to prevent data loss. +======= + toolTip: Force formatted will clean up disk data, make sure you backup all available data to prevent data loss. +>>>>>>> b5455bcb (fix: separate used/allocated units) yes: Yes (Ext4 File System) description: label: Description @@ -424,11 +671,30 @@ harvester: addLabel: Add Disk Tag conditions: Conditions storageAvailable: +<<<<<<< HEAD label: Storage Available +======= + label: Storage Available +>>>>>>> b5455bcb (fix: separate used/allocated units) storageScheduled: label: Storage Scheduled storageMaximum: label: Storage Maximum +<<<<<<< HEAD +======= + provisioner: Provisioner + lvmVolumeGroup: + label: Volume Group + create: Create New... + storage: + longhorn: + LonghornV1: + label: Longhorn V1 (CSI) + LonghornV2: + label: Longhorn V2 (CSI) + lvm: + label: LVM +>>>>>>> b5455bcb (fix: separate used/allocated units) tags: label: Host Tags addLabel: Add Host Tag @@ -440,8 +706,13 @@ harvester: tips: You can configure multiple IPv4 addresses or host addresses. placeholder: e.g. IPv4 ntpSyncStatus: +<<<<<<< HEAD isDisabled: 'The NTP is disabled. Please check the NTP service is active.' isUnsynced: 'The time is not synchronized with the NTP server {current}' +======= + isDisabled: 'NTP is disabled. Please check the NTP service is active.' + isUnsynced: 'NTP is not synchronized with the NTP server {current}.' +>>>>>>> b5455bcb (fix: separate used/allocated units) virtualMachine: label: Virtual Machines @@ -454,7 +725,11 @@ harvester: nameLabel: Name host: label: Hostname +<<<<<<< HEAD placeholder: default to the virtual machine name. +======= + placeholder: Default to the virtual machine name. +>>>>>>> b5455bcb (fix: separate used/allocated units) multiple: label: Multiple Instance nameNsDescription: Name prefix for each instance @@ -463,20 +738,34 @@ harvester: nameLabel: Name Prefix host: label: Host Prefix Name +<<<<<<< HEAD placeholder: default to the virtual machine name. useTemplate: label: "Use VM Template:" +======= + placeholder: Default to the virtual machine name. + useTemplate: + label: "Use the virtual machine template:" +>>>>>>> b5455bcb (fix: separate used/allocated units) template: label: Template version: label: Version console: +<<<<<<< HEAD novnc: Open in Web VNC +======= + novnc: Open in WebVNC +>>>>>>> b5455bcb (fix: separate used/allocated units) serial: Open in Serial Console promptRemove: title: 'Select the volume you want to delete:' deleteAll: Delete All +<<<<<<< HEAD tips: "Warn: The snapshots of vm will be deleted with VM and the snapshots of volume will be deleted with volume." +======= + tips: "Warn: The snapshots of the virtual machine will be deleted with virtual machine and the snapshots of volume will be deleted with volume." +>>>>>>> b5455bcb (fix: separate used/allocated units) unplug: title: 'Are you sure that you want to detach volume {name} ?' actionLabel: Detach @@ -488,6 +777,21 @@ harvester: other {Start} } the virtual machine now to take effect of the configuration changes. runStrategy: Run Strategy +<<<<<<< HEAD +======= + maintenanceStrategy: + label: Maintenance Strategy + options: + Migrate: Migrate + ShutdownAndRestartAfterEnable: Shutdown and Restart After Enable + ShutdownAndRestartAfterDisable: Shutdown and Restart After Disable + Shutdown: Shutdown + cpuPinning: + label: Enable CPU Pinning + tooltip: Enable CPU Pinning brings better performance and reduce latency for the virtual machine + restartVMMessage: Changing the CPU Pinning setting requires a virtual machine reboot for the change to take effect + migrationMessage: This virtual machine can only be migrated to a target node that has CPU Manager enabled, as CPU Pinning is configured. +>>>>>>> b5455bcb (fix: separate used/allocated units) restartNow: |- {restart, select, true {Restart} @@ -498,6 +802,13 @@ harvester: enableUsb: Enable USB Tablet advancedOptions: tpm: Enable TPM +<<<<<<< HEAD +======= + cpuManager: + prefix: You must enable CPU Manager for at least one node in + middle: 'host page' + suffix: to enable CPU Pinning for VM +>>>>>>> b5455bcb (fix: separate used/allocated units) usbTip: Provides an absolute pointer device which often helps with getting a consistent mouse cursor position in VNC. sshTitle: Add Public SSH Key imageTip: An external URL to the .iso, .img, .qcow2 or .raw that the virtual machine should be created from. @@ -505,22 +816,41 @@ harvester: secureBoot: Secure Boot volume: dragTip: Drag and drop volumes, or use the volume's arrows, to change the boot order. +<<<<<<< HEAD volumeTip: The VM only contains a cd-rom volume. You may want to add additional disk volumes. +======= + volumeTip: The virtual machine only contains a CD-ROM volume. You may want to add additional disk volumes. +>>>>>>> b5455bcb (fix: separate used/allocated units) macTip: "MAC address as seen inside the guest system." volumeUpdate: 'Set volume { name } successfully' type: Type size: Size edit: Edit bus: Bus +<<<<<<< HEAD +======= + readyToUse: Ready To Use +>>>>>>> b5455bcb (fix: separate used/allocated units) bootOrder: Boot Order volume: Volume dockerImage: Docker Image addVolume: Add Volume addExistingVolume: Add Existing Volume +<<<<<<< HEAD addVmImage: Add VM Image addContainer: Add Container setFirst: Set as root volume saveVolume: Update Volume +======= + addVmImage: Add a Virtual Machine Image + addContainer: Add Container + setFirst: Set as root volume + saveVolume: Update Volume + encryption: Encryption + lockTooltip: + all: All volumes are encrypted. + partial: Some volumes are encrypted. +>>>>>>> b5455bcb (fix: separate used/allocated units) title: vmImage: Image Volume existingVolume: Existing Volume @@ -534,7 +864,11 @@ harvester: addNetwork: Add Network addPort: Add Port cloudConfig: +<<<<<<< HEAD title: Cloud Config +======= + title: Cloud Configuration +>>>>>>> b5455bcb (fix: separate used/allocated units) createTemplateTitle: 'Create {name}.' createNew: Create new... cloudInit: @@ -547,23 +881,41 @@ harvester: network: label: Network Data Template title: "Network Data:" +<<<<<<< HEAD tip: "The network-data configuration allows you to customize the instance’s networking interfaces by assigning subnet configuration, virtual device creation (bonds, bridges, vlans) routes and DNS configuration. Learn more" scheduling: affinity: anyNode: 'Run VM on any available node' schedulingRules: 'Run VM on node(s) matching scheduling rules' specificNode: Run VM on specific node - (Live migration is not supported) +======= + tip: "The network-data configuration allows you to customize the instance’s networking interfaces by assigning subnet configuration, virtual device creation (bonds, bridges, VLANs) routes and DNS configuration. Learn more" + scheduling: + affinity: + anyNode: 'Run virtual machine on any available node' + schedulingRules: 'Run virtual machine on node(s) matching scheduling rules' + specificNode: Run virtual machine on specific node - (Live migration is not supported) +>>>>>>> b5455bcb (fix: separate used/allocated units) networkNotSupport: Network not support schedule accessCredentials: resetPwd: label: Add Basic Auth injectSSH: +<<<<<<< HEAD label: Add SSHKey users: Select Users addUser: Add User tips: qemu-guest-agent must be installed to enable Access Credentials, the VM should be restarted after credentials added. Need to enter the VM to edit password or remove SSH-Key after deleting the credentials. userTips: The user to be added must already exist; otherwise, the credentials will not take effect. duplicatedUser: User already exist. +======= + label: Add SSH Key + users: Select Users + addUser: Add User + tips: qemu-guest-agent must be installed to enable the accessing of credentials. The virtual machine needs to be restarted after credentials added. You need to be in the virtual machine to edit your password or remove an SSH-Key after deleting the credentials. + userTips: The user to be added must already exist; otherwise, the credentials will not take effect. + duplicatedUser: User already exists. +>>>>>>> b5455bcb (fix: separate used/allocated units) invalidUser: Invalid Username. input: name: Name @@ -594,8 +946,13 @@ harvester: instance: Virtual Machines monitor: Monitor Data keypairs: SSH Keys +<<<<<<< HEAD cloudConfig: Cloud Config metrics: VM Metrics +======= + cloudConfig: Cloud Configuration + metrics: Virtual Machine Metrics +>>>>>>> b5455bcb (fix: separate used/allocated units) details: title: vmDetails: Virtual Machine Details @@ -603,6 +960,10 @@ harvester: services: Services users: Logged in users name: Name +<<<<<<< HEAD +======= + totalSnapshotQuota: Total Snapshot Quota +>>>>>>> b5455bcb (fix: separate used/allocated units) namespace: Namespace created: Created hostname: Hostname @@ -624,7 +985,11 @@ harvester: flavor: Flavor tolerations: Tolerations dedicatedResources: Dedicated Resources +<<<<<<< HEAD down: VM not running +======= + down: Virtual machine not running +>>>>>>> b5455bcb (fix: separate used/allocated units) affinityRules: Affinity Rules sourceNode: Source Node targetNode: Target Node @@ -637,7 +1002,11 @@ harvester: from: Generated from down: No events in the past hour console: +<<<<<<< HEAD down: This Virtual Machine is down. Please start it to access its console. +======= + down: This virtual machine is down. Please start it to access its console. +>>>>>>> b5455bcb (fix: separate used/allocated units) shortcutKeys: Shortcut Keys customShortcutKeys: Custom Shortcut Keys management: Management Shortcut Keys @@ -645,13 +1014,21 @@ harvester: start: Record recording: Recording stop: Stop Recording +<<<<<<< HEAD tips: Pressing the record button will capture your keyboard inputs. +======= + tips: Press the record button to capture your keyboard inputs. +>>>>>>> b5455bcb (fix: separate used/allocated units) send: Send preferredKeys: Preferred Custom Shortcut Keys terminationGracePeriodSeconds: label: Termination Grace Period affinity: +<<<<<<< HEAD thisPodNamespace: This VM's namespace +======= + thisPodNamespace: This virtual machine's namespace +>>>>>>> b5455bcb (fix: separate used/allocated units) matchExpressions: inNamespaces: "Workloads in these namespaces" namespaces: @@ -669,7 +1046,11 @@ harvester: kind: Kind sourceOptions: new: New +<<<<<<< HEAD vmImage: VM Image +======= + vmImage: Virtual Machine Image +>>>>>>> b5455bcb (fix: separate used/allocated units) image: Image frontend: Frontend blockdev: Block Device @@ -681,10 +1062,19 @@ harvester: lastBackupAt: Last Backup At replicasNumber: Replicas Number promptRemove: +<<<<<<< HEAD tips: "Warn: The snapshots of volume will be deleted with volume." externalLink: tips: Check volume details rebuildingMessage: 'Rebuilding: {percentage}%' +======= + tips: "Warn: The volume's snapshots will be deleted with this volume." + externalLink: + tips: Check volume details + rebuildingMessage: 'Rebuilding: {percentage}%' + longhorn: + disableResize: 'Longhorn V2 volumes cannot be resized.' +>>>>>>> b5455bcb (fix: separate used/allocated units) image: label: Images @@ -692,6 +1082,7 @@ harvester: basics: Basics url: URL size: Size +<<<<<<< HEAD urlTip: 'supports the raw and qcow2 image formats which are supported by qemu. Bootable ISO images can also be used and are treated like raw images.' fileName: File Name uploadFile: Upload File @@ -699,6 +1090,23 @@ harvester: sourceType: download: URL upload: File +======= + isEncryption: Encryption + encryptionSecret: Encryption Secret + virtualSize: Virtual Size + urlTip: 'Supports the raw and qcow2 image formats which are supported by qemu. Bootable ISO images can also be used and are treated like raw images.' + fileName: File Name + uploadFile: Upload File + source: Source Type + sourceType: + download: URL + upload: File + clone: Clone + encrypt: Encrypt + decrypt: Decrypt + sourceImage: Source Image + cryptoOperation: Crypto Operation +>>>>>>> b5455bcb (fix: separate used/allocated units) warning: uploading: |- {count, plural, @@ -717,10 +1125,17 @@ harvester: tips: notExistImage: title: Image {name} does not exist! +<<<<<<< HEAD message: Please select a new Image. notExistNode: title: Node {name} does not exist! message: Please select a new Node. +======= + message: Please select a new image. + notExistNode: + title: Node {name} does not exist! + message: Please select a new node. +>>>>>>> b5455bcb (fix: separate used/allocated units) upgradePage: upgradeApp: Upgrade Software @@ -737,8 +1152,13 @@ harvester: selectExisting: Select Existing Image createRepository: Creating Upgrade Repository succeeded: Succeeded +<<<<<<< HEAD releaseTip: Please read the upgrade documentation carefully. You can view details on the Harvester Release Note. checkReady: I have read and understood the upgrade content related to this Harvester version. +======= + releaseTip: Please read the upgrade documentation carefully. You can view details on the Harvester Release Notes. + checkReady: I have read and understood the upgrade instructions related to this Harvester version. +>>>>>>> b5455bcb (fix: separate used/allocated units) pending: Pending repoInfo: upgradeStatus: Upgrade Status @@ -748,34 +1168,91 @@ harvester: harvesterChart: Harvester Chart success: Success fail: Fail +<<<<<<< HEAD ongoing: on-going +======= + ongoing: On-going +>>>>>>> b5455bcb (fix: separate used/allocated units) downloadLog: Download Log logStatus: Log Download Status dismissMessage: Dismiss it upgradeInfo: warning: WARNING +<<<<<<< HEAD doc: Read the documentation before starting the upgrade process. Ensure that you complete procedures that are relevant to your environment and the version you are upgrading to. tip: Unmet system requirements and incorrectly performed procedures may cause complete upgrade failure and other issues that require manual workarounds. moreNotes: For more details about the release notes, please visit - backup: label: VM Backups +======= + doc: Read the documentation before starting the upgrade process. Ensure that you complete procedures that are relevant to your environment and the version you are upgrading to. + tip: Unmet system requirements and incorrectly performed procedures may cause complete upgrade failure and other issues that require manual workarounds. + moreNotes: For more details about the release notes, please visit - + + schedule: + label: Virtual Machine Schedules + createTitle: Create Schedule + createButtonText: Create Schedule + scheduleType: Virtual Machine Schedule Type + cron: Cron Schedule + detail: + namespace: Namespace + sourceVM: Source Virtual Machine + tabs: + basic: Basic + backups: Backups + snapshots: Snapshots + message: + noSetting: + suffix: before creating a backup schedule + retain: + label: Retain + count: Count + tooltip: Number of up-to-date VM backups to retain. Maximum to 250, minimum to 2. + maxFailure: + label: Max Failure + count: Count + tooltip: Max number of consecutive failed backups that could be tolerated. If reach this threshold, Harvester controller will suspend the schedule job. This value should less than retain count + virtualMachine: + title: Virtual Machine Name + placeholder: Select a virtual machine + type: + snapshot: Snapshot + backup: Backup + + backup: + label: Virtual Machine Backups +>>>>>>> b5455bcb (fix: separate used/allocated units) createText: Restore Backup title: Restore Virtual Machine backupTargetTip: The endpoint used to access the backupstore. NFS and S3 are supported. message: noSetting: +<<<<<<< HEAD prefix: You must configure the backup target in middle: 'setting' suffix: before creating a new backup. errorTip: prefix: Backup Target value in middle: Setting +======= + prefix: You must configure the backup target + middle: 'setting' + suffix: before creating a new backup. + errorTip: + prefix: Backup target value in + middle: setting +>>>>>>> b5455bcb (fix: separate used/allocated units) suffix: "is invalid, error: " viewSetting: prefix: Click middle: here +<<<<<<< HEAD suffix: to view the backup config. +======= + suffix: to view the backup configuration. +>>>>>>> b5455bcb (fix: separate used/allocated units) testConnect: actionLabel: Test connection waitingLabel: Testing connection... @@ -789,13 +1266,20 @@ harvester: virtualMachineName: Virtual Machine Name keepMacAddress: Keep MAC Address matchTarget: The current backup target does not match the existing one. +<<<<<<< HEAD progress: +======= + progress: +>>>>>>> b5455bcb (fix: separate used/allocated units) details: Volume details tooltip: starting: Backup initiating progress: Backup in progress complete: Backup completed +<<<<<<< HEAD +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) restore: progress: details: Volume details @@ -805,12 +1289,17 @@ harvester: complete: Restore completed network: +<<<<<<< HEAD label: VM Networks +======= + label: Virtual Machine Networks +>>>>>>> b5455bcb (fix: separate used/allocated units) tabs: basics: Basics layer3Network: Route clusterNetwork: label: Cluster Network +<<<<<<< HEAD create: Create a New Cluster Network toolTip: Define your custom cluster scope network name createPlaceholder: Input a new Cluster Network name @@ -820,6 +1309,17 @@ harvester: mode: label: Mode auto: Auto(DHCP) +======= + create: Create a new cluster network + toolTip: Define your custom cluster scope network name + createPlaceholder: Input a new cluster network name + selectOrCreatePlaceholder: Select or create a new cluster network + selectPlaceholder: Select a cluster network + layer3Network: + mode: + label: Mode + auto: Auto (DHCP) +>>>>>>> b5455bcb (fix: separate used/allocated units) manual: Manual serverIPAddr: label: DHCP Server IP @@ -843,11 +1343,20 @@ harvester: validation: physicalNIC: DefaultPhysicalNIC placeholder: +<<<<<<< HEAD accessKeyId: specify your access key id secretAccessKey: specify your secret access key cert: upload a self-signed SSL certificate vlanChangeTip: The newly modified default network interface only applies to newly added nodes, not existing ones. defaultPhysicalNIC: Default Network Interface +======= + accessKeyId: Specify your access key ID + secretAccessKey: Specify your secret access key + cert: Upload a self-signed SSL certificate + vlanChangeTip: The newly modified default network interface only applies to newly added nodes, not existing ones. + defaultPhysicalNIC: Default Network Interface + modifiedMessage: Settings that have been customized from default settings are tagged with 'Modified'. +>>>>>>> b5455bcb (fix: separate used/allocated units) percentTip: The value in parentheses represents the distribution percentage of the network interface on all hosts. If an interface less than 100% is selected, the user needs to manually specify the network interface on the host where the vlan network configuration fails. message: ca: @@ -870,10 +1379,18 @@ harvester: placeholder: e.g. 172.16.0.1/32 invalid: '"Exclude list" is invalid.' addIp: Add Exclude IP +<<<<<<< HEAD warning: 'WARNING:
    Any change to storage-network requires shutting down all VMs before applying this setting.
    Users have to ensure the Cluster Network is configured and VLAN Config will cover all nodes and ensure the network connectivity is working and expected in all nodes.' tip: 'Specify an IP range in the IPv4 CIDR format. Number of IPs Required = Number of Nodes * 4 + Number of Disks * 2 + Number of Images to Download/Upload . For more information about storage network settings, see the documentation.' vmForceDeletionPolicy: period: Period +======= + warning: 'WARNING:
    Any change to storage-network requires shutting down all virtual machines before applying this setting.
    Users have to ensure the cluster network is configured and VLAN Configuration will cover all nodes and ensure the network connectivity is working and expected in all nodes.' + tip: 'Specify an IP range in the IPv4 CIDR format. Number of IPs Required = Number of Nodes * 4 + Number of Disks * 2 + Number of Images to Download/Upload . For more information about storage network settings, see the documentation.' + vmForceDeletionPolicy: + period: Period + ratio : Ratio +>>>>>>> b5455bcb (fix: separate used/allocated units) autoRotateRKE2Certs: expiringInHours: Expiring in httpProxy: @@ -896,7 +1413,11 @@ harvester: addRewrite: Add Rewrite addMirror: Add Mirror configs: +<<<<<<< HEAD configs: Configs +======= + configs: Configurations +>>>>>>> b5455bcb (fix: separate used/allocated units) registryEDQNorIP: Registry FDQN or IP registryPlaceholder: myregistry.local:5000 username: Username @@ -904,11 +1425,19 @@ harvester: auth: Auth identityToken: Identity Token insecureSkipVerify: InsecureSkipVerify +<<<<<<< HEAD addConfig: Add Config upgrade: selectExitImage: Please select the OS image to upgrade. imageUrl: Please input a valid image url. +======= + addConfig: Add Configuration + + upgrade: + selectExitImage: Please select the OS image to upgrade. + imageUrl: Please input a valid image URL. +>>>>>>> b5455bcb (fix: separate used/allocated units) chooseFile: Please select to upload an image. checksum: Checksum harvesterMonitoring: @@ -924,16 +1453,28 @@ harvester: retention: How long to retain metrics retentionSize: Maximum size of metrics clusterRegistrationUrl: +<<<<<<< HEAD message: To completely unset the imported Harvester cluster, please also remove it on the Rancher dashboard UI via the Virtualization Management page. +======= + message: To completely unset the imported Harvester cluster, please also remove it on the Rancher Dashboard UI via the Virtualization Management page. +>>>>>>> b5455bcb (fix: separate used/allocated units) ntpServers: isNotIPV4: The address you entered is not IPv4 or host. Please enter a valid IPv4 address or a host address. isDuplicate: There are duplicate NTP server configurations. cloudTemplate: +<<<<<<< HEAD label: Cloud Config Templates templateType: Template Type userData: User Data networkData: Network Data +======= + label: Cloud Configuration Templates + templateType: Template Type + userData: User Data + networkData: Network Data + +>>>>>>> b5455bcb (fix: separate used/allocated units) support: title: Harvester Support kubeconfig: @@ -942,7 +1483,11 @@ harvester: internal: rancher: title: Access Embedded Rancher UI +<<<<<<< HEAD titleDescription: You can only use the embedded Rancher UI for debugging and validation purposes. For more information about how Harvester integrates with Rancher, see the documentation. +======= + titleDescription: You can only use the embedded Rancher UI for debugging and validation purposes. For more information about how Harvester integrates with Rancher, see the documentation. +>>>>>>> b5455bcb (fix: separate used/allocated units) longhorn: title: Access Embedded Longhorn UI titleDescription: We only support to use the embedded Longhorn UI for debugging and validation purpose. @@ -962,7 +1507,11 @@ harvester: cidr: label: CIDR/IP Range invalid: '"CIDR/IP Range" is invalid.' +<<<<<<< HEAD toolTip: "We can apply multiple pools or ranges by seperating them with commas. i.e. 192.168.0.200/30,192.168.0.200/29 or 192.168.0.10-192.168.0.11" +======= + toolTip: "We can apply multiple pools or ranges by separating them with commas. For example: 192.168.0.200/30,192.168.0.200/29 or 192.168.0.10-192.168.0.11" +>>>>>>> b5455bcb (fix: separate used/allocated units) add: label: Add IP Pools @@ -971,11 +1520,16 @@ harvester: label: Protocols ciphers: label: Ciphers +<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units) monitoring: configuration: label: Configuration alertmanagerConfig: +<<<<<<< HEAD label: Alertmanager Configs diabledMonitoringTips: prefix: 'You must enable' @@ -987,6 +1541,19 @@ harvester: suffix: 'for configs to take effect.' disabledAddon: prefix: 'Monitoring Addon is disabled now, click' +======= + label: Alertmanager Configurations + diabledMonitoringTips: + prefix: 'Enable the' + middle: 'monitoring' + suffix: 'add-on first.' + diabledAlertingTips: + prefix: 'Enable' + middle: 'Alertmanager' + suffix: 'for configuration to take effect.' + disabledAddon: + prefix: 'The monitoring add-on is disabled, click' +>>>>>>> b5455bcb (fix: separate used/allocated units) middle: 'here' suffix: 'to enable it.' @@ -996,6 +1563,7 @@ harvester: fluentbit: Fluentbit fluentd: Fluentd clusterFlow: +<<<<<<< HEAD label: Cluster Flow clusterOutput: label: Cluster Output @@ -1009,19 +1577,44 @@ harvester: suffix: 'for configs to take effect.' snapshot: +======= + label: Cluster Flows + clusterOutput: + label: Cluster Outputs + flow: + label: Flows + output: + label: Outputs + diabledTips: + prefix: 'Enable' + middle: 'logging' + suffix: 'for configuration to take effect.' + + snapshot: + totalSnapshotSize: Total Snapshot Size +>>>>>>> b5455bcb (fix: separate used/allocated units) label: Volume Snapshots targetVolume: Original Volume size: Size image: Image vmSnapshot: +<<<<<<< HEAD label: VM Snapshots +======= + label: Virtual Machine Snapshots +>>>>>>> b5455bcb (fix: separate used/allocated units) createText: Restore Snapshot snapshot: Snapshot storage: label: Storage useDefault: Use the default storage +<<<<<<< HEAD +======= + volumeEncryption: Volume Encryption + secret: Secret +>>>>>>> b5455bcb (fix: separate used/allocated units) migratable: label: Migratable numberOfReplicas: @@ -1034,10 +1627,25 @@ harvester: label: Disk Selector storageClass: label: Storage Class +<<<<<<< HEAD title: Storage Classes customize: volumeBindingMode: later: Bind and provision a persistent volume once a VM using the PersistentVolumeClaim is created +======= + longhorn: + v1: + label: Longhorn V1 (CSI) + v2: + label: Longhorn V2 (CSI) + versionTooltip: Longhorn V2 is disabled for this node. + lvm: + label: LVM + title: Storage Classes + customize: + volumeBindingMode: + later: Bind and provision a persistent volume once a virtual machine using the PersistentVolumeClaim is created +>>>>>>> b5455bcb (fix: separate used/allocated units) parameters: numberOfReplicas: label: Number Of Replicas @@ -1051,6 +1659,7 @@ harvester: no-options: No available tags, please add in the `Host > Storage` page migratable: label: Migratable +<<<<<<< HEAD allowedTopologies: title: Allowed Topologies tooltip: Allowed Topologies helps scheduling VMs on hosts which match all of below expressions. @@ -1058,6 +1667,22 @@ harvester: vlanConfig: title: Network Configs createNetworkConfig: Create Network Config +======= + lvmVolumeGroupType: + label: Volume Group Type + lvmVolumeGroup: + label: Volume Group Name + no-options: No available Volume Groups, please add in the `Host > Storage` page + node: + label: Node + allowedTopologies: + title: Allowed Topologies + tooltip: Allowed Topologies helps scheduling virtual machines on hosts which match all of below expressions. + + vlanConfig: + title: Network Configuration + createNetworkConfig: Create Network Configuration +>>>>>>> b5455bcb (fix: separate used/allocated units) action: migrate: Migrate titles: @@ -1079,14 +1704,22 @@ harvester: validate: available: NIC "{nic}" is not available on the selected nodes linkAttributes: +<<<<<<< HEAD mtu: +======= + mtu: +>>>>>>> b5455bcb (fix: separate used/allocated units) label: MTU bondOptions: mode: label: Mode miimon: label: Miimon +<<<<<<< HEAD tooltip: -1 means to keep the original value +======= + tooltip: Miimon specifies the MII link monitoring frequency in milliseconds. -1 means to keep the original value. +>>>>>>> b5455bcb (fix: separate used/allocated units) nodeSelector: matchingNodes: matchesSome: |- @@ -1098,6 +1731,7 @@ harvester: vlanStatus: vlanConfig: +<<<<<<< HEAD label: Network Config clusterNetwork: @@ -1125,12 +1759,46 @@ harvester: 'rancher-vcluster': rancher-vcluster deploys a vcluster with rancher installed. 'harvester-seeder': harvester-seeder is an addon that uses ipmi and redfish to discover hardware information and perform out-of-band operations. 'harvester-system/harvester-seeder': harvester-seeder is an addon that uses ipmi and redfish to discover hardware information and perform out-of-band operations. +======= + label: Network Configuration + + clusterNetwork: + title: Cluster Network Configuration + create: + button: + label: Create a Cluster Network + clusterNetwork: There are no network configurations defined. + mgmt: mgmt is a built-in cluster management network and does not support any additional network configurations. + notExist: 'Cluster Network "{ clusterNetwork }" does not exist' + notReady: 'Cluster Network "{ clusterNetwork }" is not ready' + + addons: + descriptions: + 'harvester-system/vm-import-controller': vm-import-controller is an add-on to help migrate virtual machine workloads from other source clusters to an existing Harvester cluster. + 'harvester-system/pcidevices-controller': pcidevices-controller is an add-on to help discover PCI devices for nodes in your cluster and allow users to prepare devices for PCI Passthrough, for use with Harvester virtual machine and guest clusters. + 'cattle-logging-system/rancher-logging': rancher-logging is an add-on to collect versatile logs, events, and audits from the Harvester cluster and route them to many kinds of servers based on flows. + 'harvester-system/rancher-vcluster': rancher-vcluster deploys a virtual cluster (vcluster) with Rancher installed. + 'cattle-monitoring-system/rancher-monitoring': rancher-monitoring is an add-on that collects Harvester cluster and virtual machine metrics and allows you to view the metrics on an embedded dashboard and send alert(s) to remote servers. + 'vm-import-controller': vm-import-controller is an add-on to help migrate virtual machine workloads from other source clusters to an existing Harvester cluster. + 'pcidevices-controller': pcidevices-controller is an add-on to help discover PCI devices for nodes in your cluster and allow users to prepare devices for PCI Passthrough, for use with Harvester virtual machines and guest clusters. + 'nvidia-driver-toolkit': 'nvidia-driver-toolkit is an add-on to enable vGPU devices and assign them to Harvester virtual machines.' + 'rancher-logging': rancher-logging is an add-on to collect versatile logs, events, and audits from the Harvester cluster and route them to many kinds of servers based on flows. + 'rancher-monitoring': rancher-monitoring is an add-on to collect Harvester cluster and virtual machine metrics, view them on the embedded dashboard, and send alert(s) to remote servers. + 'rancher-vcluster': rancher-vcluster deploys a virtual cluster (vcluster) with Rancher installed. + 'harvester-seeder': harvester-seeder is an add-on that uses IPMI and Redfish to discover hardware information and perform out-of-band operations. + 'harvester-system/harvester-seeder': harvester-seeder is an add-on that uses IPMI and Redfish to discover hardware information and perform out-of-band operations. + 'harvester-csi-driver-lvm': harvester-csi-driver-lvm is an add-on allowing users to create PVC through the LVM with local devices. +>>>>>>> b5455bcb (fix: separate used/allocated units) vmImport: titles: basic: Basic pvc: Volume rancherVcluster: +<<<<<<< HEAD accessRancher: Access Rancher Dashboard +======= + accessRancher: Access the Rancher Dashboard +>>>>>>> b5455bcb (fix: separate used/allocated units) hostname: Hostname rancherVersion: Rancher Version password: Bootstrap Password @@ -1147,6 +1815,12 @@ harvester: location: Driver Location parsingSpecError: The field 'spec.valuesContent' has invalid format. +<<<<<<< HEAD +======= + usbController: + titles: + basic: Basic +>>>>>>> b5455bcb (fix: separate used/allocated units) loadBalancer: label: Load Balancers @@ -1191,12 +1865,20 @@ harvester: label: Backend Servers healthCheck: warning: +<<<<<<< HEAD portInUse: Warning, Backend Port {port} is in use in Health Check settings; in case of updating the port, update the Health Check settings accordingly. +======= + portInUse: Warning, the Backend Port {port} is in use in Health Check settings. If you need to update the port, update the Health Check settings accordingly. +>>>>>>> b5455bcb (fix: separate used/allocated units) ipPool: label: IP Pools network: +<<<<<<< HEAD label: VM Network +======= + label: Virtual Machine Network +>>>>>>> b5455bcb (fix: separate used/allocated units) tabs: range: Range scope: Scope @@ -1226,13 +1908,21 @@ harvester: addLabel: Add CIDR range: addLabel: Add Range +<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units) service: healthCheckPort: label: Health Check Port healthCheckSuccessThreshold: label: Health Check Success Threshold +<<<<<<< HEAD description: If the number of times the prober continuously detects an address successfully reaches the success threshold, then the backend server can start to forward traffic. +======= + description: If the number of times the probe continuously detects an address successfully reaches the success threshold, then the backend server can start to forward traffic. +>>>>>>> b5455bcb (fix: separate used/allocated units) healthCheckFailureThreshold: label: Health Check Failure Threshold description: The backend server will stop forwarding traffic if the number of health check failures reaches the failure threshold. @@ -1257,22 +1947,38 @@ harvester: sriovgpu: label: SR-IOV GPU Devices nodeName: Node +<<<<<<< HEAD numVFs: Number Of Virtual Functions +======= + numVFs: Number of Virtual Functions +>>>>>>> b5455bcb (fix: separate used/allocated units) vfAddresses: Virtual Functions Addresses vGpuDevices: vGPU Devices showMore: Show More parentSriov: Filter By Parent SR-IOV GPU +<<<<<<< HEAD noPermission: Please contact system admin to add Harvester addons first goSetting: prefix: The nvidia-driver-toolkit addon is not enabled, click +======= + noPermission: Please contact your system administrator to add Harvester add-ons first. + goSetting: + prefix: The nvidia-driver-toolkit add-on is not enabled, click +>>>>>>> b5455bcb (fix: separate used/allocated units) middle: here suffix: to enable it to manage your SR-IOV GPU devices. vgpu: label: vGPU Devices +<<<<<<< HEAD noPermission: Please contact system admin to add Harvester addons first goSetting: prefix: The nvidia-driver-toolkit addon is not enabled, click +======= + noPermission: Please contact system administrator to add Harvester add-ons first. + goSetting: + prefix: The nvidia-driver-toolkit add-on is not enabled, click +>>>>>>> b5455bcb (fix: separate used/allocated units) middle: here suffix: to enable it to manage your vGPU devices. enableGroup: Enable Group @@ -1283,22 +1989,59 @@ harvester: available: Available Devices compatibleNodes: Compatible Nodes impossibleSelection: 'There are no hosts with all of the selected devices.' +<<<<<<< HEAD howToUseDevice: 'Use the table below to enable vGPU devices you want to use in this VM.' deviceInTheSameHost: 'You can only select devices on the same host.' harvesterVlanConfigMigrateDialog: targetClusterNetwork: +======= + howToUseDevice: 'Use the table below to enable vGPU devices you want to use in this virtual machine.' + deviceInTheSameHost: 'You can only select devices on the same host.' + + usb: + label: USB Devices + noPermission: Please contact system admin to add Harvester add-ons first + goSetting: + prefix: The pcidevices-controller add-on is not enabled, click + middle: here + suffix: to enable it to manage your USB devices. + enableGroup: Enable Group + disableGroup: Disable Group + available: Available USB Devices + compatibleNodes: Compatible Nodes + impossibleSelection: 'There are no hosts with all of the selected devices.' + howToUseDevice: 'Use the table below to enable USB passthrough on each device you want to use in this VM.' + deviceInTheSameHost: 'You can only select devices on the same host.' + showCompatibility: Show device compatibility matrix + hideCompatibility: Hide device compatibility matrix + claimError: Error enabling passthrough on {name} + unclaimError: Error disabling passthrough on {name} + cantUnclaim: You cannot disable passthrough on a device claimed by another user. + enablePassthroughWarning: 'Please re-enable the USB device if the device path changes in the following situations:
     1) Re-plugging the USB device.
     2) Rebooting the node.

    An incorrect device path may cause passthrough to fail.' + + harvesterVlanConfigMigrateDialog: + targetClusterNetwork: +>>>>>>> b5455bcb (fix: separate used/allocated units) label: Target Cluster Network placeholder: Choose Target Cluster Network seeder: banner: enable: +<<<<<<< HEAD prefix: Addon "harvester-seeder" is disabled now, middle: click here suffix: to enable it. noAccess: Please contact system admin to enable the Out-of-Band Access first. noAddon: Addon "harvester-seeder" is not exist, please check if it is installed. +======= + prefix: The "harvester-seeder" add-on is disabled. + middle: Click here + suffix: to enable it. + noAccess: Please contact your system administrator to enable the Out-of-Band Access first. + noAddon: The "harvester-seeder" add-on does not exist, please check if it is installed. +>>>>>>> b5455bcb (fix: separate used/allocated units) noInventory: Waiting for "inventories.metal.harvesterhci.io" to be ready. inventory: host: @@ -1319,10 +2062,17 @@ harvester: label: Polling Interval affinity: +<<<<<<< HEAD thisPodNamespace: This VM's namespace matchExpressions: inNamespaces: "Workloads in these namespaces" vmAffinityTitle: VM Scheduling +======= + thisPodNamespace: This virtual machine's namespace + matchExpressions: + inNamespaces: "Workloads in these namespaces" + vmAffinityTitle: Virtual Machine Scheduling +>>>>>>> b5455bcb (fix: separate used/allocated units) namespaces: placeholder: e.g. default,system,base label: Namespaces @@ -1331,6 +2081,7 @@ harvester: placeholder: 'topology.kubernetes.io/zone' advancedSettings: +<<<<<<< HEAD descriptions: 'harv-vlan': Default Network Interface name of the VLAN network. 'harv-backup-target': Custom backup target to store VM backups. @@ -1362,6 +2113,42 @@ advancedSettings: 'harv-ntp-servers': Configure NTP server. You can configure multiple IPv4 addresses or host addresses. 'harv-auto-rotate-rke2-certs': The certificate rotation mechanism relies on Rancher. Harvester will automatically update certificates generation to trigger rotation. 'harv-kubeconfig-default-token-ttl-minutes': 'TTL (in minutes) applied on Harvester admin kubeconfig files. Default is 0, which means to never expire.' +======= + experimental: 'Experimental features allow users to test and evaluate early-access functionality prior to official supported releases' + descriptions: + 'harv-vlan': Default Network Interface name of the VLAN network. + 'harv-backup-target': Custom backup target to store virtual machine backups. + 'branding': Branding allows administrators to globally re-brand the UI by customizing the Harvester product name, logos, and color scheme. + 'harv-csi-driver-config': Configure additional information for CSI drivers. + 'harv-containerd-registry': Containerd Registry Configuration to connect private registries. + 'harv-log-level': Configure Harvester server log level. Defaults to Info. + 'harv-server-version': Harvester server version. + 'harv-upgrade-checker-enabled': Specifies whether to enable Harvester upgrade check or not. Default is True. + 'harv-upgrade-checker-url': Default Harvester upgrade check url. Only used when the upgrade-checker-enabled is equal to True. + 'harv-ui-source': Configure how to load the UI source. + 'harv-ui-index': 'HTML index location for the UI.' + 'harv-ui-plugin-index': 'JS index location for the Harvester plugin UI.' + 'harv-cluster-registration-url': Registration URL for multi-cluster management. + 'harv-http-proxy': 'HTTP proxy for Harvester to access external services.' + 'harv-additional-ca': 'Custom CA root certificates for TLS validation.' + 'harv-overcommit-config': 'Resource overcommit configuration.' + 'harv-support-bundle-timeout': 'Support bundle timeout configuration in minutes, use 0 to disable the timeout.' + 'harv-support-bundle-expiration': 'Support bundle expiration configuration in minutes.' + 'harv-support-bundle-node-collection-timeout': 'Support bundle node collection timeout configuration in minutes.' + 'harv-vm-force-reset-policy': Configuration for the force-reset action when a virtual machine is stuck on a node that is down. + 'harv-ssl-parameters': Custom SSL Parameters for TLS validation. + 'harv-storage-network': 'Longhorn storage-network setting.' + 'harv-support-bundle-namespaces': Specify resources in other namespaces to be collected by the support package. + 'harv-auto-disk-provision-paths': Specify the disks(using glob pattern) that Harvester will automatically add as virtual machine storage. + 'harv-support-bundle-image': Support bundle image configuration. Find different versions in rancher/support-bundle-kit. + 'harv-release-download-url': This setting allows you to configure the upgrade release download URL address. Harvester will get the ISO URL and checksum value from the ($URL/$VERSION/version.yaml) file hosted by the configured URL. + 'harv-default-vm-termination-grace-period-seconds': Configure the virtual machine termination grace period for virtual machine stop. + 'harv-ntp-servers': Configure NTP server. You can configure multiple IPv4 addresses or host addresses. + 'harv-auto-rotate-rke2-certs': The certificate rotation mechanism relies on Rancher. Harvester will automatically update certificates generation to trigger rotation. + 'harv-kubeconfig-default-token-ttl-minutes': 'TTL (in minutes) applied on Harvester administration kubeconfig files. Default is 0, which means to never expire.' + 'harv-longhorn-v2-data-engine-enabled': 'Enable the Longhorn V2 data engine. Default is false.
    • Changing this setting will restart RKE2 on all nodes. This will not affect running VM workloads.
    • If you see "not enough hugepages-2Mi capacity" errors when enabling this setting, wait a minute for the error to clear. If the error remains, reboot the affected node.
    ' + 'harv-additional-guest-memory-overhead-ratio': 'The ratio for kubevirt to adjust the VM overhead memory. The value could be zero, empty value or floating number between 1.0 and 10.0, default to 1.5.' +>>>>>>> b5455bcb (fix: separate used/allocated units) typeLabel: kubevirt.io.virtualmachine: |- @@ -1386,8 +2173,13 @@ typeLabel: } harvesterhci.io.networkattachmentdefinition: |- {count, plural, +<<<<<<< HEAD one { VM Network } other { VM Networks } +======= + one { Virtual Machine Network } + other { Virtual Machine Networks } +>>>>>>> b5455bcb (fix: separate used/allocated units) } harvesterhci.io.volume: |- {count, plural, @@ -1409,6 +2201,7 @@ typeLabel: one { Template } other { Templates } } +<<<<<<< HEAD harvesterhci.io.virtualmachinebackup: |- {count, plural, one { VM Backup } @@ -1418,6 +2211,22 @@ typeLabel: {count, plural, one { Cloud Config Template } other { Cloud Config Templates } +======= + harvesterhci.io.schedulevmbackup: |- + {count, plural, + one { Virtual Machine Schedule } + other { Virtual Machine Schedules } + } + harvesterhci.io.virtualmachinebackup: |- + {count, plural, + one { Virtual Machine Backup } + other { Virtual Machine Backups } + } + harvesterhci.io.cloudtemplate: |- + {count, plural, + one { Cloud Configuration Template } + other { Cloud Configuration Templates } +>>>>>>> b5455bcb (fix: separate used/allocated units) } harvesterhci.io.volumesnapshot: |- {count, plural, @@ -1426,6 +2235,7 @@ typeLabel: } harvesterhci.io.vmsnapshot: |- {count, plural, +<<<<<<< HEAD one { VM Snapshot } other { VM Snapshots } } @@ -1438,6 +2248,20 @@ typeLabel: {count, plural, one { Alertmanager Config } other { Alertmanager Configs } +======= + one { Virtual Machine Snapshot } + other { Virtual Machine Snapshots } + } + network.harvesterhci.io.vlanconfig: |- + {count, plural, + one { Network Configuration } + other { Network Configurations } + } + harvesterhci.io.monitoring.alertmanagerconfig: |- + {count, plural, + one { Alertmanager Configuration } + other { Alertmanager Configurations } +>>>>>>> b5455bcb (fix: separate used/allocated units) } harvesterhci.io.logging.clusterflow: |- {count, plural, @@ -1479,6 +2303,14 @@ typeLabel: one { Cluster Network } other { Cluster Networks } } +<<<<<<< HEAD +======= + harvesterhci.io.addon: |- + {count, plural, + one { Add-on } + other { Add-ons } + } +>>>>>>> b5455bcb (fix: separate used/allocated units) devices.harvesterhci.io.sriovnetworkdevice: |- {count, plural, one { SR-IOV Network Device } diff --git a/pkg/harvester/list/devices.harvesterhci.io.sriovgpudevice.vue b/pkg/harvester/list/devices.harvesterhci.io.sriovgpudevice.vue index 6157f868408..df0da7dd56d 100644 --- a/pkg/harvester/list/devices.harvesterhci.io.sriovgpudevice.vue +++ b/pkg/harvester/list/devices.harvesterhci.io.sriovgpudevice.vue @@ -27,8 +27,11 @@ export default { if (this.hasSchema) { try { +<<<<<<< HEAD const inStore = this.$store.getters['currentProduct'].inStore; +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) const hash = await allHash({ sriovgpus: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.SR_IOVGPU_DEVICE }), vGpuDevices: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.VGPU_DEVICE }), diff --git a/pkg/harvester/list/devices.harvesterhci.io.usbdevice.vue b/pkg/harvester/list/devices.harvesterhci.io.usbdevice.vue new file mode 100644 index 00000000000..d1d61e81d8d --- /dev/null +++ b/pkg/harvester/list/devices.harvesterhci.io.usbdevice.vue @@ -0,0 +1,83 @@ + + + diff --git a/pkg/harvester/list/harvesterhci.io.host.vue b/pkg/harvester/list/harvesterhci.io.host.vue index 2d992703cdc..448e4a1860d 100644 --- a/pkg/harvester/list/harvesterhci.io.host.vue +++ b/pkg/harvester/list/harvesterhci.io.host.vue @@ -6,6 +6,10 @@ import { CAPI, METRIC, NODE, SCHEMA, LONGHORN, POD } from '@shell/config/types'; import { HCI } from '../types'; +<<<<<<< HEAD +======= +import { DOC_LINKS } from '../config/doc-links'; +>>>>>>> b5455bcb (fix: separate used/allocated units) import { allHash } from '@shell/utils/promise'; import metricPoller from '@shell/mixins/metric-poller'; @@ -90,6 +94,11 @@ export default { search: ['internalIp'], value: 'internalIp', formatter: 'CopyToClipboard', +<<<<<<< HEAD +======= + sort: ['internalIp'], + align: 'center', +>>>>>>> b5455bcb (fix: separate used/allocated units) }, ]; @@ -126,6 +135,20 @@ export default { out.splice(-1, 0, storageHeader); } +<<<<<<< HEAD +======= + out.push({ + name: 'cpuManager', + labelKey: 'harvester.tableHeaders.cpuManager', + value: 'id', + formatter: 'HarvesterCPUPinning', + formatterOpts: { rows: this.rows }, + width: 150, + align: 'center', + + }); + +>>>>>>> b5455bcb (fix: separate used/allocated units) if (this.hasLonghornSchema) { out.push({ name: 'diskState', @@ -142,7 +165,11 @@ export default { name: 'console', label: ' ', align: 'right', +<<<<<<< HEAD width: 65, +======= + width: 80, +>>>>>>> b5455bcb (fix: separate used/allocated units) }); return out; @@ -150,6 +177,13 @@ export default { schema() { return schema; +<<<<<<< HEAD +======= + }, + + consoleDocLink() { + return DOC_LINKS.CONSOLE_URL; +>>>>>>> b5455bcb (fix: separate used/allocated units) } }, methods: { @@ -168,7 +202,19 @@ export default { goto(row) { window.open(row.consoleUrl, '_blank'); +<<<<<<< HEAD } +======= + }, + + consoleTooltip(row) { + if (!row.consoleUrl) { + return this.t('harvester.host.noConsoleUrl'); + } + + return ''; + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) }, typeDisplay() { @@ -198,10 +244,28 @@ export default { v-on="$listeners" >
+<<<<<<< HEAD +======= + + +>>>>>>> b5455bcb (fix: separate used/allocated units) diff --git a/pkg/harvester/list/harvesterhci.io.schedulevmbackup.vue b/pkg/harvester/list/harvesterhci.io.schedulevmbackup.vue new file mode 100644 index 00000000000..a875b317099 --- /dev/null +++ b/pkg/harvester/list/harvesterhci.io.schedulevmbackup.vue @@ -0,0 +1,124 @@ + + + diff --git a/pkg/harvester/list/harvesterhci.io.setting.vue b/pkg/harvester/list/harvesterhci.io.setting.vue index d5ab7fcfa4e..ccf71b70978 100644 --- a/pkg/harvester/list/harvesterhci.io.setting.vue +++ b/pkg/harvester/list/harvesterhci.io.setting.vue @@ -138,7 +138,11 @@ export default {
+<<<<<<< HEAD {{ t('advancedSettings.subtext') }} +======= + {{ t('harvester.setting.modifiedMessage') }} +>>>>>>> b5455bcb (fix: separate used/allocated units)
diff --git a/pkg/harvester/list/harvesterhci.io.virtualmachinebackup.vue b/pkg/harvester/list/harvesterhci.io.virtualmachinebackup.vue index d563a3252f0..8dcc4c0f178 100644 --- a/pkg/harvester/list/harvesterhci.io.virtualmachinebackup.vue +++ b/pkg/harvester/list/harvesterhci.io.virtualmachinebackup.vue @@ -4,28 +4,45 @@ import Loading from '@shell/components/Loading'; import MessageLink from '@shell/components/MessageLink'; import Masthead from '@shell/components/ResourceList/Masthead'; import ResourceTable from '@shell/components/ResourceTable'; +<<<<<<< HEAD +======= +import FilterVMSchedule from '../components/FilterVMSchedule'; +>>>>>>> b5455bcb (fix: separate used/allocated units) import { HCI } from '../types'; import { allSettled } from '../utils/promise'; import { STATE, AGE, NAME, NAMESPACE } from '@shell/config/table-headers'; import { BACKUP_TYPE } from '../config/types'; +<<<<<<< HEAD +======= +import { defaultTableSortGenerationFn } from '@shell/components/ResourceTable.vue'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default { name: 'HarvesterListBackup', components: { +<<<<<<< HEAD ResourceTable, Banner, Loading, Masthead, MessageLink +======= + ResourceTable, Banner, Loading, Masthead, MessageLink, FilterVMSchedule +>>>>>>> b5455bcb (fix: separate used/allocated units) }, props: { schema: { type: Object, required: true, +<<<<<<< HEAD } +======= + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) }, async fetch() { const inStore = this.$store.getters['currentProduct'].inStore; const hash = await allSettled({ +<<<<<<< HEAD vms: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.VM }), settings: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.SETTING }), rows: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.BACKUP }), @@ -34,6 +51,17 @@ export default { this.rows = hash.rows; this.settings = hash.settings; +======= + vms: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.VM }), + settings: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.SETTING }), + backups: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.BACKUP }), + scheduleList: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.SCHEDULE_VM_BACKUP }), + }); + + this.backups = hash.backups; + this.rows = hash.backups; + this.settings = hash.settings; +>>>>>>> b5455bcb (fix: separate used/allocated units) if (this.$store.getters[`${ inStore }/schemaFor`](HCI.SETTING)) { const backupTargetResource = hash.settings.find( O => O.id === 'backup-target'); const isEmpty = this.getBackupTargetValueIsEmpty(backupTargetResource); @@ -50,10 +78,19 @@ export default { const resource = params.resource; return { +<<<<<<< HEAD rows: [], settings: [], resource, to: `${ HCI.SETTING }/backup-target?mode=edit`, +======= + rows: [], + backups: [], + settings: [], + resource, + to: `${ HCI.SETTING }/backup-target?mode=edit`, + searchSchedule: '' +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }, @@ -85,7 +122,29 @@ export default { } return out; +<<<<<<< HEAD } +======= + }, + + getRow(row) { + return row.status && row.status.source; + }, + + changeRows(filteredRows, searchSchedule) { + this.$set(this, 'searchSchedule', searchSchedule); + this.$set(this, 'backups', filteredRows); + }, + + sortGenerationFn() { + let base = defaultTableSortGenerationFn(this.schema, this.$store); + + base += this.searchSchedule; + + return base; + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) }, computed: { @@ -96,12 +155,25 @@ export default { NAMESPACE, { name: 'targetVM', +<<<<<<< HEAD labelKey: 'tableHeaders.targetVm', +======= + labelKey: 'harvester.tableHeaders.targetVm', +>>>>>>> b5455bcb (fix: separate used/allocated units) value: 'attachVM', align: 'left', formatter: 'AttachVMWithName' }, { +<<<<<<< HEAD +======= + name: 'backupCreatedFrom', + labelKey: 'harvester.tableHeaders.vmSchedule', + value: 'sourceSchedule', + formatter: 'BackupCreatedFrom', + }, + { +>>>>>>> b5455bcb (fix: separate used/allocated units) name: 'backupTarget', labelKey: 'tableHeaders.backupTarget', value: 'backupTarget', @@ -112,7 +184,11 @@ export default { name: 'readyToUse', labelKey: 'tableHeaders.readyToUse', value: 'status.readyToUse', +<<<<<<< HEAD align: 'left', +======= + align: 'center', +>>>>>>> b5455bcb (fix: separate used/allocated units) formatter: 'Checked', }, ]; @@ -124,16 +200,22 @@ export default { value: 'backupProgress', align: 'left', formatter: 'HarvesterBackupProgressBar', +<<<<<<< HEAD width: 200, }); } +======= + }); + } +>>>>>>> b5455bcb (fix: separate used/allocated units) cols.push(AGE); return cols; }, hasBackupProgresses() { +<<<<<<< HEAD return !!this.rows.find(R => R.status?.progress !== undefined); }, @@ -143,6 +225,18 @@ export default { backupTargetResource() { return this.settings.find( O => O.id === 'backup-target'); +======= + return !!this.backups.find(r => r.status?.progress !== undefined); + }, + filteredRows() { + return this.backups.filter(r => r.spec?.type !== BACKUP_TYPE.SNAPSHOT); + }, + getRawRows() { + return this.rows.filter(r => r.spec?.type === BACKUP_TYPE.BACKUP); + }, + backupTargetResource() { + return this.settings.find(O => O.id === 'backup-target'); +>>>>>>> b5455bcb (fix: separate used/allocated units) }, isEmptyValue() { @@ -211,16 +305,33 @@ export default { :headers="headers" :groupable="true" :rows="filteredRows" +<<<<<<< HEAD +======= + :sort-generation-fn="sortGenerationFn" +>>>>>>> b5455bcb (fix: separate used/allocated units) :schema="schema" key-field="_key" default-sort-by="age" v-on="$listeners" > +<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units) diff --git a/pkg/harvester/list/harvesterhci.io.vmsnapshot.vue b/pkg/harvester/list/harvesterhci.io.vmsnapshot.vue index ed94a79ff4d..24978a2031f 100644 --- a/pkg/harvester/list/harvesterhci.io.vmsnapshot.vue +++ b/pkg/harvester/list/harvesterhci.io.vmsnapshot.vue @@ -2,6 +2,7 @@ import Loading from '@shell/components/Loading'; import Masthead from '@shell/components/ResourceList/Masthead'; import ResourceTable from '@shell/components/ResourceTable'; +<<<<<<< HEAD import { HCI } from '../types'; import { SCHEMA } from '@shell/config/types'; @@ -10,6 +11,17 @@ import { STATE, AGE, NAME, NAMESPACE } from '@shell/config/table-headers'; import { BACKUP_TYPE } from '../config/types'; const schema = { +======= +import { HCI } from '../types'; +import { SCHEMA } from '@shell/config/types'; +import { allHash } from '@shell/utils/promise'; +import FilterVMSchedule from '../components/FilterVMSchedule'; +import { STATE, AGE, NAME, NAMESPACE } from '@shell/config/table-headers'; +import { BACKUP_TYPE } from '../config/types'; +import { defaultTableSortGenerationFn } from '@shell/components/ResourceTable.vue'; + +export const schema = { +>>>>>>> b5455bcb (fix: separate used/allocated units) id: HCI.VM_SNAPSHOT, type: SCHEMA, attributes: { @@ -22,7 +34,11 @@ const schema = { export default { name: 'HarvesterListVMSnapshot', components: { +<<<<<<< HEAD ResourceTable, Loading, Masthead +======= + ResourceTable, Loading, Masthead, FilterVMSchedule +>>>>>>> b5455bcb (fix: separate used/allocated units) }, async fetch() { @@ -39,6 +55,10 @@ export default { } this.rows = hash.rows; +<<<<<<< HEAD +======= + this.snapshots = hash.rows; +>>>>>>> b5455bcb (fix: separate used/allocated units) }, data() { @@ -47,7 +67,13 @@ export default { const resource = params.resource; return { +<<<<<<< HEAD rows: [], +======= + rows: [], + snapshots: [], + searchSchedule: '', +>>>>>>> b5455bcb (fix: separate used/allocated units) resource, }; }, @@ -60,6 +86,7 @@ export default { NAMESPACE, { name: 'targetVM', +<<<<<<< HEAD labelKey: 'tableHeaders.targetVm', value: 'attachVM', align: 'left', @@ -70,12 +97,40 @@ export default { labelKey: 'tableHeaders.readyToUse', value: 'status.readyToUse', align: 'left', +======= + labelKey: 'harvester.tableHeaders.targetVm', + value: 'attachVM', + align: 'left', + sort: 'attachVM', + formatter: 'AttachVMWithName' + }, + { + name: 'backupCreatedFrom', + labelKey: 'harvester.tableHeaders.vmSchedule', + value: 'sourceSchedule', + sort: 'sourceSchedule', + formatter: 'BackupCreatedFrom', + }, + { + name: 'readyToUse', + labelKey: 'tableHeaders.readyToUse', + value: 'status.readyToUse', + align: 'center', + sort: 'status.readyToUse', +>>>>>>> b5455bcb (fix: separate used/allocated units) formatter: 'Checked', }, AGE ]; }, +<<<<<<< HEAD +======= + getRawRows() { + return this.rows.filter(r => r.spec?.type === BACKUP_TYPE.SNAPSHOT); + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) schema() { return schema; }, @@ -85,9 +140,30 @@ export default { }, filteredRows() { +<<<<<<< HEAD return this.rows.filter(R => R.spec?.type !== BACKUP_TYPE.BACKUP); }, }, +======= + return this.snapshots.filter(r => r.spec?.type !== BACKUP_TYPE.BACKUP); + }, + }, + + methods: { + changeRows(filteredRows, searchSchedule) { + this.$set(this, 'searchSchedule', searchSchedule); + this.$set(this, 'snapshots', filteredRows); + }, + + sortGenerationFn() { + let base = defaultTableSortGenerationFn(this.schema, this.$store); + + base += this.searchSchedule; + + return base; + }, + } +>>>>>>> b5455bcb (fix: separate used/allocated units) }; @@ -100,17 +176,33 @@ export default { :type-display="typeDisplay" :create-button-label="t('harvester.vmSnapshot.createText')" /> +<<<<<<< HEAD +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) >>>>>> b5455bcb (fix: separate used/allocated units) key-field="_key" default-sort-by="age" v-on="$listeners" > +<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units) +<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units)
diff --git a/pkg/harvester/list/harvesterhci.io.volume.vue b/pkg/harvester/list/harvesterhci.io.volume.vue index d261af9ee87..1cbb8f2f3f7 100644 --- a/pkg/harvester/list/harvesterhci.io.volume.vue +++ b/pkg/harvester/list/harvesterhci.io.volume.vue @@ -4,7 +4,13 @@ import ResourceTable from '@shell/components/ResourceTable'; import HarvesterVolumeState from '../formatters/HarvesterVolumeState'; import { allSettled } from '../utils/promise'; +<<<<<<< HEAD import { PV, PVC, SCHEMA, LONGHORN } from '@shell/config/types'; +======= +import { + PV, PVC, SCHEMA, LONGHORN, STORAGE_CLASS +} from '@shell/config/types'; +>>>>>>> b5455bcb (fix: separate used/allocated units) import { HCI, VOLUME_SNAPSHOT } from '../types'; import { STATE, AGE, NAME, NAMESPACE } from '@shell/config/table-headers'; @@ -30,6 +36,10 @@ export default { pvcs: this.$store.dispatch(`${ inStore }/findAll`, { type: PVC }), pvs: this.$store.dispatch(`${ inStore }/findAll`, { type: PV }), vms: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.VM }), +<<<<<<< HEAD +======= + scs: this.$store.dispatch(`${ inStore }/findAll`, { type: STORAGE_CLASS }), +>>>>>>> b5455bcb (fix: separate used/allocated units) }; const volumeSnapshotSchema = this.$store.getters[`${ inStore }/schemaFor`](VOLUME_SNAPSHOT); @@ -158,6 +168,25 @@ export default {
+<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units) diff --git a/pkg/harvester/list/kubevirt.io.virtualmachine.vue b/pkg/harvester/list/kubevirt.io.virtualmachine.vue index 6cca3a5a8aa..622af5562ba 100644 --- a/pkg/harvester/list/kubevirt.io.virtualmachine.vue +++ b/pkg/harvester/list/kubevirt.io.virtualmachine.vue @@ -1,6 +1,7 @@ @@ -189,11 +238,29 @@ export default { @@ -210,6 +277,17 @@ export default { } } +<<<<<<< HEAD +======= +.green-icon { + color: var(--success); +} + +.yellow-icon { + color: var(--warning); +} + +>>>>>>> b5455bcb (fix: separate used/allocated units) .name-console { display: flex; align-items: center; diff --git a/pkg/harvester/mixins/harvester-vm/impl.js b/pkg/harvester/mixins/harvester-vm/impl.js index ebf67032cd3..da54fb1f154 100644 --- a/pkg/harvester/mixins/harvester-vm/impl.js +++ b/pkg/harvester/mixins/harvester-vm/impl.js @@ -144,6 +144,13 @@ export default { return !!spec?.template?.spec?.domain?.firmware?.bootloader?.efi?.secureBoot; }, +<<<<<<< HEAD +======= + isCpuPinning(spec) { + return !!spec?.template?.spec?.domain?.cpu?.dedicatedCpuPlacement; + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) getCloudInitNoCloud(spec) { const secret = this.getSecret(spec); let userData = secret?.decodedData?.userdata; diff --git a/pkg/harvester/mixins/harvester-vm/index.js b/pkg/harvester/mixins/harvester-vm/index.js index cf6b4a0b55d..e2ecc1104fb 100644 --- a/pkg/harvester/mixins/harvester-vm/index.js +++ b/pkg/harvester/mixins/harvester-vm/index.js @@ -11,7 +11,13 @@ import { allHash } from '@shell/utils/promise'; import { randomStr } from '@shell/utils/string'; import { base64Decode } from '@shell/utils/crypto'; import { formatSi, parseSi } from '@shell/utils/units'; +<<<<<<< HEAD import { ADD_ONS, SOURCE_TYPE, ACCESS_CREDENTIALS } from '../../config/harvester-map'; +======= +import { + ADD_ONS, SOURCE_TYPE, ACCESS_CREDENTIALS, maintenanceStrategies, runStrategies +} from '../../config/harvester-map'; +>>>>>>> b5455bcb (fix: separate used/allocated units) import { _CLONE, _CREATE, _VIEW } from '@shell/config/query-params'; import { PV, PVC, STORAGE_CLASS, NODE, SECRET, CONFIG_MAP, NETWORK_ATTACHMENT, NAMESPACE, LONGHORN @@ -24,6 +30,11 @@ import impl, { QGA_JSON, USB_TABLET } from './impl'; import { uniq } from '@shell/utils/array'; import { parseVolumeClaimTemplates } from '../../utils/vm'; +<<<<<<< HEAD +======= +const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine'; + +>>>>>>> b5455bcb (fix: separate used/allocated units) export const MANAGEMENT_NETWORK = 'management Network'; export const OS = [{ @@ -49,6 +60,10 @@ export const OS = [{ value: 'oracle' }, { label: 'Red Hat', +<<<<<<< HEAD +======= + match: ['redhat', 'rhel'], +>>>>>>> b5455bcb (fix: separate used/allocated units) value: 'redhat' }, { label: 'openSUSE', @@ -97,6 +112,10 @@ export default { vms: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.VM }), secrets: this.$store.dispatch(`${ inStore }/findAll`, { type: SECRET }), addons: this.$store.dispatch(`${ inStore }/findAll`, { type: HCI.ADD_ONS }), +<<<<<<< HEAD +======= + longhornV2Engine: this.$store.dispatch(`${ inStore }/find`, { type: LONGHORN.SETTINGS, id: LONGHORN_V2_DATA_ENGINE }), +>>>>>>> b5455bcb (fix: separate used/allocated units) }; if (this.$store.getters[`${ inStore }/schemaFor`](NODE)) { @@ -120,11 +139,18 @@ export default { const hasPCISchema = !!this.$store.getters[`${ inStore }/schemaFor`](HCI.PCI_DEVICE); const hasSRIOVGPUSchema = !!this.$store.getters[`${ inStore }/schemaFor`](HCI.SR_IOVGPU_DEVICE); +<<<<<<< HEAD const hasPCIAddon = res.addons.find(addon => addon.name === ADD_ONS.PCI_DEVICE_CONTROLLER)?.spec?.enabled === true; const hasSriovgpuAddon = res.addons.find(addon => addon.name === ADD_ONS.NVIDIA_DRIVER_TOOLKIT_CONTROLLER)?.spec?.enabled === true; this.enabledPCI = hasPCIAddon && hasPCISchema; this.enabledSriovgpu = hasSriovgpuAddon && hasPCIAddon && hasSRIOVGPUSchema; +======= + const enabledAddons = res.addons.reduce((acc, addon) => ({ ...acc, [addon.name]: addon.spec?.enabled }), {}); + + this.enabledPCI = hasPCISchema && enabledAddons[ADD_ONS.PCI_DEVICE_CONTROLLER]; + this.enabledSriovgpu = hasSRIOVGPUSchema && enabledAddons[ADD_ONS.PCI_DEVICE_CONTROLLER] && enabledAddons[ADD_ONS.NVIDIA_DRIVER_TOOLKIT_CONTROLLER]; +>>>>>>> b5455bcb (fix: separate used/allocated units) }, data() { @@ -136,6 +162,12 @@ export default { spec: null, osType: 'linux', sshKey: [], +<<<<<<< HEAD +======= + maintenanceStrategies, + maintenanceStrategy: 'Migrate', + runStrategies, +>>>>>>> b5455bcb (fix: separate used/allocated units) runStrategy: 'RerunOnFailure', installAgent: true, hasCreateVolumes: [], @@ -164,6 +196,10 @@ export default { enabledSriovgpu: false, immutableMode: this.realMode === _CREATE ? _CREATE : _VIEW, terminationGracePeriodSeconds: '', +<<<<<<< HEAD +======= + cpuPinning: false, +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }, @@ -235,7 +271,11 @@ export default { defaultStorageClass() { const defaultStorage = this.$store.getters[`${ this.inStore }/all`](STORAGE_CLASS).find( O => O.isDefault); +<<<<<<< HEAD return defaultStorage?.metadata?.name || 'longhorn'; +======= + return defaultStorage; +>>>>>>> b5455bcb (fix: separate used/allocated units) }, storageClassSetting() { @@ -297,7 +337,11 @@ export default { } = config; const vm = this.resource === HCI.VM ? value : this.resource === HCI.BACKUP ? this.value.status?.source : value.spec.vm; +<<<<<<< HEAD +======= + const volumeBackups = this.resource === HCI.BACKUP ? this.value.status?.volumeBackups : null; +>>>>>>> b5455bcb (fix: separate used/allocated units) const spec = vm?.spec; if (!spec) { @@ -316,6 +360,14 @@ export default { }; } +<<<<<<< HEAD +======= + if (!vm.metadata.labels) { + vm.metadata.labels = {}; + } + const maintenanceStrategy = vm.metadata.labels?.[HCI_ANNOTATIONS.VM_MAINTENANCE_MODE_STRATEGY] || 'Migrate'; + +>>>>>>> b5455bcb (fix: separate used/allocated units) const runStrategy = spec.runStrategy || 'RerunOnFailure'; const machineType = value.machineType; const cpu = spec.template.spec.domain?.cpu?.cores; @@ -326,7 +378,12 @@ export default { const sshKey = this.getSSHFromAnnotation(spec) || []; const imageId = this.getRootImageId(vm) || ''; +<<<<<<< HEAD const diskRows = this.getDiskRows(vm); +======= + const diskRows = this.getDiskRows(vm, volumeBackups); + +>>>>>>> b5455bcb (fix: separate used/allocated units) const networkRows = this.getNetworkRows(vm, { fromTemplate, init }); const hasCreateVolumes = this.getHasCreatedVolumes(spec) || []; @@ -352,6 +409,10 @@ export default { const efiEnabled = this.isEfiEnabled(spec); const tpmEnabled = this.isTpmEnabled(spec); const secureBoot = this.isSecureBoot(spec); +<<<<<<< HEAD +======= + const cpuPinning = this.isCpuPinning(spec); +>>>>>>> b5455bcb (fix: separate used/allocated units) const secretRef = this.getSecret(spec); const accessCredentials = this.getAccessCredentials(spec); @@ -362,6 +423,10 @@ export default { } this.$set(this, 'spec', spec); +<<<<<<< HEAD +======= + this.$set(this, 'maintenanceStrategy', maintenanceStrategy); +>>>>>>> b5455bcb (fix: separate used/allocated units) this.$set(this, 'runStrategy', runStrategy); this.$set(this, 'secretRef', secretRef); this.$set(this, 'accessCredentials', accessCredentials); @@ -382,6 +447,10 @@ export default { this.$set(this, 'efiEnabled', efiEnabled); this.$set(this, 'tpmEnabled', tpmEnabled); this.$set(this, 'secureBoot', secureBoot); +<<<<<<< HEAD +======= + this.$set(this, 'cpuPinning', cpuPinning); +>>>>>>> b5455bcb (fix: separate used/allocated units) this.$set(this, 'hasCreateVolumes', hasCreateVolumes); this.$set(this, 'networkRows', networkRows); @@ -392,7 +461,11 @@ export default { this.refreshYamlEditor(); }, +<<<<<<< HEAD getDiskRows(vm) { +======= + getDiskRows(vm, volBackups) { +>>>>>>> b5455bcb (fix: separate used/allocated units) const namespace = vm.metadata.namespace; const _volumes = vm.spec.template.spec.volumes || []; const _disks = vm.spec.template.spec.domain.devices.disks || []; @@ -401,10 +474,39 @@ export default { let out = []; if (_disks.length === 0) { +<<<<<<< HEAD +======= + let bus = 'virtio'; + let type = HARD_DISK; + let size = '10Gi'; + + const imageResource = this.images.find( I => this.imageId === I.id); + + const isIsoImage = /iso$/i.test(imageResource?.imageSuffix); + const imageSize = Math.max(imageResource?.status?.size, imageResource?.status?.virtualSize); + const isEncrypted = imageResource?.isEncrypted || false; + const volumeBackups = volBackups?.find(vBackup => vBackup.volumeName === 'disk-0') || null ; + + if (isIsoImage) { + bus = 'sata'; + type = CD_ROM; + } + + if (imageSize) { + let imageSizeGiB = Math.ceil(imageSize / 1024 / 1024 / 1024); + + if (!isIsoImage) { + imageSizeGiB = Math.max(imageSizeGiB, 10); + } + size = `${ imageSizeGiB }Gi`; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) out.push({ id: randomStr(5), source: SOURCE_TYPE.IMAGE, name: 'disk-0', +<<<<<<< HEAD accessMode: 'ReadWriteMany', bus: 'virtio', volumeName: '', @@ -413,6 +515,18 @@ export default { storageClassName: '', image: this.imageId, volumeMode: 'Block', +======= + accessMode: 'ReadWriteMany', // root disk only support LHv1 volume, should be RWX + bus, + volumeName: '', + size, + type, + storageClassName: '', + image: this.imageId, + volumeMode: 'Block', + isEncrypted, + volumeBackups, +>>>>>>> b5455bcb (fix: separate used/allocated units) }); } else { out = _disks.map( (DISK, index) => { @@ -489,7 +603,16 @@ export default { minExponent: 3, }); +<<<<<<< HEAD const volumeStatus = this.pvcs.find(P => P.id === `${ this.value.metadata.namespace }/${ volumeName }`)?.relatedPV?.metadata?.annotations?.[HCI_ANNOTATIONS.VOLUME_ERROR]; +======= + const pvc = this.pvcs.find(P => P.id === `${ this.value.metadata.namespace }/${ volumeName }`); + + const volumeStatus = pvc?.relatedPV?.metadata?.annotations?.[HCI_ANNOTATIONS.VOLUME_ERROR]; + + const isEncrypted = pvc?.isEncrypted || false; + const volumeBackups = volBackups?.find(vBackup => vBackup.volumeName === DISK.name) || null; +>>>>>>> b5455bcb (fix: separate used/allocated units) return { id: randomStr(5), @@ -509,7 +632,13 @@ export default { hotpluggable, volumeStatus, dataSource, +<<<<<<< HEAD namespace +======= + namespace, + isEncrypted, + volumeBackups, +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }); } @@ -574,6 +703,15 @@ export default { } else { vm.metadata.annotations[HCI_ANNOTATIONS.VM_RESERVED_MEMORY] = this.reservedMemory; } +<<<<<<< HEAD +======= + + if (this.maintenanceStrategy === 'Migrate') { + delete vm.metadata.labels[HCI_ANNOTATIONS.VM_MAINTENANCE_MODE_STRATEGY]; + } else { + vm.metadata.labels[HCI_ANNOTATIONS.VM_MAINTENANCE_MODE_STRATEGY] = this.maintenanceStrategy; + } +>>>>>>> b5455bcb (fix: separate used/allocated units) }, parseDiskRows(disk) { @@ -819,6 +957,13 @@ export default { } }, +<<<<<<< HEAD +======= + getMaintenanceStrategyOptionLabel(opt) { + return this.t(`harvester.virtualMachine.maintenanceStrategy.options.${ opt.label || opt }`); + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) getInitUserData(config) { const _QGA_JSON = this.getMatchQGA(config.osType); @@ -1339,6 +1484,17 @@ export default { } }, +<<<<<<< HEAD +======= + setCpuPinning(value) { + if (value) { + set(this.spec.template.spec.domain.cpu, 'dedicatedCpuPlacement', true); + } else { + this.$delete(this.spec.template.spec.domain.cpu, 'dedicatedCpuPlacement'); + } + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) setTPM(tpmEnabled) { if (tpmEnabled) { set(this.spec.template.spec.domain.devices, 'tpm', {}); @@ -1462,6 +1618,13 @@ export default { this.setBootMethod({ efi: this.efiEnabled, secureBoot: val }); }, +<<<<<<< HEAD +======= + cpuPinning(value) { + this.setCpuPinning(value); + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) tpmEnabled(val) { this.setTPM(val); }, diff --git a/pkg/harvester/models/devices.harvesterhci.io.pcidevice.js b/pkg/harvester/models/devices.harvesterhci.io.pcidevice.js index 2cbbac84bcd..e4093a72fe3 100644 --- a/pkg/harvester/models/devices.harvesterhci.io.pcidevice.js +++ b/pkg/harvester/models/devices.harvesterhci.io.pcidevice.js @@ -36,14 +36,24 @@ export default class PCIDevice extends SteveModel { icon: 'icon icon-fw icon-dot', label: 'Enable Passthrough', bulkable: true, +<<<<<<< HEAD bulkAction: 'enablePassthroughBulk' +======= + bulkAction: 'enablePassthroughBulk', + weight: 1 +>>>>>>> b5455bcb (fix: separate used/allocated units) }, { action: 'disablePassthrough', enabled: this.isEnabling && this.claimedByMe, icon: 'icon icon-fw icon-dot-open', label: 'Disable Passthrough', +<<<<<<< HEAD bulkable: true +======= + bulkable: true, + weight: 0 +>>>>>>> b5455bcb (fix: separate used/allocated units) }, ); @@ -135,7 +145,11 @@ export default class PCIDevice extends SteveModel { enablePassthroughBulk(resources = this) { this.$dispatch('promptModal', { resources, +<<<<<<< HEAD component: 'EnablePassthrough' +======= + component: 'EnablePciPassthrough' +>>>>>>> b5455bcb (fix: separate used/allocated units) }); } diff --git a/pkg/harvester/models/devices.harvesterhci.io.usbdevice.js b/pkg/harvester/models/devices.harvesterhci.io.usbdevice.js new file mode 100644 index 00000000000..ad93395ea0c --- /dev/null +++ b/pkg/harvester/models/devices.harvesterhci.io.usbdevice.js @@ -0,0 +1,161 @@ +import SteveModel from '@shell/plugins/steve/steve-class'; +import { escapeHtml } from '@shell/utils/string'; +import { HCI } from '../types'; + +const STATUS_DISPLAY = { + enabled: { + displayKey: 'generic.enabled', + color: 'bg-success' + }, + pending: { + displayKey: 'generic.inProgress', + color: 'bg-info' + }, + disabled: { + displayKey: 'generic.disabled', + color: 'bg-warning' + }, + error: { + displayKey: 'generic.disabled', + color: 'bg-warning' + } +}; + +/** + * Class representing USB Device resource. + * @extends SteveModal + */ +export default class USBDevice extends SteveModel { + get _availableActions() { + const out = super._availableActions; + + out.push( + { + action: 'enablePassthroughBulk', + enabled: !this.passthroughClaim && !this.status.enabled, + icon: 'icon icon-fw icon-dot', + label: 'Enable Passthrough', + bulkable: true, + bulkAction: 'enablePassthroughBulk', + weight: 1 + }, + { + action: 'disablePassthrough', + enabled: this.status.enabled, + icon: 'icon icon-fw icon-dot-open', + label: 'Disable Passthrough', + bulkable: true, + weight: 0 + }, + ); + + return out; + } + + get canYaml() { + return false; + } + + get canDelete() { + return false; + } + + goToDetail() { + return false; + } + + goToEdit() { + return false; + } + + get passthroughClaim() { + const passthroughClaims = this.$getters['all'](HCI.USB_CLAIM) || []; + + return !!this.status && passthroughClaims.find(req => req?.status?.nodeName === this.status?.nodeName && req?.metadata?.name === this.metadata?.name); + } + + // this is an id for each 'type' of device - there may be multiple instances of device CRs + get uniqueId() { + return `${ this.status?.vendorId }:${ this.status?.deviceId }`; + } + + get claimedBy() { + return this.passthroughClaim?.spec?.userName; + } + + get claimedByMe() { + if (!this.passthroughClaim) { + return false; + } + const isSingleProduct = this.$rootGetters['isSingleProduct']; + let userName = 'admin'; + + // if this is imported Harvester, there may be users other than admin + if (!isSingleProduct) { + const user = this.$rootGetters['auth/v3User']; + + userName = user?.username || user?.id; + } + + return this.claimedBy === userName; + } + + // map status.passthroughEnabled to disabled/enabled & overwrite default dash colors + get claimStatusDisplay() { + if (!this.passthroughClaim) { + return STATUS_DISPLAY.disabled; + } + if (this.status.enabled) { + return STATUS_DISPLAY.enabled; + } + + return STATUS_DISPLAY.pending; + } + + get stateDisplay() { + const t = this.$rootGetters['i18n/t']; + + return t(this.claimStatusDisplay.displayKey); + } + + get stateBackground() { + return this.claimStatusDisplay.color; + } + + // 'enable' passthrough creates the passthrough claim CRD - + enablePassthroughBulk(resources = this) { + this.$dispatch('promptModal', { + resources, + component: 'EnableUSBPassthrough' + }); + } + + // 'disable' passthrough deletes claim + // backend should return error if device is in use + async disablePassthrough() { + try { + if (!this.claimedByMe) { + throw new Error(this.$rootGetters['i18n/t']('harvester.usb.cantUnclaim', { name: escapeHtml(this.metadata.name) })); + } else { + await this.passthroughClaim.remove(); + } + } catch (err) { + this.$dispatch('growl/fromError', { + title: this.$rootGetters['i18n/t']('harvester.usb.unclaimError', { name: escapeHtml(this.metadata.name) }), + err, + }, { root: true }); + } + } + + // group device list by node + get groupByNode() { + const name = this.status?.nodeName || this.$rootGetters['i18n/t']('generic.none'); + + return this.$rootGetters['i18n/t']('resourceTable.groupLabel.node', { name: escapeHtml(name) }); + } + + // group device list by unique device (same vendorid and deviceid) + get groupByDevice() { + return this.status?.description; + } +} diff --git a/pkg/harvester/models/harvester/namespace.js b/pkg/harvester/models/harvester/namespace.js index 4d392df9d2e..b3c2e734616 100644 --- a/pkg/harvester/models/harvester/namespace.js +++ b/pkg/harvester/models/harvester/namespace.js @@ -5,6 +5,10 @@ import SYSTEM_NAMESPACES from '@shell/config/system-namespaces'; import { get } from '@shell/utils/object'; import { NAMESPACE } from '@shell/config/types'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '@pkg/harvester/config/harvester'; +<<<<<<< HEAD +======= +import { HCI } from '../../types'; +>>>>>>> b5455bcb (fix: separate used/allocated units) const OBSCURE_NAMESPACE_PREFIX = [ 'c-', // cluster namespace @@ -37,15 +41,41 @@ export default class HciNamespace extends namespace { weight: -10, }; +<<<<<<< HEAD +======= + const editQuotaAction = { + action: 'editNSQuota', + label: this.t('harvester.modal.quota.editQuota'), + icon: 'icon icon-storage', + enabled: !!this?.actions?.updateResourceQuota && !!this?.actions?.deleteResourceQuota, + weight: -11, + }; + +>>>>>>> b5455bcb (fix: separate used/allocated units) if (remove > -1) { out.splice(remove, 1); } insertAt(out, out.length - 1, promptRemove); +<<<<<<< HEAD +======= + insertAt(out, out.length - 5, editQuotaAction); +>>>>>>> b5455bcb (fix: separate used/allocated units) return out; } +<<<<<<< HEAD +======= + editNSQuota(resources = this) { + this.$dispatch('promptModal', { + resources, + snapshotSizeQuota: this.snapshotSizeQuota, + component: 'HarvesterQuotaDialog' + }); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) promptRemove(resources = this) { this.$dispatch('promptModal', { resources, @@ -54,6 +84,20 @@ export default class HciNamespace extends namespace { }); } +<<<<<<< HEAD +======= + get nsResourceQuota() { + const inStore = this.$rootGetters['currentProduct'].inStore; + const allResQuotas = this.$rootGetters[`${ inStore }/all`](HCI.RESOURCE_QUOTA); + + return allResQuotas.find( RQ => RQ.metadata.namespace === this.id); + } + + get snapshotSizeQuota() { + return this.nsResourceQuota?.spec?.snapshotLimit?.namespaceTotalSnapshotSizeQuota; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get isSystem() { const systemNamespaces = ['fleet-default']; diff --git a/pkg/harvester/models/harvester/node.js b/pkg/harvester/models/harvester/node.js index e1c77ec941d..6057b6981d8 100644 --- a/pkg/harvester/models/harvester/node.js +++ b/pkg/harvester/models/harvester/node.js @@ -59,6 +59,25 @@ export default class HciNode extends HarvesterResource { total: 1 }; +<<<<<<< HEAD +======= + const enableCPUManager = { + action: 'enableCPUManager', + enabled: this.hasAction('enableCPUManager') && !this.isCPUManagerEnableInProgress && !this.isCPUManagerEnabled && !this.isEtcd, // witness node doesn't have CPU manager + icon: 'icon icon-fw icon-os-management', + label: this.t('harvester.action.enableCPUManager'), + total: 1 + }; + + const disableCPUManager = { + action: 'disableCPUManager', + enabled: this.hasAction('disableCPUManager') && !this.isCPUManagerEnableInProgress && this.isCPUManagerEnabled && !this.isEtcd, + icon: 'icon icon-fw icon-os-management', + label: this.t('harvester.action.disableCPUManager'), + total: 1 + }; + +>>>>>>> b5455bcb (fix: separate used/allocated units) const shutDown = { action: 'shutDown', enabled: this.hasAction('powerActionPossible') && this.hasAction('powerAction') && !this.isStopped && !!this.inventory, @@ -88,6 +107,11 @@ export default class HciNode extends HarvesterResource { uncordon, enableMaintenance, disableMaintenance, +<<<<<<< HEAD +======= + enableCPUManager, + disableCPUManager, +>>>>>>> b5455bcb (fix: separate used/allocated units) shutDown, powerOn, reboot, @@ -134,6 +158,7 @@ export default class HciNode extends HarvesterResource { get consoleUrl() { const url = this.metadata?.annotations?.[HCI_ANNOTATIONS.HOST_CONSOLE_URL]; +<<<<<<< HEAD if (!url) { return false; @@ -143,6 +168,14 @@ export default class HciNode extends HarvesterResource { return `http://${ url }`; } +======= + const validator = /^[a-z]+:\/\//; + + if (!url?.match(validator)) { + return false; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) return url; } @@ -308,6 +341,17 @@ export default class HciNode extends HarvesterResource { this.doAction('disableMaintenanceMode', {}); } +<<<<<<< HEAD +======= + enableCPUManager() { + this.doActionGrowl('enableCPUManager', {}); + } + + disableCPUManager() { + this.doActionGrowl('disableCPUManager', {}); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get isUnSchedulable() { return ( this.metadata?.labels?.[HCI_ANNOTATIONS.NODE_SCHEDULABLE] === 'false' || @@ -347,6 +391,31 @@ export default class HciNode extends HarvesterResource { ); } +<<<<<<< HEAD +======= + get isCPUManagerEnabled() { + return this.metadata?.labels?.[HCI_ANNOTATIONS.CPU_MANAGER] === 'true'; + } + + get isCPUManagerEnableInProgress() { + return this.cpuManagerUpdateStatus === 'requested' || this.cpuManagerUpdateStatus === 'running'; + } + + get isCPUManagerEnableFailed() { + return this.cpuManagerUpdateStatus === 'failed'; + } + + get cpuManagerUpdateStatus() { + try { + const cpuManagerUpdate = JSON.parse(this.metadata.annotations[HCI_ANNOTATIONS.NODE_CPU_MANAGER_UPDATE_STATUS] || '{}'); + + return cpuManagerUpdate.status || ''; + } catch { + return ''; + } + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get longhornDisks() { const inStore = this.$rootGetters['currentProduct'].inStore; const longhornNode = this.$rootGetters[`${ inStore }/byId`]( @@ -444,7 +513,11 @@ export default class HciNode extends HarvesterResource { get unProvisionedDisks() { const blockDevices = this.blockDevices || []; +<<<<<<< HEAD return blockDevices.filter(d => d?.spec?.fileSystem?.provisioned && d?.status?.provisionPhase !== 'Provisioned'); +======= + return blockDevices.filter(d => d?.isProvisioned && d?.status?.provisionPhase !== 'Provisioned'); +>>>>>>> b5455bcb (fix: separate used/allocated units) } get diskStatusCount() { diff --git a/pkg/harvester/models/harvester/persistentvolumeclaim.js b/pkg/harvester/models/harvester/persistentvolumeclaim.js index 1b65741159c..53035a69e25 100644 --- a/pkg/harvester/models/harvester/persistentvolumeclaim.js +++ b/pkg/harvester/models/harvester/persistentvolumeclaim.js @@ -2,7 +2,11 @@ import Vue from 'vue'; import { _CLONE } from '@shell/config/query-params'; import pick from 'lodash/pick'; import { HCI, VOLUME_SNAPSHOT } from '../../types'; +<<<<<<< HEAD import { PV, LONGHORN } from '@shell/config/types'; +======= +import { PV, LONGHORN, STORAGE_CLASS } from '@shell/config/types'; +>>>>>>> b5455bcb (fix: separate used/allocated units) import { DESCRIPTION } from '@shell/config/labels-annotations'; import { HCI as HCI_ANNOTATIONS } from '@pkg/harvester/config/labels-annotations'; import { findBy } from '@shell/utils/array'; @@ -10,8 +14,18 @@ import { get, clone } from '@shell/utils/object'; import { colorForState } from '@shell/plugins/dashboard-store/resource-class'; import HarvesterResource from '../harvester'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../../config/harvester'; +<<<<<<< HEAD const DEGRADED_ERROR = 'replica scheduling failed'; +======= +import { LVM_DRIVER } from './storage.k8s.io.storageclass'; +import { LONGHORN_DRIVER } from '@shell/models/persistentvolume'; + +const DEGRADED_ERRORS = ['replica scheduling failed', 'precheck new replica failed']; + +export const DATA_ENGINE_V1 = 'v1'; +export const DATA_ENGINE_V2 = 'v2'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default class HciPv extends HarvesterResource { applyDefaults(_, realMode) { @@ -31,6 +45,10 @@ export default class HciPv extends HarvesterResource { get availableActions() { const out = super._availableActions; +<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units) const clone = out.find(action => action.action === 'goToClone'); if (clone) { @@ -40,22 +58,38 @@ export default class HciPv extends HarvesterResource { return [ { action: 'exportImage', +<<<<<<< HEAD enabled: this.hasAction('export'), +======= + enabled: this.hasAction('export') && !this.isEncrypted, +>>>>>>> b5455bcb (fix: separate used/allocated units) icon: 'icon icon-copy', label: this.t('harvester.action.exportImage') }, { +<<<<<<< HEAD action: 'cancelExpand', enabled: this.hasAction('cancelExpand'), icon: 'icon icon-backup', label: this.t('harvester.action.cancelExpand') }, { +======= +>>>>>>> b5455bcb (fix: separate used/allocated units) action: 'snapshot', enabled: this.hasAction('snapshot'), icon: 'icon icon-backup', label: this.t('harvester.action.snapshot'), }, +<<<<<<< HEAD +======= + { + action: 'cancelExpand', + enabled: this.hasAction('cancelExpand'), + icon: 'icon icon-backup', + label: this.t('harvester.action.cancelExpand') + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) ...out ]; } @@ -94,21 +128,39 @@ export default class HciPv extends HarvesterResource { this.metadata.annotations = pick(this.metadata.annotations, keys); } +<<<<<<< HEAD +======= + get storageClass() { + const inStore = this.$rootGetters['currentProduct'].inStore; + + return this.$rootGetters[`${ inStore }/all`](STORAGE_CLASS).find(sc => sc.name === this.spec.storageClassName); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get canUpdate() { return this.hasLink('update'); } get stateDisplay() { +<<<<<<< HEAD const ownedBy = this?.metadata?.annotations?.[HCI_ANNOTATIONS.OWNED_BY]; const volumeError = this.relatedPV?.metadata?.annotations?.[HCI_ANNOTATIONS.VOLUME_ERROR]; const degradedVolume = volumeError === DEGRADED_ERROR; +======= + const volumeError = this.relatedPV?.metadata?.annotations?.[HCI_ANNOTATIONS.VOLUME_ERROR]; + const degradedVolume = DEGRADED_ERRORS.includes(volumeError); +>>>>>>> b5455bcb (fix: separate used/allocated units) const status = this?.status?.phase === 'Bound' && !volumeError && this.isLonghornVolumeReady ? 'Ready' : 'Not Ready'; const conditions = this?.status?.conditions || []; if (findBy(conditions, 'type', 'Resizing')?.status === 'True') { return 'Resizing'; +<<<<<<< HEAD } else if (ownedBy && !volumeError) { +======= + } else if (!!this.attachVM && !volumeError) { +>>>>>>> b5455bcb (fix: separate used/allocated units) return 'In-use'; } else if (degradedVolume) { return 'Degraded'; @@ -120,7 +172,11 @@ export default class HciPv extends HarvesterResource { // state is similar with stateDisplay, the reason we keep this property is the status of In-use should not be displayed on vm detail page get state() { const volumeError = this.relatedPV?.metadata?.annotations?.[HCI_ANNOTATIONS.VOLUME_ERROR]; +<<<<<<< HEAD const degradedVolume = volumeError === DEGRADED_ERROR; +======= + const degradedVolume = DEGRADED_ERRORS.includes(volumeError); +>>>>>>> b5455bcb (fix: separate used/allocated units) let status = this?.status?.phase === 'Bound' && !volumeError ? 'Ready' : 'Not Ready'; const conditions = this?.status?.conditions || []; @@ -180,6 +236,7 @@ export default class HciPv extends HarvesterResource { } get attachVM() { +<<<<<<< HEAD const allVMs = this.$rootGetters['harvester/all'](HCI.VM); const ownedBy = get(this, `metadata.annotations."${ HCI_ANNOTATIONS.OWNED_BY }"`) || ''; @@ -191,6 +248,21 @@ export default class HciPv extends HarvesterResource { const ownedId = JSON.parse(ownedBy)[0]?.refs?.[0]; return allVMs.find(D => D.id === ownedId); +======= + const allVMs = this.$rootGetters['harvester/all'](HCI.VM) || []; + + const findAttachVM = (vm) => { + const attachVolumes = vm.spec.template?.spec?.volumes || []; + + if (vm.namespace === this.namespace && attachVolumes.length > 0) { + return attachVolumes.find(vol => vol.persistentVolumeClaim?.claimName === this.name); + } + + return null; + }; + + return allVMs.find(findAttachVM); +>>>>>>> b5455bcb (fix: separate used/allocated units) } get isAvailable() { @@ -215,6 +287,13 @@ export default class HciPv extends HarvesterResource { return false; } +<<<<<<< HEAD +======= + get isEncrypted() { + return this.relatedPV?.spec.csi.volumeAttributes.encrypted === 'true'; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get longhornVolume() { const inStore = this.$rootGetters['currentProduct'].inStore; @@ -279,6 +358,29 @@ export default class HciPv extends HarvesterResource { return this.$rootGetters['harvester/all'](PV).find(pv => pv.metadata?.name === this.spec?.volumeName); } +<<<<<<< HEAD +======= + get volumeProvider() { + return this.relatedPV?.spec.csi?.driver; + } + + get dataEngine() { + return this.relatedPV?.spec.csi?.volumeAttributes?.dataEngine; + } + + get isLvm() { + return this.volumeProvider === LVM_DRIVER; + } + + get isLonghorn() { + return this.volumeProvider === LONGHORN_DRIVER; + } + + get isLonghornV2() { + return this.dataEngine === DATA_ENGINE_V2; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get resourceExternalLink() { const host = window.location.host; const { params } = this.currentRoute(); diff --git a/pkg/harvester/models/harvester/secret.js b/pkg/harvester/models/harvester/secret.js index 0c8536ddd5b..657d7322f61 100644 --- a/pkg/harvester/models/harvester/secret.js +++ b/pkg/harvester/models/harvester/secret.js @@ -2,6 +2,10 @@ import { clone } from '@shell/utils/object'; import { HCI } from '../../types'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../../config/harvester'; import Secret from '@shell/models/secret'; +<<<<<<< HEAD +======= +import { NAMESPACE } from '@shell/config/types'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default class HciSecret extends Secret { get _detailLocation() { @@ -52,6 +56,17 @@ export default class HciSecret extends Secret { return this.doneOverride; } +<<<<<<< HEAD +======= + get isSystem() { + const inStore = this.$rootGetters['currentProduct'].inStore; + + const systemNs = this.$rootGetters[`${ inStore }/all`](NAMESPACE).filter(ns => ns.isSystem === true).map(ns => ns.metadata.name); + + return systemNs.includes(this.metadata.namespace); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get details() { const out = [ { diff --git a/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js b/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js index 80dffc49df6..0b4d95dbfb2 100644 --- a/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js +++ b/pkg/harvester/models/harvester/storage.k8s.io.storageclass.js @@ -2,6 +2,13 @@ import { clone } from '@shell/utils/object'; import { HCI } from '../../types'; import StorageClass from '@shell/models/storage.k8s.io.storageclass'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../../config/harvester'; +<<<<<<< HEAD +======= +import { LONGHORN_DRIVER } from '@shell/models/persistentvolume'; +import { DATA_ENGINE_V1, DATA_ENGINE_V2 } from '../../models/harvester/persistentvolumeclaim'; + +export const LVM_DRIVER = 'lvm.driver.harvesterhci.io'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default class HciStorageClass extends StorageClass { get detailLocation() { @@ -31,4 +38,33 @@ export default class HciStorageClass extends StorageClass { get parentNameOverride() { return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.STORAGE }"`, { count: 1 })?.trim(); } +<<<<<<< HEAD +======= + + get longhornVersion() { + if (this.provisioner === LONGHORN_DRIVER) { + return (this.parameters || {}).dataEngine || DATA_ENGINE_V1; + } + + return null; + } + + get provisionerDisplay() { + let key = ''; + + if (this.provisioner === LONGHORN_DRIVER) { + key = `harvester.storage.storageClass.longhorn.${ this.longhornVersion }.label`; + } + + if (this.provisioner === LVM_DRIVER) { + key = `harvester.storage.storageClass.lvm.label`; + } + + return key ? this.$rootGetters['i18n/t'](key) : this.provisioner; + } + + get isLonghornV2() { + return this.provisioner === LONGHORN_DRIVER && this.longhornVersion === DATA_ENGINE_V2; + } +>>>>>>> b5455bcb (fix: separate used/allocated units) } diff --git a/pkg/harvester/models/harvesterhci.io.addon.js b/pkg/harvester/models/harvesterhci.io.addon.js index e7ff9d459ae..37b79cb75cc 100644 --- a/pkg/harvester/models/harvesterhci.io.addon.js +++ b/pkg/harvester/models/harvesterhci.io.addon.js @@ -2,6 +2,10 @@ import HarvesterResource from './harvester'; import { HCI as HCI_ANNOTATIONS } from '../config/labels-annotations'; import jsyaml from 'js-yaml'; import startCase from 'lodash/startCase'; +<<<<<<< HEAD +======= +import { HCI } from '../types'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default class HciAddonConfig extends HarvesterResource { get availableActions() { @@ -106,6 +110,13 @@ export default class HciAddonConfig extends HarvesterResource { return failedCondition?.message || super.stateDescription; } +<<<<<<< HEAD +======= + get parentNameOverride() { + return this.$rootGetters['i18n/t'](`typeLabel."${ HCI.ADD_ONS }"`, { count: 1 })?.trim(); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get displayName() { const isExperimental = this.metadata?.labels?.[HCI_ANNOTATIONS.ADDON_EXPERIMENTAL] === 'true'; diff --git a/pkg/harvester/models/harvesterhci.io.blockdevice.js b/pkg/harvester/models/harvesterhci.io.blockdevice.js index 06078faf692..c22912ee863 100644 --- a/pkg/harvester/models/harvesterhci.io.blockdevice.js +++ b/pkg/harvester/models/harvesterhci.io.blockdevice.js @@ -15,7 +15,11 @@ export default class HciBlockDevice extends HarvesterResource { } get isChildPartProvisioned() { +<<<<<<< HEAD const parts = this.childParts.filter(p => p.spec?.fileSystem?.provisioned) || []; +======= + const parts = this.childParts.filter(p => p.isProvisioned) || []; +>>>>>>> b5455bcb (fix: separate used/allocated units) return parts.length > 0; } @@ -59,4 +63,12 @@ export default class HciBlockDevice extends HarvesterResource { return formatting.status === 'True'; } +<<<<<<< HEAD +======= + + get isProvisioned() { + // spec.fileSystem.provisioned is deprecated + return this.spec?.fileSystem?.provisioned || this.spec?.provision; + } +>>>>>>> b5455bcb (fix: separate used/allocated units) } diff --git a/pkg/harvester/models/harvesterhci.io.schedulevmbackup.js b/pkg/harvester/models/harvesterhci.io.schedulevmbackup.js new file mode 100644 index 00000000000..13a2f566100 --- /dev/null +++ b/pkg/harvester/models/harvesterhci.io.schedulevmbackup.js @@ -0,0 +1,97 @@ +import HarvesterResource from './harvester'; +import { get } from '@shell/utils/object'; +import { findBy } from '@shell/utils/array'; +import { colorForState, stateDisplay, STATES } from '@shell/plugins/dashboard-store/resource-class'; +import { _CREATE } from '@shell/config/query-params'; +import { ucFirst, escapeHtml } from '@shell/utils/string'; + +export default class ScheduleVmBackup extends HarvesterResource { + detailPageHeaderActionOverride(realMode) { + if (realMode === _CREATE) { + return this.t('harvester.schedule.createTitle'); + } + } + + get _availableActions() { + const toFilter = ['goToClone']; + + const out = super._availableActions.filter((action) => { + if (!toFilter.includes(action.action)) { + return action; + } + }); + + return [ + { + action: 'resumeSchedule', + enabled: ucFirst(this.state) === STATES.suspended.label, + icon: 'icons icon-play', + label: this.t('harvester.action.resumeSchedule'), + }, + { + action: 'suspendSchedule', + enabled: ucFirst(this.state) === STATES.active.label, + icon: 'icons icon-pause', + label: this.t('harvester.action.suspendSchedule'), + }, + ...out + ]; + } + + async suspendSchedule() { + try { + this.spec.suspend = true; // suspend schedule + await this.save(); + } catch (err) { + this.spec.suspend = false; + + this.$dispatch('growl/fromError', { + title: this.t('generic.notification.title.error', { name: escapeHtml(this.metadata.name) }), + err, + }, { root: true }); + } + } + + async resumeSchedule() { + try { + this.spec.suspend = false; // resume schedule + await this.save(); + } catch (err) { + this.spec.suspend = true; + + this.$dispatch('growl/fromError', { + title: this.t('generic.notification.title.error', { name: escapeHtml(this.metadata.name) }), + err, + }, { root: true }); + } + } + + get state() { + const conditions = get(this, 'status.conditions'); + const isSuspended = findBy(conditions, 'type', 'BackupSuspend')?.status === 'True'; + + if (isSuspended) { + return STATES.suspended.label; + } + + return this.metadata.state.name; + } + + get stateDescription() { + const suspendedCondition = (this.status?.conditions || []).find(c => c.type === 'BackupSuspend'); + + return ucFirst(suspendedCondition?.message) || super.stateDescription; + } + + get stateBackground() { + return colorForState(this.stateDisplay).replace('text-', 'bg-'); + } + + get stateColor() { + return colorForState(this.state); + } + + get stateDisplay() { + return stateDisplay(this.state); + } +} diff --git a/pkg/harvester/models/harvesterhci.io.virtualmachinebackup.js b/pkg/harvester/models/harvesterhci.io.virtualmachinebackup.js index 8857f1352e9..0b44939368a 100644 --- a/pkg/harvester/models/harvesterhci.io.virtualmachinebackup.js +++ b/pkg/harvester/models/harvesterhci.io.virtualmachinebackup.js @@ -2,6 +2,10 @@ import { HCI } from '../types'; import { get, clone } from '@shell/utils/object'; import { findBy } from '@shell/utils/array'; import { colorForState } from '@shell/plugins/dashboard-store/resource-class'; +<<<<<<< HEAD +======= +import { HCI as HCI_ANNOTATIONS } from '@pkg/harvester/config/labels-annotations'; +>>>>>>> b5455bcb (fix: separate used/allocated units) import { _CREATE } from '@shell/config/query-params'; import HarvesterResource from './harvester'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../config/harvester'; @@ -18,9 +22,14 @@ export default class HciVmBackup extends HarvesterResource { get detailLocation() { const detailLocation = clone(this._detailLocation); +<<<<<<< HEAD const route = this.currentRoute(); detailLocation.params.resource = route.params.resource; +======= + + detailLocation.params.resource = HCI.BACKUP; +>>>>>>> b5455bcb (fix: separate used/allocated units) return detailLocation; } @@ -81,6 +90,7 @@ export default class HciVmBackup extends HarvesterResource { } restoreExistingVM(resource = this) { +<<<<<<< HEAD const route = this.currentRoute(); const router = this.currentRouter(); @@ -88,10 +98,23 @@ export default class HciVmBackup extends HarvesterResource { name: `${ HARVESTER_PRODUCT }-c-cluster-resource-create`, params: { resource: route.params.resource }, query: { restoreMode: 'existing', resourceName: resource.name } +======= + const router = this.currentRouter(); + const targetResource = resource.spec.type === BACKUP_TYPE.BACKUP ? HCI.BACKUP : HCI.VM_SNAPSHOT; + + router.push({ + name: `${ HARVESTER_PRODUCT }-c-cluster-resource-create`, + params: { resource: targetResource }, + query: { + restoreMode: 'existing', + resourceName: resource.name, + } +>>>>>>> b5455bcb (fix: separate used/allocated units) }); } restoreNewVM(resource = this) { +<<<<<<< HEAD const route = this.currentRoute(); const router = this.currentRouter(); @@ -99,6 +122,18 @@ export default class HciVmBackup extends HarvesterResource { name: `${ HARVESTER_PRODUCT }-c-cluster-resource-create`, params: { resource: route.params.resource }, query: { restoreMode: 'new', resourceName: resource.name } +======= + const router = this.currentRouter(); + const targetResource = resource.spec.type === BACKUP_TYPE.BACKUP ? HCI.BACKUP : HCI.VM_SNAPSHOT; + + router.push({ + name: `${ HARVESTER_PRODUCT }-c-cluster-resource-create`, + params: { resource: targetResource }, + query: { + restoreMode: 'new', + resourceName: resource.name, + } +>>>>>>> b5455bcb (fix: separate used/allocated units) }); } @@ -125,6 +160,13 @@ export default class HciVmBackup extends HarvesterResource { return colorForState(state); } +<<<<<<< HEAD +======= + get sourceSchedule() { + return this.metadata?.annotations[HCI_ANNOTATIONS.SVM_BACKUP_ID]; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get attachVM() { return this.spec.source.name; } diff --git a/pkg/harvester/models/harvesterhci.io.virtualmachineimage.js b/pkg/harvester/models/harvesterhci.io.virtualmachineimage.js index a3067801641..03a33364e89 100644 --- a/pkg/harvester/models/harvesterhci.io.virtualmachineimage.js +++ b/pkg/harvester/models/harvesterhci.io.virtualmachineimage.js @@ -12,6 +12,15 @@ import { stateDisplay, colorForState } from '@shell/plugins/dashboard-store/reso import { _CLONE } from '@shell/config/query-params'; import HarvesterResource from './harvester'; import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../config/harvester'; +<<<<<<< HEAD +======= +import { CSI_SECRETS } from '@pkg/harvester/config/harvester-map'; + +const { + CSI_PROVISIONER_SECRET_NAME, + CSI_PROVISIONER_SECRET_NAMESPACE, +} = CSI_SECRETS; +>>>>>>> b5455bcb (fix: separate used/allocated units) function isReady() { function getStatusConditionOfType(type, defaultValue = []) { @@ -53,6 +62,23 @@ export default class HciVmImage extends HarvesterResource { disabled: !this.isReady, }, { +<<<<<<< HEAD +======= + action: 'encryptImage', + enabled: !this.isEncrypted, + icon: 'icon icon-lock', + label: this.t('harvester.action.encryptImage'), + disabled: !this.isReady, + }, + { + action: 'decryptImage', + enabled: this.isEncrypted, + icon: 'icon icon-unlock', + label: this.t('harvester.action.decryptImage'), + disabled: !this.isReady, + }, + { +>>>>>>> b5455bcb (fix: separate used/allocated units) action: 'download', enabled: this.links?.download, icon: 'icon icon-download', @@ -62,6 +88,39 @@ export default class HciVmImage extends HarvesterResource { ]; } +<<<<<<< HEAD +======= + encryptImage() { + const router = this.currentRouter(); + + router.push({ + name: `${ HARVESTER_PRODUCT }-c-cluster-resource-create`, + params: { resource: HCI.IMAGE }, + query: { + image: this, + fromPage: HCI.IMAGE, + sourceType: 'clone', + cryptoOperation: 'encrypt' + } + }); + } + + decryptImage() { + const router = this.currentRouter(); + + router.push({ + name: `${ HARVESTER_PRODUCT }-c-cluster-resource-create`, + params: { resource: HCI.IMAGE }, + query: { + image: this, + fromPage: HCI.IMAGE, + sourceType: 'clone', + cryptoOperation: 'decrypt' + } + }); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) applyDefaults(resources = this, realMode) { if (realMode !== _CLONE) { Vue.set(this.metadata, 'labels', { [HCI_ANNOTATIONS.OS_TYPE]: '', [HCI_ANNOTATIONS.IMAGE_SUFFIX]: '' }); @@ -102,6 +161,13 @@ export default class HciVmImage extends HarvesterResource { const imported = this.getStatusConditionOfType('Imported'); if (imported?.status === 'Unknown') { +<<<<<<< HEAD +======= + if (this.spec.sourceType === 'restore') { + return 'Restoring'; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) if (this.spec.sourceType === 'download') { return 'Downloading'; } @@ -124,6 +190,31 @@ export default class HciVmImage extends HarvesterResource { return stateDisplay(this.metadata.state.name); } +<<<<<<< HEAD +======= + get encryptionSecret() { + const secretNS = this.spec.storageClassParameters[CSI_PROVISIONER_SECRET_NAMESPACE]; + const secretName = this.spec.storageClassParameters[CSI_PROVISIONER_SECRET_NAME]; + + if (secretNS && secretName) { + return `${ secretNS }/${ secretName }`; + } + + return ''; + } + + get isEncrypted() { + return this.spec.sourceType === 'clone' && + this.spec.securityParameters?.cryptoOperation === 'encrypt' && + !!this.spec.securityParameters?.sourceImageName && + !!this.spec.securityParameters?.sourceImageNamespace; + } + + get displayNameWithNamespace() { + return `${ this.metadata.namespace }/${ this.spec.displayName }`; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get imageMessage() { if (this.uploadError) { return ucFirst(this.uploadError); @@ -169,6 +260,24 @@ export default class HciVmImage extends HarvesterResource { }); } +<<<<<<< HEAD +======= + get virtualSize() { + const virtualSize = this.status?.virtualSize; + + if (!virtualSize) { + return '-'; + } + + return formatSi(virtualSize, { + increment: 1024, + maxPrecision: 2, + suffix: 'B', + firstSuffix: 'B', + }); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) getStatusConditionOfType(type, defaultValue = []) { const conditions = Array.isArray(get(this, 'status.conditions')) ? this.status.conditions : defaultValue; diff --git a/pkg/harvester/models/kubevirt.io.virtualmachine.js b/pkg/harvester/models/kubevirt.io.virtualmachine.js index 9c24ab88bab..7b11544acf8 100644 --- a/pkg/harvester/models/kubevirt.io.virtualmachine.js +++ b/pkg/harvester/models/kubevirt.io.virtualmachine.js @@ -1,7 +1,11 @@ import Vue from 'vue'; import { load } from 'js-yaml'; import { omitBy, pickBy } from 'lodash'; +<<<<<<< HEAD +======= +import { PRODUCT_NAME as HARVESTER_PRODUCT } from '../config/harvester'; +>>>>>>> b5455bcb (fix: separate used/allocated units) import { colorForState } from '@shell/plugins/dashboard-store/resource-class'; import { POD, NODE, PVC } from '@shell/config/types'; import { HCI } from '../types'; @@ -134,7 +138,11 @@ export default class VirtVm extends HarvesterResource { { action: 'softrebootVM', enabled: !!this.actions?.softreboot, +<<<<<<< HEAD icon: 'icon icon-refresh', +======= + icon: 'icon icon-pipeline', +>>>>>>> b5455bcb (fix: separate used/allocated units) label: this.t('harvester.action.softreboot') }, { @@ -153,10 +161,29 @@ export default class VirtVm extends HarvesterResource { { action: 'takeVMSnapshot', enabled: !!this.actions?.backup, +<<<<<<< HEAD icon: 'icon icon-backup', label: this.t('harvester.action.vmSnapshot') }, { +======= + icon: 'icon icon-snapshot', + label: this.t('harvester.action.vmSnapshot') + }, + { + action: 'editVMQuota', + enabled: !!this.actions?.updateResourceQuota && !!this.actions.deleteResourceQuota, + icon: 'icon icon-storage', + label: this.t('harvester.action.editVMQuota') + }, + { + action: 'createSchedule', + enabled: true, + icon: 'icon icon-history', + label: this.t('harvester.action.createSchedule') + }, + { +>>>>>>> b5455bcb (fix: separate used/allocated units) action: 'restoreVM', enabled: !!this.actions?.restore, icon: 'icon icon-backup-restore', @@ -318,6 +345,19 @@ export default class VirtVm extends HarvesterResource { ); } +<<<<<<< HEAD +======= + createSchedule(resources = this) { + const router = this.currentRouter(); + + router.push({ + name: `${ HARVESTER_PRODUCT }-c-cluster-resource-create`, + params: { resource: HCI.SCHEDULE_VM_BACKUP }, + query: { vmNamespace: this.metadata.namespace, vmName: this.metadata.name } + }); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) backupVM(resources = this) { this.$dispatch('promptModal', { resources, @@ -332,6 +372,17 @@ export default class VirtVm extends HarvesterResource { }); } +<<<<<<< HEAD +======= + editVMQuota(resources = this) { + this.$dispatch('promptModal', { + resources, + snapshotSizeQuota: this.snapshotSizeQuota, + component: 'HarvesterQuotaDialog' + }); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) unplugVolume(diskName) { const resources = this; @@ -446,6 +497,13 @@ export default class VirtVm extends HarvesterResource { return null; } +<<<<<<< HEAD +======= + get isCpuPinning() { + return this.spec?.template?.spec?.domain?.cpu?.dedicatedCpuPlacement === true; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get isVMExpectedRunning() { if (!this?.spec) { return false; @@ -542,6 +600,20 @@ export default class VirtVm extends HarvesterResource { return null; } +<<<<<<< HEAD +======= + get nsResourceQuota() { + const inStore = this.productInStore; + const allResQuotas = this.$rootGetters[`${ inStore }/all`](HCI.RESOURCE_QUOTA); + + return allResQuotas.find( RQ => RQ.namespace === this.metadata.namespace); + } + + get snapshotSizeQuota() { + return this.nsResourceQuota?.spec?.snapshotLimit?.vmTotalSnapshotSizeQuota?.[this.metadata.name]; + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get vmi() { const inStore = this.productInStore; @@ -550,6 +622,35 @@ export default class VirtVm extends HarvesterResource { return vmis.find(VMI => VMI.id === this.id); } +<<<<<<< HEAD +======= + get volumes() { + const pvcs = this.$rootGetters[`${ this.productInStore }/all`](PVC); + + const volumeClaimNames = this.spec.template.spec.volumes?.map(v => v.persistentVolumeClaim?.claimName).filter(v => !!v) || []; + + return pvcs.filter(pvc => volumeClaimNames.includes(pvc.metadata.name)); + } + + get lvmVolumes() { + return this.volumes.filter(volume => volume?.isLvm); + } + + get longhornV2Volumes() { + return this.volumes.filter(volume => volume?.isLonghornV2); + } + + get encryptedVolumeType() { + if (this.volumes.every(vol => vol.isEncrypted)) { + return 'all'; + } else if (this.volumes.some(vol => vol.isEncrypted)) { + return 'partial'; + } else { + return 'none'; + } + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) get isError() { const conditions = get(this.vmi, 'status.conditions'); const vmiFailureCond = findBy(conditions, 'type', 'Failure'); diff --git a/pkg/harvester/package.json b/pkg/harvester/package.json index f6feed55443..0ebda8ef123 100644 --- a/pkg/harvester/package.json +++ b/pkg/harvester/package.json @@ -1,7 +1,11 @@ { "name": "harvester", "description": "Cloud-Native Hyperconverged Infrastructure", +<<<<<<< HEAD "version": "1.2.0", +======= + "version": "1.4.0", +>>>>>>> b5455bcb (fix: separate used/allocated units) "private": false, "rancher": true, "license": "Apache-2.0", diff --git a/pkg/harvester/pages/c/_cluster/support/index.vue b/pkg/harvester/pages/c/_cluster/support/index.vue index 90e6bc037be..a31866c376a 100644 --- a/pkg/harvester/pages/c/_cluster/support/index.vue +++ b/pkg/harvester/pages/c/_cluster/support/index.vue @@ -7,6 +7,10 @@ import HarvesterSupportBundle from '../../../../dialog/HarvesterSupportBundle'; import CommunityLinks from '@shell/components/CommunityLinks'; import { SCHEMA } from '@shell/config/types'; import { HCI } from '../../../../types'; +<<<<<<< HEAD +======= +import { DOC_LINKS } from '../../../../config/doc-links'; +>>>>>>> b5455bcb (fix: separate used/allocated units) export default { layout: 'default', @@ -73,13 +77,26 @@ export default { const { host, params } = this.internalPrefix; return `https://${ host }/k8s/clusters/${ params.cluster }/api/v1/namespaces/longhorn-system/services/http:longhorn-frontend:80/proxy/#/dashboard`; +<<<<<<< HEAD } +======= + }, + + rancherIntegrationLink() { + return DOC_LINKS.RANCHER_INTEGRATION_URL; + }, +>>>>>>> b5455bcb (fix: separate used/allocated units) }, methods: { open() { this.$store.commit('harvester-common/toggleBundleModal', true); +<<<<<<< HEAD } +======= + }, + +>>>>>>> b5455bcb (fix: separate used/allocated units) } }; @@ -132,7 +149,11 @@ export default {

+<<<<<<< HEAD +======= + +>>>>>>> b5455bcb (fix: separate used/allocated units)

diff --git a/pkg/harvester/store/harvester-store/actions.ts b/pkg/harvester/store/harvester-store/actions.ts index cadd41398a6..9544e7b4b11 100644 --- a/pkg/harvester/store/harvester-store/actions.ts +++ b/pkg/harvester/store/harvester-store/actions.ts @@ -90,6 +90,13 @@ export default { }, { root: true }), }; +<<<<<<< HEAD +======= + if (getters['schemaFor'](HCI.RESOURCE_QUOTA)) { + hash.resourceQuota = dispatch('findAll', { type: HCI.RESOURCE_QUOTA }); + } + +>>>>>>> b5455bcb (fix: separate used/allocated units) if (getters['schemaFor'](HCI.UPGRADE)) { hash.upgrades = dispatch('findAll', { type: HCI.UPGRADE }); } @@ -101,6 +108,10 @@ export default { commit('updateNamespaces', { filters: [], all: getters.filterNamespace(), +<<<<<<< HEAD +======= + getters +>>>>>>> b5455bcb (fix: separate used/allocated units) }, { root: true }); // Solve compatibility with Rancher v2.6.x, fell remove these codes after not support v2.6.x diff --git a/pkg/harvester/types.ts b/pkg/harvester/types.ts index 6638cacc77d..45a34147699 100644 --- a/pkg/harvester/types.ts +++ b/pkg/harvester/types.ts @@ -11,6 +11,10 @@ export const HCI = { SETTING: 'harvesterhci.io.setting', UPGRADE: 'harvesterhci.io.upgrade', UPGRADE_LOG: 'harvesterhci.io.upgradelog', +<<<<<<< HEAD +======= + SCHEDULE_VM_BACKUP: 'harvesterhci.io.schedulevmbackup', +>>>>>>> b5455bcb (fix: separate used/allocated units) BACKUP: 'harvesterhci.io.virtualmachinebackup', RESTORE: 'harvesterhci.io.virtualmachinerestore', NODE_NETWORK: 'network.harvesterhci.io.nodenetwork', @@ -31,12 +35,21 @@ export const HCI = { FLOW: 'harvesterhci.io.logging.flow', OUTPUT: 'harvesterhci.io.logging.output', STORAGE: 'harvesterhci.io.storage', +<<<<<<< HEAD +======= + RESOURCE_QUOTA: 'harvesterhci.io.resourcequota', +>>>>>>> b5455bcb (fix: separate used/allocated units) KSTUNED: 'node.harvesterhci.io.ksmtuned', PCI_DEVICE: 'devices.harvesterhci.io.pcidevice', PCI_CLAIM: 'devices.harvesterhci.io.pcideviceclaim', SR_IOV: 'devices.harvesterhci.io.sriovnetworkdevice', VGPU_DEVICE: 'devices.harvesterhci.io.vgpudevice', SR_IOVGPU_DEVICE: 'devices.harvesterhci.io.sriovgpudevice', +<<<<<<< HEAD +======= + USB_DEVICE: 'devices.harvesterhci.io.usbdevice', + USB_CLAIM: 'devices.harvesterhci.io.usbdeviceclaim', +>>>>>>> b5455bcb (fix: separate used/allocated units) VLAN_CONFIG: 'network.harvesterhci.io.vlanconfig', VLAN_STATUS: 'network.harvesterhci.io.vlanstatus', ADD_ONS: 'harvesterhci.io.addon', @@ -46,6 +59,10 @@ export const HCI = { LB: 'loadbalancer.harvesterhci.io.loadbalancer', IP_POOL: 'loadbalancer.harvesterhci.io.ippool', HARVESTER_CONFIG: 'rke-machine-config.cattle.io.harvesterconfig', +<<<<<<< HEAD +======= + LVM_VOLUME_GROUP: 'harvesterhci.io.lvmvolumegroup' +>>>>>>> b5455bcb (fix: separate used/allocated units) }; export const VOLUME_SNAPSHOT = 'snapshot.storage.k8s.io.volumesnapshot'; diff --git a/pkg/harvester/utils/cron.js b/pkg/harvester/utils/cron.js new file mode 100644 index 00000000000..67f883cd143 --- /dev/null +++ b/pkg/harvester/utils/cron.js @@ -0,0 +1,11 @@ +import cronstrue from 'cronstrue'; + +export function isCronValid(schedule = '') { + try { + const hint = cronstrue.toString(schedule); + + return !!hint; + } catch (e) { + return false; + } +} diff --git a/pkg/harvester/validators/vm.js b/pkg/harvester/validators/vm.js index c1ded608ea0..19e5939ce57 100644 --- a/pkg/harvester/validators/vm.js +++ b/pkg/harvester/validators/vm.js @@ -87,7 +87,11 @@ export function vmDisks(spec, getters, errors, validatorArgs, displayKey, value) errors.push(getters['i18n/t']('harvester.validation.generic.tabError', { prefix, message })); } +<<<<<<< HEAD if (typeValue?.spec?.resources?.requests?.storage && !/^([1-9][0-9]{0,8})[a-zA-Z]+$/.test(typeValue?.spec?.resources?.requests?.storage)) { +======= + if (typeValue?.spec?.resources?.requests?.storage && !/^([0-9][0-9]{0,8})[a-zA-Z]+$/.test(typeValue?.spec?.resources?.requests?.storage)) { +>>>>>>> b5455bcb (fix: separate used/allocated units) const message = getters['i18n/t']('harvester.validation.generic.maximumSize', { max: '999999999 GiB' }); errors.push(getters['i18n/t']('harvester.validation.generic.tabError', { prefix, message })); diff --git a/pkg/harvester/validators/volume.js b/pkg/harvester/validators/volume.js index 24c885bf830..5a64d3a65a8 100644 --- a/pkg/harvester/validators/volume.js +++ b/pkg/harvester/validators/volume.js @@ -1,5 +1,15 @@ export function volumeSize(size, getters, errors, validatorArgs, displayKey, value) { +<<<<<<< HEAD if (!/^([1-9][0-9]{0,8})[a-zA-Z]+$/.test(size)) { +======= + if (!size) { + const key = getters['i18n/t']('harvester.volume.size'); + + errors.push(getters['i18n/t']('validation.required', { key })); + } + + if (size && !/^([0-9][0-9]{0,8})[a-zA-Z]+$/.test(size)) { +>>>>>>> b5455bcb (fix: separate used/allocated units) const message = getters['i18n/t']('harvester.validation.generic.maximumSize', { max: '999999999 GiB' }); errors.push(message); diff --git a/pkg/rancher-components/package.json b/pkg/rancher-components/package.json index d31e73d2955..56767fc5832 100644 --- a/pkg/rancher-components/package.json +++ b/pkg/rancher-components/package.json @@ -32,8 +32,13 @@ "@vue/test-utils": "1.2.1", "babel-eslint": "10.1.0", "core-js": "3.25.3", +<<<<<<< HEAD "cron-validator": "1.2.0", "cronstrue": "1.95.0", +======= + "cron-validator": "1.3.1", + "cronstrue": "2.50.0", +>>>>>>> b5455bcb (fix: separate used/allocated units) "eslint": "7.32.0", "eslint-plugin-import": "2.23.4", "eslint-plugin-node": "11.1.0", diff --git a/pkg/rancher-components/src/components/Form/LabeledInput/LabeledInput.vue b/pkg/rancher-components/src/components/Form/LabeledInput/LabeledInput.vue index c4bd59177ac..f2223499bd8 100644 --- a/pkg/rancher-components/src/components/Form/LabeledInput/LabeledInput.vue +++ b/pkg/rancher-components/src/components/Form/LabeledInput/LabeledInput.vue @@ -144,11 +144,24 @@ export default ( if (this.type !== 'cron' || !this.value) { return; } +<<<<<<< HEAD if (!isValidCron(this.value)) { return this.t('generic.invalidCron'); } try { const hint = cronstrue.toString(this.value); +======= + // refer https://github.com/GuillaumeRochat/cron-validator#readme + if (!isValidCron(this.value, { + alias: true, + allowBlankDay: true, + allowSevenAsSunday: true, + })) { + return this.t('generic.invalidCron'); + } + try { + const hint = cronstrue.toString(this.value, { verbose: true }); +>>>>>>> b5455bcb (fix: separate used/allocated units) return hint; } catch (e) { diff --git a/shell/assets/translations/en-us.yaml b/shell/assets/translations/en-us.yaml index 3badc7a46e3..c37852b93fa 100644 --- a/shell/assets/translations/en-us.yaml +++ b/shell/assets/translations/en-us.yaml @@ -101,7 +101,11 @@ generic: deprecated: Deprecated placeholder: "e.g. {text}" +<<<<<<< HEAD moreInfo: More Info +======= + moreInfo: More Information +>>>>>>> b5455bcb (fix: separate used/allocated units) selectors: label: Selector matchingResources: @@ -195,7 +199,11 @@ nav: restoreCards: Restore hidden cards userMenu: preferences: Preferences +<<<<<<< HEAD accountAndKeys: Account & API Keys +======= + accountAndKeys: Account and API Keys +>>>>>>> b5455bcb (fix: separate used/allocated units) logOut: Log Out failWhale: reload: Reload @@ -203,7 +211,11 @@ nav: product: apps: Apps +<<<<<<< HEAD auth: Users & Authentication +======= + auth: Users and Authentication +>>>>>>> b5455bcb (fix: separate used/allocated units) backup: Rancher Backups cis: CIS Benchmark ecm: Cluster Manager @@ -337,17 +349,29 @@ accountAndKeys: accessKey: Access Key secretKey: Secret Key bearerToken: Bearer Token +<<<<<<< HEAD saveWarning: Save the info above! This is the only time you'll be able to see it. If you lose it, you'll need to create a new API key. keyCreated: A new API Key has been created bearerTokenTip: "Access Key and Secret Key can be sent as the username and password for HTTP Basic auth to authorize requests. You can also combine them to use as a Bearer token:" ttlLimitedWarning: The Expiry time for this API Key was reduced due to system configuration +======= + saveWarning: Save the above information! This is the only time you will be able to see it. If you lose it, you will need to create a new API key. + keyCreated: A new API key has been created + bearerTokenTip: "Access Key and Secret Key can be sent as the username and password for HTTP basic authentication to authorize requests. You can also combine them to use as a Bearer token:" + ttlLimitedWarning: The Expiry time for this API key was reduced due to system configuration +>>>>>>> b5455bcb (fix: separate used/allocated units) addClusterMemberDialog: title: Add Cluster Member addonConfigConfirmation: +<<<<<<< HEAD title: Add-On Config Reset body: Changing the Kubernetes Version can reset the Add-On Config values. You should check that the values are as expected before continuing. +======= + title: Add-on Configuration Reset + body: Changing the Kubernetes Version can reset the add-on configuration values. Confirm that the values are as expected before continuing. +>>>>>>> b5455bcb (fix: separate used/allocated units) addProjectMemberDialog: title: Add Project Member @@ -355,11 +379,19 @@ addProjectMemberDialog: authConfig: accessMode: label: 'Configure who should be able to login and use {vendor}' +<<<<<<< HEAD required: Restrict access to only the authorized users & groups restricted: 'Allow members of clusters and projects, plus authorized users & groups' unrestricted: Allow any valid user allowedPrincipalIds: title: Authorized Users & Groups +======= + required: Restrict access to only the authorized users and groups + restricted: 'Allow members of clusters and projects, plus authorized users and groups' + unrestricted: Allow any valid user + allowedPrincipalIds: + title: Authorized Users and Groups +>>>>>>> b5455bcb (fix: separate used/allocated units) associatedWarning: 'Note: The {provider} user you authenticate as will be associated as an alternate way to login to the {vendor} user you are currently logged in as {username}; all the global permissions, project, and cluster role bindings of this {vendor} user will also apply to the {provider} user.' github: clientId: @@ -384,7 +416,11 @@ authConfig: 3:
  • Click the "New OAuth App" button.
  • suffix: 1:
  • Click "Register application"
  • +<<<<<<< HEAD 2:
  • Copy and paste the Client ID and Client Secret of your newly created OAuth app into the fields below
  • +======= + 2:
  • Copy and paste the client ID and client secret of your newly created OAuth app into the fields below
  • +>>>>>>> b5455bcb (fix: separate used/allocated units) host: label: GitHub Enterprise Host placeholder: e.g. github.mycompany.example @@ -408,7 +444,11 @@ authConfig: 1: title: 'Click here to open applications settings in a new window' body: +<<<<<<< HEAD 1: Login to your account. Navigate to "APIs & Services" and then select "OAuth consent screen". +======= + 1: Login to your account. Navigate to "APIs and Services" and then select "OAuth consent screen". +>>>>>>> b5455bcb (fix: separate used/allocated units) 2: 'Authorized domains:' 3: 'Application homepage link: ' 4: 'Under Scopes for Google APIs, enable "email", "profile", and "openid".' @@ -417,7 +457,11 @@ authConfig: 2: title: 'Navigate to the "Credentials" tab to create your OAuth client ID' body: +<<<<<<< HEAD 1: 'Select the "Create Credentials" dropdown, and select "OAuth clientID", then select "Web application".' +======= + 1: 'Select the "Create Credentials" drop-down, and select "OAuth clientID", then select "Web application".' +>>>>>>> b5455bcb (fix: separate used/allocated units) 2: 'Authorized Javascript origins:' 3: 'Authorized redirect URIs:' 4: 'Click "Create", and then click on the "Download JSON" button.' @@ -428,14 +472,22 @@ authConfig: body: 1: Create a service account. 2: Generate a key for the service account. +<<<<<<< HEAD 3: Add the service account as an OAuth client in your google domain. +======= + 3: Add the service account as an OAuth client in your Google domain. +>>>>>>> b5455bcb (fix: separate used/allocated units) ldap: freeipa: Configure a FreeIPA server activedirectory: Configure an Active Directory account openldap: Configure an OpenLDAP server defaultLoginDomain: label: Default Login Domain +<<<<<<< HEAD placeholder: eg mycompany +======= + placeholder: eg, mycompany +>>>>>>> b5455bcb (fix: separate used/allocated units) hint: This domain will be used if a user logs in without specifying one. cert: Certificate disabledStatusBitmask: Disabled Status Bitmask @@ -728,7 +780,11 @@ backupRestoreOperator: backupFilename: Backup Filename deleteTimeout: label: Delete Timeout +<<<<<<< HEAD tip: Seconds to wait for a resource delete to succeed before removing finalizers to force deletion. +======= + tip: Seconds to wait for a resource deletion to succeed before removing finalizers to force deletion. +>>>>>>> b5455bcb (fix: separate used/allocated units) deployment: rancherNamespace: Rancher ResourceSet Namespace size: Size @@ -745,6 +801,7 @@ backupRestoreOperator: storageClass: label: Storage Class tip: 'Configure a storage location where all backups are saved by default. You will have the option to override this with each backup, but will be limited to using an S3-compatible object store.' +<<<<<<< HEAD warning: 'This {type} does not have its reclaim policy set to "Retain". Your backups may be lost if the volume is changed or becomes unbound.' encryption: Encryption encryptionConfigName: @@ -753,6 +810,16 @@ backupRestoreOperator: options: none: Store the contents of the backup unencrypted secret: 'Encrypt backups using an Encryption Config Secret (Recommended)' +======= + warning: 'This {type} does not have its reclaim policy set to "Retain". Your backups may be lost if the volume is changed or becomes unbound.' + encryption: Encryption + encryptionConfigName: + backuptip: 'Any secret in the cattle-resource-system namespace that has an encryption-provider-config.yaml key.
    The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup.' + label: Encryption Configuration Secret + options: + none: Store the contents of the backup unencrypted + secret: 'Encrypt backups using an Encryption Configuration Secret (Recommended)' +>>>>>>> b5455bcb (fix: separate used/allocated units) restoretip: 'If the backup was performed with encryption enabled, a secret containing the same encryption-provider-config should be used during restore.' warning: 'The contents of this file are necessary to perform a restore from this backup, and are not stored by Rancher Backup.' lastBackup: Last Backup @@ -852,9 +919,15 @@ catalog: versionWindowsIncompatible: Linux only version header: Charts featuredCharts: Featured Charts +<<<<<<< HEAD noCharts: 'There are no charts available, have you added any repos?' noWindows: Your repos do not contain any charts capable of being deployed on a cluster with Windows nodes. noWindowsAndLinux: Your repos do not contain any charts capable of being deployed on a cluster with both Windows and Linux worker nodes. +======= + noCharts: 'There are no charts available, have you added any repositories?' + noWindows: Your repositories do not contain any charts capable of being deployed on a cluster with Windows nodes. + noWindowsAndLinux: Your repositories do not contain any charts capable of being deployed on a cluster with both Windows and Linux worker nodes. +>>>>>>> b5455bcb (fix: separate used/allocated units) operatingSystems: all: All Operating Systems linux: Linux @@ -863,7 +936,11 @@ catalog: install: action: goToUpgrade: Edit/Upgrade +<<<<<<< HEAD appReadmeMissing: This chart doesn't have any additional chart information. +======= + appReadmeMissing: This chart does not have any additional chart information. +>>>>>>> b5455bcb (fix: separate used/allocated units) appReadmeTitle: Chart Information (Helm README) chart: Chart error: @@ -872,12 +949,21 @@ catalog: insufficientCpu: 'This chart requires {need, number} CPU cores, but the cluster only has {have, number} available.' insufficientMemory: 'This chart requires {need} of memory, but the cluster only has {have} available.' legacy: +<<<<<<< HEAD label: This is a {legacyType} App and it cannot be modified here enableLegacy: prompt: You will need to enable Legacy Features to edit this App goto: Go to Feature Flag settings navigate: Navigate to Legacy Apps mcmNotSupported: Legacy Multi-cluster Apps can not be managed through this UI +======= + label: This is a {legacyType} application and it cannot be modified here + enableLegacy: + prompt: You will need to enable Legacy Features to edit this application + goto: Go to Feature Flag settings + navigate: Navigate to Legacy Applications + mcmNotSupported: Legacy Multi-cluster Applications can not be managed through this UI +>>>>>>> b5455bcb (fix: separate used/allocated units) category: legacy: Legacy mcm: Multi-cluster @@ -889,8 +975,13 @@ catalog: atomic: Atomic description: label: Description +<<<<<<< HEAD placeholder: e.g. Purpose of helm command cleanupOnFail: Cleanup on Failure +======= + placeholder: e.g. Purpose of Helm command + cleanupOnFail: Clean up on Failure +>>>>>>> b5455bcb (fix: separate used/allocated units) crds: Apply custom resource definitions dryRun: Dry Run force: Force @@ -913,7 +1004,11 @@ catalog: } wait: Wait namespaceIsInProject: "This chart's target namespace, {namespace}, already exists and cannot be added to a different project." +<<<<<<< HEAD project: Install into Project +======= + project: Install Into Project +>>>>>>> b5455bcb (fix: separate used/allocated units) section: chartOptions: Edit Options valuesYaml: Edit YAML @@ -931,8 +1026,13 @@ catalog: } the {existing, select, true { app} false { chart} +<<<<<<< HEAD }. Start by setting some basic information used by {vendor} to manage the App. nsCreationDescription: "To install the app into a new namespace enter it's name in the Namespace field and select it." +======= + }. Start by setting some basic information used by {vendor} to manage the application. + nsCreationDescription: "To install the application into a new namespace, enter the name in the Namespace field and select it." +>>>>>>> b5455bcb (fix: separate used/allocated units) createNamespace: "Namespace {namespace} will be created." clusterTplVersion: label: Version @@ -940,6 +1040,7 @@ catalog: description: Select a version of the Cluster Template clusterTplValues: label: Values +<<<<<<< HEAD subtext: Change how the Cluster is defined description: Configure Values used by Helm that help define the Cluster. helmValues: @@ -953,6 +1054,21 @@ catalog: checkbox: Customize Helm options before install label: Helm Options subtext: Change how the app is deployed +======= + subtext: Change how the cluster is defined + description: Configure Values used by Helm that help define the cluster. + helmValues: + label: Values + subtext: Change how the application works + description: Configure values used by Helm that help define the application. + chartInfo: + button: View Chart Information + label: Chart Information + helmCli: + checkbox: Customize Helm options before installation + label: Helm Options + subtext: Change how the application is deployed +>>>>>>> b5455bcb (fix: separate used/allocated units) description: Supply additional deployment options version: Version versions: @@ -971,7 +1087,11 @@ catalog: gitBranch: label: Git Branch placeholder: e.g. master +<<<<<<< HEAD defaultMessage: 'Will default to "master" if left blank' +======= + defaultMessage: 'The branch will default to "master" if left blank' +>>>>>>> b5455bcb (fix: separate used/allocated units) gitRepo: label: Git Repo URL placeholder: 'e.g. https://github.com/your-company/charts.git' @@ -1103,7 +1223,11 @@ cluster: rke2-multus: Multus Configuration agentEnvVars: label: Agent Environment +<<<<<<< HEAD detail: Add additional environment variables to the agent container. This is most commonly useful for configuring a HTTP proxy. +======= + detail: Add additional environment variables to the agent container. This is most commonly useful for configuring a HTTP proxy. +>>>>>>> b5455bcb (fix: separate used/allocated units) keyLabel: Variable Name cloudProvider: aws: @@ -1116,7 +1240,11 @@ cluster: label: Google rancher-vsphere: label: vSphere +<<<<<<< HEAD note: 'Important: Configure the vSphere Cloud Provider and Storage Provider options in the Add-On Config tab.' +======= + note: 'Important: Configure the vSphere Cloud Provider and Storage Provider options in the Add-on Configuration tab.' +>>>>>>> b5455bcb (fix: separate used/allocated units) harvester: label: Harvester copyConfig: Copy KubeConfig to Clipboard @@ -1124,10 +1252,17 @@ cluster: custom: nodeRole: label: Node Role +<<<<<<< HEAD detail: Choose what roles the node will have in the cluster. The cluster needs to have at least one node with each role. advanced: label: Advanced detail: Additional control over how the node will be registered. These values will often need to be different for each node registered. +======= + detail: Choose what roles the node will have in the cluster. The cluster needs to have at least one node with each role. + advanced: + label: Advanced + detail: Additional control over how the node will be registered. These values will often need to be different for each node registered. +>>>>>>> b5455bcb (fix: separate used/allocated units) nodeName: Node Name publicIp: Node Public IP privateIp: Node Private IP @@ -1140,14 +1275,23 @@ cluster: windowsDetail: Run this command in PowerShell on each of the existing Windows machines you want to register. Windows nodes can only be workers. windowsNotReady: The cluster must be up and running with Linux etcd, control plane, and worker nodes before the registration command for adding Windows workers will display. windowsWarning: Workload pods, including some deployed by Rancher charts, will be scheduled on both Linux and Windows nodes by default. Edit NodeSelector in the chart to direct them to be placed onto a compatible node. +<<<<<<< HEAD windowsDeprecatedForRKE1: Windows support is being deprecated for RKE1. We suggest migrating to RKE2. +======= + windowsDeprecatedForRKE1: Windows support is being deprecated for RKE1 and RKE1 is soon to be deprecrated. Please migrate to RKE2. +>>>>>>> b5455bcb (fix: separate used/allocated units) insecure: "Insecure: Select this to skip TLS verification if your server has a self-signed certificate." credential: banner: createCredential: |- {length, plural, +<<<<<<< HEAD =0 {First you'll need to create a credential to talk to the cloud provider} other {Ok, Let's create a new credential} +======= + =0 {First, you will need to create a credential to talk to the cloud provider} + other {Ok, start to create a new credential} +>>>>>>> b5455bcb (fix: separate used/allocated units) } selectExisting: label: Select Existing @@ -1160,7 +1304,11 @@ cluster: label: Access Key placeholder: Your AWS Access Key defaultRegion: +<<<<<<< HEAD help: The default region to use when creating clusters. Also contacted to verify that this credential works. +======= + help: The default region to use when creating clusters. Also contacted to verify that this credential works. +>>>>>>> b5455bcb (fix: separate used/allocated units) label: Default Region secretKey: label: Secret Key @@ -1265,7 +1413,11 @@ cluster: volume: Volume imageVolume: Image Volume addVolume: Add Volume +<<<<<<< HEAD addVMImage: Add VM Image +======= + addVMImage: Add Virtual Machine Image +>>>>>>> b5455bcb (fix: separate used/allocated units) storageClass: Storage Class sshUser: SSH User userData: @@ -1281,9 +1433,15 @@ cluster: installGuestAgent: Install guest agent description: label: Cluster Description +<<<<<<< HEAD placeholder: Any text you want that better describes this cluster harvester: importNotice: Import Harvester Clusters via +======= + placeholder: Any text to describe this cluster + harvester: + importNotice: Import Harvester Clusters Via +>>>>>>> b5455bcb (fix: separate used/allocated units) warning: label: This is a Harvester Cluster - enable the Harvester feature flag to manage it state: Warning @@ -1316,11 +1474,19 @@ cluster: sshUser: placeholder: e.g. ubuntu toolTip: SSH user to login with the selected OS image. +<<<<<<< HEAD haveOneOwner: There must be at least one member with the Owner role. import: warningBanner: 'You should not import a cluster which has already been connected to another instance of Rancher as it will lead to data corruption.' commandInstructions: 'Run the kubectl command below on an existing Kubernetes cluster running a supported Kubernetes version to import it into {vendor}:' commandInstructionsInsecure: 'If you get a "certificate signed by unknown authority" error, your {vendor} installation has a self-signed or untrusted SSL certificate. Run the command below instead to bypass the certificate verification:' +======= + haveOneOwner: There must be at least one member with the owner role. + import: + warningBanner: 'You should not import a cluster which has already been connected to another instance of Rancher as it will lead to data corruption.' + commandInstructions: 'Run the kubectl command below on an existing Kubernetes cluster running a supported Kubernetes version to import it into {vendor}:' + commandInstructionsInsecure: 'If you get a "certificate signed by unknown authority" error, your {vendor} installation has a self-signed or untrusted SSL certificate. Run the command below instead to bypass the certificate verification:' +>>>>>>> b5455bcb (fix: separate used/allocated units) clusterRoleBindingInstructions: 'If you get permission errors creating some of the resources, your user may not have the cluster-admin role. Use this command to apply it:' clusterRoleBindingCommand: 'kubectl create clusterrolebinding cluster-admin-binding --clusterrole cluster-admin --user ' explore: Explore @@ -1333,7 +1499,11 @@ cluster: deprecated: (deprecated) deprecatedPatches: Show deprecated Kubernetes patch versions deprecatedPatchWarning: We recommend using the latest patch version for each minor Kubernetes version. Deprecated patch versions can be useful for migration purposes. +<<<<<<< HEAD toolsTip: Use the new Cluster Tools to manage and install Monitoring, Logging and other tools +======= + toolsTip: Use the new cluster tools to manage and install monitoring, logging and other tools +>>>>>>> b5455bcb (fix: separate used/allocated units) legacyWarning: The legacy feature flag is enabled and not all legacy features are supported in Kubernetes 1.21+. log: connecting: Connecting… @@ -1411,6 +1581,7 @@ cluster: network: Network disks: Disks size: +<<<<<<< HEAD label: VM Size tooltip: When accelerated networking is enabled, not all sizes are available. supportsAcceleratedNetworking: Sizes that Support Accelerated Networking @@ -1419,6 +1590,16 @@ cluster: regionDoesNotSupportAzs: Availability zones are not supported in the selected region. Please select a different region or use an availability set instead. regionSupportsAzsButNotThisSize: The selected region does not support availability zones for the selected VM size. Please select a different region or VM size. selectedSizeAcceleratedNetworkingWarning: The selected VM size does not support accelerated networking. Please select another VM size or disable accelerated networking. +======= + label: Virtual Machine Size + tooltip: When accelerated networking is enabled, not all sizes are available. + supportsAcceleratedNetworking: Sizes That Support Accelerated Networking + doesNotSupportAcceleratedNetworking: Sizes Without Accelerated Networking + availabilityWarning: The selected virtual machine size is not available in the selected region. + regionDoesNotSupportAzs: Availability zones are not supported in the selected region. Please select a different region or use an availability set instead. + regionSupportsAzsButNotThisSize: The selected region does not support availability zones for the selected virtual machine size. Please select a different region or virtual machine size. + selectedSizeAcceleratedNetworkingWarning: The selected virtual machine size does not support accelerated networking. Please select another virtual machine size or disable accelerated networking. +>>>>>>> b5455bcb (fix: separate used/allocated units) sshUser: label: SSH Username storageType: @@ -1511,7 +1692,11 @@ cluster: folder: Folder host: label: Host +<<<<<<< HEAD note: Specific host to create VM on (leave blank for standalone ESXi or for cluster with DRS) +======= + note: Specific host to create virtual machine on (leave blank for standalone ESXi or for cluster with DRS) +>>>>>>> b5455bcb (fix: separate used/allocated units) instanceOptions: label: Instance Options description: Choose the size and OS of the virtual machine @@ -1532,7 +1717,11 @@ cluster: label: Cloud Init placeholder: e.g. http://my_host/cloud-config.yml note: Cloud-init file or url to set in the guestinfo +<<<<<<< HEAD cloudConfigYaml: Cloud Config YAML +======= + cloudConfigYaml: Cloud Configuration YAML +>>>>>>> b5455bcb (fix: separate used/allocated units) os: Operating System tags: label: Tags @@ -1608,7 +1797,11 @@ cluster: serverOs: label: OS addOns: +<<<<<<< HEAD dependencyBanner: Add-On Configurations can vary between Kubernetes versions. Changing the Kubernetes version may reset the values below. +======= + dependencyBanner: Add-on configurations can vary between Kubernetes versions. Changing the Kubernetes version may reset the values below. +>>>>>>> b5455bcb (fix: separate used/allocated units) additionalManifest: title: Additional Manifest tooltip: 'Additional Kubernetes Manifest YAML to be applied to the cluster on startup.' @@ -1627,14 +1820,20 @@ cluster: nodeAffinity: Node Affinity banners: advanced: These are advanced configuration options. Generally, they should be left as-is. +<<<<<<< HEAD tolerations: Additional Pod Tolerations will be added to the default Tolerations applied by Rancher. limits: Pod Requests and Limits do not have a default configuration. +======= + tolerations: Additional pod tolerations will be added to the default tolerations applied by Rancher. + limits: Pod requests and limits do not have a default configuration. +>>>>>>> b5455bcb (fix: separate used/allocated units) windowsCompatibility: "We do not recommended removing the Node Affinity rule that prevents the agent from running on Windows nodes as this is not a supported configuration." affinity: default: Use default affinity rules defined by Rancher custom: Use custom affinity rules advanced: argInfo: +<<<<<<< HEAD title: Additional Kubelet Args machineSelector: label: Add Machine Selector @@ -1650,15 +1849,40 @@ cluster: kubeControllerManagerTitle: Additional Controller Manager Args kubeApiServerTitle: Additional API Server Args kubeSchedulerTitle: Additional Scheduler Args +======= + title: Additional Kubelet Arguments + machineSelector: + label: Add Machine Selector + listLabel: Add Arguments + bannerLabel: 'Note: The last selector that matches wins and only arguments from it will be used. Arguments from other matches above will not combined together or merged.' + title: 'For machines with labels matching:' + subTitle: 'Use the Kubelet arguments:' + titleAlt: |- + {count, plural, + =1 { For all machines, use the Kubelet arguments: } + other { For any machines, use the Kubelet arguments: } + } + kubeControllerManagerTitle: Additional Controller Manager Arguments + kubeApiServerTitle: Additional API Server Arguments + kubeSchedulerTitle: Additional Scheduler Arguments +>>>>>>> b5455bcb (fix: separate used/allocated units) agentArgs: label: Raise error if kernel parameters are different than the expected kubelet defaults banner: warning: 'This cluster contains a machineSelectorConfig which this form does not fully support; use the YAML editor to manage the full configuration.' +<<<<<<< HEAD os: 'You are attemping to add a {newOS} worker node to a cluster with one or more {existingOS} worker nodes: some installed apps may need to be upgraded or removed.' rke2-k3-reprovisioning: 'Making changes to cluster configuration may result in nodes reprovisioning. For more information see the documentation.' desiredNodeGroupWarning: There are 0 nodes available to run the cluster agent. The cluster will not become active until at least one node is available. invalidPsps: You have one or more PodSecurityPolicy resource(s) in this cluster. Pod Security Policies are not available in Kubernetes v1.25 and will be automatically removed. haveArgInfo: Configuration information is not available for the selected Kubernetes version. The options available in this screen will be limited, you may want to use the YAML editor. +======= + os: 'You are attemping to add a {newOS} worker node to a cluster with one or more {existingOS} worker nodes: some installed applications may need to be upgraded or removed.' + rke2-k3-reprovisioning: 'Making changes to cluster configuration may result in nodes reprovisioning. For more information see the documentation.' + desiredNodeGroupWarning: There are 0 nodes available to run the cluster agent. The cluster will not become active until at least one node is available. + invalidPsps: You have one or more PodSecurityPolicy resource(s) in this cluster. Pod Security Policies are not available in Kubernetes v1.25 and will be automatically removed. + haveArgInfo: Configuration information is not available for the selected Kubernetes version. The options available in this screen will be limited, you may want to use the YAML editor. +>>>>>>> b5455bcb (fix: separate used/allocated units) deprecatedPsp: Pod Security Policies are deprecated as of Kubernetes v1.21, and have been removed in Kubernetes v1.25. removedPsp: Pod Security Policies have been removed in Kubernetes v1.25, use Pod Security Admission instead. rkeTemplateUpgrade: Template revision {name} available for upgrade @@ -1678,7 +1902,11 @@ cluster: machinePool: name: label: Pool Name +<<<<<<< HEAD placeholder: A random one will be generated by default +======= + placeholder: A random name is generated by default +>>>>>>> b5455bcb (fix: separate used/allocated units) nodeTotals: label: controlPlane: '{count} Control Plane' @@ -1695,7 +1923,11 @@ cluster: {count, plural, =0 { A cluster needs at least one etcd node to be usable. } =1 { A cluster with only one etcd node is not fault-tolerant. } +<<<<<<< HEAD =2 { Clusters should have an odd number of nodes. A cluster with 2 etcd nodes is not fault-tolerant. } +======= + =2 { Clusters should have an odd number of nodes. A cluster with 2 etcd nodes is not fault-tolerant. } +>>>>>>> b5455bcb (fix: separate used/allocated units) =3 {} =4 { Clusters should have an odd number of nodes. } =5 {} @@ -1731,7 +1963,11 @@ cluster: label: Auto Replace toolTip: If greater than 0, nodes that are unreachable for this duration will be automatically deleted and replaced. unit: "Seconds" +<<<<<<< HEAD managementTimeout: The cluster to become available. It's possible the cluster was created. We suggest checking the clusters page before trying to create another. +======= + managementTimeout: The cluster to become available. It is possible the cluster was created. We suggest checking the clusters page before trying to create another. +>>>>>>> b5455bcb (fix: separate used/allocated units) memberRoles: removeMessage: 'Note: Removing a user will not remove their project permissions' addClusterMember: @@ -1807,11 +2043,19 @@ cluster: harvester: '{tag}' providerGroup: create-custom1: Use existing nodes and create a cluster using RKE +<<<<<<< HEAD create-custom2: Use existing nodes and create a cluster using RKE2/K3s create-kontainer: Create a cluster in a hosted Kubernetes provider register-kontainer: Register an existing cluster in a hosted Kubernetes provider create-rke1: Provision new nodes and create a cluster using RKE create-rke2: Provision new nodes and create a cluster using RKE2/K3s +======= + create-custom2: Use existing nodes and create a cluster using RKE2 or K3s + create-kontainer: Create a cluster in a hosted Kubernetes provider + register-kontainer: Register an existing cluster in a hosted Kubernetes provider + create-rke1: Provision new nodes and create a cluster using RKE + create-rke2: Provision new nodes and create a cluster using RKE2 or K3s +>>>>>>> b5455bcb (fix: separate used/allocated units) create-template: Use a Catalog Template to create a cluster register-custom: Import any Kubernetes cluster rke2: @@ -1835,7 +2079,11 @@ cluster: label: Container Network cloudProvider: label: Cloud Provider +<<<<<<< HEAD header: Cloud Provider Config +======= + header: Cloud Provider Configuration +>>>>>>> b5455bcb (fix: separate used/allocated units) defaultValue: label: Default - RKE2 Embedded security: @@ -1867,8 +2115,13 @@ cluster: toolTip: "This can be either a fixed number of nodes (e.g. 1) at a time or a percentage (e.g. 10%)" drain: label: Drain Nodes +<<<<<<< HEAD toolTip: Draining preemptively removes the pods on each node so there are no running workloads on the nodes being upgraded. Upgrading without draining is faster and causes less shuffling around, but pods may still be restarted depending on the upgrade being performed. deleteEmptyDir: "By default, pods using emptyDir volumes will be deleted on upgrade. Operations reliant on emptyDir volumes persisting through the pod's lifecycle may be impacted." +======= + toolTip: Draining preemptively removes the pods on each node so there are no running workloads on the nodes being upgraded. Upgrading without draining is faster and causes less shuffling around, but pods may still be restarted depending on the upgrade being performed. + deleteEmptyDir: "By default, pods using emptyDir volumes will be deleted on upgrade. Operations reliant on emptyDir volumes persisting through the pods lifecycle may be impacted." +>>>>>>> b5455bcb (fix: separate used/allocated units) truncateHostnames: Truncate hostnames to 15 characters for NetBIOS compatibility. address: tooltip: Cluster networking values cannot be changed after the cluster is created. @@ -1912,7 +2165,11 @@ cluster: servicelb: 'Klipper Service LB' traefik: 'Traefik Ingress' selectCredential: +<<<<<<< HEAD genericDescription: "{vendor} has no built-in support for this driver. We've taken a guess, but consult the driver's documentation for the fields required for authentication." +======= + genericDescription: "{vendor} has no built-in support for this driver. We've taken a guess, but consult the driver's documentation for the fields required for authentication." +>>>>>>> b5455bcb (fix: separate used/allocated units) snapshot: successTitle: Snapshot Started errorTitle: "Error Snapshotting {name}" @@ -1930,7 +2187,11 @@ cluster: s3: s3 tabs: ace: Authorized Endpoint +<<<<<<< HEAD addons: Add-On Config +======= + addons: Add-on Configuration +>>>>>>> b5455bcb (fix: separate used/allocated units) advanced: Advanced agentEnv: Agent Environment Vars basic: Basics @@ -1954,7 +2215,11 @@ cluster: v1: RKE1 v2: RKE2/K3s validation: +<<<<<<< HEAD iamInstanceProfileName: If the Amazon cloud provider is selected the "IAM Instance Profile Name" must be defined for each Machine Pool +======= + iamInstanceProfileName: If the Amazon cloud provider is selected the "IAM Instance Profile Name" must be defined for each machine pool +>>>>>>> b5455bcb (fix: separate used/allocated units) clusterIndexPage: hardwareResourceGauge: @@ -2007,7 +2272,11 @@ configmap: tabs: data: label: Data +<<<<<<< HEAD protip: Use this area for anything that's UTF-8 text data +======= + protip: Use this area for anything that contains UTF-8 text data +>>>>>>> b5455bcb (fix: separate used/allocated units) binaryData: label: Binary Data @@ -2127,7 +2396,11 @@ fleet: notReady: Not Ready waitApplied: Wait Applied gitRepo: +<<<<<<< HEAD createLocalBanner: When deploying a Git Repo to the Local workspace you are unable to target any specific Cluster or Cluster Groups +======= + createLocalBanner: When deploying a Git Repo to the local workspace you are unable to target any specific cluster or cluster groups +>>>>>>> b5455bcb (fix: separate used/allocated units) tabs: resources: Resources unready: Non-Ready @@ -2142,7 +2415,11 @@ fleet: label: Paths placeholder: e.g. /directory/in/your/repo addLabel: Add Path +<<<<<<< HEAD empty: The root of the repo is used by default. To use one or more different directories, add them here. +======= + empty: The root of the repo is used by default. To use one or more different directories, add it here. +>>>>>>> b5455bcb (fix: separate used/allocated units) repo: label: Repository URL placeholder: e.g. https://github.com/rancher/fleet-examples.git or git@github.com:rancher/fleet-examples.git @@ -2228,7 +2505,11 @@ fleet: workspaces: tabs: restrictions: Allowed Target Namespaces +<<<<<<< HEAD timeout: Workspace creation timeout. It's possible the workspace was created. We suggest checking the workspace page before trying to create another. +======= + timeout: Workspace creation timeout. It is possible the workspace was created. We suggest checking the workspace page before trying to create another. +>>>>>>> b5455bcb (fix: separate used/allocated units) restrictions: addTitle: 'allowedTargetNamespaces' addLabel: Add @@ -2401,10 +2682,17 @@ hpa: cpu: CPU memory: Memory warnings: +<<<<<<< HEAD custom: In order to use custom metrics with HPA, you need to deploy the custom metrics server such as prometheus adapter. external: In order to use external metrics with HPA, you need to deploy the external metrics server such as prometheus adapter. noMetric: In order to use resource metrics with HPA, you need to deploy the metrics server. resource: The selected target reference does not have the correct resource requests on the spec. Without this the HPA metric will have no effect. +======= + custom: In order to use custom metrics with HPA, you need to deploy the custom metrics server such as Prometheus adapter. + external: In order to use external metrics with HPA, you need to deploy the external metrics server such as Prometheus adapter. + noMetric: In order to use resource metrics with HPA, you need to deploy the metrics server. + resource: The selected target reference does not have the correct resource requests on the spec. Without this, the HPA metric will have no effect. +>>>>>>> b5455bcb (fix: separate used/allocated units) workloadTab: current: Current Replicas last: Last Scale Time @@ -2423,7 +2711,11 @@ import: } ingress: +<<<<<<< HEAD description: Ingresses route incoming traffic from the internet to Services within the cluster based on the hostname and path specified in the request. You can expose multiple Services on the same external IP address and port. +======= + description: Ingresses route incoming traffic from the internet to services within the cluster based on the hostname and path specified in the request. You can expose multiple services on the same external IP address and port. +>>>>>>> b5455bcb (fix: separate used/allocated units) certificates: addCertificate: Add Certificate addHost: Add Host @@ -2450,7 +2742,11 @@ ingress: targetService: label: Target Service doesntExist: The selected service does not exist +<<<<<<< HEAD required: Target Service is required +======= + required: Target service is required +>>>>>>> b5455bcb (fix: separate used/allocated units) warning: "Warning: Default backend is used globally for the entire cluster." ingressClass: label: Ingress Class @@ -2476,7 +2772,11 @@ ingress: placeholder: e.g. example.com target: label: Target Service +<<<<<<< HEAD tooltip: If none of the Services in this dropdown select the Pods that you need to expose, you will need to create a Service that selects those Pods first. +======= + tooltip: If none of the services in this drop-down select the pods that you need to expose, you will need to create a service that selects those pods first. +>>>>>>> b5455bcb (fix: separate used/allocated units) doesntExist: The selected service does not exist title: Rules rulesAndCertificates: @@ -2484,7 +2784,11 @@ ingress: defaultCertificate: default target: default: Default +<<<<<<< HEAD rulesOrBackendSpecified: Either Default Backend or Rules must be specified +======= + rulesOrBackendSpecified: Either the default backend or rules must be specified +>>>>>>> b5455bcb (fix: separate used/allocated units) internalExternalIP: none: None @@ -2496,7 +2800,11 @@ istio: description: 'Visualization of services within a service mesh and how they are connected. For Kiali to display data, you need Prometheus installed. If you need a monitoring solution, install {vendor} monitoring.' jaeger: label: Jaeger +<<<<<<< HEAD description: Monitor and Troubleshoot microservices-based distributed systems. +======= + description: Monitor and troubleshoot microservices-based distributed systems. +>>>>>>> b5455bcb (fix: separate used/allocated units) disabled: '{app} is not installed' cni: Enable CNI customOverlayFile: @@ -2588,7 +2896,11 @@ istio: help: Maximum number of HTTP1 /TCP connections to a destination host. outlierDetection: label: Outlier Detection +<<<<<<< HEAD detail: Configure eviction of unhealthy hosts from the load balancing pool +======= + detail: Configure eviction of unhealthy hosts from the load balancing pool. +>>>>>>> b5455bcb (fix: separate used/allocated units) baseEjectionTime: label: Base Ejection Time placeholder: e.g. 30s @@ -2613,7 +2925,11 @@ istio: name: label: Name placeholder: e.g. v1 +<<<<<<< HEAD error: Subset Name is required. +======= + error: Subset name is required. +>>>>>>> b5455bcb (fix: separate used/allocated units) labels: error: Please input at least one label for subset. tls: @@ -2634,11 +2950,19 @@ istio: clientCertificate: label: Client Certificate placeholder: e.g. /etc/certs/myclientcert.pem +<<<<<<< HEAD error: Client Certificate is required. privateKey: label: Private Key placeholder: e.g. /etc/certs/client_private_key.pem error: Private Key is required. +======= + error: Client certificate is required. + privateKey: + label: Private Key + placeholder: e.g. /etc/certs/client_private_key.pem + error: Private key is required. +>>>>>>> b5455bcb (fix: separate used/allocated units) caCertificates: label: CA Certificates placeholder: e.g. /etc/certs/rootcacerts.pem @@ -2668,14 +2992,22 @@ istio: labels: addLabel: Add Label +<<<<<<< HEAD addSetLabel: Add/Set Label +======= + addSetLabel: Add or Set Label +>>>>>>> b5455bcb (fix: separate used/allocated units) addTag: Add Tag addTaint: Add Taint addAnnotation: Add Annotation labels: title: Labels description: Key/value pairs that are attached to objects which specify identifying attributes. +<<<<<<< HEAD fleetClusterTooltip: Label changes are made to the Management Cluster and synchronized to the Fleet Cluster +======= + fleetClusterTooltip: Label changes are made to the management cluster and synchronized to the Fleet cluster. +>>>>>>> b5455bcb (fix: separate used/allocated units) show: Show System Label hide: Hide System Label annotations: @@ -2726,7 +3058,11 @@ logging: noOutputsBanner: There are no cluster outputs in the selected namespace. flow: clusterOutputs: +<<<<<<< HEAD doesntExistTooltip: This cluster output doesn't exist +======= + doesntExistTooltip: This cluster output does not exist +>>>>>>> b5455bcb (fix: separate used/allocated units) label: Cluster Outputs matches: banner: Configure which container logs will be pulled from @@ -2760,7 +3096,11 @@ logging: filters: label: Filters outputs: +<<<<<<< HEAD doesntExistTooltip: This output doesn't exist +======= + doesntExistTooltip: This output does not exist +>>>>>>> b5455bcb (fix: separate used/allocated units) sameNamespaceError: Output must reside in same namespace as the flow. label: Outputs install: @@ -2874,7 +3214,11 @@ logging: overwriteExistingPath: Overwrite Existing Path kinesisStream: streamName: Stream Name +<<<<<<< HEAD keyId: Key Id from Secret +======= + keyId: Key ID from Secret +>>>>>>> b5455bcb (fix: separate used/allocated units) secretKey: Secret Key from Secret logdna: apiKey: API Key @@ -2883,7 +3227,11 @@ logging: logz: url: URL port: Port +<<<<<<< HEAD token: Api Token from Secret +======= + token: API Token from Secret +>>>>>>> b5455bcb (fix: separate used/allocated units) enableCompression: Enable Compression newrelic: apiKey: API Key from Secret @@ -2914,7 +3262,11 @@ logging: timekeyWait: Timekey Wait timekeyUseUTC: Timekey Use UTC s3: +<<<<<<< HEAD keyId: Key Id from Secret +======= + keyId: Key ID from Secret +>>>>>>> b5455bcb (fix: separate used/allocated units) secretKey: Secret Key from Secret endpoint: Endpoint bucket: Bucket @@ -2933,7 +3285,11 @@ logging: configuration: Configuration tips: singleProvider: This output is configured with multiple providers. We currently only support a single provider per output. You can view or edit the YAML. +<<<<<<< HEAD multipleProviders: This output is configured with providers we don't support yet. You can view or edit the YAML. +======= + multipleProviders: This output is configured with providers we do not support yet. You can view or edit the YAML. +>>>>>>> b5455bcb (fix: separate used/allocated units) outputProviders: elasticsearch: Elasticsearch opensearch: OpenSearch @@ -3042,7 +3398,11 @@ members: clusterPermissions: noDescription: User created - no description label: Cluster Permissions +<<<<<<< HEAD description: Controls what access users have to the Cluster +======= + description: Controls what access users have to the cluster +>>>>>>> b5455bcb (fix: separate used/allocated units) createProjects: Create Projects manageClusterBackups: Manage Cluster Backups manageClusterCatalogs: Manage Cluster Catalogs @@ -3056,10 +3416,17 @@ members: viewNodes: View Nodes owner: label: Owner +<<<<<<< HEAD description: Owners have full control over the Cluster and all resources inside it. member: label: Member description: Members can manage the resources inside the Cluster but not change the Cluster itself. +======= + description: Owners have full control over the cluster and all the resources inside it. + member: + label: Member + description: Members can manage the resources inside the cluster but not change the cluster itself. +>>>>>>> b5455bcb (fix: separate used/allocated units) custom: label: Custom description: Choose individual roles for this user. @@ -3079,16 +3446,24 @@ monitoring: readOnlyMany: ReadOnlyMany aggregateDefaultRoles: label: Aggregate to Default Kubernetes Roles +<<<<<<< HEAD tip: 'Adds labels to the ClusterRoles deployed by the Monitoring chart to aggregate to the corresponding default k8s admin, edit, and view ClusterRoles.' alerting: config: label: Alert Manager Config +======= + tip: 'Adds labels to the ClusterRoles deployed by the monitoring chart to aggregate to the corresponding default Kubernetes administrator, edit, and view ClusterRoles.' + alerting: + config: + label: Alert Manager Configuration +>>>>>>> b5455bcb (fix: separate used/allocated units) enable: label: Deploy Alertmanager secrets: additional: info: Secrets should be mounted at
    /etc/alertmanager/secrets/
    label: Additional Secrets +<<<<<<< HEAD existing: Choose an existing config secret info: | Create default config: A Secret containing your Alertmanager Config will be created in the
    cattle-monitoring-system
    namespace on deploying this chart under the name
    alertmanager-rancher-monitoring-alertmanager
    . By default, this Secret will never be modified on an uninstall or upgrade of this chart.
    @@ -3098,6 +3473,17 @@ monitoring: new: Create default config radio: label: Config Secret +======= + existing: Choose an existing configuration secret + info: | + Create default configuration: A Secret containing your Alertmanager configuration will be created in the
    cattle-monitoring-system
    namespace on deploying this chart under the name
    alertmanager-rancher-monitoring-alertmanager
    . By default, this secret will never be modified on an uninstall or upgrade of this chart.
    + Once you have deployed this chart, edit the secret via the UI in order to add your custom notification configurations that will be used by Alertmanager to send alerts.

    + Choose an existing configuration secret: You must specify a secret that exists in the
    cattle-monitoring-system
    namespace. If the namespace does not exist, you will not be able to select an existing secret. + label: Alertmanager Secret + new: Create default configuration + radio: + label: Configuration Secret +>>>>>>> b5455bcb (fix: separate used/allocated units) validation: duplicatedReceiverName: A receiver with the name {name} already exists. templates: @@ -3170,7 +3556,11 @@ monitoring: adminApi: Admin API evaluation: Evaluation Interval ignoreNamespaceSelectors: +<<<<<<< HEAD help: 'Ignoring Namespace Selectors allows Cluster Admins to limit teams from monitoring resources outside of namespaces they have permissions to but can break the functionality of Apps that rely on setting up Monitors that scrape targets across multiple namespaces, such as Istio.' +======= + help: 'Ignoring Namespace Selectors allows cluster admins to limit teams from monitoring resources outside of namespaces they have permissions to but can break the functionality of applications that rely on setting up monitors that scrape targets across multiple namespaces, such as Istio.' +>>>>>>> b5455bcb (fix: separate used/allocated units) label: Namespace Selectors radio: enforced: 'Use: Monitors can access resources based on namespaces that match the namespace selector field' @@ -3190,13 +3580,21 @@ monitoring: label: Persistent Storage for Prometheus mode: Access Mode selector: Selector +<<<<<<< HEAD selectorWarning: 'If you are using a dynamic provisioner (e.g. Longhorn), no Selectors should be specified since a PVC with a non-empty selector can''t have a PV dynamically provisioned for it.' +======= + selectorWarning: 'If you are using a dynamic provisioner (e.g. Longhorn), no selectors should be specified since a PVC with a non-empty selector cannot have a PV dynamically provisioned for it.' +>>>>>>> b5455bcb (fix: separate used/allocated units) size: Size volumeName: Volume Name title: Configure Prometheus warningInstalled: | Warning: Prometheus Operators are currently deployed. Deploying multiple Prometheus Operators onto one cluster is not currently supported. Please remove all other Prometheus Operator deployments from this cluster before trying to install this chart. +<<<<<<< HEAD If you are migrating from an older version of {vendor} with Monitoring enabled, please disable Monitoring on this cluster completely before attempting to install this chart. +======= + If you are migrating from an older version of {vendor} with monitoring enabled, please disable monitoring on this cluster completely before attempting to install this chart. +>>>>>>> b5455bcb (fix: separate used/allocated units) receiver: addReceiver: Add Receiver fields: @@ -3212,6 +3610,7 @@ monitoring: keyFilePath: label: Key File Path placeholder: e.g. ./key-file.pfx +<<<<<<< HEAD secretsBanner: The file paths below must be referenced in
    alertmanager.alertmanagerSpec.secrets
    when deploying the Monitoring chart. For more information see our documentation. projectMonitoring: detail: @@ -3222,6 +3621,18 @@ monitoring: message: Project Monitoring has not been configured for any projects canCreate: Get started by clicking Create to add monitoring to a project cannotCreate: Contact the admin to add project monitoring +======= + secretsBanner: The file paths below must be referenced in
    alertmanager.alertmanagerSpec.secrets
    when deploying the monitoring chart. For more information see our documentation. + projectMonitoring: + detail: + error: "Unable to fetch dashboard values with status: " + list: + banner: Project monitoring configuration is stored in ProjectHelmChart resources + empty: + message: Project monitoring has not been configured for any projects + canCreate: Get started by clicking create to add monitoring to a project + cannotCreate: Contact the administrator to add project monitoring +>>>>>>> b5455bcb (fix: separate used/allocated units) route: label: Route fields: @@ -3236,9 +3647,15 @@ monitoring: alertmanagerConfig: description: Routes and receivers for project alerting and cluster alerting are configured within AlertmanagerConfig resources. empty: Alerts have not been configured for any accessible namespaces. +<<<<<<< HEAD getStarted: Get started by clicking Create to configure an alert. receiverTooltip: This route will direct alerts to the selected receiver, which must be defined in the same AlertmanagerConfig. deprecationWarning: The Route and Receiver resources are deprecated. Going forward, routes and receivers should not be managed as separate Kubernetes resources on this page. They should be configured as YAML fields in an AlertmanagerConfig resource. +======= + getStarted: Get started by clicking create to configure an alert. + receiverTooltip: This route will direct alerts to the selected receiver, which must be defined in the same AlertmanagerConfig. + deprecationWarning: The route and receiver resources are deprecated. Going forward, routes and receivers should not be managed as separate Kubernetes resources on this page. They should be configured as YAML fields in an AlertmanagerConfig resource. +>>>>>>> b5455bcb (fix: separate used/allocated units) routeInfo: This form supports configuring one route that directs traffic to a receiver. Alerts can be directed to more receiver(s) by configuring child routes in YAML. receiverFormNames: create: Create Receiver in AlertmanagerConfig @@ -3273,19 +3690,28 @@ monitoring: warning2: Learn more about the migration steps to V2 Monitoring. promptDescription:
    You are attempting to uninstall V1 Monitoring. Please ensure you have read the migration steps.
    success1: V1 monitoring successfully uninstalled. +<<<<<<< HEAD success2: Press Next to continue +======= + success2: Press next to continue +>>>>>>> b5455bcb (fix: separate used/allocated units) tabs: alerting: Alerting general: General grafana: Grafana prometheus: Prometheus projectMetrics: Project Metrics +<<<<<<< HEAD v1Warning: 'Monitoring is currently deployed from Cluster Manager. If you are migrating from an older version of {vendor} with monitoring enabled, please disable monitoring in Cluster Manager before attempting to install the new {vendor} Monitoring chart in Cluster Explorer.' +======= + v1Warning: 'Monitoring is currently deployed from cluster manager. If you are migrating from an older version of {vendor} with monitoring enabled, please disable monitoring in cluster manager before attempting to install the new {vendor} monitoring chart in cluster explorer.' +>>>>>>> b5455bcb (fix: separate used/allocated units) monitoringReceiver: addButton: Add {type} custom: label: Custom +<<<<<<< HEAD title: Custom Config info: The YAML provided here will be directly appended to your receiver within the Alertmanager Config Secret. email: @@ -3308,6 +3734,30 @@ monitoringReceiver: urlTooltip: For some webhooks this a url that points to the service DNS modifyNamespace: If
    rancher-alerting-drivers
    default values were changed, please update the url below in the format http://<new_service_name>.<new_namespace>.svc.<port>/<path> banner: To use MS Teams or SMS you will need to have at least one instance of
    rancher-alerting-drivers
    installed first. +======= + title: Custom Configuration + info: The YAML provided here will be directly appended to your receiver within the Alertmanager configuration secret. + email: + label: Email + title: Email Configuration + opsgenie: + label: Opsgenie + title: Opsgenie Configuration + pagerduty: + label: PagerDuty + title: PagerDuty Configuration + info: "You can find additional info on creating an Integration Key for PagerDuty here." + slack: + label: Slack + title: Slack Configuration + info: "You can find additional info on creating Incoming Webhooks for Slack here ." + webhook: + label: Webhook + title: Webhook Configuration + urlTooltip: For some webhooks this a URL that point to the service DNS + modifyNamespace: If
    rancher-alerting-drivers
    default values were changed, please update the URL below in the format http://<new_service_name>.<new_namespace>.svc.<port>/<path> + banner: To use MS Teams or SMS, you will need to have at least one instance of
    rancher-alerting-drivers
    installed first. +>>>>>>> b5455bcb (fix: separate used/allocated units) add: selectWebhookType: Select Webhook Type generic: Generic @@ -3342,7 +3792,11 @@ monitoringReceiver: label: Enable send resolved alerts alertmanagerConfigReceiver: +<<<<<<< HEAD secretKeyId: Key Id from Secret +======= + secretKeyId: Key ID from Secret +>>>>>>> b5455bcb (fix: separate used/allocated units) name: Receiver Name addButton: Add Receiver receivers: Receivers @@ -3356,7 +3810,11 @@ monitoringRoute: label: Group By addGroupByLabel: Labels to Group Alerts By groupByTooltip: Add each label as a string in the format key:value. The special label ... will aggregate by all possible labels. If provided, the ... must be the only element in the list. +<<<<<<< HEAD info: This is the top-level Route used by Alertmanager as the default destination for any Alerts that do not match any other Routes. This Route must exist and cannot be deleted. +======= + info: This is the top-level route used by Alertmanager as the default destination for any alerts that do not match any other routes. This route must exist and cannot be deleted. +>>>>>>> b5455bcb (fix: separate used/allocated units) interval: label: Group Interval matching: @@ -3417,6 +3875,12 @@ namespace: selectNamespace: Select Namespace createNamespace: Create a New Namespace selectOrCreate: Select or Create a Namespace +<<<<<<< HEAD +======= + snapshots: + label: Snapshots + totalSnapshotSize: Total Snapshot Size +>>>>>>> b5455bcb (fix: separate used/allocated units) resourceStates: success: 'Active' info: 'Transitioning' @@ -3505,7 +3969,11 @@ networkpolicy: ruleHint: Incoming traffic is only allowed from the configured sources portHint: Incoming traffic is only allowed to connect to the configured ports labelsAnnotations: +<<<<<<< HEAD label: Labels & Annotations +======= + label: Labels and Annotations +>>>>>>> b5455bcb (fix: separate used/allocated units) rules: pod: Pod namespace: Namespace @@ -3536,12 +4004,20 @@ networkpolicy: namespaceSelector: label: Namespace Selector namespaceAndPodSelector: +<<<<<<< HEAD label: Namespace/Pod Selector +======= + label: Namespace and Pod Selector +>>>>>>> b5455bcb (fix: separate used/allocated units) config: label: Configuration selectors: label: Selectors +<<<<<<< HEAD hint: The NetworkPolicy is applied to the selected Pods +======= + hint: The NetworkPolicy is applied to the selected pods +>>>>>>> b5455bcb (fix: separate used/allocated units) matchingPods: matchesSome: |- {matched, plural, @@ -3593,8 +4069,13 @@ node: used: Used amount: "{used} of {total} {unit}" cpu: CPU +<<<<<<< HEAD memory: MEMORY pods: PODS +======= + memory: Memory + pods: Pods +>>>>>>> b5455bcb (fix: separate used/allocated units) diskPressure: Disk Pressure kubelet: kubelet memoryPressure: Memory Pressure @@ -3716,6 +4197,10 @@ persistentVolume: file-csi-azure-com: Azure File (CSI) driver-longhorn-io: Longhorn (CSI) driver-harvesterhci-io: Harvester (CSI) +<<<<<<< HEAD +======= + lvm-driver-harvesterhci-io: LVM +>>>>>>> b5455bcb (fix: separate used/allocated units) nfs-csi-k8s-io: NFS (CSI) ebs-csi-aws-com: AWS Elastic Block Store (CSI) rbd-csi-ceph-com: Ceph RBD (CSI) @@ -3807,7 +4292,11 @@ persistentVolume: portals: add: Add Portal cinder: +<<<<<<< HEAD label: Openstack Cinder Volume (Unsupported) +======= + label: OpenStack Cinder Volume (Unsupported) +>>>>>>> b5455bcb (fix: separate used/allocated units) volumeId: label: Volume ID placeholder: e.g. vol @@ -3892,7 +4381,11 @@ persistentVolume: label: Path on the Node placeholder: /mnt/disks/ssd1 mustBe: +<<<<<<< HEAD label: The Path on the Node must be +======= + label: The path on the node must be +>>>>>>> b5455bcb (fix: separate used/allocated units) anything: 'Anything: do not check the target path' directory: A directory, or create if it does not exist file: A file, or create if it does not exist @@ -3955,8 +4448,13 @@ persistentVolumeClaim: source: label: Source options: +<<<<<<< HEAD new: Use a Storage Class to provision a new Persistent Volume existing: Use an existing Persistent Volume +======= + new: Use a storage class to provision a new persistent volume + existing: Use an existing persistent volume +>>>>>>> b5455bcb (fix: separate used/allocated units) expand: label: Expand notSupported: Storage class does not support volume expansion @@ -3967,8 +4465,13 @@ persistentVolumeClaim: requestStorage: Request Storage persistentVolume: Persistent Volume tooltips: +<<<<<<< HEAD noStorageClass: You don't have permission to list Storage Classes, enter a name manually noPersistentVolume: You don't have permission to list Persistent Volumes, enter a name manually +======= + noStorageClass: You do not have permission to list storage classes, enter a name manually + noPersistentVolume: You do not have permission to list persistent volumes, enter a name manually +>>>>>>> b5455bcb (fix: separate used/allocated units) customize: label: Customize accessModes: @@ -4007,18 +4510,32 @@ plugins: installing: Installing ... uninstalling: Uninstalling ... descriptions: +<<<<<<< HEAD experimental: This Extension is marked as experimental third-party: This Extension is provided by a Third-Party built-in: This Extension is built-in image: This Extension Image has been loaded manually +======= + experimental: This extension is marked as experimental + third-party: This extension is provided by a third-party + built-in: This extension is built-in + image: This extension image has been loaded manually +>>>>>>> b5455bcb (fix: separate used/allocated units) error: title: Error loading extension message: Could not load extension code generic: Extension error +<<<<<<< HEAD api: This Extension is not compatible with the Extensions API host: This Extension is not compatible with this application version: This Extension is not compatible with this version of Rancher load: An error occurred loading the code for this Extension +======= + api: This extension is not compatible with the extension API + host: This extension is not compatible with this application + version: This extension is not compatible with this version of Rancher + load: An error occurred loading the code for this extension +>>>>>>> b5455bcb (fix: separate used/allocated units) success: title: Loaded extension {name} message: Extension was loaded successfully @@ -4037,10 +4554,17 @@ plugins: requiresVersion: "Requires Rancher {version}" empty: all: Extensions are neither installed nor available +<<<<<<< HEAD available: No Extensions available installed: No Extensions installed updates: No updates available for installed Extensions images: No Extension Images installed +======= + available: No extension available + installed: No extension installed + updates: No updates available for installed extension + images: No extension images installed +>>>>>>> b5455bcb (fix: separate used/allocated units) loadError: An error occurred loading the code for this extension helmError: "An error occurred installing the extension via Helm" manageRepos: Manage Repositories @@ -4051,14 +4575,23 @@ plugins: subtitle: Catalogs imageLoad: load: Import Extension Catalog +<<<<<<< HEAD prompt: An Extension Catalog contains extension assets bundled into an image, importing will take the image and host a Helm repository to act as a catalog for custom built Extensions. +======= + prompt: An extension catalog contains extension assets bundled into an image, importing will take the image and host a Helm repository to act as a catalog for custom built extensions. +>>>>>>> b5455bcb (fix: separate used/allocated units) fields: image: label: Catalog Image Reference placeholder: "e.g. hub.docker.io/example-org/my-image:latest" secrets: +<<<<<<< HEAD banner: "If the registry that hosts the Catalog Image requires Pull Secrets, they must be created in the following namespace:
    cattle-ui-plugin-system
    " banner: This will create an Deployment, Service, and Helm repository to serve the extension charts. +======= + banner: "If the registry that hosts the catalog image requires pull secrets, they must be created in the following namespace:
    cattle-ui-plugin-system
    " + banner: This will create a deployment, service, and Helm repository to serve the extension charts. +>>>>>>> b5455bcb (fix: separate used/allocated units) imageVersion: title: Image Version Not Found message: Unable to determine image version from {image}, defaulting to latest @@ -4075,7 +4608,11 @@ plugins: message: A repository with the name {repo} already exists success: title: "Imported Extension Catalog from: {name}" +<<<<<<< HEAD message: Extension Catalog image was imported successfully +======= + message: Extension catalog image was imported successfully +>>>>>>> b5455bcb (fix: separate used/allocated units) headers: image: name: images @@ -4094,6 +4631,7 @@ plugins: install: label: Install title: Install Extension {name} +<<<<<<< HEAD prompt: "Are you sure that you want to install this Extension?" version: Version warnNotCertified: Please ensure that you are aware of the risks of installing Extensions from untrusted authors @@ -4111,6 +4649,25 @@ plugins: prompt: "Are you sure that you want to uninstall this Extension?" custom: "Are you sure that you want to uninstall this Extension Image? This will also remove any Extensions provided by this image." upgradeAvailable: A newer version of this Extension is available +======= + prompt: "Are you sure that you want to install this extension?" + version: Version + warnNotCertified: Please ensure that you are aware of the risks of installing extensions from untrusted authors + update: + label: Update + title: Update Extension {name} + prompt: "Are you sure that you want to update this extension?" + rollback: + label: Rollback + title: Rollback Extension {name} + prompt: "Are you sure that you want to rollback this extension?" + uninstall: + label: Uninstall + title: "Uninstall Extension: {name}" + prompt: "Are you sure that you want to uninstall this extension?" + custom: "Are you sure that you want to uninstall this extension image? This will also remove any extensions provided by this image." + upgradeAvailable: A newer version of this extension is available +>>>>>>> b5455bcb (fix: separate used/allocated units) reload: Extensions changed - reload required safeMode: title: Extensions Safe Mode @@ -4119,19 +4676,34 @@ plugins: title: Extension support is not enabled prompt: cant: Automatic installation is not available - required Helm Charts could not be found +<<<<<<< HEAD can: You need to install the Extension Operator install: title: Enable Extension Support? prompt: This will install the Helm charts to enable Extension support airgap: The Rancher Extensions Repository provides extensions published by Rancher. Un-check if your Rancher installation is air-gapped +======= + can: You need to install the extension operator + install: + title: Enable Extension Support? + prompt: This will install the Helm charts to enable extension support + airgap: The Rancher extensions repository provides extensions published by Rancher. De-select if your Rancher installation is air-gapped +>>>>>>> b5455bcb (fix: separate used/allocated units) addRancherRepo: Add the Rancher Extension Repository remove: label: Disable Extension Support title: Disable Extension Support? +<<<<<<< HEAD prompt: This will un-install the Helm charts that enable Extension support registry: title: Remove the Rancher Extensions Repository prompt: The Rancher Extensions Repository provides extensions published by Rancher +======= + prompt: This will un-install the Helm charts that enable extension support + registry: + title: Remove the Rancher Extensions Repository + prompt: The Rancher extension repository provides extensions published by Rancher +>>>>>>> b5455bcb (fix: separate used/allocated units) crd: title: Remove the Rancher Extensions Custom Resource Definition prompt: There are one or more extensions installed - removing the CRD will require you to manually reinstall these extensions if you subsequently re-enable extensions support. @@ -4154,7 +4726,11 @@ podSecurityAdmission: placeholder: 'Version (default: latest)' exemptions: title: Exemptions +<<<<<<< HEAD description: Allow the creation of pods for specific Usernames, RuntimeClassNames, and Namespaces that would otherwise be prohibited due to the policies set above. +======= + description: Allow the creation of pods for specific usernames, RuntimeClassNames, and namespaces that would otherwise be prohibited due to the policies set above. +>>>>>>> b5455bcb (fix: separate used/allocated units) placeholder: Enter a comma separated list of {psaExemptionsControl} prefs: title: Preferences @@ -4192,9 +4768,15 @@ prefs: advFeatures: title: Advanced Features viewInApi: Enable "View in API" +<<<<<<< HEAD allNamespaces: Show system Namespaces managed by Rancher (not intended for editing or deletion) themeShortcut: Enable Dark/Light Theme keyboard shortcut toggle (shift+T) pluginDeveloper: Enable Extension developer features +======= + allNamespaces: Show system namespaces managed by Rancher (not intended for editing or deletion) + themeShortcut: Enable Dark/Light theme keyboard shortcut toggle (shift+T) + pluginDeveloper: Enable extension developer features +>>>>>>> b5455bcb (fix: separate used/allocated units) hideDesc: label: Hide All Type Descriptions helm: @@ -4250,9 +4832,15 @@ project: members: label: Members containerDefaultResourceLimit: Container Default Resource Limit +<<<<<<< HEAD vmDefaultResourceLimit: VM Default Resource Limit resourceQuotas: Resource Quotas haveOneOwner: There must be at least one member with the Owner role. +======= + vmDefaultResourceLimit: Virtual Machine Default Resource Limit + resourceQuotas: Resource Quotas + haveOneOwner: There must be at least one member with the owner role. +>>>>>>> b5455bcb (fix: separate used/allocated units) psp: default: Cluster Default label: Pod Security Policy @@ -4264,11 +4852,16 @@ projectMembers: label: Project projectPermissions: label: Project Permissions +<<<<<<< HEAD description: Controls what access users have to the Project +======= + description: Controls what access users have to the project +>>>>>>> b5455bcb (fix: separate used/allocated units) noDescription: User created - no description searchForMember: Search for a member to provide project access owner: label: Owner +<<<<<<< HEAD description: Owners have full control over the Project and all resources inside it. member: label: Member @@ -4276,11 +4869,24 @@ projectMembers: readOnly: label: Read Only description: Members can only view the resources inside the Project but not change the resources. +======= + description: Owners have full control over the project and all resources inside it. + member: + label: Member + description: Members can manage the resources inside the project but not change the project itself. + readOnly: + label: Read Only + description: Members can only view the resources inside the project but not change the resources. +>>>>>>> b5455bcb (fix: separate used/allocated units) custom: label: Custom description: Choose individual roles for this user. createNs: Create Namespaces +<<<<<<< HEAD configmapsManage: Manage Config Maps +======= + configmapsManage: Manage Configuration Maps +>>>>>>> b5455bcb (fix: separate used/allocated units) ingressManage: Manage Ingress projectcatalogsManage: Manage Project Catalogs projectroletemplatebindingsManage: Manage Project Members @@ -4289,7 +4895,11 @@ projectMembers: servicesManage: Manage Services persistentvolumeclaimsManage: Manage Volumes workloadsManage: Manage Workloads +<<<<<<< HEAD configmapsView: View Config Maps +======= + configmapsView: View Configuration Maps +>>>>>>> b5455bcb (fix: separate used/allocated units) ingressView: View Ingress monitoringUiView: View Monitoring projectcatalogsView: View Project Catalogs @@ -4325,7 +4935,11 @@ prometheusRule: summary: input: Summary Annotation Value label: Summary +<<<<<<< HEAD bannerText: 'When firing alerts, the annotations and labels will be passed to the configured AlertManagers to allow them to construct the notification that will be sent to any configured Receivers.' +======= + bannerText: 'When firing alerts, the annotations and labels will be passed to the configured AlertManagers to allow them to construct the notification that will be sent to any configured receivers.' +>>>>>>> b5455bcb (fix: separate used/allocated units) for: label: Wait to fire for placeholder: '60' @@ -4364,14 +4978,22 @@ prometheusRule: promptForceRemove: modalTitle: Are you sure? +<<<<<<< HEAD removeWarning: "There was an issue with deleting underlying infrastructure. If you proceed with this action, the Machine {nameToMatch} will be deleted from Rancher only. It's highly recommended to manually delete any referenced infrastructure." +======= + removeWarning: "There was an issue with deleting underlying infrastructure. If you proceed with this action, the Machine {nameToMatch} will be deleted from Rancher only. We recommend to manually delete any referenced infrastructure." +>>>>>>> b5455bcb (fix: separate used/allocated units) forceDelete: Force Delete confirmName: "Enter in the pool name below to confirm:" podRemoveWarning: "Force deleting pods does not wait for confirmation that the pod's processes have been terminated. This may result in data corruption or inconsistencies" promptScaleMachineDown: attemptingToRemove: "You are attempting to delete {count} {type}" +<<<<<<< HEAD retainedMachine1: At least one Machine must exist for roles Control Plane and Etcd. +======= + retainedMachine1: At least one machine must exist for roles control plane and Etcd. +>>>>>>> b5455bcb (fix: separate used/allocated units) retainedMachine2: { name } will remain promptRemove: @@ -4383,7 +5005,11 @@ promptRemove: other { and {count} others.} } attemptingToRemove: "You are attempting to delete the {type}" +<<<<<<< HEAD attemptingToRemoveAuthConfig: "You are attempting to disable this Auth Provider.

    Be aware that cluster role template bindings, project role template bindings, global role bindings, users, tokens will be all deleted.

    Are you sure you want to proceed?" +======= + attemptingToRemoveAuthConfig: "You are attempting to disable this authenticator provider.

    Be aware that cluster role template bindings, project role template bindings, global role bindings, users, tokens will be all deleted.

    Are you sure you want to proceed?" +>>>>>>> b5455bcb (fix: separate used/allocated units) protip: "Tip: Hold the {alternateLabel} key while clicking delete to bypass this confirmation" confirmName: "Enter {nameToMatch} below to confirm:" deleteAssociatedNamespaces: "Also delete the namespaces in this project:" @@ -4425,7 +5051,11 @@ promptSaveAsRKETemplate: promptRotateEncryptionKey: title: Rotate Encryption Keys description: The last backup {name} was performed on {date} +<<<<<<< HEAD warning: Before proceeding, ensure a successful ETCD backup of the cluster has been completed. +======= + warning: Before proceeding, ensure a successful etcd backup of the cluster has been completed. +>>>>>>> b5455bcb (fix: separate used/allocated units) error: No backup found rancherAlertingDrivers: @@ -4525,10 +5155,17 @@ rbac: description: Administrators have full control over the entire installation and all resources in all clusters. restricted-admin: label: Restricted Administrator +<<<<<<< HEAD description: Restricted Admins have full control over all resources in all downstream clusters but no access to the local cluster. user: label: Standard User description: Standard Users can create new clusters and manage clusters and projects they have been granted access to. +======= + description: Restricted administrators have full control over all resources in all downstream clusters but no access to the local cluster. + user: + label: Standard User + description: Standard users can create new clusters and manage clusters and projects they have been granted access to. +>>>>>>> b5455bcb (fix: separate used/allocated units) user-base: label: User-Base description: User-Base users have login-access only. @@ -4540,10 +5177,17 @@ rbac: description: Allows the user to create new RKE cluster templates and become the owner of them. authn-manage: label: Configure Authentication +<<<<<<< HEAD description: Allows the user to enable, configure, and disable all Authentication provider settings. catalogs-manage: label: Legacy Configure Catalogs description: Allows the user to add, edit, and remove management.cattle.io based catalogs resources. +======= + description: Allows the user to enable, configure, and disable all authentication provider settings. + catalogs-manage: + label: Legacy Configure Catalogs + description: Allows the user to add, edit, and remove management.cattle.io-based catalog resources. +>>>>>>> b5455bcb (fix: separate used/allocated units) clusters-manage: label: Manage all Clusters description: Allows the user to manage all clusters, including ones they are not a member of. @@ -4558,21 +5202,33 @@ rbac: description: Allows the user to enable and disable custom features via feature flag settings. nodedrivers-manage: label: Configure Node Drivers +<<<<<<< HEAD description: Allows the user to enable, configure, and remove all Node Driver settings. nodetemplates-manage: label: Manage Node Templates description: Allows the user to define, edit, and remove Node Templates. +======= + description: Allows the user to enable, configure, and remove all node driver settings. + nodetemplates-manage: + label: Manage Node Templates + description: Allows the user to define, edit, and remove node templates. +>>>>>>> b5455bcb (fix: separate used/allocated units) podsecuritypolicytemplates-manage: label: Manage Pod Security Policies (PSPs) description: Allows the user to define, edit, and remove PSPs. roles-manage: label: Manage Roles +<<<<<<< HEAD description: Allows the user to define, edit, and remove Role definitions. +======= + description: Allows the user to define, edit, and remove role definitions. +>>>>>>> b5455bcb (fix: separate used/allocated units) settings-manage: label: Manage Settings description: 'Allows the user to manage {vendor} Settings.' users-manage: label: Manage Users +<<<<<<< HEAD description: Allows the user to create, remove, and set passwords for all Users. catalogs-use: label: Use Catalogs @@ -4583,6 +5239,18 @@ rbac: view-rancher-metrics: label: 'View {vendor} Metrics' description: Allows the user to view Metrics through the API. +======= + description: Allows the user to create, remove, and set passwords for all users. + catalogs-use: + label: Use Catalogs + description: Allows the user to see and deploy templates from the catalog. Standard users have this permission by default. + nodetemplates-use: + label: Use Node Templates + description: Allows the user to deploy new nodes using any existing node templates. + view-rancher-metrics: + label: 'View {vendor} Metrics' + description: Allows the user to view metrics through the API. +>>>>>>> b5455bcb (fix: separate used/allocated units) base: label: Login Access clustertemplaterevisions-create: @@ -4623,8 +5291,13 @@ resourceDetail: age: Age restartCount: Pod Restarts defaultBannerMessage: +<<<<<<< HEAD error: This resource is currently in an error state, but there isn't a detailed message available. transitioning: This resource is currently in a transitioning state, but there isn't a detailed message available. +======= + error: This resource is currently in an error state, but a detailed message is not available. + transitioning: This resource is currently in a transitioning state, a detailed message is not available. +>>>>>>> b5455bcb (fix: separate used/allocated units) sensitive: hide: Hide Sensitive Values show: Show Sensitive Values @@ -4638,7 +5311,11 @@ resourceDetail: managedWarning: |- This {type} is managed by {hasName, select, no {a {managedBy} app} +<<<<<<< HEAD yes {the {managedBy} app {appName}}}; changes made here will likely be overwritten the next time {managedBy} runs. +======= + yes {the {managedBy} app {appName}}}; changes made here can be overwritten the next time {managedBy} runs. +>>>>>>> b5455bcb (fix: separate used/allocated units) resourceList: head: create: Create @@ -4686,7 +5363,11 @@ resourceTabs: resourceYaml: errors: +<<<<<<< HEAD namespaceRequired: This resource is namespaced, so a namespace must be provided. +======= + namespaceRequired: This resource is namespaced; a namespace must be provided. +>>>>>>> b5455bcb (fix: separate used/allocated units) buttons: continue: Continue Editing edit: Edit YAML @@ -4757,12 +5438,20 @@ secret: relatedWorkloads: Related Workloads typeDescriptions: custom: +<<<<<<< HEAD description: Create a Secret with a custom type +======= + description: Create a secret with a custom type +>>>>>>> b5455bcb (fix: separate used/allocated units) 'kubernetes.io/basic-auth': description: 'Authentication with a username and password' docLink: https://kubernetes.io/docs/concepts/configuration/secret/#basic-authentication-secret 'Opaque': +<<<<<<< HEAD description: Default type of Secret using key-value pairs +======= + description: Default type of secret using key-value pairs +>>>>>>> b5455bcb (fix: separate used/allocated units) docLink: https://kubernetes.io/docs/concepts/configuration/secret/#opaque-secrets 'kubernetes.io/dockerconfigjson': description: Authenticated registry for pulling container images @@ -4831,9 +5520,15 @@ serviceTypes: nodeport: Node Port servicesPage: +<<<<<<< HEAD serviceListDescription: Services allow you to define a logical set of Pods that can be accessed with a single IP address and port. targetPorts: The Service will send requests to this port, and the selected Pods are expected to listen on this port. listeningPorts: The Service is exposed on this port. +======= + serviceListDescription: Services allow you to define a logical set of pods that can be accessed with a single IP address and port. + targetPorts: The service will send requests to this port, and the selected pods are expected to listen on this port. + listeningPorts: The service is exposed on this port. +>>>>>>> b5455bcb (fix: separate used/allocated units) anyNode: Any Node labelsAnnotations: label: Labels & Annotations @@ -4848,7 +5543,11 @@ servicesPage: placeholder: e.g. 10800 externalName: define: External Name +<<<<<<< HEAD helpText: "External Name is intended to specify a canonical DNS name. This is a required field. To hardcode an IP address, use a Headless service." +======= + helpText: "External name is intended to specify a canonical DNS name. This is a required field. To hardcode an IP address, use a headless service." +>>>>>>> b5455bcb (fix: separate used/allocated units) label: External Name placeholder: e.g. my.database.example.com input: @@ -4893,7 +5592,11 @@ servicesPage: serviceTypes: clusterIp: abbrv: IP +<<<<<<< HEAD description: Expose a set of Pods to other Pods within the cluster. This type of Service is only reachable from within the cluster. This is the default type. +======= + description: Expose a set of pods to other pods within the cluster. This type of service is only reachable from within the cluster. This is the default type. +>>>>>>> b5455bcb (fix: separate used/allocated units) label: Cluster IP externalName: abbrv: EN @@ -4918,7 +5621,11 @@ setup: currentPassword: Bootstrap Password confirmPassword: Confirm New Password defaultPassword: +<<<<<<< HEAD intro: It looks like this is your first time visiting {vendor}; if you pre-set your own bootstrap password, enter it here. Otherwise a random one has been generated for you. To find it:

    +======= + intro: It looks like this is your first time visiting {vendor}; if you have pre-set your own bootstrap password, enter it here. Otherwise a random one has been generated for you. To find it:

    +>>>>>>> b5455bcb (fix: separate used/allocated units) dockerPrefix: 'For a "docker run" installation:' dockerPs: 'Find your container ID with docker ps, then run:' dockerSuffix: "" @@ -5278,7 +5985,11 @@ tableHeaders: apiGroup: API Groups apikey: API Key available: Available +<<<<<<< HEAD attachedVM: Attached VM +======= + attachedVM: Attached Virtual Machine +>>>>>>> b5455bcb (fix: separate used/allocated units) authRoles: globalDefault: New User Default @@ -5381,7 +6092,11 @@ tableHeaders: namespaceName: Name namespaceNameUnlinked: Name networkType: Type +<<<<<<< HEAD networkVlan: Vlan ID +======= + networkVlan: VLAN ID +>>>>>>> b5455bcb (fix: separate used/allocated units) node: Node nodeName: Node Name nodesReady: Nodes Ready @@ -5471,6 +6186,10 @@ tableHeaders: targetKind: Target Type targetPort: Target template: Template +<<<<<<< HEAD +======= + totalSnapshotQuota: Total Snapshot Quota +>>>>>>> b5455bcb (fix: separate used/allocated units) type: Type updated: Updated up-to-date: Up To Date @@ -5549,7 +6268,11 @@ validation: name: Cluster name cannot be 'local' or take the form 'c-xxxxx' conflict: |- This resource has been modified since you started editing it, and some of those modifications conflict with your changes. +<<<<<<< HEAD This screen has been updated to reflect the current values on the cluster. Review and reapply the changes you wanted to make, then Save again. +======= + This screen has been updated to reflect the current values on the cluster. Review and reapply the changes you wanted to make, then save again. +>>>>>>> b5455bcb (fix: separate used/allocated units) Conflicting {fieldCount, plural, =1 {field} other {fields}}: {fields} custom: missing: 'No validator exists for { validatorName }! Does the validator exist in custom-validators? Is the name spelled correctly?' @@ -5578,7 +6301,11 @@ validation: global: Requires "Cluster Output" to be selected. output: logdna: +<<<<<<< HEAD apiKey: Required an "Api Key" to be set. +======= + apiKey: Required an "API Key" to be set. +>>>>>>> b5455bcb (fix: separate used/allocated units) invalidCron: Invalid cron schedule k8s: name: Must consist of lower case alphanumeric characters or '-', and must start and end with an alphanumeric character (e.g. 'my-name', or '123-abc'). @@ -5618,17 +6345,28 @@ validation: port: A port must be a number between 1 and 65535. path: '"{key}" must be an absolute path' prometheusRule: +<<<<<<< HEAD noEdit: This Prometheus Rule may not be edited due to invalid characters in name. +======= + noEdit: This Prometheus rule may not be edited due to invalid characters in name. +>>>>>>> b5455bcb (fix: separate used/allocated units) groups: required: At least one rule group is required. singleAlert: A rule may contain alert rules or recording rules but not both. valid: name: 'Name is required for rule group {index}.' rule: +<<<<<<< HEAD alertName: 'Rule group {groupIndex} rule {ruleIndex} requires a Alert Name.' expr: 'Rule group {groupIndex} rule {ruleIndex} requires a PromQL Expression.' labels: 'Rule group {groupIndex} rule {ruleIndex} requires at least one label. Severity is recommended.' recordName: 'Rule group {groupIndex} rule {ruleIndex} requires a Time Series Name.' +======= + alertName: 'Rule group {groupIndex} rule {ruleIndex} requires a alert name.' + expr: 'Rule group {groupIndex} rule {ruleIndex} requires a PromQL expression.' + labels: 'Rule group {groupIndex} rule {ruleIndex} requires at least one label. Severity is recommended.' + recordName: 'Rule group {groupIndex} rule {ruleIndex} requires a time series name.' +>>>>>>> b5455bcb (fix: separate used/allocated units) singleEntry: 'At least one alert rule or one recording rule is required in rule group {index}.' required: '"{key}" is required' invalid: '"{key}" is invalid' @@ -5637,12 +6375,21 @@ validation: roleTemplate: roleTemplateRules: missingVerb: You must specify at least one verb for each resource grant +<<<<<<< HEAD missingResource: You must specify a Resource for each resource grant missingApiGroup: You must specify an API Group for each resource grant missingOneResource: You must specify at least one Resource, Non-Resource URL or API Group for each resource grant service: externalName: none: External Name is required on an ExternalName Service. +======= + missingResource: You must specify a resource for each resource grant + missingApiGroup: You must specify an API group for each resource grant + missingOneResource: You must specify at least one resource, non-resource URL or API group for each resource grant + service: + externalName: + none: External name is required on an ExternalName service. +>>>>>>> b5455bcb (fix: separate used/allocated units) ports: name: required: 'Port Rule [{position}] - Name is required.' @@ -5670,7 +6417,11 @@ validation: missingProjectId: A target must have a project selected. monitoring: route: +<<<<<<< HEAD match: At least one Match or Match Regex must be selected +======= + match: At least one match or match regex must be selected +>>>>>>> b5455bcb (fix: separate used/allocated units) interval: '"{key}" must be of a format with digits followed by a unit i.e. 1h, 2m, 30s' tab: "One or more fields in this tab contain a form validation error" @@ -5762,9 +6513,15 @@ workload: initialDelay: Initial Delay livenessProbe: Liveness Check livenessTip: Containers will be restarted when this check is failing. Not recommended for most uses. +<<<<<<< HEAD noHealthCheck: "There is not a Readiness Check, Liveness Check or Startup Check configured." readinessProbe: Readiness Checks readinessTip: Containers will be removed from service endpoints when this check is failing. Recommended. +======= + noHealthCheck: "There is not a readiness check, liveness check or startup check configured." + readinessProbe: Readiness Checks + readinessTip: Containers will be removed from service endpoints when this check is failing. Recommended. +>>>>>>> b5455bcb (fix: separate used/allocated units) startupProbe: Startup Check startupTip: Containers will wait until this check succeeds before attempting other health checks. successThreshold: Success Threshold @@ -5830,9 +6587,15 @@ workload: noServiceAccess: You do not have permission to create or manage services ports: expose: Networking +<<<<<<< HEAD description: 'Define a Service to expose the container, or define a non-functional, named port so that humans will know where the app within the container is expected to run.' detailedDescription: If ClusterIP, LoadBalancer, or NodePort is selected, a Service is automatically created that will select the Pods in this workload using labels. toolTip: 'For help exposing workloads on Kubernetes, see the official Kubernetes documentation on Services. You can also manually create a Service to expose Pods by selecting their labels, and you can use an Ingress to map HTTP routes to Services.' +======= + description: 'Define a service to expose the container, or define a non-functional, named port so that other users will know where the application within the container is expected to run.' + detailedDescription: If ClusterIP, LoadBalancer, or NodePort is selected, a service is automatically created that will select the pods in this workload using labels. + toolTip: 'For help exposing workloads on Kubernetes, see the official Kubernetes documentation on services. You can also manually create a service to expose pods by selecting their labels, and you can use an ingress to map HTTP routes to services.' +>>>>>>> b5455bcb (fix: separate used/allocated units) createService: Service Type noCreateService: Do not create a service containerPort: Private Container Port @@ -5906,6 +6669,7 @@ workload: detail: services: Services ingresses: Ingresses +<<<<<<< HEAD cannotViewServices: Could not list Services due to lack of permission. cannotFindServices: Could not find any Services that select Pods from this workload. serviceListCaption: "The following Services select Pods from this workload:" @@ -5913,6 +6677,15 @@ workload: cannotFindIngresses: Could not find any Ingresses that forward traffic to Services that select Pods in this workload. ingressListCaption: "The following Ingresses forward traffic to Services that select Pods from this workload:" cannotViewIngressesBecauseCannotViewServices: Could not find relevant relevant Ingresses due to lack of permission to view Services. +======= + cannotViewServices: Could not list services due to lack of permission. + cannotFindServices: Could not find any services that select pods from this workload. + serviceListCaption: "The following services select pods from this workload:" + cannotViewIngresses: Could not list ingresses due to lack of permission. + cannotFindIngresses: Could not find any ingresses that forward traffic to services that select pods in this workload. + ingressListCaption: "The following ingresses forward traffic to services that select pods from this workload:" + cannotViewIngressesBecauseCannotViewServices: Could not find relevant relevant ingresses due to lack of permission to view services. +>>>>>>> b5455bcb (fix: separate used/allocated units) pods: title: Pods detailTop: @@ -6101,7 +6874,11 @@ workload: addMount: Add Mount addVolume: Add Volume selectVolume: Select Volume +<<<<<<< HEAD noVolumes: Volumes will appear here after they are added in the Pod tab +======= + noVolumes: Volumes will appear here after they are added in the pod tab +>>>>>>> b5455bcb (fix: separate used/allocated units) certificate: Certificate csi: diskName: Disk Name @@ -6132,12 +6909,21 @@ workload: defaultMode: Default Mode driver: driver hostPath: +<<<<<<< HEAD label: The Path on the Node must be options: default: 'Anything: do not check the target path' directoryOrCreate: A directory, or create if it doesn't exist directory: An existing directory fileOrCreate: A file, or create if it doesn't exist +======= + label: The Path on the node must be + options: + default: 'Anything: do not check the target path' + directoryOrCreate: A directory, or create if it does not exist + directory: An existing directory + fileOrCreate: A file, or create if it does not exist +>>>>>>> b5455bcb (fix: separate used/allocated units) file: An existing file socket: An existing socket charDevice: An existing character device @@ -6166,11 +6952,19 @@ workload: placeholder: "e.g. 300" typeDescriptions: apps.daemonset: DaemonSets run exactly one pod on every eligible node. When new nodes are added to the cluster, DaemonSets automatically deploy to them. Recommended for system-wide or vertically-scalable workloads that never need more than one pod per node. +<<<<<<< HEAD apps.deployment: Deployments run a scalable number of replicas of a pod distributed among the eligible nodes. Changes are rolled out incrementally and can be rolled back to the previous revision when needed. Recommended for stateless & horizontally-scalable workloads. apps.statefulset: StatefulSets manage stateful applications and provide guarantees about the ordering and uniqueness of the pods created. Recommended for workloads with persistent storage or strict identity, quorum, or upgrade order requirements. batch.cronjob: CronJobs create Jobs, which then run Pods, on a repeating schedule. The schedule is expressed in standard Unix cron format, and uses the timezone of the Kubernetes control plane (typically UTC). batch.job: Jobs create one or more pods to reliably perform a one-time task by running a pod until it exits successfully. Failed pods are automatically replaced until the specified number of completed runs has been reached. Jobs can also run multiple pods in parallel or function as a batch work queue. pod: Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. A Pod is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. +======= + apps.deployment: Deployments run a scalable number of replicas of a pod distributed among the eligible nodes. Changes are rolled out incrementally and can be rolled back to the previous revision when needed. Recommended for stateless and horizontally-scalable workloads. + apps.statefulset: StatefulSets manage stateful applications and provide guarantees about the ordering and uniqueness of the pods created. Recommended for workloads with persistent storage or strict identity, quorum, or upgrade order requirements. + batch.cronjob: CronJobs create jobs, which then run pods, on a repeating schedule. The schedule is expressed in standard Unix cron format, and uses the timezone of the Kubernetes control plane (typically UTC). + batch.job: Jobs create one or more pods to reliably perform a one-time task by running a pod until it exits successfully. Failed pods are automatically replaced until the specified number of completed runs has been reached. Jobs can also run multiple pods in parallel or function as a batch work queue. + pod: Pods are the smallest deployable units of computing that you can create and manage in Kubernetes. A pod is a group of one or more containers, with shared storage and network resources, and a specification for how to run the containers. +>>>>>>> b5455bcb (fix: separate used/allocated units) upgrading: activeDeadlineSeconds: label: Pod Active Deadline @@ -6179,8 +6973,13 @@ workload: label: Concurrency options: allow: Allow CronJobs to run concurrently +<<<<<<< HEAD forbid: Skip next run if current run hasn't finished replace: Replace run if current run hasn't finished +======= + forbid: Skip next run if current run has not finished + replace: Replace run if current run has not finished +>>>>>>> b5455bcb (fix: separate used/allocated units) maxSurge: label: Max Surge tip: The maximum number of pods allowed beyond the desired scale at any given time. @@ -6202,7 +7001,11 @@ workload: labels: delete: "On Delete: New pods are only created when old pods are manually deleted." recreate: "Recreate: Kill ALL pods, then start new pods." +<<<<<<< HEAD rollingUpdate: "Rolling Update: Create new pods, until max surge is reached, before deleting old pods. Don't stop more pods than max unavailable." +======= + rollingUpdate: "Rolling Update: Create new pods, until max surge is reached, before deleting old pods. Do not stop more pods than max unavailable." +>>>>>>> b5455bcb (fix: separate used/allocated units) terminationGracePeriodSeconds: label: Termination Grace Period tip: The duration the pod needs to terminate successfully. @@ -6299,14 +7102,22 @@ typeDescription: cis.cattle.io.clusterscanprofile: A profile is the configuration for the CIS scan, which is the benchmark versions to use and any specific tests to skip in that benchmark. cis.cattle.io.clusterscan: A scan is created to trigger a CIS scan on the cluster based on the defined profile. A report is created after the scan is completed. cis.cattle.io.clusterscanreport: A report is the result of a CIS scan of the cluster. +<<<<<<< HEAD management.cattle.io.feature: Feature Flags allow certain {vendor} features to be toggled on and off. Features that are off by default should be considered experimental functionality. cluster.x-k8s.io.machine: A Machine encapsulates the configuration of a Kubernetes Node. Use this view to see what happens after updating a cluster. cluster.x-k8s.io.machinedeployment: A Machine Deployment orchestrates deployments via templates over a collection of Machine Sets (similar to a Deployment). Use this view to see what happens after updating a cluster. cluster.x-k8s.io.machineset: A Machine Set ensures the desired number of Machine resources are up and running at all times (similar to a ReplicaSet). Use this view to see what happens after updating a cluster. +======= + management.cattle.io.feature: Feature flags allow certain {vendor} features to be toggled on and off. Features that are off by default should be considered experimental functionality. + cluster.x-k8s.io.machine: A machine encapsulates the configuration of a Kubernetes node. Use this view to see what happens after updating a cluster. + cluster.x-k8s.io.machinedeployment: A machine deployment orchestrates deployments via templates over a collection of machine sets (similar to a deployment). Use this view to see what happens after updating a cluster. + cluster.x-k8s.io.machineset: A machine set ensures the desired number of machine resources are up and running at all times (similar to a ReplicaSet). Use this view to see what happens after updating a cluster. +>>>>>>> b5455bcb (fix: separate used/allocated units) resources.cattle.io.backup: A backup is created to perform one-time backups or schedule recurring backups based on a ResourceSet. resources.cattle.io.restore: A restore is created to trigger a restore to the cluster based on a backup file. resources.cattle.io.resourceset: A resource set defines which CRDs and resources to store in the backup. monitoring.coreos.com.servicemonitor: A service monitor defines the group of services and the endpoints that Prometheus will scrape for metrics. This is the most common way to define metrics collection. +<<<<<<< HEAD monitoring.coreos.com.podmonitor: A pod monitor defines the group of pods that Prometheus will scrape for metrics. The common way is to use service monitors, but pod monitors allow you to handle any situation where a service monitor wouldn't work. monitoring.coreos.com.prometheusrule: A Prometheus Rule resource defines both recording and/or alert rules. A recording rule can pre-compute values and save the results. Alerting rules allow you to define conditions on when to send notifications to AlertManager. monitoring.coreos.com.prometheus: A Prometheus server is a Prometheus deployment whose scrape configuration and rules are determined by selected ServiceMonitors, PodMonitors, and PrometheusRules and whose alerts will be sent to all selected Alertmanagers with the custom resource's configuration. @@ -6317,6 +7128,18 @@ typeDescription: catalog.cattle.io.operation: An operation is the list of recent Helm operations that have been applied to the cluster. catalog.cattle.io.app: An installed application is a Helm 3 chart that was installed either via our charts or through the Helm CLI. logging.banzaicloud.io.clusterflow: Logs from the cluster will be collected and logged to the selected Cluster Output. +======= + monitoring.coreos.com.podmonitor: A pod monitor defines the group of pods that Prometheus will scrape for metrics. The common way is to use service monitors, but pod monitors allow you to handle any situation where a service monitor would not work. + monitoring.coreos.com.prometheusrule: A Prometheus rule resource defines both recording or alert rules. A recording rule can pre-compute values and save the results. Alerting rules allow you to define conditions on when to send notifications to AlertManager. + monitoring.coreos.com.prometheus: A Prometheus server is a Prometheus deployment whose scrape configuration and rules are determined by selected ServiceMonitors, PodMonitors, and PrometheusRules and whose alerts will be sent to all selected Alertmanagers with the custom resource's configuration. + monitoring.coreos.com.alertmanager: An alert manager is deployment whose configuration will be specified by a secret in the same namespace, which determines which alerts should go to which receiver. + node: The base Kubernetes node resource represents a virtual or physical machine which hosts deployments. To manage the machine lifecycle, if available, go to Cluster Management. + catalog.cattle.io.clusterrepo: 'A chart repository is a Helm repository or {vendor} git based application catalog. It provides the list of available charts in the cluster.' + catalog.cattle.io.clusterrepo.local: 'A chart repository is a Helm repository or {vendor} git based application catalog. It provides the list of available charts in the cluster. Cluster Templates are deployed via Helm charts.' + catalog.cattle.io.operation: An operation is the list of recent Helm operations that have been applied to the cluster. + catalog.cattle.io.app: An installed application is a Helm 3 chart that was installed either via our charts or through the Helm CLI. + logging.banzaicloud.io.clusterflow: Logs from the cluster will be collected and logged to the selected cluster output. +>>>>>>> b5455bcb (fix: separate used/allocated units) logging.banzaicloud.io.clusteroutput: A cluster output defines which logging providers that logs can be sent to and is only effective when deployed in the namespace that the logging operator is in. logging.banzaicloud.io.flow: A flow defines which logs to collect and filter as well as which output to send the logs. The flow is a namespaced resource, which means logs will only be collected from the namespace that the flow is deployed in. logging.banzaicloud.io.output: An output defines which logging providers that logs can be sent to. The output needs to be in the same namespace as the flow that is using it. @@ -6350,8 +7173,13 @@ typeLabel: } catalog.cattle.io.app: |- {count, plural, +<<<<<<< HEAD one { Installed App } other { Installed Apps } +======= + one { Installed Application } + other { Installed Applications } +>>>>>>> b5455bcb (fix: separate used/allocated units) } catalog.cattle.io.clusterrepo: |- {count, plural, @@ -6360,6 +7188,7 @@ typeLabel: } catalog.cattle.io.repo: |- {count, plural, +<<<<<<< HEAD one { Namespaced Repo } other { Namespaced Repos } } @@ -6372,6 +7201,20 @@ typeLabel: {count, plural, one { App } other { Apps } +======= + one { Namespaced Repository } + other { Namespaced Repositories } + } + chartinstallaction: |- + {count, plural, + one { Application } + other { Applications } + } + chartupgradeaction: |- + {count, plural, + one { Application } + other { Applications } +>>>>>>> b5455bcb (fix: separate used/allocated units) } cloudcredential: |- {count, plural, @@ -6395,8 +7238,13 @@ typeLabel: } fleet.cattle.io.gitrepo: |- {count, plural, +<<<<<<< HEAD one { Git Repo } other {Git Repos } +======= + one { Git Repository } + other {Git Repositories } +>>>>>>> b5455bcb (fix: separate used/allocated units) } management.cattle.io.authconfig: |- {count, plural, @@ -6501,8 +7349,13 @@ typeLabel: } 'management.cattle.io.cluster': |- {count, plural, +<<<<<<< HEAD one { Mgmt Cluster } other { Mgmt Clusters } +======= + one { Manaagement Cluster } + other { Management Clusters } +>>>>>>> b5455bcb (fix: separate used/allocated units) } 'cluster.x-k8s.io.cluster': |- {count, plural, @@ -6681,8 +7534,13 @@ typeLabel: } harvesterhci.io.cloudtemplate: |- {count, plural, +<<<<<<< HEAD one { Cloud Config Template } other { Cloud Config Templates } +======= + one { Cloud Configuration Template } + other { Cloud Configuration Templates } +>>>>>>> b5455bcb (fix: separate used/allocated units) } fleet.cattle.io.content: |- {count, plural, @@ -6701,8 +7559,13 @@ typeLabel: } k3s.cattle.io.addon: |- {count, plural, +<<<<<<< HEAD one { Addon } other { Addons } +======= + one { Add-on } + other { Add-ons } +>>>>>>> b5455bcb (fix: separate used/allocated units) } management.cattle.io.apiservice: |- {count, plural, @@ -6801,8 +7664,13 @@ typeLabel: } management.cattle.io.rkeaddon: |- {count, plural, +<<<<<<< HEAD one { RkeAddon } other { RkeAddons } +======= + one { RKEAddon } + other { RKEAddons } +>>>>>>> b5455bcb (fix: separate used/allocated units) } management.cattle.io.rkek8sserviceoption: |- {count, plural, @@ -6811,8 +7679,13 @@ typeLabel: } management.cattle.io.rkek8ssystemimage: |- {count, plural, +<<<<<<< HEAD one { RkeK8sSystemImage } other { RkeK8sSystemImages } +======= + one { RKEK8sSystemImage } + other { RKEK8sSystemImages } +>>>>>>> b5455bcb (fix: separate used/allocated units) } rbac.authorization.k8s.io.clusterrolebinding: |- {count, plural, @@ -6880,6 +7753,10 @@ action: viewYaml: View YAML activate: Activate deactivate: Deactivate +<<<<<<< HEAD +======= + editQuota: Edit Quota +>>>>>>> b5455bcb (fix: separate used/allocated units) show: Show hide: Hide copy: Copy @@ -6917,11 +7794,19 @@ podAffinity: keyValue: keyPlaceholder: e.g. foo valuePlaceholder: e.g. bar +<<<<<<< HEAD protip: 'Paste lines of key=value or key: value into any key field for easy bulk entry' registryMirror: header: Mirrors toolTip: 'Mirrors can be used to redirect requests for images from one registry to come from a list of endpoints you specify instead. For example docker.io could redirect to your internal registry instead of ever going to DockerHub.' +======= + protip: 'Paste lines of key=value or key:value into any key field for easy bulk entry' + +registryMirror: + header: Mirrors + toolTip: 'Mirrors can be used to redirect requests for images from one registry to come from a list of endpoints you specify instead. For example docker.io could redirect to your internal registry instead of ever going to DockerHub.' +>>>>>>> b5455bcb (fix: separate used/allocated units) addLabel: Add Mirror description: Mirrors define the names and endpoints for private registries. The endpoints are tried one by one, and the first working one is used. hostnameLabel: Registry Hostname @@ -6950,7 +7835,11 @@ registryConfig: advancedSettings: label: Settings +<<<<<<< HEAD subtext: Typical users will not need to change these. Proceed with caution, incorrect values can break your {appName} installation. Settings which have been customized from default settings are tagged 'Modified'. +======= + subtext: Users will not need to change these settings. Proceed with caution as incorrect values can break your {appName} installation. Settings that have been customized from default settings are tagged with 'Modified'. +>>>>>>> b5455bcb (fix: separate used/allocated units) show: Show hide: Hide none: None @@ -6969,12 +7858,21 @@ advancedSettings: 'cluster-defaults': 'Override RKE Defaults when creating new clusters.' 'engine-install-url': 'Default Docker engine installation URL (for most node drivers).' 'engine-iso-url': 'Default OS installation URL (for vSphere driver).' +<<<<<<< HEAD 'engine-newest-version': 'The newest supported version of Docker at the time of this release. A Docker version that does not satisfy supported docker range but is newer than this will be marked as untested.' 'engine-supported-range': 'Semver range for supported Docker engine versions. Versions which do not satisfy this range will be marked unsupported in the UI.' 'ingress-ip-domain': 'Wildcard DNS domain to use for automatically generated Ingress hostnames. .. will be added to the domain.' 'server-url': 'Default {appName} install url. Must be HTTPS. All nodes in your cluster must be able to reach this.' 'system-default-registry': 'Private registry to be used for all Rancher System Container Images. If no value is specified, the default registry for the container runtime is used. For Docker and containerd, the default is `docker.io`.' 'ui-index': 'HTML index location for the Cluster Manager UI.' +======= + 'engine-newest-version': 'The newest supported version of Docker at the time of this release. A Docker version that does not satisfy supported docker range but is newer than this will be marked as untested.' + 'engine-supported-range': 'Semver range for supported Docker engine versions. Versions which do not satisfy this range will be marked unsupported in the UI.' + 'ingress-ip-domain': 'Wildcard DNS domain to use for automatically generated ingress hostnames. .. will be added to the domain.' + 'server-url': 'Default {appName} install url. Must be HTTPS. All nodes in your cluster must be able to reach this.' + 'system-default-registry': 'Private registry to be used for all Rancher system container images. If no value is specified, the default registry for the container runtime is used. For Docker and containerd, the default is `docker.io`.' + 'ui-index': 'HTML index location for the cluster manager UI.' +>>>>>>> b5455bcb (fix: separate used/allocated units) 'ui-dashboard-index': 'HTML index location for the {appName} UI.' 'ui-offline-preferred': 'Controls whether UI assets are served locally by the server container or from the remote URL defined in the ui-index and ui-dashboard-index settings. The `Dynamic` option will use local assets in production builds of {appName}.' 'ui-pl': 'Private-Label company name.' @@ -7039,19 +7937,33 @@ performance: label: Incremental Loading setting: You can configure the threshold above which incremental loading will be used. description: |- +<<<<<<< HEAD When enabled, resources will appear more quickly, but it may take slightly longer to load the entire set of resources. This setting only applies to resources that come from the Kubernetes API checkboxLabel: Enable incremental loading inputLabel: Resource Threshold incompatibleDescription: "Incremental Loading is incomaptible with Namespace/Project filtering. Enabling this will disable it." +======= + When enabled, resources will appear more quickly, but it may take slightly longer to load the entire set of resources. This setting only applies to resources that come from the Kubernetes API. + checkboxLabel: Enable incremental loading + inputLabel: Resource Threshold + incompatibleDescription: "Incremental Loading is incomaptible with namespace or project filtering. Enabling this will disable it." +>>>>>>> b5455bcb (fix: separate used/allocated units) manualRefresh: label: Manual Refresh setting: You can configure a threshold above which manual refresh will be enabled. buttonTooltip: Refresh list description: |- +<<<<<<< HEAD When enabled, list data will not auto-update but instead the user must manually trigger a list-view refresh. This setting only applies to resources that come from the Kubernetes API checkboxLabel: Enable manual refresh of data for lists inputLabel: Resource Threshold incompatibleDescription: "Manual Refresh is incomaptible with Namespace/Project filtering. Enabling this will disable it." +======= + When enabled, list data will not auto-update but instead the user must manually trigger a list-view refresh. This setting only applies to resources that come from the Kubernetes API. + checkboxLabel: Enable manual refresh of data for lists + inputLabel: Resource Threshold + incompatibleDescription: "Manual Refresh is incomaptible with namespace or project filtering. Enabling this will disable it." +>>>>>>> b5455bcb (fix: separate used/allocated units) websocketNotification: label: Websocket Notifications description: |- @@ -7059,7 +7971,11 @@ performance: checkboxLabel: Disable websocket notifications gc: label: Resource Garbage Collection +<<<<<<< HEAD description: The UI will cache kuberentes resources locally to avoid having to re-fetch them. In some cases this can lead to a large amount of data stored in the browser. Enable this setting to periodically remove them. +======= + description: The UI will cache Kubernetes resources locally to avoid having to re-fetch them. In some cases, this can lead to a large amount of data stored in the browser. Enable this setting to periodically remove them. +>>>>>>> b5455bcb (fix: separate used/allocated units) checkboxLabel: Enable Garbage Collection whenRun: description: Update when garbage collection runs @@ -7073,25 +7989,42 @@ performance: howRun: description: Update how garbage collection runs age: +<<<<<<< HEAD description: "Resource types musn't have been accessed within this period to be considered for garbage collection." +======= + description: "Resource types must not have been accessed within this period to be considered for garbage collection." +>>>>>>> b5455bcb (fix: separate used/allocated units) inputLabel: Resource Age count: description: Resource types must exceed this amount to be considered for garbage collection. inputLabel: Resource Count nsFiltering: label: Require Namespace / Project Filtering +<<<<<<< HEAD description: Require the user to select namespaces and/or projects. This restricts the number of resources fetched when viewing lists and should help the responsiveness of the UI in systems with a lot of resources. checkboxLabel: Enable Required Namespace / Project Filtering incompatibleDescription: "Required Namespace / Project Filtering is incomaptible with Manual Refresh and Incremental Loading. Enabling this will disable them." advancedWorker: label: Websocket Web Worker description: Updates to resources pushed to the UI come via WebSocket and are handled in the UI thread. Enable this option to handle cluster WebSocket updates in a Web Worker in a separate thread. This should help the responsiveness of the UI in systems where resources change often. +======= + description: Require the user to select namespaces or projects. This restricts the number of resources fetched when viewing lists and should help the responsiveness of the UI in systems with a lot of resources. + checkboxLabel: Enable Required Namespace or Project Filtering + incompatibleDescription: "Required namespace or project filtering is incomaptible with manual refresh and incremental Loading. Enabling this will disable them." + advancedWorker: + label: Websocket Web Worker + description: Updates to resources pushed to the UI come via WebSocket and are handled in the UI thread. Enable this option to handle cluster WebSocket updates in a web worker in a separate thread. This should help the responsiveness of the UI in systems where resources change often. +>>>>>>> b5455bcb (fix: separate used/allocated units) checkboxLabel: Enable Advanced Websocket Web Worker inactivity: title: Inactivity checkboxLabel: Enable inactivity session expiration inputLabel: Inactivity timeout (minutes) +<<<<<<< HEAD information: To change the automatic logout behaviour, edit the authorisation and/or session token timeout values (auth-user-session-ttl-minutes and auth-token-max-ttl-minutes) in the Settings page. +======= + information: To change the automatic log out behaviour, edit the authorisation and session token timeout values (auth-user-session-ttl-minutes and auth-token-max-ttl-minutes) in the settings page. +>>>>>>> b5455bcb (fix: separate used/allocated units) description: When enabled and the user is inactive past the specified timeout, the UI will no longer fresh page content and the user must reload the page to continue. authUserTTL: This timeout cannot be higher than the user session timeout auth-user-session-ttl-minutes, which is currently {current} minutes. @@ -7178,7 +8111,11 @@ resourceQuota: helpText: Configure how much of the resources the namespace as a whole can consume. helpTextDetail: The amount of resources the namespace as a whole can consume. helpTextHarvester: VMs need to reserve additional memory overhead. +<<<<<<< HEAD configMaps: Config Maps +======= + configMaps: Configuration Maps +>>>>>>> b5455bcb (fix: separate used/allocated units) limitsCpu: CPU Limit limitsMemory: Memory Limit persistentVolumeClaims: Persistent Volume Claims @@ -7262,8 +8199,13 @@ support: text: Login to SUSE Customer Center to access support for your subscription action: SUSE Customer Center aws: +<<<<<<< HEAD generateConfig: Generate Support Config text: 'Login to SUSE Customer Center to access support for your subscription. Need to open a new support case? Download a support config file below.' +======= + generateConfig: Generate Support Configuration + text: 'Login to SUSE Customer Center to access support for your subscription. Need to open a new support case? Download a support configuration file below.' +>>>>>>> b5455bcb (fix: separate used/allocated units) promos: one: title: 24x7 Support @@ -7297,7 +8239,11 @@ legacy: alerts: Alerts apps: Apps catalogs: Catalogs +<<<<<<< HEAD configMaps: Config Maps +======= + configMaps: Configuration Maps +>>>>>>> b5455bcb (fix: separate used/allocated units) configuration: Configuration globalDnsEntries: Global DNS Entries globalDnsProviders: Global DNS Providers @@ -7308,7 +8254,11 @@ legacy: project: label: Project +<<<<<<< HEAD select: "Use the Project/Namespace filter at the top of the page to select a Project in order to see legacy Project features." +======= + select: "Use the namespace or project filter at the top of the page to select a project in order to see legacy project features." +>>>>>>> b5455bcb (fix: separate used/allocated units) serverUpgrade: title: "{vendor} Server Changed" diff --git a/shell/cloud-credential/generic.vue b/shell/cloud-credential/generic.vue index 17ec5a1f8b0..4e6343d65d1 100644 --- a/shell/cloud-credential/generic.vue +++ b/shell/cloud-credential/generic.vue @@ -3,10 +3,20 @@ import CreateEditView from '@shell/mixins/create-edit-view'; import KeyValue from '@shell/components/form/KeyValue'; import { Banner } from '@components/Banner'; import { simplify, iffyFields, likelyFields } from '@shell/store/plugins'; +<<<<<<< HEAD export default { components: { KeyValue, Banner }, mixins: [CreateEditView], +======= +import Loading from '@shell/components/Loading'; + +export default { + components: { + KeyValue, Banner, Loading + }, + mixins: [CreateEditView], +>>>>>>> b5455bcb (fix: separate used/allocated units) props: { driverName: { @@ -15,19 +25,34 @@ export default { } }, +<<<<<<< HEAD data() { let keyOptions = []; const normanType = this.$store.getters['plugins/credentialFieldForDriver'](this.driverName); const normanSchema = this.$store.getters['rancher/schemaFor'](`${ normanType }credentialconfig`); +======= + async fetch() { + let keyOptions = []; + + const { normanSchema } = this; +>>>>>>> b5455bcb (fix: separate used/allocated units) if ( normanSchema?.resourceFields ) { keyOptions = Object.keys(normanSchema.resourceFields); } else { +<<<<<<< HEAD keyOptions = this.$store.getters['plugins/fieldNamesForDriver'](this.driverName); } // Prepopulate empty values for keys that sound like they're cloud-credential-ey +======= + keyOptions = await this.$store.getters['plugins/fieldNamesForDriver'](this.driverName); + } + + this.keyOptions = keyOptions; + +>>>>>>> b5455bcb (fix: separate used/allocated units) const keys = []; for ( const k of keyOptions ) { @@ -43,11 +68,24 @@ export default { this.value.setData(k, ''); } } +<<<<<<< HEAD return { hasSupport: !!normanSchema, keyOptions, errors: null, +======= + }, + + data() { + const normanType = this.$store.getters['plugins/credentialFieldForDriver'](this.driverName); + const normanSchema = this.$store.getters['rancher/schemaFor'](`${ normanType }credentialconfig`); + + return { + hasSupport: !!normanSchema, + errors: null, + normanSchema, +>>>>>>> b5455bcb (fix: separate used/allocated units) }; }, @@ -67,7 +105,12 @@ export default { +<<<<<<< HEAD
    +
    >>>>>> b5455bcb (fix: separate used/allocated units) class="cru-resource-yaml-container resource-container cru__content" > +<<<<<<< HEAD