Lint fixes

Signed-off-by: Francesco Torchia <francesco.torchia@suse.com>
This commit is contained in:
Francesco Torchia 2024-10-30 20:11:28 +01:00
parent 19b11aac2c
commit 4626d56acd
No known key found for this signature in database
GPG Key ID: E6D011B7415D4393
214 changed files with 3162 additions and 1298 deletions

View File

@ -102,7 +102,7 @@ export default {
},
onRemoveTag(tag) {
this.tags = this.tags.filter(v => v !== tag);
this.tags = this.tags.filter((v) => v !== tag);
this.$emit('update:value', this.tags);
},
}
@ -124,7 +124,9 @@ export default {
</div>
<div class="mt-10">
<Tag
v-for="(tag, i) in value" :key="i" class="tag"
v-for="(tag, i) in value"
:key="i"
class="tag"
>
<span>
{{ tag }}

View File

@ -70,8 +70,14 @@ export default {
<template>
<div class="filter">
<span v-if="parentSriov" class="banner-item bg-warning">
{{ parentSriov }} <i class="icon icon-close" @click="remove()" />
<span
v-if="parentSriov"
class="banner-item bg-warning"
>
{{ parentSriov }} <i
class="icon icon-close"
@click="remove()"
/>
</span>
<v-dropdown
@ -79,7 +85,10 @@ export default {
placement="bottom-end"
>
<slot name="header">
<button ref="actionDropDown" class="btn bg-primary mr-10">
<button
ref="actionDropDown"
class="btn bg-primary mr-10"
>
<slot name="title">
{{ label }}
</slot>

View File

@ -46,7 +46,7 @@ export default {
const valueOptions = [];
this.rows.map((row) => {
const isExistValue = valueOptions.find(value => value.label === row.labels[key]);
const isExistValue = valueOptions.find((value) => value.label === row.labels[key]);
if (Object.keys(row.labels).includes(key) && key && row.labels[key] && !isExistValue) {
valueOptions.push({
@ -77,7 +77,7 @@ export default {
filterRows() {
const rows = this.rows.filter((row) => {
const hasSearch = this.searchLabels.find(search => search.key);
const hasSearch = this.searchLabels.find((search) => search.key);
if (!hasSearch) {
return this.rows;
@ -119,20 +119,33 @@ export default {
<template>
<div class="filter">
<template v-for="(label, index) in searchLabels" :key="index">
<span v-if="label.key" :key="`${label.key}${index}`" class="banner-item bg-warning">
{{ label.key }}{{ label.value ? "=" : '' }}{{ label.value }}<i class="icon icon-close" @click="remove(label)" />
<template
v-for="(label, index) in searchLabels"
:key="index"
>
<span
v-if="label.key"
:key="`${label.key}${index}`"
class="banner-item bg-warning"
>
{{ label.key }}{{ label.value ? "=" : '' }}{{ label.value }}<i
class="icon icon-close"
@click="remove(label)"
/>
</span>
</template>
<v-dropdown
popperClass="filter-label"
popper-class="filter-label"
trigger="click"
placement="bottom-end"
:distance="20"
>
<slot name="header">
<button ref="actionDropDown" class="btn bg-primary mr-10">
<button
ref="actionDropDown"
class="btn bg-primary mr-10"
>
<slot name="title">
{{ t('harvester.fields.filterLabels') }}
</slot>
@ -184,7 +197,11 @@ export default {
:options="calcValueOptions(scope.row.value.key)"
@update:value="filterRows"
/>
<LabeledInput v-else v-model:value="scope.row.value.value" @update:value="filterRows" />
<LabeledInput
v-else
v-model:value="scope.row.value.value"
@update:value="filterRows"
/>
</div>
</template>

View File

@ -16,14 +16,12 @@ export default {
},
data() {
return {
selected: '',
};
return { selected: '' };
},
computed: {
scheduleOptions() {
const options = this.rows.map(r => r.sourceSchedule).filter(r => r);
const options = this.rows.map((r) => r.sourceSchedule).filter((r) => r);
return Array.from(new Set(options));
},
@ -46,7 +44,7 @@ export default {
return;
}
const filteredRows = this.rows.filter(row => row.sourceSchedule === this.selected);
const filteredRows = this.rows.filter((row) => row.sourceSchedule === this.selected);
this.$emit('change-rows', filteredRows, this.selected);
}
@ -67,8 +65,14 @@ export default {
<template>
<div class="vm-schedule-filter">
<template>
<span v-if="selected" class="banner-item bg-warning">
{{ t('harvester.tableHeaders.vmSchedule') }}{{ selected ? ` = ${selected}`: '' }}<i class="icon icon-close ml-5" @click="remove" />
<span
v-if="selected"
class="banner-item bg-warning"
>
{{ t('harvester.tableHeaders.vmSchedule') }}{{ selected ? ` = ${selected}`: '' }}<i
class="icon icon-close ml-5"
@click="remove"
/>
</span>
</template>
@ -77,7 +81,10 @@ export default {
placement="bottom-end"
offset="1"
>
<button ref="actionDropDown" class="btn bg-primary mr-10">
<button
ref="actionDropDown"
class="btn bg-primary mr-10"
>
<slot name="title">
{{ t('harvester.fields.filterSchedule') }}
</slot>

View File

@ -43,7 +43,7 @@ export default {
...mapGetters(['currentCluster']),
latestUpgrade() {
return this.upgrade?.find(u => u.isLatestUpgrade);
return this.upgrade?.find((u) => u.isLatestUpgrade);
},
isUpgradeInProgress() {
@ -55,7 +55,7 @@ export default {
versionOptions() {
const versions = this.$store.getters['harvester/all'](HCI.VERSION);
return versions.map(V => V.metadata.name);
return versions.map((V) => V.metadata.name);
},
currentVersion() {
@ -79,7 +79,7 @@ export default {
let upgradeMessage = [];
const list = neu || [];
const currentResource = list.find( O => !!O.isLatestUpgrade);
const currentResource = list.find( (O) => !!O.isLatestUpgrade);
upgradeMessage = currentResource ? currentResource.upgradeMessage : [];

View File

@ -52,13 +52,13 @@ export default {
},
latestResource() {
return this.$store.getters['harvester/all'](HCI.UPGRADE).find( U => U.isLatestUpgrade);
return this.$store.getters['harvester/all'](HCI.UPGRADE).find( (U) => U.isLatestUpgrade);
},
latestUpgradeLogResource() {
const upgradeLogId = `${ this.latestResource.id }-upgradelog`;
return this.$store.getters['harvester/all'](HCI.UPGRADE_LOG).find( U => U.id === upgradeLogId);
return this.$store.getters['harvester/all'](HCI.UPGRADE_LOG).find( (U) => U.id === upgradeLogId);
},
downloadLogFailReason() {
@ -82,7 +82,7 @@ export default {
upgradeImage() {
const id = this.latestResource?.upgradeImage;
return this.$store.getters['harvester/all'](HCI.IMAGE).find(I => I.id === id);
return this.$store.getters['harvester/all'](HCI.IMAGE).find((I) => I.id === id);
},
imageProgress() {
@ -182,7 +182,10 @@ export default {
};
</script>
<template>
<div v-if="enabled && isShow" class="upgrade">
<div
v-if="enabled && isShow"
class="upgrade"
>
<v-dropdown
v-clean-tooltip="{
placement: 'bottom-left',
@ -195,21 +198,36 @@ export default {
<template #popper>
<div class="upgrade-info mb-10">
<div v-if="repoInfo" class="repoInfo">
<div
v-if="repoInfo"
class="repoInfo"
>
<div class="row">
<div class="col span-12">
<a :href="releaseLink" target="_blank">{{ upgradeVersion }}</a>
<a
:href="releaseLink"
target="_blank"
>{{ upgradeVersion }}</a>
</div>
</div>
<div v-if="latestResource" class="row mb-5">
<div
v-if="latestResource"
class="row mb-5"
>
<div class="col span-12">
<p class="state">
{{ t('harvester.upgradePage.repoInfo.upgradeStatus') }}: <BadgeStateFormatter class="ml-5" :row="latestResource" />
{{ t('harvester.upgradePage.repoInfo.upgradeStatus') }}: <BadgeStateFormatter
class="ml-5"
:row="latestResource"
/>
</p>
</div>
</div>
<div v-if="downloadLogFailReason" class="row mb-5">
<div
v-if="downloadLogFailReason"
class="row mb-5"
>
<div class="col span-12">
<p class="state">
{{ t('harvester.upgradePage.repoInfo.logStatus') }}: <span class="error ml-5">{{ downloadLogFailReason }}</span>
@ -252,13 +270,19 @@ export default {
<p class="bordered-section"></p>
</div>
<p v-if="overallMessage" class="text-warning mb-20">
<p
v-if="overallMessage"
class="text-warning mb-20"
>
{{ overallMessage }}
</p>
<div v-if="showImage">
<h4>{{ t('harvester.upgradePage.upgradeImage') }}<span class="float-r text-info">{{ imageProgress }}%</span></h4>
<PercentageBar :modelValue="imageProgress" preferred-direction="MORE" />
<PercentageBar
:model-value="imageProgress"
preferred-direction="MORE"
/>
<p class="text-warning">
{{ imageMessage }}
</p>
@ -266,23 +290,46 @@ export default {
</div>
<h4>{{ t('harvester.upgradePage.createRepository') }} <span class="float-r text-info">{{ repoReady.isReady ? t('harvester.upgradePage.succeeded') : t('harvester.upgradePage.pending') }}</span></h4>
<p v-if="repoReady.message" class="text-warning">
<p
v-if="repoReady.message"
class="text-warning"
>
{{ repoReady.message }}
</p>
<p class="bordered-section"></p>
<ProgressBarList :title="t('harvester.upgradePage.upgradeNode')" :precent="nodesPercent" :list="nodesStatus" />
<ProgressBarList
:title="t('harvester.upgradePage.upgradeNode')"
:precent="nodesPercent"
:list="nodesStatus"
/>
<p class="bordered-section"></p>
<ProgressBarList :title="t('harvester.upgradePage.upgradeSysService')" :precent="sysServiceTotal" :list="sysServiceUpgradeMessage" />
<ProgressBarList
:title="t('harvester.upgradePage.upgradeSysService')"
:precent="sysServiceTotal"
:list="sysServiceUpgradeMessage"
/>
</div>
<div class="footer">
<button v-if="canStartedDownload" :disabled="logDownloading" class="btn role-primary mr-10" @click="downloadLog()">
<i class="icon mr-10" :class="[logDownloading ? 'icon-spinner icon-spin' : 'icon-download']"></i> {{ t('harvester.upgradePage.repoInfo.downloadLog') }}
<button
v-if="canStartedDownload"
:disabled="logDownloading"
class="btn role-primary mr-10"
@click="downloadLog()"
>
<i
class="icon mr-10"
:class="[logDownloading ? 'icon-spinner icon-spin' : 'icon-download']"
></i> {{ t('harvester.upgradePage.repoInfo.downloadLog') }}
</button>
<button v-if="latestResource.isUpgradeSucceeded" class="btn role-primary" @click="ignoreMessage()">
<button
v-if="latestResource.isUpgradeSucceeded"
class="btn role-primary"
@click="ignoreMessage()"
>
{{ t('harvester.upgradePage.dismissMessage') }}
</button>
</div>

View File

@ -45,16 +45,33 @@ export default {
<Collapse v-model:open="open">
<template #title>
<div class="total-bar">
<span class="bar"><PercentageBar :modelValue="precent" preferred-direction="MORE" /></span>
<span class="on-off" @click="handleSwitch"> {{ open ? t('harvester.generic.close') : t('harvester.generic.open') }}</span>
<span class="bar"><PercentageBar
:model-value="precent"
preferred-direction="MORE"
/></span>
<span
class="on-off"
@click="handleSwitch"
> {{ open ? t('harvester.generic.close') : t('harvester.generic.open') }}</span>
</div>
</template>
<template>
<div class="custom-content">
<div v-for="(item, i) in list" :key="i" >
<p>{{ item.name }} <span class="status" :class="{ [item.state]: true }">{{ item.state }}</span></p>
<PercentageBar :modelValue="item.percent" preferred-direction="MORE" />
<div
v-for="(item, i) in list"
:key="i"
>
<p>
{{ item.name }} <span
class="status"
:class="{ [item.state]: true }"
>{{ item.state }}</span>
</p>
<PercentageBar
:model-value="item.percent"
preferred-direction="MORE"
/>
<p class="warning">
{{ item.message }}
</p>

View File

@ -64,7 +64,7 @@ export default {
}
},
beforeDestroy() {
beforeUnmount() {
this.close();
},
@ -247,7 +247,10 @@ export default {
<template>
<div class="harvester-shell-container">
<div ref="xterm" class="shell-body" />
<div
ref="xterm"
class="shell-body"
/>
<resize-observer @notify="fit" />
</div>
</template>

View File

@ -57,11 +57,11 @@ export default {
filterCategorySettings() {
return this.settings.filter((s) => {
if (this.category !== 'advanced') {
return (CATEGORY[this.category] || []).find(item => item === s.id);
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));
return !allCategory.some((category) => (CATEGORY[category] || []).find((item) => item === s.id));
}
}) || [];
},
@ -75,7 +75,7 @@ export default {
},
getSettingOption(id) {
return HCI_ALLOWED_SETTINGS.find(setting => setting.id === id);
return HCI_ALLOWED_SETTINGS.find((setting) => setting.id === id);
},
toggleHide(s) {
@ -116,43 +116,78 @@ export default {
<template>
<div>
<div v-for="(setting, i) in categorySettings" :key="i" class="advanced-setting mb-20">
<div
v-for="(setting, i) in categorySettings"
:key="i"
class="advanced-setting mb-20"
>
<div class="header">
<div class="title">
<h1>
{{ setting.id }}
<span v-if="setting.customized" class="modified">
<span
v-if="setting.customized"
class="modified"
>
Modified
</span>
<span v-if="setting.experimental" v-clean-tooltip="t('advancedSettings.experimental')" class="experimental">
<span
v-if="setting.experimental"
v-clean-tooltip="t('advancedSettings.experimental')"
class="experimental"
>
Experimental
</span>
</h1>
<h2 v-clean-html="t(setting.description, {}, true)">
</h2>
</div>
<div v-if="setting.hasActions" :id="setting.id" class="action">
<button aria-haspopup="true" aria-expanded="false" type="button" class="btn btn-sm role-multi-action actions" @click="showActionMenu($event, setting)">
<div
v-if="setting.hasActions"
:id="setting.id"
class="action"
>
<button
aria-haspopup="true"
aria-expanded="false"
type="button"
class="btn btn-sm role-multi-action actions"
@click="showActionMenu($event, setting)"
>
<i class="icon icon-actions" />
</button>
</div>
</div>
<div value>
<div v-if="!setting.hide" class="settings-value">
<div
v-if="!setting.hide"
class="settings-value"
>
<pre v-if="setting.kind === 'json'">{{ setting.json }}</pre>
<pre v-else-if="setting.kind === 'multiline'">{{ setting.data.value || setting.data.default }}</pre>
<pre v-else-if="setting.kind === 'enum'">{{ t(setting.enum) }}</pre>
<pre v-else-if="setting.kind === 'custom' && setting.custom">{{ setting.custom }}</pre>
<pre v-else-if="setting.data.value || setting.data.default">{{ setting.data.value || setting.data.default }}</pre>
<pre v-else class="text-muted">&lt;{{ t('advancedSettings.none') }}&gt;</pre>
<pre
v-else
class="text-muted"
>&lt;{{ t('advancedSettings.none') }}&gt;</pre>
</div>
<div class="mt-5">
<button v-if="setting.hide" class="btn btn-sm role-primary" @click="toggleHide(setting)">
<button
v-if="setting.hide"
class="btn btn-sm role-primary"
@click="toggleHide(setting)"
>
{{ t('advancedSettings.show') }} {{ setting.id }}
</button>
<button v-if="setting.canHide && !setting.hide" class="btn btn-sm role-primary" @click="toggleHide(setting)">
<button
v-if="setting.canHide && !setting.hide"
class="btn btn-sm role-primary"
@click="toggleHide(setting)"
>
{{ t('advancedSettings.hide') }} {{ setting.id }}
</button>
@ -169,7 +204,11 @@ export default {
/>
</div>
</div>
<Banner v-if="setting.data.errMessage" color="error mt-5" class="settings-banner">
<Banner
v-if="setting.data.errMessage"
color="error mt-5"
class="settings-banner"
>
{{ setting.data.errMessage }}
</Banner>
</div>

View File

@ -31,14 +31,20 @@ export default {
<Banner color="warning">
<div>
<strong>{{ t('harvester.upgradePage.upgradeInfo.warning') }}:</strong>
<p v-clean-html="t('harvester.upgradePage.upgradeInfo.doc', {url: upgradeLink}, true)" class="mb-5"></p>
<p
v-clean-html="t('harvester.upgradePage.upgradeInfo.doc', {url: upgradeLink}, true)"
class="mb-5"
></p>
<p class="mb-5">
{{ t('harvester.upgradePage.upgradeInfo.tip') }}
</p>
<p class="mb-5">
{{ t('harvester.upgradePage.upgradeInfo.moreNotes') }} <a :href="releaseVersion" target="_blank">{{ t('generic.moreInfo') }}</a>
{{ t('harvester.upgradePage.upgradeInfo.moreNotes') }} <a
:href="releaseVersion"
target="_blank"
>{{ t('generic.moreInfo') }}</a>
</p>
</div>
</Banner>

View File

@ -3,7 +3,11 @@
<div v-if="connected && disconnected">
<main class="main-layout error">
<div class="text-center">
<BrandImage file-name="error-desert-landscape.svg" width="900" height="300" />
<BrandImage
file-name="error-desert-landscape.svg"
width="900"
height="300"
/>
<h1>
{{ t('generic.notification.title.warning') }}
</h1>
@ -61,7 +65,7 @@ export default {
});
},
beforeDestroy() {
beforeUnmount() {
this.clearTimeout();
},

View File

@ -7,10 +7,10 @@ import ModalWithCard from '@shell/components/ModalWithCard';
const PREFERED_SHORTCUT_KEYS = 'prefered-shortcut-keys';
export default {
name: 'NovncConsoleCustomKeys',
name: 'NovncConsoleCustomKeys',
emits: ['close'],
components: {
ModalWithCard, Banner, AsyncButton
},
@ -48,7 +48,7 @@ export default {
displayedKeys() {
const out = this.addedShortcutKeys.concat(this.preferredShortcutKeys).map((item) => {
const out = item.map(K => ` <code>${ K.key.charAt(0).toUpperCase() + K.key.slice(1) }</code>`);
const out = item.map((K) => ` <code>${ K.key.charAt(0).toUpperCase() + K.key.slice(1) }</code>`);
return out.join(',');
});
@ -69,7 +69,7 @@ export default {
return this.t('harvester.virtualMachine.detail.console.record.tips');
}
const out = this.keysRecord.map(item => ` <code>${ item.key.charAt(0).toUpperCase() + item.key.slice(1) }</code>`);
const out = this.keysRecord.map((item) => ` <code>${ item.key.charAt(0).toUpperCase() + item.key.slice(1) }</code>`);
return `Keys: ${ out.join(',') }`;
},
@ -85,7 +85,7 @@ export default {
validationList.push(this.keysRecord);
validationList = validationList.map((item) => {
const out = item.map(K => K.key);
const out = item.map((K) => K.key);
return out.join(',');
});
@ -140,13 +140,13 @@ export default {
const key = keys.replace(/(\s*)<code>|<\/code>/g, '').replace(/\s*,\s*/g, ',');
this.addedShortcutKeys = this.addedShortcutKeys.filter((item) => {
const formatkey = item.map(K => K.key.charAt(0).toUpperCase() + K.key.slice(1)).join(',');
const formatkey = item.map((K) => K.key.charAt(0).toUpperCase() + K.key.slice(1)).join(',');
return formatkey !== key;
});
this.preferredShortcutKeys = this.preferredShortcutKeys.filter((item) => {
const formatkey = item.map(K => K.key.charAt(0).toUpperCase() + K.key.slice(1)).join(',');
const formatkey = item.map((K) => K.key.charAt(0).toUpperCase() + K.key.slice(1)).join(',');
return formatkey !== key;
});
@ -188,11 +188,21 @@ export default {
</div>
<div class="row">
<div class="col span-12">
<button class="btn bg-primary" @click="toggleRecording">
<button
class="btn bg-primary"
@click="toggleRecording"
>
<t :k="recordButton" />
<i class="icon icon-fw" :class="isRecording ? 'icon-dot-open' : 'icon-dot'" />
<i
class="icon icon-fw"
:class="isRecording ? 'icon-dot-open' : 'icon-dot'"
/>
</button>
<button :disabled="!canAdd" class="btn bg-primary" @click="addShortcutKey">
<button
:disabled="!canAdd"
class="btn bg-primary"
@click="addShortcutKey"
>
<t k="generic.add" />
</button>
</div>
@ -207,7 +217,10 @@ export default {
/>
<div class="displayed-banners">
<Banner v-for="(keys,index) in displayedKeys" :key="index">
<Banner
v-for="(keys,index) in displayedKeys"
:key="index"
>
<span v-clean-html="keys"></span>
</Banner>
</div>
@ -216,7 +229,10 @@ export default {
<template #footer>
<div class="actions">
<button class="btn role-secondary mr-20" @click.prevent="closeRecordingModal">
<button
class="btn role-secondary mr-20"
@click.prevent="closeRecordingModal"
>
<t k="generic.close" />
</button>
<AsyncButton

View File

@ -51,21 +51,38 @@ export default {
<template>
<ul class="list-unstyled dropdown combination-keys__container">
<li v-for="(item, key) in items" :key="key">
<li
v-for="(item, key) in items"
:key="key"
>
<v-dropdown
v-if="!!item.keys"
placement="right-start"
trigger="click"
:container="false"
>
<span :class="{ open: getOpenStatus(key, pos) }" class="p-10 hand" @click="addKeys({ key, pos })">{{ item.label }}</span>
<span
:class="{ open: getOpenStatus(key, pos) }"
class="p-10 hand"
@click="addKeys({ key, pos })"
>{{ item.label }}</span>
<template #popper>
<novnc-console-item :items="item.keys" :path="path" :pos="pos+1" @update="addKeys" @send-keys="sendKeys" />
<novnc-console-item
:items="item.keys"
:path="path"
:pos="pos+1"
@update="addKeys"
@send-keys="sendKeys"
/>
</template>
</v-dropdown>
<span v-else class="p-10 hand" @click="keysDown(key, pos)">{{ item.label }}</span>
<span
v-else
class="p-10 hand"
@click="keysDown(key, pos)"
>{{ item.label }}</span>
</li>
</ul>
</template>

View File

@ -211,7 +211,7 @@ export default {
preferredShortcutKeys() {
return (this.savedShortcutKeys || []).map((item) => {
return {
label: item.map(K => K.key.charAt(0).toUpperCase() + K.key.slice(1)).join('+'),
label: item.map((K) => K.key.charAt(0).toUpperCase() + K.key.slice(1)).join('+'),
value: item
};
});
@ -288,11 +288,21 @@ export default {
</button>
<template #popper>
<novnc-console-item :items="keymap" :path="keysRecord" :pos="0" @update="update" @send-keys="sendKeys" />
<novnc-console-item
:items="keymap"
:path="keysRecord"
:pos="0"
@update="update"
@send-keys="sendKeys"
/>
</template>
</v-dropdown>
<button v-if="hasSoftRebootAction" class="btn btn-sm bg-primary" @click="softReboot">
<button
v-if="hasSoftRebootAction"
class="btn btn-sm bg-primary"
@click="softReboot"
>
{{ t("harvester.action.softreboot") }}
</button>
@ -309,15 +319,24 @@ export default {
<template #popper>
<div>
<button class="btn btn-sm bg-primary" @click="showKeysModal">
<button
class="btn btn-sm bg-primary"
@click="showKeysModal"
>
{{ t("harvester.virtualMachine.detail.console.management") }}
</button>
</div>
<hr>
<div v-for="(keys, index) in preferredShortcutKeys" :key="index">
<button class="btn btn-sm bg-primary" @click="sendCustomKeys(keys.value)">
<div
v-for="(keys, index) in preferredShortcutKeys"
:key="index"
>
<button
class="btn btn-sm bg-primary"
@click="sendCustomKeys(keys.value)"
>
{{ keys.label }}
</button>
</div>
@ -330,7 +349,11 @@ export default {
@close="hideKeysModal"
/>
</div>
<NovncConsole v-if="url && !isDown" ref="novncConsole" :url="url" />
<NovncConsole
v-if="url && !isDown"
ref="novncConsole"
:url="url"
/>
<p v-if="isDown">
{{ t("harvester.virtualMachine.detail.console.down") }}
</p>

View File

@ -121,12 +121,31 @@ export default {
</script>
<template>
<div class="row" @update:value="update">
<div
class="row"
@update:value="update"
>
<div class="col span-12">
<LabeledSelect v-model:value="parseDefaultValue.type" class="mb-20" :label="t('harvester.fields.type')" :options="typeOption" @update:value="update" />
<LabeledSelect
v-model:value="parseDefaultValue.type"
class="mb-20"
:label="t('harvester.fields.type')"
:options="typeOption"
@update:value="update"
/>
<LabeledInput v-model:value="parseDefaultValue.endpoint" class="mb-5" :placeholder="endpointPlaceholder" :mode="mode" label="Endpoint" />
<Tip class="mb-20" icon="icon icon-info" :text="t('harvester.backup.backupTargetTip')" />
<LabeledInput
v-model:value="parseDefaultValue.endpoint"
class="mb-5"
:placeholder="endpointPlaceholder"
:mode="mode"
label="Endpoint"
/>
<Tip
class="mb-20"
icon="icon icon-info"
:text="t('harvester.backup.backupTargetTip')"
/>
<template v-if="isS3">
<LabeledInput
@ -163,7 +182,13 @@ export default {
required
/>
<LabeledSelect v-model:value="parseDefaultValue.virtualHostedStyle" class="mb-20" label="Virtual Hosted-Style" :options="virtualHostedStyleType" @update:value="update" />
<LabeledSelect
v-model:value="parseDefaultValue.virtualHostedStyle"
class="mb-20"
label="Virtual Hosted-Style"
:options="virtualHostedStyleType"
@update:value="update"
/>
<div class="mb-20">
<Tip icon="icon icon-info">

View File

@ -225,8 +225,16 @@ export default {
<div>
<h3>{{ t('harvester.setting.containerdRegistry.mirrors.mirrors') }}</h3>
<div>
<InfoBox v-for="mirror, idx in mirrors" :key="mirror.idx" class="box">
<button type="button" class="role-link btn btn-sm remove" @click="remove('mirrors', idx)">
<InfoBox
v-for="mirror, idx in mirrors"
:key="mirror.idx"
class="box"
>
<button
type="button"
class="role-link btn btn-sm remove"
@click="remove('mirrors', idx)"
>
<i class="icon icon-2x icon-x" />
</button>
@ -273,7 +281,10 @@ export default {
</infobox>
</div>
<button class="btn btn-sm role-primary" @click.self="addMirror">
<button
class="btn btn-sm role-primary"
@click.self="addMirror"
>
{{ t('harvester.setting.containerdRegistry.mirrors.addMirror') }}
</button>
@ -281,8 +292,16 @@ export default {
<h3>{{ t('harvester.setting.containerdRegistry.configs.configs') }}</h3>
<div>
<InfoBox v-for="config, idx in configs" :key="config.idx" class="box">
<button type="button" class="role-link btn btn-sm remove" @click="remove('configs', idx)">
<InfoBox
v-for="config, idx in configs"
:key="config.idx"
class="box"
>
<button
type="button"
class="role-link btn btn-sm remove"
@click="remove('configs', idx)"
>
<i class="icon icon-2x icon-x" />
</button>
@ -355,7 +374,10 @@ export default {
</div>
</infobox>
<button class="btn btn-sm role-primary" @click="addConfig">
<button
class="btn btn-sm role-primary"
@click="addConfig"
>
{{ t('harvester.setting.containerdRegistry.configs.addConfig') }}
</button>
</div>

View File

@ -64,7 +64,7 @@ export default {
const csiDrivers = this.$store.getters[`${ inStore }/all`](CSI_DRIVER) || [];
return csiDrivers.filter((provisioner) => {
return !this.configArr.map(config => config.key).includes(provisioner.name);
return !this.configArr.map((config) => config.key).includes(provisioner.name);
}).map((provisioner) => {
return provisioner.name;
});
@ -181,8 +181,16 @@ export default {
<template>
<div>
<InfoBox v-for="(driver, idx) in configArr" :key="idx">
<button :disabled="disableEdit(driver.key)" type="button" class="role-link btn btn-sm remove" @click="remove(idx)">
<InfoBox
v-for="(driver, idx) in configArr"
:key="idx"
>
<button
:disabled="disableEdit(driver.key)"
type="button"
class="role-link btn btn-sm remove"
@click="remove(idx)"
>
<i class="icon icon-x" />
</button>
@ -229,7 +237,11 @@ export default {
</div>
</infobox>
<button class="btn btn-sm role-primary" :disabled="disableAdd" @click.self="add">
<button
class="btn btn-sm role-primary"
:disabled="disableAdd"
@click.self="add"
>
{{ t('generic.add') }}
</button>
</div>

View File

@ -54,10 +54,16 @@ export default {
<template>
<div>
<Banner color="warning">
<t k="harvester.setting.httpProxy.warning" :raw="true" />
<t
k="harvester.setting.httpProxy.warning"
:raw="true"
/>
</Banner>
<div class="row" @update:value="update">
<div
class="row"
@update:value="update"
>
<div class="col span-12">
<LabeledInput
v-model:value="parseDefaultValue.httpProxy"

View File

@ -107,7 +107,7 @@ export default {
methods: {
update() {
const exclude = this.exclude.filter(ip => ip);
const exclude = this.exclude.filter((ip) => ip);
if (Array.isArray(exclude) && exclude.length > 0) {
this.parsedDefaultValue.exclude = exclude;
@ -172,7 +172,10 @@ export default {
@update:value="update"
>
<Banner color="warning">
<t k="harvester.setting.storageNetwork.warning" :raw="true" />
<t
k="harvester.setting.storageNetwork.warning"
:raw="true"
/>
</Banner>
<RadioGroup
@ -210,8 +213,15 @@ export default {
:placeholder="t('harvester.setting.storageNetwork.range.placeholder')"
label-key="harvester.setting.storageNetwork.range.label"
/>
<Tip class="mb-20" icon="icon icon-info">
<t k="harvester.setting.storageNetwork.tip" :raw="true" :url="storageNetworkExampleLink" />
<Tip
class="mb-20"
icon="icon icon-info"
>
<t
k="harvester.setting.storageNetwork.tip"
:raw="true"
:url="storageNetworkExampleLink"
/>
</Tip>
<ArrayList

View File

@ -29,6 +29,7 @@ export default {
data() {
let parseDefaultValue = {};
try {
parseDefaultValue = JSON.parse(this.value.value);
} catch (error) {
@ -63,6 +64,7 @@ export default {
methods: {
update() {
const value = JSON.stringify(this.parseDefaultValue);
this.value['value'] = value;
},
@ -99,7 +101,10 @@ export default {
</script>
<template>
<div class="row" @input="update">
<div
class="row"
@input="update"
>
<div class="col span-12">
<LabeledInput
v-model:value="parseDefaultValue.repository"

View File

@ -48,7 +48,10 @@ export default {
</script>
<template>
<div class="row" @input="update">
<div
class="row"
@input="update"
>
<div class="col span-12">
<RadioGroup
v-model:value="parseDefaultValue.enable"

View File

@ -1,5 +1,5 @@
const pkgJson = require('../package.json');
import semver from 'semver';
const pkgJson = require('../package.json');
const docVersion = `v${ semver.major(pkgJson.version) }.${ semver.minor(pkgJson.version) }`;

View File

@ -44,14 +44,14 @@ export const IP_POOL_HEADERS = [
STATE,
NAME_COL,
{
name: 'subnet',
name: 'subnet',
labelKey: 'harvester.ipPool.subnet.label',
value: 'subnetDisplay',
value: 'subnetDisplay',
},
{
name: 'availableIP',
name: 'availableIP',
labelKey: 'harvester.ipPool.availableIP.label',
value: 'status.available',
value: 'status.available',
},
AGE
];
@ -71,7 +71,7 @@ export function init($plugin, store) {
if (isSingleVirtualCluster) {
const home = {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: {
product: PRODUCT_NAME,
resource: HCI.DASHBOARD
@ -79,34 +79,34 @@ export function init($plugin, store) {
};
store.dispatch('setIsSingleProduct', {
productName: PRODUCT_NAME,
logo: require(`@shell/assets/images/providers/harvester.svg`),
productNameKey: 'harvester.productLabel',
getVersionInfo: (store) => store.getters[`${PRODUCT_NAME}/byId`]?.(HCI.SETTING, 'server-version')?.value || 'unknown',
afterLoginRoute: home,
logoRoute: home,
productName: PRODUCT_NAME,
logo: require(`@shell/assets/images/providers/harvester.svg`),
productNameKey: 'harvester.productLabel',
getVersionInfo: (store) => store.getters[`${ PRODUCT_NAME }/byId`]?.(HCI.SETTING, 'server-version')?.value || 'unknown',
afterLoginRoute: home,
logoRoute: home,
supportCustomLogo: true
});
}
product({
inStore: 'harvester',
removable: false,
showNamespaceFilter: true,
hideKubeShell: true,
hideKubeConfig: true,
showClusterSwitcher: true,
hideCopyConfig: true,
hideSystemResources: true,
inStore: 'harvester',
removable: false,
showNamespaceFilter: true,
hideKubeShell: true,
hideKubeConfig: true,
showClusterSwitcher: true,
hideCopyConfig: true,
hideSystemResources: true,
customNamespaceFilter: true,
typeStoreMap: {
[MANAGEMENT.PROJECT]: 'management',
typeStoreMap: {
[MANAGEMENT.PROJECT]: 'management',
[MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING]: 'management',
[MANAGEMENT.PROJECT_ROLE_TEMPLATE_BINDING]: 'management'
},
supportRoute: { name: `${PRODUCT_NAME}-c-cluster-support` },
to: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
supportRoute: { name: `${ PRODUCT_NAME }-c-cluster-support` },
to: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: {
product: PRODUCT_NAME,
resource: HCI.DASHBOARD
@ -118,13 +118,13 @@ export function init($plugin, store) {
basicType([HCI.DASHBOARD]);
virtualType({
labelKey: 'harvester.dashboard.label',
group: 'Root',
name: HCI.DASHBOARD,
weight: 500,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
group: 'Root',
name: HCI.DASHBOARD,
weight: 500,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: {
product: PRODUCT_NAME,
product: PRODUCT_NAME,
resource: HCI.DASHBOARD
}
}
@ -133,12 +133,12 @@ export function init($plugin, store) {
configureType(HCI.HOST, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.HOST }
},
resource: NODE,
resource: NODE,
resourceDetail: HCI.HOST,
resourceEdit: HCI.HOST
resourceEdit: HCI.HOST
});
configureType(HCI.HOST, { isCreatable: false, isEditable: true });
@ -146,13 +146,13 @@ export function init($plugin, store) {
virtualType({
ifHaveType: NODE,
labelKey: 'harvester.host.label',
group: 'Root',
name: HCI.HOST,
labelKey: 'harvester.host.label',
group: 'Root',
name: HCI.HOST,
namespaced: true,
weight: 399,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 399,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.HOST }
},
exact: false
@ -161,29 +161,29 @@ export function init($plugin, store) {
// multiVirtualCluster
basicType(['cluster-members'], 'rbac');
virtualType({
ifHave: IF_HAVE.MULTI_CLUSTER,
labelKey: 'members.clusterMembers',
group: 'root',
ifHave: IF_HAVE.MULTI_CLUSTER,
labelKey: 'members.clusterMembers',
group: 'root',
namespaced: false,
name: VIRTUAL_TYPES.CLUSTER_MEMBERS,
weight: 100,
route: { name: `${PRODUCT_NAME}-c-cluster-members` },
exact: true,
name: VIRTUAL_TYPES.CLUSTER_MEMBERS,
weight: 100,
route: { name: `${ PRODUCT_NAME }-c-cluster-members` },
exact: true,
ifHaveType: {
type: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
type: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
store: 'management'
}
});
basicType([HCI.VM]);
virtualType({
labelKey: 'harvester.virtualMachine.label',
group: 'root',
name: HCI.VM,
labelKey: 'harvester.virtualMachine.label',
group: 'root',
name: HCI.VM,
namespaced: true,
weight: 299,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 299,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.VM }
},
exact: false
@ -192,23 +192,23 @@ export function init($plugin, store) {
basicType([HCI.VOLUME]);
configureType(HCI.VOLUME, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.VOLUME }
},
resource: PVC,
resource: PVC,
resourceDetail: HCI.VOLUME,
resourceEdit: HCI.VOLUME,
canYaml: false,
resourceEdit: HCI.VOLUME,
canYaml: false,
});
virtualType({
labelKey: 'harvester.volume.label',
group: 'root',
labelKey: 'harvester.volume.label',
group: 'root',
ifHaveType: PVC,
name: HCI.VOLUME,
name: HCI.VOLUME,
namespaced: true,
weight: 199,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 199,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.VOLUME }
},
exact: false
@ -224,17 +224,15 @@ export function init($plugin, store) {
IMAGE_VIRTUAL_SIZE,
AGE
]);
configureType(HCI.IMAGE, {
canYaml: false,
});
configureType(HCI.IMAGE, { canYaml: false });
virtualType({
labelKey: 'harvester.image.label',
group: 'root',
name: HCI.IMAGE,
labelKey: 'harvester.image.label',
group: 'root',
name: HCI.IMAGE,
namespaced: true,
weight: 198,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 198,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.IMAGE }
},
exact: false
@ -242,14 +240,14 @@ export function init($plugin, store) {
basicType(['projects-namespaces']);
virtualType({
ifHave: IF_HAVE.MULTI_CLUSTER,
labelKey: 'harvester.projectNamespace.label',
group: 'root',
ifHave: IF_HAVE.MULTI_CLUSTER,
labelKey: 'harvester.projectNamespace.label',
group: 'root',
namespaced: true,
name: 'projects-namespaces',
weight: 98,
route: { name: `${PRODUCT_NAME}-c-cluster-projectsnamespaces` },
exact: true,
name: 'projects-namespaces',
weight: 98,
route: { name: `${ PRODUCT_NAME }-c-cluster-projectsnamespaces` },
exact: true,
});
if (isSingleVirtualCluster) {
@ -287,31 +285,31 @@ export function init($plugin, store) {
NAME_COL,
NAMESPACE_COL,
{
name: 'receivers',
labelKey: 'tableHeaders.receivers',
name: 'receivers',
labelKey: 'tableHeaders.receivers',
formatter: 'ReceiverIcons',
value: 'name'
value: 'name'
},
]);
configureType(HCI.ALERTMANAGERCONFIG, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.ALERTMANAGERCONFIG },
},
resource: MONITORING.ALERTMANAGERCONFIG,
resource: MONITORING.ALERTMANAGERCONFIG,
resourceDetail: HCI.ALERTMANAGERCONFIG,
resourceEdit: HCI.ALERTMANAGERCONFIG
resourceEdit: HCI.ALERTMANAGERCONFIG
});
virtualType({
ifHaveType: MONITORING.ALERTMANAGERCONFIG,
labelKey: 'harvester.monitoring.alertmanagerConfig.label',
name: HCI.ALERTMANAGERCONFIG,
labelKey: 'harvester.monitoring.alertmanagerConfig.label',
name: HCI.ALERTMANAGERCONFIG,
namespaced: true,
weight: 87,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 87,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.ALERTMANAGERCONFIG }
},
exact: false,
@ -319,21 +317,21 @@ export function init($plugin, store) {
configureType(HCI.CLUSTER_FLOW, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.CLUSTER_FLOW },
},
resource: LOGGING.CLUSTER_FLOW,
resource: LOGGING.CLUSTER_FLOW,
resourceDetail: HCI.CLUSTER_FLOW,
resourceEdit: HCI.CLUSTER_FLOW
resourceEdit: HCI.CLUSTER_FLOW
});
virtualType({
labelKey: 'harvester.logging.clusterFlow.label',
name: HCI.CLUSTER_FLOW,
labelKey: 'harvester.logging.clusterFlow.label',
name: HCI.CLUSTER_FLOW,
namespaced: true,
weight: 79,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 79,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.CLUSTER_FLOW }
},
exact: false,
@ -341,21 +339,21 @@ export function init($plugin, store) {
configureType(HCI.CLUSTER_OUTPUT, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.CLUSTER_OUTPUT },
},
resource: LOGGING.CLUSTER_OUTPUT,
resource: LOGGING.CLUSTER_OUTPUT,
resourceDetail: HCI.CLUSTER_OUTPUT,
resourceEdit: HCI.CLUSTER_OUTPUT
resourceEdit: HCI.CLUSTER_OUTPUT
});
virtualType({
labelKey: 'harvester.logging.clusterOutput.label',
name: HCI.CLUSTER_OUTPUT,
labelKey: 'harvester.logging.clusterOutput.label',
name: HCI.CLUSTER_OUTPUT,
namespaced: true,
weight: 78,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 78,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.CLUSTER_OUTPUT }
},
exact: false,
@ -363,21 +361,21 @@ export function init($plugin, store) {
configureType(HCI.FLOW, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.FLOW },
},
resource: LOGGING.FLOW,
resource: LOGGING.FLOW,
resourceDetail: HCI.FLOW,
resourceEdit: HCI.FLOW
resourceEdit: HCI.FLOW
});
virtualType({
labelKey: 'harvester.logging.flow.label',
name: HCI.FLOW,
labelKey: 'harvester.logging.flow.label',
name: HCI.FLOW,
namespaced: true,
weight: 77,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 77,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.FLOW }
},
exact: false,
@ -385,21 +383,21 @@ export function init($plugin, store) {
configureType(HCI.OUTPUT, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.OUTPUT },
},
resource: LOGGING.OUTPUT,
resource: LOGGING.OUTPUT,
resourceDetail: HCI.OUTPUT,
resourceEdit: HCI.OUTPUT
resourceEdit: HCI.OUTPUT
});
virtualType({
labelKey: 'harvester.logging.output.label',
name: HCI.OUTPUT,
labelKey: 'harvester.logging.output.label',
name: HCI.OUTPUT,
namespaced: true,
weight: 76,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 76,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.OUTPUT }
},
exact: false,
@ -454,17 +452,17 @@ export function init($plugin, store) {
configureType(HCI.CLUSTER_NETWORK, {
realResource: HCI.SETTING,
showState: false
showState: false
});
virtualType({
labelKey: 'harvester.vmTemplate.label',
group: 'root',
name: TEMPLATE,
labelKey: 'harvester.vmTemplate.label',
group: 'root',
name: TEMPLATE,
namespaced: true,
weight: 289,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 289,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: TEMPLATE }
},
exact: false
@ -486,12 +484,12 @@ export function init($plugin, store) {
configureType(HCI.BACKUP, { showListMasthead: false, showConfigView: false });
virtualType({
labelKey: 'harvester.backup.label',
name: HCI.BACKUP,
labelKey: 'harvester.backup.label',
name: HCI.BACKUP,
namespaced: true,
weight: 200,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 200,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.BACKUP }
},
exact: false
@ -501,13 +499,13 @@ export function init($plugin, store) {
configureType(HCI.CLUSTER_NETWORK, { showListMasthead: false });
virtualType({
labelKey: 'harvester.clusterNetwork.title',
name: HCI.CLUSTER_NETWORK,
labelKey: 'harvester.clusterNetwork.title',
name: HCI.CLUSTER_NETWORK,
ifHaveType: HCI.CLUSTER_NETWORK,
namespaced: false,
weight: 189,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 189,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.CLUSTER_NETWORK }
},
exact: false,
@ -515,21 +513,21 @@ export function init($plugin, store) {
configureType(HCI.NETWORK_ATTACHMENT, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.NETWORK_ATTACHMENT }
},
resource: NETWORK_ATTACHMENT,
resource: NETWORK_ATTACHMENT,
resourceDetail: HCI.NETWORK_ATTACHMENT,
resourceEdit: HCI.NETWORK_ATTACHMENT
resourceEdit: HCI.NETWORK_ATTACHMENT
});
virtualType({
labelKey: 'harvester.network.label',
name: HCI.NETWORK_ATTACHMENT,
labelKey: 'harvester.network.label',
name: HCI.NETWORK_ATTACHMENT,
namespaced: true,
weight: 188,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 188,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.NETWORK_ATTACHMENT }
},
exact: false
@ -537,22 +535,22 @@ export function init($plugin, store) {
configureType(HCI.SNAPSHOT, {
isCreatable: false,
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
location: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SNAPSHOT },
},
resource: VOLUME_SNAPSHOT,
resource: VOLUME_SNAPSHOT,
resourceDetail: HCI.SNAPSHOT,
resourceEdit: HCI.SNAPSHOT,
resourceEdit: HCI.SNAPSHOT,
});
headers(HCI.SNAPSHOT, [STATE, NAME_COL, NAMESPACE_COL, SNAPSHOT_TARGET_VOLUME, AGE]);
virtualType({
labelKey: 'harvester.snapshot.label',
name: HCI.SNAPSHOT,
labelKey: 'harvester.snapshot.label',
name: HCI.SNAPSHOT,
namespaced: true,
weight: 190,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 190,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SNAPSHOT }
},
exact: false,
@ -560,22 +558,22 @@ export function init($plugin, store) {
configureType(HCI.VM_SNAPSHOT, {
showListMasthead: false,
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
location: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.VM_SNAPSHOT }
},
resource: HCI.BACKUP,
resource: HCI.BACKUP,
resourceDetail: HCI.VM_SNAPSHOT,
resourceEdit: HCI.VM_SNAPSHOT
resourceEdit: HCI.VM_SNAPSHOT
});
virtualType({
labelKey: 'harvester.vmSnapshot.label',
name: HCI.VM_SNAPSHOT,
labelKey: 'harvester.vmSnapshot.label',
name: HCI.VM_SNAPSHOT,
namespaced: true,
weight: 191,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 191,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.VM_SNAPSHOT }
},
exact: false
@ -583,12 +581,12 @@ export function init($plugin, store) {
headers(HCI.SSH, [STATE, NAME_COL, NAMESPACE_COL, FINGERPRINT, AGE]);
virtualType({
labelKey: 'harvester.sshKey.label',
name: HCI.SSH,
labelKey: 'harvester.sshKey.label',
name: HCI.SSH,
namespaced: true,
weight: 170,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 170,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SSH }
},
exact: false
@ -596,21 +594,21 @@ export function init($plugin, store) {
configureType(HCI.CLOUD_TEMPLATE, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.CLOUD_TEMPLATE }
},
resource: CONFIG_MAP,
resource: CONFIG_MAP,
resourceDetail: HCI.CLOUD_TEMPLATE,
resourceEdit: HCI.CLOUD_TEMPLATE
resourceEdit: HCI.CLOUD_TEMPLATE
});
virtualType({
labelKey: 'harvester.cloudTemplate.label',
name: HCI.CLOUD_TEMPLATE,
labelKey: 'harvester.cloudTemplate.label',
name: HCI.CLOUD_TEMPLATE,
namespaced: true,
weight: 87,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 87,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.CLOUD_TEMPLATE }
},
exact: false
@ -622,9 +620,9 @@ export function init($plugin, store) {
NAMESPACE_COL,
SUB_TYPE,
{
name: 'data',
labelKey: 'tableHeaders.data',
value: 'dataPreview',
name: 'data',
labelKey: 'tableHeaders.data',
value: 'dataPreview',
formatter: 'SecretData'
},
AGE
@ -632,22 +630,22 @@ export function init($plugin, store) {
configureType(HCI.SECRET, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SECRET }
},
resource: SECRET,
resourceDetail: HCI.SECRET,
resourceEdit: HCI.SECRET,
resource: SECRET,
resourceDetail: HCI.SECRET,
resourceEdit: HCI.SECRET,
notFilterNamespace: ['cattle-monitoring-system', 'cattle-logging-system']
});
virtualType({
labelKey: 'harvester.secret.label',
name: HCI.SECRET,
labelKey: 'harvester.secret.label',
name: HCI.SECRET,
namespaced: true,
weight: -999,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: -999,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SECRET }
},
exact: false
@ -658,12 +656,12 @@ export function init($plugin, store) {
virtualType({
ifHaveType: HCI.SETTING,
ifHaveVerb: 'POST',
labelKey: 'harvester.setting.label',
name: HCI.SETTING,
labelKey: 'harvester.setting.label',
name: HCI.SETTING,
namespaced: true,
weight: -1000,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: -1000,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SETTING }
},
exact: false
@ -671,56 +669,56 @@ export function init($plugin, store) {
configureType(HCI.STORAGE, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.STORAGE }
},
resource: STORAGE_CLASS,
resource: STORAGE_CLASS,
resourceDetail: HCI.STORAGE,
resourceEdit: HCI.STORAGE,
isCreatable: true,
resourceEdit: HCI.STORAGE,
isCreatable: true,
});
virtualType({
labelKey: 'harvester.storage.title',
group: 'root',
labelKey: 'harvester.storage.title',
group: 'root',
ifHaveType: STORAGE_CLASS,
name: HCI.STORAGE,
name: HCI.STORAGE,
namespaced: false,
weight: 79,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 79,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.STORAGE }
},
exact: false,
});
virtualType({
label: 'PCI Devices',
group: 'advanced',
weight: 14,
name: HCI.PCI_DEVICE,
label: 'PCI Devices',
group: 'advanced',
weight: 14,
name: HCI.PCI_DEVICE,
namespaced: false,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.PCI_DEVICE }
},
exact: false,
});
configureType(HCI.PCI_DEVICE, {
isCreatable: false,
isCreatable: false,
hiddenNamespaceGroupButton: true,
listGroups: [
listGroups: [
{
icon: 'icon-list-grouped',
value: 'description',
field: 'groupByDevice',
icon: 'icon-list-grouped',
value: 'description',
field: 'groupByDevice',
hideColumn: 'description',
tooltipKey: 'resourceTable.groupBy.device'
},
{
icon: 'icon-cluster',
value: 'node',
field: 'groupByNode',
icon: 'icon-cluster',
value: 'node',
field: 'groupByNode',
hideColumn: 'node',
tooltipKey: 'resourceTable.groupBy.node'
}
@ -729,63 +727,63 @@ export function init($plugin, store) {
virtualType({
ifHaveType: HCI.SR_IOV,
labelKey: 'harvester.sriov.label',
group: 'advanced',
weight: 15,
name: HCI.SR_IOV,
labelKey: 'harvester.sriov.label',
group: 'advanced',
weight: 15,
name: HCI.SR_IOV,
namespaced: false,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SR_IOV }
},
exact: false
});
configureType(HCI.SR_IOV, {
isCreatable: false,
isCreatable: false,
hiddenNamespaceGroupButton: true,
});
virtualType({
ifHaveType: HCI.SR_IOVGPU_DEVICE,
labelKey: 'harvester.sriovgpu.label',
group: 'advanced',
weight: 13,
name: HCI.SR_IOVGPU_DEVICE,
labelKey: 'harvester.sriovgpu.label',
group: 'advanced',
weight: 13,
name: HCI.SR_IOVGPU_DEVICE,
namespaced: false,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.SR_IOVGPU_DEVICE }
},
exact: false,
});
configureType(HCI.SR_IOVGPU_DEVICE, {
isCreatable: false,
isCreatable: false,
hiddenNamespaceGroupButton: true,
});
virtualType({
labelKey: 'harvester.vgpu.label',
group: 'advanced',
weight: 12,
name: HCI.VGPU_DEVICE,
labelKey: 'harvester.vgpu.label',
group: 'advanced',
weight: 12,
name: HCI.VGPU_DEVICE,
namespaced: false,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.VGPU_DEVICE }
},
exact: false,
});
configureType(HCI.VGPU_DEVICE, {
isCreatable: false,
isCreatable: false,
hiddenNamespaceGroupButton: true,
listGroups: [
listGroups: [
{
icon: 'icon-cluster',
value: 'node',
field: 'groupByNode',
icon: 'icon-cluster',
value: 'node',
field: 'groupByNode',
hideColumn: 'node',
tooltipKey: 'resourceTable.groupBy.node'
}
@ -830,18 +828,18 @@ export function init($plugin, store) {
configureType(HCI.ADD_ONS, {
isCreatable: false,
isRemovable: false,
showState: false,
showState: false,
});
virtualType({
label: 'Add-ons',
group: 'advanced',
name: HCI.ADD_ONS,
label: 'Add-ons',
group: 'advanced',
name: HCI.ADD_ONS,
ifHaveType: HCI.ADD_ONS,
weight: -900,
weight: -900,
namespaced: false,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.ADD_ONS }
},
exact: false,
@ -849,20 +847,20 @@ export function init($plugin, store) {
configureType(HCI.LB, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.LB }
},
});
virtualType({
labelKey: 'harvester.loadBalancer.label',
name: HCI.LB,
labelKey: 'harvester.loadBalancer.label',
name: HCI.LB,
namespaced: true,
weight: 185,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 185,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.LB }
},
exact: false,
exact: false,
ifHaveType: HCI.LB,
});
headers(HCI.LB, [
@ -873,34 +871,34 @@ export function init($plugin, store) {
formatter: 'HarvesterListener',
},
{
name: 'workloadType',
name: 'workloadType',
labelKey: 'harvester.loadBalancer.workloadType.label',
value: 'workloadTypeDisplay',
value: 'workloadTypeDisplay',
},
{
name: 'ipam',
name: 'ipam',
labelKey: 'harvester.loadBalancer.ipam.label',
value: 'ipamDisplay',
value: 'ipamDisplay',
},
AGE
]);
configureType(HCI.IP_POOL, {
location: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.IP_POOL }
},
});
virtualType({
labelKey: 'harvester.ipPool.label',
name: HCI.IP_POOL,
labelKey: 'harvester.ipPool.label',
name: HCI.IP_POOL,
namespaced: false,
weight: 184,
route: {
name: `${PRODUCT_NAME}-c-cluster-resource`,
weight: 184,
route: {
name: `${ PRODUCT_NAME }-c-cluster-resource`,
params: { resource: HCI.IP_POOL }
},
exact: false,
exact: false,
ifHaveType: HCI.IP_POOL,
});
headers(HCI.IP_POOL, IP_POOL_HEADERS);

View File

@ -193,16 +193,25 @@ export default {
<h3>{{ t('harvester.host.tabs.overview') }}</h3>
<div class="row mb-20">
<div class="col span-6">
<LabelValue :name="t('harvester.host.detail.customName')" :value="customName" />
<LabelValue
:name="t('harvester.host.detail.customName')"
:value="customName"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.host.detail.hostIP')" :value="value.internalIp" />
<LabelValue
:name="t('harvester.host.detail.hostIP')"
:value="value.internalIp"
/>
</div>
</div>
<div class="row mb-20">
<div class="col span-6">
<LabelValue :name="t('harvester.host.detail.os')" :value="value.status.nodeInfo.osImage" />
<LabelValue
:name="t('harvester.host.detail.os')"
:value="value.status.nodeInfo.osImage"
/>
</div>
<div class="col span-6">
<div class="role">
@ -223,20 +232,39 @@ export default {
<div class="row mb-20">
<div class="col span-6">
<LabelValue :name="t('harvester.host.detail.create')" :value="value.metadata.creationTimestamp" />
<LabelValue
:name="t('harvester.host.detail.create')"
:value="value.metadata.creationTimestamp"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.host.detail.update')" :value="lastUpdateTime" />
<LabelValue
:name="t('harvester.host.detail.update')"
:value="lastUpdateTime"
/>
</div>
</div>
<div class="row mb-20">
<div v-if="!value.isEtcd" class="col span-6">
<LabelValue :name="t('harvester.host.detail.cpuManager')" :value="cpuManagerStatus" />
<div
v-if="!value.isEtcd"
class="col span-6"
>
<LabelValue
:name="t('harvester.host.detail.cpuManager')"
:value="cpuManagerStatus"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.host.detail.consoleUrl')" :value="consoleUrl.value">
<a slot="value" :href="consoleUrl.value" target="_blank">{{ consoleUrl.display }}</a>
<LabelValue
:name="t('harvester.host.detail.consoleUrl')"
:value="consoleUrl.value"
>
<a
slot="value"
:href="consoleUrl.value"
target="_blank"
>{{ consoleUrl.display }}</a>
</LabelValue>
</div>
</div>
@ -288,15 +316,24 @@ export default {
<h3>{{ t('harvester.host.detail.more') }}</h3>
<div class="row mb-20">
<div class="col span-4">
<LabelValue :name="t('harvester.host.detail.uuid')" :value="value.status.nodeInfo.systemUUID" />
<LabelValue
:name="t('harvester.host.detail.uuid')"
:value="value.status.nodeInfo.systemUUID"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.detail.kernel')" :value="value.status.nodeInfo.kernelVersion" />
<LabelValue
:name="t('harvester.host.detail.kernel')"
:value="value.status.nodeInfo.kernelVersion"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.detail.containerRuntime')" :value="value.status.nodeInfo.containerRuntimeVersion" />
<LabelValue
:name="t('harvester.host.detail.containerRuntime')"
:value="value.status.nodeInfo.containerRuntimeVersion"
/>
</div>
</div>
<div

View File

@ -10,7 +10,7 @@ import { LONGHORN_VERSION_V1 } from '@shell/config/types';
export default {
emits: ['update:value'],
components: {
LabelValue,
BadgeState,
@ -44,7 +44,7 @@ export default {
},
computed: {
targetDisk() {
return this.disks.find(disk => disk.name === this.value.name);
return this.disks.find((disk) => disk.name === this.value.name);
},
schedulableTooltipMessage() {
const { name, path } = this.value;
@ -124,7 +124,10 @@ export default {
</script>
<template>
<div class="disk" @update:value="update">
<div
class="disk"
@update:value="update"
>
<Banner
v-if="mountedMessage"
color="error"
@ -139,7 +142,10 @@ export default {
>
<template #value>
<div class="mt-5">
<Tag v-for="(prop, key) in value.tags" :key="key">
<Tag
v-for="(prop, key) in value.tags"
:key="key"
>
{{ prop }}
</Tag>
</div>
@ -185,7 +191,10 @@ export default {
</div>
</div>
</div>
<div v-if="!value.isNew" class="row mt-30">
<div
v-if="!value.isNew"
class="row mt-30"
>
<div class="col span-4">
<LabelValue
:name="t('harvester.host.disk.storageAvailable.label')"
@ -214,7 +223,10 @@ export default {
:value="value.displayName"
/>
</div>
<div v-if="value.path" class="col span-4">
<div
v-if="value.path"
class="col span-4"
>
<LabelValue
:name="t('harvester.host.disk.path.label')"
:value="value.path"

View File

@ -37,7 +37,7 @@ export default {
modeText() {
const mode = this.ksmtuned.spec.mode;
return ksmtunedMode.find(M => M.value === mode).label;
return ksmtunedMode.find((M) => M.value === mode).label;
},
thresCoef() {
@ -47,7 +47,7 @@ export default {
runText() {
const run = this.ksmtuned.spec.run;
return ksmtunedRunOption.find(M => M.value === run).label;
return ksmtunedRunOption.find((M) => M.value === run).label;
},
showRunInformation() {
@ -77,20 +77,35 @@ export default {
</h2>
<div class="row mb-20">
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.run')" :value="runText" />
<LabelValue
:name="t('harvester.host.ksmtuned.run')"
:value="runText"
/>
</div>
</div>
<div v-if="showRunInformation" class="row mb-20">
<div
v-if="showRunInformation"
class="row mb-20"
>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.thresCoef')" :value="thresCoef" />
<LabelValue
:name="t('harvester.host.ksmtuned.thresCoef')"
:value="thresCoef"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.mode')" :value="modeText" />
<LabelValue
:name="t('harvester.host.ksmtuned.mode')"
:value="modeText"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.enableMergeNodes')" :value="mergeNodesText" />
<LabelValue
:name="t('harvester.host.ksmtuned.enableMergeNodes')"
:value="mergeNodesText"
/>
</div>
</div>
@ -100,31 +115,51 @@ export default {
<h3>{{ t('harvester.host.ksmtuned.parameters.title') }}</h3>
<div class="row mb-20">
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.parameters.boost')" :value="ksmtuned.spec.ksmtunedParameters.boost" />
<LabelValue
:name="t('harvester.host.ksmtuned.parameters.boost')"
:value="ksmtuned.spec.ksmtunedParameters.boost"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.parameters.decay')" :value="ksmtuned.spec.ksmtunedParameters.decay" />
<LabelValue
:name="t('harvester.host.ksmtuned.parameters.decay')"
:value="ksmtuned.spec.ksmtunedParameters.decay"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.parameters.sleepMsec')" :value="ksmtuned.spec.ksmtunedParameters.sleepMsec" />
<LabelValue
:name="t('harvester.host.ksmtuned.parameters.sleepMsec')"
:value="ksmtuned.spec.ksmtunedParameters.sleepMsec"
/>
</div>
</div>
<div class="row mb-20">
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.parameters.minPages')" :value="ksmtuned.spec.ksmtunedParameters.minPages" />
<LabelValue
:name="t('harvester.host.ksmtuned.parameters.minPages')"
:value="ksmtuned.spec.ksmtunedParameters.minPages"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.parameters.maxPages')" :value="ksmtuned.spec.ksmtunedParameters.maxPages" />
<LabelValue
:name="t('harvester.host.ksmtuned.parameters.maxPages')"
:value="ksmtuned.spec.ksmtunedParameters.maxPages"
/>
</div>
</div>
</div>
<div>
<hr class="divider" />
<h3><t k="harvester.host.ksmtuned.statistics.title" :raw="true" /></h3>
<h3>
<t
k="harvester.host.ksmtuned.statistics.title"
:raw="true"
/>
</h3>
<div class="row mb-20">
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.ksmStatus')">
@ -135,34 +170,55 @@ export default {
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.statistics.sharing')" :value="ksmtuned.status.sharing" />
<LabelValue
:name="t('harvester.host.ksmtuned.statistics.sharing')"
:value="ksmtuned.status.sharing"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.statistics.shared')" :value="ksmtuned.status.shared" />
<LabelValue
:name="t('harvester.host.ksmtuned.statistics.shared')"
:value="ksmtuned.status.shared"
/>
</div>
</div>
<div class="row mb-20">
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.statistics.unshared')" :value="ksmtuned.status.unshared" />
<LabelValue
:name="t('harvester.host.ksmtuned.statistics.unshared')"
:value="ksmtuned.status.unshared"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.statistics.volatile')" :value="ksmtuned.status.volatile" />
<LabelValue
:name="t('harvester.host.ksmtuned.statistics.volatile')"
:value="ksmtuned.status.volatile"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.statistics.fullScans')" :value="ksmtuned.status.fullScans" />
<LabelValue
:name="t('harvester.host.ksmtuned.statistics.fullScans')"
:value="ksmtuned.status.fullScans"
/>
</div>
</div>
<div class="row mb-20">
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.statistics.stableNodeDups')" :value="ksmtuned.status.stableNodeDups" />
<LabelValue
:name="t('harvester.host.ksmtuned.statistics.stableNodeDups')"
:value="ksmtuned.status.stableNodeDups"
/>
</div>
<div class="col span-4">
<LabelValue :name="t('harvester.host.ksmtuned.statistics.stableNodeChains')" :value="ksmtuned.status.stableNodeChains" />
<LabelValue
:name="t('harvester.host.ksmtuned.statistics.stableNodeChains')"
:value="ksmtuned.status.stableNodeChains"
/>
</div>
</div>
</div>

View File

@ -57,7 +57,9 @@ export default {
<div>
<div v-if="inventory.warningMessages.length > 0">
<Banner
v-for="(msg, i) in inventory.warningMessages" :key="i" color="error"
v-for="(msg, i) in inventory.warningMessages"
:key="i"
color="error"
:label="msg.text"
/>
</div>

View File

@ -94,7 +94,11 @@ export default {
<template>
<Loading v-if="$fetchState.pending" />
<div v-else id="host-instances" class="row">
<div
v-else
id="host-instances"
class="row"
>
<div class="col span-12">
<SortableTable
v-bind="$attrs"
@ -102,11 +106,17 @@ export default {
default-sort-by="age"
:rows="rows"
key-field="_key"
>
<template #cell:state="scope" class="state-col">
<template
#cell:state="scope"
class="state-col"
>
<div class="state">
<HarvesterVmState class="vmstate" :row="scope.row" :all-cluster-network="allClusterNetwork" />
<HarvesterVmState
class="vmstate"
:row="scope.row"
:all-cluster-network="allClusterNetwork"
/>
</div>
</template>
</Sortabletable>

View File

@ -46,7 +46,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const linkMonitors = this.$store.getters[`${ inStore }/all`](HCI.LINK_MONITOR);
const linkMonitor = (linkMonitors.filter(l => l.id === linkMonitorId) || [])[0] || {};
const linkMonitor = (linkMonitors.filter((l) => l.id === linkMonitorId) || [])[0] || {};
return linkMonitor?.status?.linkStatus?.[nodeName] || [];
},

View File

@ -93,7 +93,7 @@ export default {
}
const res = await allHash(hash);
const hostNetworkResource = (res.hostNetworks || []).find( O => this.value.id === O.attachNodeName);
const hostNetworkResource = (res.hostNetworks || []).find( (O) => this.value.id === O.attachNodeName);
this.loadMetrics();
@ -126,7 +126,7 @@ export default {
this.newDisks = clone(disks);
const addons = this.$store.getters[`${ inStore }/all`](HCI.ADD_ONS);
const seeder = addons.find(addon => addon.id === 'harvester-system/harvester-seeder');
const seeder = addons.find((addon) => addon.id === 'harvester-system/harvester-seeder');
const seederEnabled = seeder ? seeder?.spec?.enabled : false;
@ -134,7 +134,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const inventories = this.$store.getters[`${ inStore }/all`](HCI.INVENTORY) || [];
const inventory = inventories.find(inv => inv.id === `harvester-system/${ this.value.id }`);
const inventory = inventories.find((inv) => inv.id === `harvester-system/${ this.value.id }`);
if (inventory) {
this.inventory = inventory;
@ -222,14 +222,14 @@ export default {
const nodeId = this.value.id;
const vlanStatuses = this.$store.getters[`${ inStore }/all`](HCI.VLAN_STATUS);
return vlanStatuses.filter(s => s?.status?.node === nodeId) || [];
return vlanStatuses.filter((s) => s?.status?.node === nodeId) || [];
},
longhornNode() {
const inStore = this.$store.getters['currentProduct'].inStore;
const longhornNodes = this.$store.getters[`${ inStore }/all`](LONGHORN.NODES);
return longhornNodes.find(node => node.id === `${ LONGHORN_SYSTEM }/${ this.value.id }`);
return longhornNodes.find((node) => node.id === `${ LONGHORN_SYSTEM }/${ this.value.id }`);
},
events() {
@ -275,7 +275,7 @@ export default {
seederEnabled() {
const inStore = this.$store.getters['currentProduct'].inStore;
const addons = this.$store.getters[`${ inStore }/all`](HCI.ADD_ONS);
const seeder = addons.find(addon => addon.id === 'harvester-system/harvester-seeder');
const seeder = addons.find((addon) => addon.id === 'harvester-system/harvester-seeder');
return seeder ? seeder?.spec?.enabled : false;
},
@ -373,14 +373,24 @@ export default {
:side-tabs="true"
@changed="tabChange"
>
<Tab name="basics" :label="t('harvester.host.tabs.basics')" :weight="4" class="bordered-table">
<Tab
name="basics"
:label="t('harvester.host.tabs.basics')"
:weight="4"
class="bordered-table"
>
<Basic
:value="value"
:metrics="metrics"
:mode="mode"
/>
</Tab>
<Tab name="instance" :label="t('harvester.host.tabs.instance')" :weight="3" class="bordered-table">
<Tab
name="instance"
:label="t('harvester.host.tabs.instance')"
:weight="3"
class="bordered-table"
>
<Instance :node="value" />
</Tab>
<Tab
@ -391,7 +401,9 @@ export default {
class="bordered-table"
>
<InfoBox
v-for="(vlan, i) in vlanStatuses" :key="i" >
v-for="(vlan, i) in vlanStatuses"
:key="i"
>
<VlanStatus
:value="vlan"
:mode="mode"
@ -415,7 +427,10 @@ export default {
>
<template #value>
<div class="mt-5">
<Tag v-for="(prop, key) in longhornNode.spec.tags" :key="key">
<Tag
v-for="(prop, key) in longhornNode.spec.tags"
:key="key"
>
{{ prop }}
</Tag>
</div>
@ -447,7 +462,10 @@ export default {
:show-header="false"
:label="t('harvester.host.tabs.ksmtuned')"
>
<HarvesterKsmtuned :mode="mode" :node="value" />
<HarvesterKsmtuned
:mode="mode"
:node="value"
/>
</Tab>
<Tab

View File

@ -84,14 +84,14 @@ export default {
},
hasBackupProgresses() {
return !!this.rows.find(R => R.status?.progress !== undefined);
return !!this.rows.find((R) => R.status?.progress !== undefined);
},
filteredRows() {
let r = this.rows.filter(row => row.spec?.type === BACKUP_TYPE.BACKUP);
let r = this.rows.filter((row) => row.spec?.type === BACKUP_TYPE.BACKUP);
if (this.id) {
r = r.filter(backup => backup.metadata.annotations?.[HCI_ANNOTATIONS.SVM_BACKUP_ID] === this.id);
r = r.filter((backup) => backup.metadata.annotations?.[HCI_ANNOTATIONS.SVM_BACKUP_ID] === this.id);
}
return r;

View File

@ -56,10 +56,10 @@ export default {
},
filteredRows() {
let r = this.rows.filter(row => row.spec?.type === BACKUP_TYPE.SNAPSHOT);
let r = this.rows.filter((row) => row.spec?.type === BACKUP_TYPE.SNAPSHOT);
if (this.id) {
r = r.filter(row => row.metadata.annotations?.[HCI_ANNOTATIONS.SVM_BACKUP_ID] === this.id);
r = r.filter((row) => row.metadata.annotations?.[HCI_ANNOTATIONS.SVM_BACKUP_ID] === this.id);
}
return r;

View File

@ -47,7 +47,11 @@ export default {
</script>
<template>
<Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true">
<Tabbed
v-bind="$attrs"
class="mt-15"
:side-tabs="true"
>
<Tab
name="basic"
:label="t('harvester.virtualMachine.detail.tabs.basics')"

View File

@ -19,7 +19,7 @@ const registryAddresses = [
export default {
emits: ['input'],
components: {
ResourceTabs,
DetailText,
@ -161,10 +161,10 @@ export default {
<template>
<ResourceTabs
:value="value"
@update:value="$emit('input', $event)"
:need-events="false"
:need-related="false"
:mode="mode"
@update:value="$emit('input', $event)"
>
<Tab
name="data"
@ -258,7 +258,9 @@ export default {
<div v-else>
<div
v-for="(row,idx) in parsedRows" :key="idx" class="entry"
v-for="(row,idx) in parsedRows"
:key="idx"
class="entry"
>
<DetailText
:value="row.value"

View File

@ -69,7 +69,7 @@ export default {
imageName() {
const imageList = this.$store.getters['harvester/all'](HCI.IMAGE) || [];
const image = imageList.find( I => this.imageId === I.id);
const image = imageList.find( (I) => this.imageId === I.id);
return image?.spec?.displayName || '-';
},
@ -126,29 +126,52 @@ export default {
:mode="mode"
:apply-hooks="applyHooks"
>
<Tabbed v-if="spec" :side-tabs="true" @changed="onTabChanged">
<Tab name="Basics" :label="t('harvester.virtualMachine.detail.tabs.basics')">
<Tabbed
v-if="spec"
:side-tabs="true"
@changed="onTabChanged"
>
<Tab
name="Basics"
:label="t('harvester.virtualMachine.detail.tabs.basics')"
>
<div class="row">
<div class="col span-6 mb-20">
<LabelValue :name="t('harvester.virtualMachine.detail.details.name')" :value="name" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.name')"
:value="name"
/>
</div>
<div class="col span-6 mb-20">
<LabelValue :name="t('harvester.fields.image')" :value="imageName" />
<LabelValue
:name="t('harvester.fields.image')"
:value="imageName"
/>
</div>
</div>
<div class="row">
<div class="col span-6 mb-20">
<LabelValue :name="t('harvester.virtualMachine.detail.details.hostname')" :value="hostname" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.hostname')"
:value="hostname"
/>
</div>
<div class="col span-6 mb-20">
<LabelValue :name="t('harvester.virtualMachine.input.MachineType')" :value="machineType" />
<LabelValue
:name="t('harvester.virtualMachine.input.MachineType')"
:value="machineType"
/>
</div>
</div>
<div class="mb-20">
<CpuMemory :cpu="cpu" :mode="mode" :memory="memory" />
<CpuMemory
:cpu="cpu"
:mode="mode"
:memory="memory"
/>
</div>
<div class="row">
<div class="col span-6 mb-20">
@ -156,7 +179,10 @@ export default {
<template #value>
<div>
<ul>
<li v-for="(disk, i) in disks" :key="i" >
<li
v-for="(disk, i) in disks"
:key="i"
>
{{ disk.bootOrder }}. {{ disk.name }} ({{ getDeviceType(disk) }})
</li>
</ul>
@ -169,7 +195,10 @@ export default {
<template #value>
<div>
<ul v-if="cdroms.length > 0">
<li v-for="(rom, i) in cdroms" :key="i" >
<li
v-for="(rom, i) in cdroms"
:key="i"
>
{{ rom.name }}
</li>
</ul>
@ -187,7 +216,10 @@ export default {
:label="t('harvester.tab.volume')"
:weight="-1"
>
<Volume v-model:value="diskRows" :mode="mode" />
<Volume
v-model:value="diskRows"
:mode="mode"
/>
</Tab>
<Tab
@ -195,11 +227,22 @@ export default {
:label="t('harvester.tab.network')"
:weight="-2"
>
<Network v-model:value="networkRows" :mode="mode" />
<Network
v-model:value="networkRows"
:mode="mode"
/>
</Tab>
<Tab name="keypairs" :label="t('harvester.virtualMachine.detail.tabs.keypairs')" class="bordered-table" :weight="-3">
<OverviewKeypairs v-if="vm" v-model:value="vm" />
<Tab
name="keypairs"
:label="t('harvester.virtualMachine.detail.tabs.keypairs')"
class="bordered-table"
:weight="-3"
>
<OverviewKeypairs
v-if="vm"
v-model:value="vm"
/>
</Tab>
<Tab
@ -215,7 +258,13 @@ export default {
/>
<div class="spacer"></div>
<Checkbox v-model:value="installUSBTablet" :mode="mode" class="check" type="checkbox" :label="t('harvester.virtualMachine.enableUsb')" />
<Checkbox
v-model:value="installUSBTablet"
:mode="mode"
class="check"
type="checkbox"
:label="t('harvester.virtualMachine.enableUsb')"
/>
</Tab>
</Tabbed>
</CruResource>

View File

@ -75,7 +75,7 @@ export default {
if (sourceImageNamespace && sourceImageName) {
const imageId = `${ sourceImageNamespace }/${ sourceImageName }`;
return this.images.find(image => image.id === imageId);
return this.images.find((image) => image.id === imageId);
}
return null;
@ -105,7 +105,7 @@ export default {
return this.value.encryptionSecret;
},
secretLink() {
return this.secrets.find(sc => sc.id === this.value.encryptionSecret)?.detailLocation;
return this.secrets.find((sc) => sc.id === this.value.encryptionSecret)?.detailLocation;
},
isEncryptedString() {
@ -120,7 +120,11 @@ export default {
</script>
<template>
<Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true">
<Tabbed
v-bind="$attrs"
class="mt-15"
:side-tabs="true"
>
<Tab
name="detail"
:label="t('harvester.virtualMachine.detail.tabs.basics')"
@ -155,63 +159,100 @@ export default {
<div class="row">
<div class="col span-12">
<LabelValue :name="t('harvester.image.size')" :value="formattedValue" class="mb-20" />
<LabelValue
:name="t('harvester.image.size')"
:value="formattedValue"
class="mb-20"
/>
</div>
</div>
<div class="row">
<div class="col span-12">
<LabelValue :name="t('harvester.image.virtualSize')" :value="virtualSize" class="mb-20" />
<LabelValue
:name="t('harvester.image.virtualSize')"
:value="virtualSize"
class="mb-20"
/>
</div>
</div>
<div class="row">
<div class="col span-12">
<LabelValue :name="t('nameNsDescription.description.label')" :value="description" class="mb-20" />
<LabelValue
:name="t('nameNsDescription.description.label')"
:value="description"
class="mb-20"
/>
</div>
</div>
<div class="row">
<div class="col span-12">
<LabelValue :name="t('harvester.image.isEncryption')" :value="isEncryptedString" class="mb-20" />
<LabelValue
:name="t('harvester.image.isEncryption')"
:value="isEncryptedString"
class="mb-20"
/>
</div>
</div>
<div v-if="value.isEncrypted" class="row mb-20">
<div
v-if="value.isEncrypted"
class="row mb-20"
>
<div class="col span-12">
<div class="text-label">
{{ t('harvester.image.encryptionSecret') }}
</div>
<router-link v-if="encryptionSecret && secretLink" :to="secretLink">
<router-link
v-if="encryptionSecret && secretLink"
:to="secretLink"
>
{{ encryptionSecret }}
</router-link>
<span v-else-if="encryptionSecret">
{{ encryptionSecret }}
</span>
<span v-else class="text-muted">
<span
v-else
class="text-muted"
>
&mdash;
</span>
</div>
</div>
<div v-if="isEncryptedOrDecrypted" class="row mb-20">
<div
v-if="isEncryptedOrDecrypted"
class="row mb-20"
>
<div class="col span-12">
<div class="text-label">
{{ t('harvester.image.sourceImage') }}
</div>
<router-link v-if="sourceImageId && sourceImageLink" :to="sourceImageLink">
<router-link
v-if="sourceImageId && sourceImageLink"
:to="sourceImageLink"
>
{{ sourceImageId }}
</router-link>
<span v-else-if="sourceImageId">
{{ sourceImageId }}
</span>
<span v-else class="text-muted">
<span
v-else
class="text-muted"
>
&mdash;
</span>
</div>
</div>
<div v-if="errorMessage !== '-'" class="row">
<div
v-if="errorMessage !== '-'"
class="row"
>
<div class="col span-12">
<div>
{{ t('tableHeaders.message') }}

View File

@ -69,7 +69,7 @@ export default {
imageName() {
const imageList = this.$store.getters['harvester/all'](HCI.IMAGE) || [];
const image = imageList.find( I => this.imageId === I.id);
const image = imageList.find( (I) => this.imageId === I.id);
return image?.spec?.displayName || '-';
},
@ -126,29 +126,52 @@ export default {
:mode="mode"
:apply-hooks="applyHooks"
>
<Tabbed v-if="spec" :side-tabs="true" @changed="onTabChanged">
<Tab name="Basics" :label="t('harvester.virtualMachine.detail.tabs.basics')">
<Tabbed
v-if="spec"
:side-tabs="true"
@changed="onTabChanged"
>
<Tab
name="Basics"
:label="t('harvester.virtualMachine.detail.tabs.basics')"
>
<div class="row mb-10">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.name')" :value="name" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.name')"
:value="name"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.fields.image')" :value="imageName" />
<LabelValue
:name="t('harvester.fields.image')"
:value="imageName"
/>
</div>
</div>
<div class="row mb-10">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.hostname')" :value="hostname" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.hostname')"
:value="hostname"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.input.MachineType')" :value="machineType" />
<LabelValue
:name="t('harvester.virtualMachine.input.MachineType')"
:value="machineType"
/>
</div>
</div>
<CpuMemory :cpu="cpu" :mode="mode" :memory="memory" />
<CpuMemory
:cpu="cpu"
:mode="mode"
:memory="memory"
/>
<div class="row mb-10">
<div class="col span-6">
@ -156,7 +179,10 @@ export default {
<template #value>
<div>
<ul>
<li v-for="(disk, i) in disks" :key="i" >
<li
v-for="(disk, i) in disks"
:key="i"
>
{{ disk.bootOrder }}. {{ disk.name }} ({{ getDeviceType(disk) }})
</li>
</ul>
@ -169,7 +195,10 @@ export default {
<template #value>
<div>
<ul v-if="cdroms.length > 0">
<li v-for="(rom, i) in cdroms" :key="i" >
<li
v-for="(rom, i) in cdroms"
:key="i"
>
{{ rom.name }}
</li>
</ul>
@ -188,7 +217,10 @@ export default {
:label="t('harvester.tab.volume')"
:weight="-1"
>
<Volume v-model:value="diskRows" :mode="mode" />
<Volume
v-model:value="diskRows"
:mode="mode"
/>
</Tab>
<Tab
@ -196,11 +228,22 @@ export default {
:label="t('harvester.tab.network')"
:weight="-2"
>
<Network v-model:value="networkRows" :mode="mode" />
<Network
v-model:value="networkRows"
:mode="mode"
/>
</Tab>
<Tab name="keypairs" :label="t('harvester.virtualMachine.detail.tabs.keypairs')" class="bordered-table" :weight="-3">
<OverviewKeypairs v-if="vm" v-model:value="vm" />
<Tab
name="keypairs"
:label="t('harvester.virtualMachine.detail.tabs.keypairs')"
class="bordered-table"
:weight="-3"
>
<OverviewKeypairs
v-if="vm"
v-model:value="vm"
/>
</Tab>
<Tab
@ -216,7 +259,13 @@ export default {
/>
<div class="spacer"></div>
<Checkbox v-model:value="installUSBTablet" :mode="mode" class="check" type="checkbox" :label="t('harvester.virtualMachine.enableUsb')" />
<Checkbox
v-model:value="installUSBTablet"
:mode="mode"
class="check"
type="checkbox"
:label="t('harvester.virtualMachine.enableUsb')"
/>
</Tab>
</Tabbed>
</CruResource>

View File

@ -63,7 +63,7 @@ export default {
imageName() {
const imageList = this.$store.getters['harvester/all'](HCI.IMAGE) || [];
const image = imageList.find( I => this.value.rootImageId === I.id);
const image = imageList.find( (I) => this.value.rootImageId === I.id);
return image?.spec?.displayName || 'N/A';
},
@ -134,11 +134,17 @@ export default {
<template>
<div>
<VMConsoleBar :resourceType="value" class="consoleBut" />
<VMConsoleBar
:resource-type="value"
class="consoleBut"
/>
<div class="overview-basics">
<div class="row">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.name')" :value="value.nameDisplay">
<LabelValue
:name="t('harvester.virtualMachine.detail.details.name')"
:value="value.nameDisplay"
>
<template #value>
<div class="smart-row">
<div class="console">
@ -149,13 +155,19 @@ export default {
</LabelValue>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.fields.image')" :value="imageName" />
<LabelValue
:name="t('harvester.fields.image')"
:value="imageName"
/>
</div>
</div>
<div class="row">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.hostname')" :value="hostname">
<LabelValue
:name="t('harvester.virtualMachine.detail.details.hostname')"
:value="hostname"
>
<template #value>
<div>
{{ hostname }}
@ -165,7 +177,10 @@ export default {
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.node')" :value="node">
<LabelValue
:name="t('harvester.virtualMachine.detail.details.node')"
:value="node"
>
<template #value>
<div>
{{ node }}
@ -179,13 +194,19 @@ export default {
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.ipAddress')">
<template #value>
<HarvesterIpAddress v-model:value="value.id" :row="value" />
<HarvesterIpAddress
v-model:value="value.id"
:row="value"
/>
</template>
</LabelValue>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.created')" :value="creationTimestamp" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.created')"
:value="creationTimestamp"
/>
</div>
</div>
@ -195,10 +216,17 @@ export default {
<div class="row">
<div class="col span-6">
<InputOrDisplay :name="t('harvester.virtualMachine.detail.details.bootOrder')" :value="disks" :mode="mode">
<InputOrDisplay
:name="t('harvester.virtualMachine.detail.details.bootOrder')"
:value="disks"
:mode="mode"
>
<template #value>
<ul>
<li v-for="(disk, i) in disks" :key="i" >
<li
v-for="(disk, i) in disks"
:key="i"
>
{{ disk.bootOrder }}. {{ disk.name }} ({{ getDeviceType(disk) }})
</li>
</ul>
@ -206,11 +234,18 @@ export default {
</InputOrDisplay>
</div>
<div class="col span-6">
<InputOrDisplay :name="t('harvester.virtualMachine.detail.details.CDROMs')" :value="cdroms" :mode="mode">
<InputOrDisplay
:name="t('harvester.virtualMachine.detail.details.CDROMs')"
:value="cdroms"
:mode="mode"
>
<template #value>
<div>
<ul v-if="cdroms.length > 0">
<li v-for="(rom, i) in cdroms" :key="i" >
<li
v-for="(rom, i) in cdroms"
:key="i"
>
{{ rom.name }}
</li>
</ul>
@ -224,17 +259,29 @@ export default {
</div>
<div class="row">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.operatingSystem')" :value="operatingSystem" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.operatingSystem')"
:value="operatingSystem"
/>
</div>
<LabelValue :name="t('harvester.virtualMachine.detail.details.flavor')" :value="flavor" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.flavor')"
:value="flavor"
/>
</div>
<div class="row">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.kernelRelease')" :value="kernelRelease" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.kernelRelease')"
:value="kernelRelease"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.input.MachineType')" :value="machineType" />
<LabelValue
:name="t('harvester.virtualMachine.input.MachineType')"
:value="machineType"
/>
</div>
</div>
</div>

View File

@ -42,7 +42,7 @@ export default {
},
isShow(id = '') {
const ssh = this.sshKeys.find(O => O?.data?.id === id) || {};
const ssh = this.sshKeys.find((O) => O?.data?.id === id) || {};
return ssh.showKey || false;
}
@ -66,18 +66,31 @@ export default {
<template>
<div class="overview-sshKeys">
<div v-for="(ssh, index) in sshKeys" :key="index">
<div
v-for="(ssh, index) in sshKeys"
:key="index"
>
<div class="col span-4">
{{ ssh.id }}
</div>
<div class="col span-7 offset-1">
<div v-if="ssh.showKey" class="key-display">
<div
v-if="ssh.showKey"
class="key-display"
>
{{ ssh.publicKey }}
<button class="btn btn-sm role-link hide-bar" @click="toggleShow(index)">
<button
class="btn btn-sm role-link hide-bar"
@click="toggleShow(index)"
>
<i class="icon icon-x"></i>
</button>
</div>
<button v-else class="btn btn-sm role-link" @click="toggleShow(index)">
<button
v-else
class="btn btn-sm role-link"
@click="toggleShow(index)"
>
*******<i class="icons icon-show"></i>
</button>
</div>

View File

@ -60,19 +60,31 @@ export default {
<div>
<div class="row mb-20">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.sourceNode')" :value="sourceNode" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.sourceNode')"
:value="sourceNode"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.targetNode')" :value="targetNode" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.targetNode')"
:value="targetNode"
/>
</div>
</div>
<div class="row mb-20">
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.started')" :value="started" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.started')"
:value="started"
/>
</div>
<div class="col span-6">
<LabelValue :name="t('harvester.virtualMachine.detail.details.ended')" :value="ended" />
<LabelValue
:name="t('harvester.virtualMachine.detail.details.ended')"
:value="ended"
/>
</div>
</div>
</div>

View File

@ -139,7 +139,7 @@ export default {
const involvedName = e?.involvedObject?.name;
const matchPVC = pvcName.find(name => name === involvedName);
const matchPVC = pvcName.find((name) => name === involvedName);
return (involvedName === name || involvedName === podName || matchPVC) && e.firstTimestamp >= creationTimestamp;
}).sort((a, b) => {
@ -182,12 +182,31 @@ export default {
<template>
<div>
<Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true" @changed="onTabChanged">
<Tab name="basics" :label="t('harvester.virtualMachine.detail.tabs.basics')" class="bordered-table" :weight="7">
<OverviewBasics :value="value" :vmi="vmi" mode="view" />
<Tabbed
v-bind="$attrs"
class="mt-15"
:side-tabs="true"
@changed="onTabChanged"
>
<Tab
name="basics"
:label="t('harvester.virtualMachine.detail.tabs.basics')"
class="bordered-table"
:weight="7"
>
<OverviewBasics
:value="value"
:vmi="vmi"
mode="view"
/>
</Tab>
<Tab name="disks" :label="t('harvester.tab.volume')" class="bordered-table" :weight="6">
<Tab
name="disks"
:label="t('harvester.tab.volume')"
class="bordered-table"
:weight="6"
>
<Volume
v-model:value="diskRows"
mode="view"
@ -197,15 +216,33 @@ export default {
/>
</Tab>
<Tab name="networks" :label="t('harvester.virtualMachine.detail.tabs.networks')" class="bordered-table" :weight="5">
<Network v-model:value="networkRows" mode="view" />
<Tab
name="networks"
:label="t('harvester.virtualMachine.detail.tabs.networks')"
class="bordered-table"
:weight="5"
>
<Network
v-model:value="networkRows"
mode="view"
/>
</Tab>
<Tab name="keypairs" :label="t('harvester.virtualMachine.detail.tabs.keypairs')" class="bordered-table" :weight="4">
<Tab
name="keypairs"
:label="t('harvester.virtualMachine.detail.tabs.keypairs')"
class="bordered-table"
:weight="4"
>
<OverviewKeypairs :value="value" />
</Tab>
<Tab v-if="hasResourceQuotaSchema" name="quotas" :label="t('harvester.tab.quotas')" :weight="3">
<Tab
v-if="hasResourceQuotaSchema"
name="quotas"
:label="t('harvester.tab.quotas')"
:weight="3"
>
<LabelValue
:name="t('harvester.snapshot.totalSnapshotSize')"
:value="totalSnapshotSize"
@ -229,13 +266,27 @@ export default {
</template>
</Tab>
<Tab name="nodeScheduling" :label="t('workload.container.titles.nodeScheduling')" :weight="2.4">
<Tab
name="nodeScheduling"
:label="t('workload.container.titles.nodeScheduling')"
:weight="2.4"
>
<template #default="{active}">
<NodeScheduling v-if="spec" :key="active" :mode="mode" :value="spec.template.spec" :nodes="nodesIdOptions" />
<NodeScheduling
v-if="spec"
:key="active"
:mode="mode"
:value="spec.template.spec"
:nodes="nodesIdOptions"
/>
</template>
</Tab>
<Tab :label="t('harvester.tab.vmScheduling')" name="vmScheduling" :weight="2.3">
<Tab
:label="t('harvester.tab.vmScheduling')"
name="vmScheduling"
:weight="2.3"
>
<template #default="{active}">
<PodAffinity
v-if="spec"
@ -250,11 +301,25 @@ export default {
</template>
</Tab>
<Tab :label="t('harvester.tab.accessCredentials')" class="bordered-table" name="accessCredentials" :weight="2.2">
<AccessCredentials mode="view" :value="accessCredentials" :resourceType="value" />
<Tab
:label="t('harvester.tab.accessCredentials')"
class="bordered-table"
name="accessCredentials"
:weight="2.2"
>
<AccessCredentials
mode="view"
:value="accessCredentials"
:resource-type="value"
/>
</Tab>
<Tab name="cloudConfig" :label="t('harvester.virtualMachine.detail.tabs.cloudConfig')" class="bordered-table" :weight="2">
<Tab
name="cloudConfig"
:label="t('harvester.virtualMachine.detail.tabs.cloudConfig')"
class="bordered-table"
:weight="2"
>
<CloudConfig
ref="yamlEditor"
mode="view"
@ -263,12 +328,25 @@ export default {
/>
</Tab>
<Tab name="event" :label="t('harvester.virtualMachine.detail.tabs.events')" :weight="1">
<Events :resource="vmi" :events="events" />
<Tab
name="event"
:label="t('harvester.virtualMachine.detail.tabs.events')"
:weight="1"
>
<Events
:resource="vmi"
:events="events"
/>
</Tab>
<Tab name="migration" :label="t('harvester.virtualMachine.detail.tabs.migration')">
<Migration :value="value" :vmi-resource="vmi" />
<Tab
name="migration"
:label="t('harvester.virtualMachine.detail.tabs.migration')"
>
<Migration
:value="value"
:vmi-resource="vmi"
/>
</Tab>
<Tab

View File

@ -8,7 +8,7 @@ import { NETWORK_HEADERS } from '@pkg/harvester/list/harvesterhci.io.networkatta
export default {
emits: ['input'],
components: {
ResourceTabs,
Tab,
@ -37,7 +37,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const networks = this.$store.getters[`${ inStore }/all`](NETWORK_ATTACHMENT);
return networks.filter(n => n?.id === this.value?.spec?.selector?.network);
return networks.filter((n) => n?.id === this.value?.spec?.selector?.network);
},
networkHeaders() {
@ -74,8 +74,8 @@ export default {
<template>
<ResourceTabs
:value="value"
@update:value="$emit('input', $event)"
:need-related="false"
@update:value="$emit('input', $event)"
>
<Tab
name="network"

View File

@ -11,7 +11,7 @@ import { IP_POOL_HEADERS } from '../config/harvester-cluster';
export default {
emits: ['input'],
components: {
ResourceTabs,
Tab,
@ -43,7 +43,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const ipPools = this.$store.getters[`${ inStore }/all`](HCI.IP_POOL);
return ipPools.filter(i => i.id === this.value.status.allocatedAddress.ipPool);
return ipPools.filter((i) => i.id === this.value.status.allocatedAddress.ipPool);
},
ipPoolHeaders() {
@ -86,7 +86,7 @@ export default {
},
backendServerSelectors() {
return Object.keys(this.value.spec?.backendServerSelector || {}).map(key => ({
return Object.keys(this.value.spec?.backendServerSelector || {}).map((key) => ({
key,
value: this.value.spec.backendServerSelector[key],
}));
@ -105,12 +105,12 @@ export default {
vmHeaders() {
const filterNames = ['state', 'ip', 'node'];
return VM_HEADERS.filter(h => !filterNames.includes(h.name));
return VM_HEADERS.filter((h) => !filterNames.includes(h.name));
},
vms() {
const inStore = this.$store.getters['currentProduct'].inStore;
const vms = this.$store.getters[`${ inStore }/all`](HCI.VM).filter(vm => vm.metadata.namespace === this.value.metadata.namespace);
const vms = this.$store.getters[`${ inStore }/all`](HCI.VM).filter((vm) => vm.metadata.namespace === this.value.metadata.namespace);
const match = matching(vms, this.value?.spec?.backendServerSelector, 'spec.template.metadata.labels');
return match;
@ -122,8 +122,8 @@ export default {
<template>
<ResourceTabs
:value="value"
@update:value="$emit('input', $event)"
:need-related="false"
@update:value="$emit('input', $event)"
>
<Tab
v-if="value.spec.ipam === 'pool'"

View File

@ -12,7 +12,7 @@ import { HCI } from '@pkg/harvester/config/labels-annotations';
export default {
emits: ['input'],
components: {
ResourceTabs,
Tab,
@ -64,7 +64,7 @@ export default {
if (!isEmpty(selector)) {
return matching(nodes, selector);
} else if (matchedNodes && matchedNodes.length > 0) {
return nodes.filter(node => matchedNodes.includes(node.id));
return nodes.filter((node) => matchedNodes.includes(node.id));
} else {
return nodes;
}
@ -76,8 +76,8 @@ export default {
<template>
<ResourceTabs
:value="value"
@update:value="$emit('input', $event)"
:need-related="false"
@update:value="$emit('input', $event)"
>
<Tab
name="node"

View File

@ -93,7 +93,11 @@ export default {
</template>
<template #body>
<Checkbox v-model:value="cloneData" class="mb-10" label-key="harvester.modal.cloneVM.type" />
<Checkbox
v-model:value="cloneData"
class="mb-10"
label-key="harvester.modal.cloneVM.type"
/>
<LabeledInput
v-show="cloneData"
@ -104,9 +108,15 @@ export default {
/>
</template>
<template #actions class="actions">
<template
#actions
class="actions"
>
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -118,7 +128,10 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</template>
</Card>
</template>

View File

@ -47,7 +47,7 @@ export default {
},
names() {
return this.resources.map(obj => obj.nameDisplay).slice(0, 5);
return this.resources.map((obj) => obj.nameDisplay).slice(0, 5);
},
resourceNames() {
@ -131,7 +131,10 @@ export default {
</script>
<template>
<Card class="prompt-related" :show-highlight-border="false">
<Card
class="prompt-related"
:show-highlight-border="false"
>
<template #title>
<h4 class="text-default-text">
{{ t('promptRemove.title') }}
@ -152,19 +155,34 @@ export default {
<div class="mb-10">
<CopyToClipboardText :text="nameToMatch" />
</div>
<input id="confirm" v-model="confirmName" type="text" />
<input
id="confirm"
v-model="confirmName"
type="text"
/>
<div class="text-info mt-20">
{{ protip }}
</div>
<Banner v-for="(error, i) in errors" :key="i"/>
<Banner
v-for="(error, i) in errors"
:key="i"
/>
</div>
</template>
<template #actions>
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton mode="delete" class="btn bg-error ml-10" :disabled="deleteDisabled" @click="remove" />
<AsyncButton
mode="delete"
class="btn bg-error ml-10"
:disabled="deleteDisabled"
@click="remove"
/>
</template>
</Card>
</template>

View File

@ -93,7 +93,11 @@ export default {
</template>
<template #body>
<Checkbox v-model:value="cloneData" class="mb-10" label-key="harvester.modal.cloneVM.type" />
<Checkbox
v-model:value="cloneData"
class="mb-10"
label-key="harvester.modal.cloneVM.type"
/>
<LabeledInput
v-show="cloneData"
@ -107,7 +111,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -119,7 +126,12 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
</div>
</template>
</Card>

View File

@ -99,11 +99,17 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton mode="enable" @click="save" />
<AsyncButton
mode="enable"
@click="save"
/>
</div>
</div>
</template>

View File

@ -86,11 +86,17 @@ export default {
<template #actions>
<div class="buttons actions">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton mode="enable" @click="save" />
<AsyncButton
mode="enable"
@click="save"
/>
</div>
</template>
</Card>

View File

@ -99,11 +99,17 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton mode="enable" @click="save" />
<AsyncButton
mode="enable"
@click="save"
/>
</div>
</div>
</template>

View File

@ -83,11 +83,18 @@ export default {
<template #actions>
<div class="buttons actions">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton mode="edit" :disabled="!type" @click="save" />
<AsyncButton
mode="edit"
:disabled="!type"
@click="save"
/>
</div>
</template>
</Card>

View File

@ -43,7 +43,7 @@ export default {
...mapGetters({ t: 'i18n/t' }),
PVCs() {
return this.allPVCs.filter(P => this.actionResource.metadata.namespace === P.metadata.namespace) || [];
return this.allPVCs.filter((P) => this.actionResource.metadata.namespace === P.metadata.namespace) || [];
},
actionResource() {
@ -111,7 +111,11 @@ export default {
</script>
<template>
<Card ref="modal" name="modal" :show-highlight-border="false">
<Card
ref="modal"
name="modal"
:show-highlight-border="false"
>
<template #title>
<h4
v-clean-html="t('harvester.modal.hotplug.title')"
@ -138,7 +142,11 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button type="button" class="btn role-secondary mr-10" @click="close">
<button
type="button"
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -149,7 +157,10 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -98,20 +98,36 @@ export default {
</template>
<template #body>
<LabeledInput v-model:value="backUpName" :label="t('generic.name')" required />
<LabeledInput
v-model:value="backUpName"
:label="t('generic.name')"
required
/>
</template>
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton mode="create" :disabled="!backUpName" @click="save" />
<AsyncButton
mode="create"
:disabled="!backUpName"
@click="save"
/>
</div>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
</div>
</template>
</Card>

View File

@ -103,7 +103,11 @@ export default {
</template>
<template #body>
<Checkbox v-model:value="withData" class="mb-10" label="With Data" />
<Checkbox
v-model:value="withData"
class="mb-10"
label="With Data"
/>
<LabeledInput
v-model:value="templateName"
@ -121,7 +125,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -132,7 +139,10 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -118,7 +118,9 @@ export default {
<div>
<Checkbox
v-for="(disk, i) in allDisk" :key="i" v-model:value="disk.value"
v-for="(disk, i) in allDisk"
:key="i"
v-model:value="disk.value"
:label="disk.name"
/>
</div>
@ -131,7 +133,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -143,7 +148,12 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
</div>
</template>
</Card>

View File

@ -34,7 +34,7 @@ export default {
await allHash(hash);
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find(s => s.isDefault);
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find((s) => s.isDefault);
this['storageClassName'] = defaultStorage?.metadata?.name || 'longhorn';
},
@ -58,7 +58,7 @@ export default {
},
namespaces() {
const choices = this.$store.getters['harvester/all'](NAMESPACE).filter( N => !N.isSystem);
const choices = this.$store.getters['harvester/all'](NAMESPACE).filter( (N) => !N.isSystem);
const out = sortBy(
choices.map((obj) => {
@ -81,7 +81,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const storages = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS);
const out = storages.filter(s => !s.parameters?.backingImage).map((s) => {
const out = storages.filter((s) => !s.parameters?.backingImage).map((s) => {
const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name;
return {
@ -169,7 +169,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -180,7 +183,10 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -10,7 +10,7 @@ import { ucFirst } from '@shell/utils/string';
export default {
emits: ['close'],
components: {
Card,
Checkbox,
@ -110,13 +110,29 @@ export default {
/>
</div>
<Banner color="warning" :label="t('harvester.host.enableMaintenance.protip')" />
<Banner
color="warning"
:label="t('harvester.host.enableMaintenance.protip')"
/>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="ucFirst(err)" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="ucFirst(err)"
/>
<Banner v-if="!force" class="mt-0" color="warning" :labelKey="'harvester.host.enableMaintenance.shutDownVMs'" />
<Banner
v-if="!force"
class="mt-0"
color="warning"
:label-key="'harvester.host.enableMaintenance.shutDownVMs'"
/>
<div v-for="(unhealthyVM, i) in unhealthyVMs" :key="i">
<div
v-for="(unhealthyVM, i) in unhealthyVMs"
:key="i"
>
<Banner color="error mt-0 mb-5">
<p>
{{ ucFirst(unhealthyVM.message) }}
@ -125,7 +141,9 @@ export default {
<div class="vm-list mb-5">
<BadgeState
v-for="(vm, k) in unhealthyVM.vms" :key="k" color="bg-error mb-5 mr-5"
v-for="(vm, k) in unhealthyVM.vms"
:key="k"
color="bg-error mb-5 mr-5"
:label="vm"
/>
</div>
@ -135,7 +153,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>

View File

@ -13,7 +13,7 @@ import { HCI } from '../types';
export default {
emits: ['close'],
components: {
AsyncButton, Banner, Card, LabeledSelect
},
@ -65,7 +65,7 @@ export default {
vmi() {
const inStore = this.$store.getters['currentProduct'].inStore;
const vmiResources = this.$store.getters[`${ inStore }/all`](HCI.VMI);
const resource = vmiResources.find(VMI => VMI.id === this.actionResource?.id) || null;
const resource = vmiResources.find((VMI) => VMI.id === this.actionResource?.id) || null;
return resource;
},
@ -150,7 +150,11 @@ export default {
</template>
<template #body>
<Banner v-if="actionResource?.isCpuPinning" color="warning" :label="cpuPinningAlertMessage" />
<Banner
v-if="actionResource?.isCpuPinning"
color="warning"
:label="cpuPinningAlertMessage"
/>
<LabeledSelect
v-model:value="nodeName"
:label="t('harvester.modal.migration.fields.nodeName.label')"
@ -159,9 +163,15 @@ export default {
/>
</template>
<template #actions class="actions">
<template
#actions
class="actions"
>
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -171,7 +181,12 @@ export default {
@click="apply"
/>
</div>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
</template>
</Card>
</template>

View File

@ -100,12 +100,20 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton @click="save" />
</div>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
</div>
</template>
</Card>

View File

@ -141,7 +141,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -152,7 +155,10 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -157,7 +157,9 @@ export default {
</div>
<div
v-for="(err, idx) in errors" :key="idx">
v-for="(err, idx) in errors"
:key="idx"
>
<Banner
color="error"
:label="stringify(err)"

View File

@ -80,7 +80,11 @@ export default {
</script>
<template>
<Card ref="modal" name="modal" :show-highlight-border="false">
<Card
ref="modal"
name="modal"
:show-highlight-border="false"
>
<template #title>
<h4
v-clean-html="t('harvester.virtualMachine.unplug.title', { name: diskName })"
@ -91,7 +95,11 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button type="button" class="btn role-secondary mr-10" @click="close">
<button
type="button"
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -104,7 +112,12 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
</div>
</template>
</Card>

View File

@ -121,21 +121,40 @@ export default {
</template>
<template #body>
<LabeledInput v-model:value="actionResource.metadata.namespace" :disabled="true" :label="t('generic.namespace')" />
<LabeledInput v-model:value="snapshotName" class="mt-20" :label="t('generic.name')" required />
<LabeledInput
v-model:value="actionResource.metadata.namespace"
:disabled="true"
:label="t('generic.namespace')"
/>
<LabeledInput
v-model:value="snapshotName"
class="mt-20"
:label="t('generic.name')"
required
/>
</template>
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton mode="create" :disabled="!snapshotName" @click="save" />
<AsyncButton
mode="create"
:disabled="!snapshotName"
@click="save"
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -12,7 +12,7 @@ import LabeledSelect from '@shell/components/form/LabeledSelect';
export default {
emits: ['close'],
components: {
AsyncButton,
Banner,
@ -112,7 +112,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
@ -123,7 +126,10 @@ export default {
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -35,7 +35,11 @@ export default {
</script>
<template>
<Card ref="modal" name="modal" :show-highlight-border="false">
<Card
ref="modal"
name="modal"
:show-highlight-border="false"
>
<template #title>
<h4 class="text-default-text">
{{ t('generic.tip') }}
@ -49,7 +53,11 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button type="button" class="btn role-secondary mr-10" @click="ok">
<button
type="button"
class="btn role-secondary mr-10"
@click="ok"
>
{{ t('generic.ok') }}
</button>
</div>

View File

@ -8,7 +8,7 @@ import AppModal from '@shell/components/AppModal';
export default {
emits: ['close'],
components: {
AppModal,
Card,
@ -75,7 +75,9 @@ export default {
<template #actions>
<div class="bottom">
<Banner
v-for="(err, i) in errors" :key="i" color="error"
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
<div class="buttons">

View File

@ -12,8 +12,8 @@ import { allHash } from '@shell/utils/promise';
import { STORAGE_CLASS } from '@shell/config/types';
export default {
name: 'HarvesterRestoreSnapshotDialog',
name: 'HarvesterRestoreSnapshotDialog',
emits: ['close'],
components: {
@ -45,7 +45,7 @@ export default {
await allHash(hash);
if (this.showStorageClass) {
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find(s => s.isDefault);
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find((s) => s.isDefault);
const currentStorageName = this.resources[0].metadata?.annotations[HCI_ANNOTATIONS.STORAGE_CLASS];
@ -66,7 +66,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const storages = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS);
const out = storages.filter(s => !s.parameters?.backingImage).filter((s) => {
const out = storages.filter((s) => !s.parameters?.backingImage).filter((s) => {
return s.provisioner === this.actionResource.metadata?.annotations[HCI_ANNOTATIONS.STORAGE_PROVISIONER];
}).map((s) => {
const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name;
@ -127,7 +127,6 @@ export default {
</script>
<template>
<Card :show-highlight-border="false">
<template #title>
{{ t('harvester.modal.restoreSnapshot.title') }}
</template>
@ -151,7 +150,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton
@ -160,7 +162,10 @@ export default {
@click="save"
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -6,7 +6,7 @@ import { Banner } from '@components/Banner';
import AsyncButton from '@shell/components/AsyncButton';
import { LabeledInput } from '@components/Form/LabeledInput';
export default {
name: 'HarvesterSnapshotDialog',
name: 'HarvesterSnapshotDialog',
emits: ['close'],
@ -84,7 +84,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton
@ -93,7 +96,12 @@ export default {
@click="save"
/>
</div>
<Banner v-for="(err, i) in errors" :key="i" color="error" :label="err" />
<Banner
v-for="(err, i) in errors"
:key="i"
color="error"
:label="err"
/>
</div>
</template>
</Card>

View File

@ -8,7 +8,7 @@ import { LabeledInput } from '@components/Form/LabeledInput';
import { Checkbox } from '@components/Form/Checkbox';
export default {
name: 'HarvesterPvcCloneDialog',
name: 'HarvesterPvcCloneDialog',
emits: ['close'],
@ -85,7 +85,11 @@ export default {
</template>
<template #body>
<Checkbox v-model:value="cloneData" class="mb-10" label-key="harvester.modal.cloneVM.type" />
<Checkbox
v-model:value="cloneData"
class="mb-10"
label-key="harvester.modal.cloneVM.type"
/>
<LabeledInput
v-show="cloneData"
@ -99,7 +103,10 @@ export default {
<template #actions>
<div class="actions">
<div class="buttons">
<button class="btn role-secondary mr-10" @click="close">
<button
class="btn role-secondary mr-10"
@click="close"
>
{{ t('generic.cancel') }}
</button>
<AsyncButton
@ -108,7 +115,10 @@ export default {
@click="save"
/>
</div>
<Banner v-for="(err, i) in errors" :key="i"/>
<Banner
v-for="(err, i) in errors"
:key="i"
/>
</div>
</template>
</Card>

View File

@ -97,7 +97,10 @@ export default {
color="error"
:label="t('harvester.addons.nvidiaDriverToolkit.parsingSpecError', null, { raw: true })"
/>
<Tabbed v-else :side-tabs="true">
<Tabbed
v-else
:side-tabs="true"
>
<Tab
name="basic"
:label="t('harvester.addons.nvidiaDriverToolkit.titles.basic')"
@ -113,7 +116,10 @@ export default {
@update:value="toggleEnable"
/>
<div v-if="value.spec.enabled">
<div v-if="valuesContentJson.image" class="row mb-15">
<div
v-if="valuesContentJson.image"
class="row mb-15"
>
<div class="col span-6">
<LabeledInput
v-model:value="valuesContentJson.image.repo"

View File

@ -102,7 +102,12 @@ export default {
:labels="[t('generic.enabled'), t('generic.disabled')]"
/>
</Tab>
<Tab v-if="value.spec.enabled" name="fluentbit" :label="t('harvester.logging.configuration.section.fluentbit')" :weight="-1">
<Tab
v-if="value.spec.enabled"
name="fluentbit"
:label="t('harvester.logging.configuration.section.fluentbit')"
:weight="-1"
>
<div class="row mt-20">
<div class="col span-6">
<LabeledInput
@ -140,7 +145,12 @@ export default {
</div>
</div>
</Tab>
<Tab v-if="value.spec.enabled" name="fluentd" :label="t('harvester.logging.configuration.section.fluentd')" :weight="-1">
<Tab
v-if="value.spec.enabled"
name="fluentd"
:label="t('harvester.logging.configuration.section.fluentd')"
:weight="-1"
>
<div class="row mt-20">
<div class="col span-6">
<LabeledInput

View File

@ -216,7 +216,12 @@ export default {
:labels="[t('generic.enabled'), t('generic.disabled')]"
/>
</Tab>
<Tab v-if="value.spec.enabled" name="prometheus" :label="t('harvester.setting.harvesterMonitoring.section.prometheus')" :weight="-1">
<Tab
v-if="value.spec.enabled"
name="prometheus"
:label="t('harvester.setting.harvesterMonitoring.section.prometheus')"
:weight="-1"
>
<a
v-clean-tooltip="!externalLinks.prometheus.enabled ? t('monitoring.overview.linkedList.na') : undefined"
:disabled="!externalLinks.prometheus.enabled"
@ -325,7 +330,12 @@ export default {
</div>
</div>
</Tab>
<Tab v-if="value.spec.enabled" name="nodeExporter" :label="t('harvester.setting.harvesterMonitoring.section.prometheusNodeExporter')" :weight="-2">
<Tab
v-if="value.spec.enabled"
name="nodeExporter"
:label="t('harvester.setting.harvesterMonitoring.section.prometheusNodeExporter')"
:weight="-2"
>
<div class="row mt-10">
<div class="col span-6">
<LabeledInput
@ -363,7 +373,12 @@ export default {
</div>
</div>
</Tab>
<Tab v-if="value.spec.enabled && valuesContentJson.grafana.resources" name="grafana" :label="t('harvester.setting.harvesterMonitoring.section.grafana')" :weight="-3">
<Tab
v-if="value.spec.enabled && valuesContentJson.grafana.resources"
name="grafana"
:label="t('harvester.setting.harvesterMonitoring.section.grafana')"
:weight="-3"
>
<a
v-clean-tooltip="!externalLinks.grafana.enabled ? t('monitoring.overview.linkedList.na') : undefined"
:disabled="!externalLinks.grafana.enabled"
@ -425,7 +440,12 @@ export default {
</div>
</div>
</Tab>
<Tab v-if="value.spec.enabled" name="alertmanager" :label="t('harvester.setting.harvesterMonitoring.section.alertmanager')" :weight="-4">
<Tab
v-if="value.spec.enabled"
name="alertmanager"
:label="t('harvester.setting.harvesterMonitoring.section.alertmanager')"
:weight="-4"
>
<RadioGroup
v-model:value="valuesContentJson.alertmanager.enabled"
class="mb-20"

View File

@ -86,7 +86,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const storages = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS);
const out = storages.filter(s => !s.parameters?.backingImage).map((s) => {
const out = storages.filter((s) => !s.parameters?.backingImage).map((s) => {
const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name;
return {
@ -106,7 +106,7 @@ export default {
setDefaultClassName() {
const inStore = this.$store.getters['currentProduct'].inStore;
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find( s => s.isDefault);
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find( (s) => s.isDefault);
this.valuesContent.pvcClaim['storageClassName'] = this.valuesContent?.pvcClaim?.storageClassName || defaultStorage?.metadata?.name || 'longhorn';

View File

@ -83,13 +83,17 @@ export default {
>
<NameNsDescription
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
:namespaced="true"
@update:value="$emit('update:value', $event)"
/>
<Tabbed :side-tabs="true">
<Tab name="basics" :label="t('harvester.host.tabs.basics')" :weight="1">
<Tab
name="basics"
:label="t('harvester.host.tabs.basics')"
:weight="1"
>
<div class="mb-20">
<LabeledSelect
v-model:value="type"

View File

@ -1,6 +1,8 @@
<script>
import { allHash } from '@shell/utils/promise';
import { CSI_DRIVER, LONGHORN, LONGHORN_DRIVER, LONGHORN_VERSION_V1, LONGHORN_VERSION_V2 } from '@shell/config/types';
import {
CSI_DRIVER, LONGHORN, LONGHORN_DRIVER, LONGHORN_VERSION_V1, LONGHORN_VERSION_V2
} from '@shell/config/types';
import { LabeledInput } from '@components/Form/LabeledInput';
import LabelValue from '@shell/components/LabelValue';
import { BadgeState } from '@components/BadgeState';
@ -123,7 +125,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const lvmVolumeGroups = this.$store.getters[`${ inStore }/all`](HCI.LVM_VOLUME_GROUP) || [];
const out = lvmVolumeGroups.filter(group => group.spec.nodeName === this.node.name).map(g => g.spec.vgName);
const out = lvmVolumeGroups.filter((group) => group.spec.nodeName === this.node.name).map((g) => g.spec.vgName);
out.unshift({
label: this.t('harvester.host.disk.lvmVolumeGroup.create'),
@ -134,7 +136,7 @@ export default {
},
targetDisk() {
return this.disks.find(disk => disk.name === this.value.name);
return this.disks.find((disk) => disk.name === this.value.name);
},
schedulableTooltipMessage() {
@ -329,7 +331,10 @@ export default {
</script>
<template>
<div class="disk" @update:value="update">
<div
class="disk"
@update:value="update"
>
<div class="mt-10" />
<Banner
v-if="mountedMessage && isProvisioned"
@ -395,7 +400,10 @@ export default {
</div>
</div>
</div>
<div v-if="!value.isNew" class="row mt-30">
<div
v-if="!value.isNew"
class="row mt-30"
>
<div class="col flex span-12">
<LabelValue
:name="t('harvester.host.disk.storageAvailable.label')"
@ -422,7 +430,7 @@ export default {
/>
</div>
</div>
<div class="row mt-10">
<div :class="`col span-${ value.isNew ? '6': '12' }`">
<LabeledSelect
@ -437,7 +445,10 @@ export default {
@keydown.native.enter.prevent="()=>{}"
/>
</div>
<div v-if="(value.isNew && isLonghornV1 && !isFormatted) || isCorrupted" class="col span-6">
<div
v-if="(value.isNew && isLonghornV1 && !isFormatted) || isCorrupted"
class="col span-6"
>
<RadioGroup
v-model:value="value.forceFormatted"
:mode="mode"
@ -459,7 +470,10 @@ export default {
</template>
</RadioGroup>
</div>
<div v-if="value.isNew && isLvm" class="col span-6">
<div
v-if="value.isNew && isLvm"
class="col span-6"
>
<LabeledSelect
v-model:value="value.lvmVolumeGroup"
:mode="mode"

View File

@ -136,10 +136,20 @@ export default {
class="mb-20"
/>
<Checkbox v-model:value="enableMergeAcrossNodes" :mode="mode" class="check mb-20" type="checkbox" :label="t('harvester.host.ksmtuned.enableMergeNodes')" />
<Checkbox
v-model:value="enableMergeAcrossNodes"
:mode="mode"
class="check mb-20"
type="checkbox"
:label="t('harvester.host.ksmtuned.enableMergeNodes')"
/>
<h3>
<t k="harvester.host.ksmtuned.modeLink" :raw="true" :url="ksmtunedLink" />
<t
k="harvester.host.ksmtuned.modeLink"
:raw="true"
:url="ksmtunedLink"
/>
</h3>
<RadioGroup
v-model:value="spec.mode"

View File

@ -250,7 +250,9 @@ export default {
<div>
<div v-if="inventory.warningMessages.length > 0">
<Banner
v-for="(msg, i) in inventory.warningMessages" :key="i" color="error"
v-for="(msg, i) in inventory.warningMessages"
:key="i"
color="error"
:label="msg.text"
/>
</div>
@ -343,9 +345,9 @@ export default {
<template #content>
<NameNsDescription
:value="secret"
@update:value="$emit('update:value', $event)"
:namespaced="true"
mode="create"
@update:value="$emit('update:value', $event)"
/>
<LabeledInput

View File

@ -9,7 +9,9 @@ import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
import ButtonDropdown from '@shell/components/ButtonDropdown';
import CreateEditView from '@shell/mixins/create-edit-view';
import { HCI as HCI_LABELS_ANNOTATIONS } from '@pkg/harvester/config/labels-annotations';
import { LONGHORN, SECRET, LONGHORN_DRIVER, LONGHORN_VERSION_V1, LONGHORN_VERSION_V2 } from '@shell/config/types';
import {
LONGHORN, SECRET, LONGHORN_DRIVER, LONGHORN_VERSION_V1, LONGHORN_VERSION_V2
} from '@shell/config/types';
import { allHash } from '@shell/utils/promise';
import { formatSi } from '@shell/utils/units';
import { findBy } from '@shell/utils/array';
@ -37,7 +39,7 @@ export const LONGHORN_SYSTEM = 'longhorn-system';
export const LONGHORN_V2_DATA_ENGINE = 'longhorn-system/v2-data-engine';
export default {
name: 'HarvesterEditNode',
name: 'HarvesterEditNode',
emits: ['update:value'],
@ -58,9 +60,9 @@ export default {
HarvesterSeeder,
MessageLink,
},
mixins: [CreateEditView],
mixins: [CreateEditView],
inheritAttrs: false,
props: {
props: {
value: {
type: Object,
required: true,
@ -114,7 +116,7 @@ export default {
this.blockDeviceOpts = this.getBlockDeviceOpts();
const addons = this.$store.getters[`${ inStore }/all`](HCI.ADD_ONS);
const seeder = addons.find(addon => addon.id === `harvester-system/${ ADD_ONS.HARVESTER_SEEDER }`);
const seeder = addons.find((addon) => addon.id === `harvester-system/${ ADD_ONS.HARVESTER_SEEDER }`);
const seederEnabled = seeder ? seeder?.spec?.enabled : false;
@ -122,7 +124,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const inventories = this.$store.getters[`${ inStore }/all`](HCI.INVENTORY) || [];
const inventory = inventories.find(inv => inv.id === `harvester-system/${ this.value.id }`);
const inventory = inventories.find((inv) => inv.id === `harvester-system/${ this.value.id }`);
if (inventory) {
this.inventory = await this.$store.dispatch(`${ inStore }/clone`, { resource: inventory });
@ -214,7 +216,7 @@ export default {
},
showFormattedWarning() {
const out = this.newDisks.filter(d => d.forceFormatted && d.isNew && d.provisionerVersion === LONGHORN_VERSION_V1) || [];
const out = this.newDisks.filter((d) => d.forceFormatted && d.isNew && d.provisionerVersion === LONGHORN_VERSION_V1) || [];
return out.length > 0;
},
@ -235,13 +237,13 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const longhornNodes = this.$store.getters[`${ inStore }/all`](LONGHORN.NODES);
return longhornNodes.find(node => node.id === `${ LONGHORN_SYSTEM }/${ this.value.id }`);
return longhornNodes.find((node) => node.id === `${ LONGHORN_SYSTEM }/${ this.value.id }`);
},
seederEnabled() {
const inStore = this.$store.getters['currentProduct'].inStore;
const addons = this.$store.getters[`${ inStore }/all`](HCI.ADD_ONS);
const seeder = addons.find(addon => addon.id === `harvester-system/${ ADD_ONS.HARVESTER_SEEDER }`);
const seeder = addons.find((addon) => addon.id === `harvester-system/${ ADD_ONS.HARVESTER_SEEDER }`);
return seeder ? seeder?.spec?.enabled : false;
},
@ -271,7 +273,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const addons = this.$store.getters[`${ inStore }/all`](HCI.ADD_ONS);
return addons.find(addon => addon.id === `harvester-system/${ ADD_ONS.HARVESTER_SEEDER }`);
return addons.find((addon) => addon.id === `harvester-system/${ ADD_ONS.HARVESTER_SEEDER }`);
},
hasInventorySchema() {
@ -350,8 +352,8 @@ export default {
async saveDisk() {
const inStore = this.$store.getters['currentProduct'].inStore;
const addDisks = this.newDisks.filter(d => d.isNew);
const removeDisks = this.disks.filter(d => !findBy(this.newDisks, 'name', d.name) && d.blockDevice);
const addDisks = this.newDisks.filter((d) => d.isNew);
const removeDisks = this.disks.filter((d) => !findBy(this.newDisks, 'name', d.name) && d.blockDevice);
if (addDisks.length === 0 && removeDisks.length === 0) {
return Promise.resolve();
@ -459,7 +461,7 @@ export default {
const sizeBytes = d.status?.deviceStatus?.capacity?.sizeBytes;
const size = formatSi(sizeBytes, { increment: 1024 });
const parentDevice = d.status?.deviceStatus?.parentDevice;
const isChildAdded = this.newDisks.find(newDisk => newDisk.blockDevice?.status?.deviceStatus?.parentDevice === devPath);
const isChildAdded = this.newDisks.find((newDisk) => newDisk.blockDevice?.status?.deviceStatus?.parentDevice === devPath);
const name = d.displayName;
let label = `${ name } (Type: ${ deviceType }, Size: ${ size })`;
@ -528,7 +530,7 @@ export default {
opt: { force: true },
});
await new Promise(resolve => setTimeout(resolve, '5000'));
await new Promise((resolve) => setTimeout(resolve, '5000'));
await retrySave();
} else {
return Promise.reject(exceptionToErrorsArray(err));
@ -545,16 +547,27 @@ export default {
</script>
<template>
<Loading v-if="$fetchState.pending" />
<div v-else id="node">
<div
v-else
id="node"
>
<div class="content">
<NameNsDescription
:value="value"
@update:value="$emit('update:value', $event)"
:namespaced="false"
:mode="mode"
@update:value="$emit('update:value', $event)"
/>
<Tabbed ref="tabbed" class="mt-15" :side-tabs="true">
<Tab name="basics" :weight="100" :label="t('harvester.host.tabs.basics')">
<Tabbed
ref="tabbed"
class="mt-15"
:side-tabs="true"
>
<Tab
name="basics"
:weight="100"
:label="t('harvester.host.tabs.basics')"
>
<LabeledInput
v-model:value="customName"
:label="t('harvester.host.detail.customName')"
@ -637,8 +650,17 @@ export default {
</template>
</ArrayListGrouped>
</Tab>
<Tab v-if="hasKsmtunedSchema" name="Ksmtuned" :weight="70" :label="t('harvester.host.tabs.ksmtuned')">
<HarvesterKsmtuned :mode="mode" :node="value" :register-before-hook="registerBeforeHook" />
<Tab
v-if="hasKsmtunedSchema"
name="Ksmtuned"
:weight="70"
:label="t('harvester.host.tabs.ksmtuned')"
>
<HarvesterKsmtuned
:mode="mode"
:node="value"
:register-before-hook="registerBeforeHook"
/>
</Tab>
<Tab
v-if="hasAddonSchema"
@ -678,7 +700,10 @@ export default {
/>
</div>
</Tab>
<Tab name="labels" label-key="harvester.host.tabs.labels">
<Tab
name="labels"
label-key="harvester.host.tabs.labels"
>
<KeyValue
key="labels"
:value="filteredLabels"
@ -697,7 +722,13 @@ export default {
/>
</div>
<Footer class="footer" :mode="mode" :errors="errors" @save="save" @done="done" />
<Footer
class="footer"
:mode="mode"
:errors="errors"
@save="save"
@done="done"
/>
</div>
</template>
<style lang="scss" scoped>

View File

@ -90,12 +90,21 @@ export default {
ref="nd"
:key="randomString"
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
@update:value="$emit('update:value', $event)"
/>
<Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true">
<Tab name="basic" :label="t('harvester.sshKey.tabs.basics')" :weight="1" class="bordered-table">
<Tabbed
v-bind="$attrs"
class="mt-15"
:side-tabs="true"
>
<Tab
name="basic"
:label="t('harvester.sshKey.tabs.basics')"
:weight="1"
class="bordered-table"
>
<LabeledInput
v-model:value="publicKey"
type="multiline"

View File

@ -13,7 +13,7 @@ export default {
this.registerBeforeHook(this.willSave, 'willSave');
this.registerAfterHook(() => {
const allNamespaces = this.$store.getters['allNamespaces'];
const defaultNamepsace = allNamespaces.find(N => N.id === 'default');
const defaultNamepsace = allNamespaces.find((N) => N.id === 'default');
const ns = defaultNamepsace?.id || allNamespaces?.[0]?.id || '';
this.value.$dispatch('prefs/set', { key: LAST_NAMESPACE, value: ns }, { root: true });

View File

@ -11,7 +11,7 @@ export default {
this.registerAfterHook(() => {
const allNamespaces = this.$store.getters['allNamespaces'];
const defaultNamepsace = allNamespaces.find(N => N.id === 'default');
const defaultNamepsace = allNamespaces.find((N) => N.id === 'default');
const ns = defaultNamepsace?.id || allNamespaces?.[0]?.id || '';
this.value.$dispatch('prefs/set', { key: LAST_NAMESPACE, value: ns }, { root: true });

View File

@ -77,7 +77,7 @@ export default {
set(this.value, 'spec', this.value.spec || {});
const providers = PROVIDERS.map(provider => ({
const providers = PROVIDERS.map((provider) => ({
...provider,
value: provider.name,
label: this.t(provider.labelKey)
@ -117,7 +117,7 @@ export default {
return EDITOR_MODES;
},
enabledProviders() {
return this.providers.filter(p => p.enabled);
return this.providers.filter((p) => p.enabled);
},
cruMode() {
if (this.selectedProviders.length > 1 || !this.value.allProvidersSupported) {
@ -192,20 +192,35 @@ export default {
<NameNsDescription
v-if="!isView"
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
label="generic.name"
:register-before-hook="registerBeforeHook"
:namespaced="value.type !== LOGGING.CLUSTER_OUTPUT"
@update:value="$emit('update:value', $event)"
/>
<Banner v-if="selectedProviders.length > 1" color="info">
<Banner
v-if="selectedProviders.length > 1"
color="info"
>
{{ t('logging.output.tips.singleProvider') }}
</Banner>
<Banner v-else-if="!value.allProvidersSupported" color="info">
<Banner
v-else-if="!value.allProvidersSupported"
color="info"
>
{{ t('logging.output.tips.multipleProviders') }}
</Banner>
<Tabbed v-else ref="tabbed" :side-tabs="true" @changed="tabChanged($event)">
<Tab name="Output" label="Output" :weight="2">
<Tabbed
v-else
ref="tabbed"
:side-tabs="true"
@changed="tabChanged($event)"
>
<Tab
name="Output"
label="Output"
:weight="2"
>
<div class="row">
<div class="col span-6">
<LabeledSelect
@ -220,13 +235,27 @@ export default {
</div>
<div class="row">
<div class="col span-6">
<LabeledSelect v-model:value="selectedProvider" label="Output" :options="providers" :mode="mode" />
<LabeledSelect
v-model:value="selectedProvider"
label="Output"
:options="providers"
:mode="mode"
/>
</div>
</div>
<div class="spacer"></div>
<component :is="getComponent(selectedProvider)" :value="value.spec[selectedProvider]" :namespace="value.namespace" :mode="mode" />
<component
:is="getComponent(selectedProvider)"
:value="value.spec[selectedProvider]"
:namespace="value.namespace"
:mode="mode"
/>
</Tab>
<Tab name="buffer" :label="t('logging.output.buffer.label')" :weight="1">
<Tab
name="buffer"
:label="t('logging.output.buffer.label')"
:weight="1"
>
<YamlEditor
ref="yaml"
v-model:value="bufferYaml"

View File

@ -16,7 +16,7 @@ import { _CREATE, _EDIT, _VIEW, _CONFIG } from '@shell/config/query-params';
export default {
emits: ['update:value'],
components: {
ActionMenu,
CruResource,
@ -54,7 +54,7 @@ export default {
const defaultReceiverValues = {};
const receiverSchema = this.$store.getters['harvester/schemaFor'](MONITORING.SPOOFED.ALERTMANAGERCONFIG_RECEIVER_SPEC);
const routeSchema = this.$store.getters['harvester/schemaFor'](MONITORING.SPOOFED.ALERTMANAGERCONFIG_ROUTE_SPEC);
const receiverOptions = (this.value?.spec?.receivers || []).map(receiver => receiver.name);
const receiverOptions = (this.value?.spec?.receivers || []).map((receiver) => receiver.name);
return {
actionMenuTargetElement: null,
@ -195,9 +195,9 @@ export default {
>
<NameNsDescription
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
:namespaced="isNamespaced"
@update:value="$emit('update:value', $event)"
/>
<Tabbed>

View File

@ -17,7 +17,7 @@ const MANUAL = 'manual';
export default {
emits: ['update:value'],
components: {
Tab,
Tabbed,
@ -191,11 +191,20 @@ export default {
<NameNsDescription
ref="nd"
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
@update:value="$emit('update:value', $event)"
/>
<Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true">
<Tab name="basics" :label="t('harvester.network.tabs.basics')" :weight="99" class="bordered-table">
<Tabbed
v-bind="$attrs"
class="mt-15"
:side-tabs="true"
>
<Tab
name="basics"
:label="t('harvester.network.tabs.basics')"
:weight="99"
class="bordered-table"
>
<LabeledSelect
v-model:value="type"
class="mb-20"

View File

@ -73,7 +73,7 @@ export default {
cron: '',
retain: 8,
maxFailure: 4,
vmbackup: {
vmbackup: {
source: {
apiGroup: 'kubevirt.io',
kind: 'VirtualMachine',
@ -90,7 +90,7 @@ export default {
computed: {
backupTargetResource() {
return this.settings.find( O => O.id === 'backup-target');
return this.settings.find( (O) => O.id === 'backup-target');
},
isEmptyValue() {
return this.getBackupTargetValueIsEmpty(this.backupTargetResource);
@ -112,8 +112,8 @@ export default {
return this.value.spec.vmbackup.type === BACKUP_TYPE.BACKUP && (this.errorMessage || this.isEmptyValue) && this.canUpdate;
},
vmOptions() {
const nsVmList = this.$store.getters['harvester/all'](HCI.VM).filter(vm => vm.metadata.namespace === this.value.metadata.namespace);
const vmObjectLists = nsVmList.map(obj => ({
const nsVmList = this.$store.getters['harvester/all'](HCI.VM).filter((vm) => vm.metadata.namespace === this.value.metadata.namespace);
const vmObjectLists = nsVmList.map((obj) => ({
label: obj.nameDisplay,
value: obj.name,
}));
@ -196,7 +196,7 @@ export default {
:mode="mode"
:errors="errors"
:apply-hooks="applyHooks"
:validationPassed="canSave"
:validation-passed="canSave"
@finish="save"
@error="e=>errors = e"
>
@ -258,8 +258,17 @@ export default {
</div>
</div>
</div>
<Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true">
<Tab name="basics" :label="t('harvester.network.tabs.basics')" :weight="99" class="bordered-table">
<Tabbed
v-bind="$attrs"
class="mt-15"
:side-tabs="true"
>
<Tab
name="basics"
:label="t('harvester.network.tabs.basics')"
:weight="99"
class="bordered-table"
>
<LabeledInput
v-model:value="value.spec.cron"
class="mb-30"

View File

@ -160,7 +160,7 @@ export default {
created() {
this.registerAfterHook(() => {
const allNamespaces = this.$store.getters['allNamespaces'];
const defaultNamepsace = allNamespaces.find(N => N.id === 'default');
const defaultNamepsace = allNamespaces.find((N) => N.id === 'default');
const ns = defaultNamepsace?.id || allNamespaces?.[0]?.id || '';
this.value.$dispatch('prefs/set', { key: LAST_NAMESPACE, value: ns }, { root: true });
@ -238,9 +238,9 @@ export default {
>
<NameNsDescription
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
:namespaced="!isCloud"
@update:value="$emit('update:value', $event)"
/>
<div class="spacer" />

View File

@ -31,7 +31,7 @@ export default {
let enumOptions = [];
if (setting.kind === 'enum') {
enumOptions = setting.options.map(id => ({
enumOptions = setting.options.map((id) => ({
label: `advancedSettings.enum.harv-${ this.value.id }.${ id }`,
value: id
}));
@ -53,7 +53,7 @@ export default {
const customSettingComponents = require
.context('../components/settings', false, /^.*\.vue$/)
.keys()
.map(path => path.replace(/(\.\/)|(.vue)/g, ''));
.map((path) => path.replace(/(\.\/)|(.vue)/g, ''));
return {
setting,
@ -183,7 +183,11 @@ export default {
>
<h4 v-clean-html="description"></h4>
<h5 v-if="editHelp" v-clean-html="editHelp" class="edit-help" />
<h5
v-if="editHelp"
v-clean-html="editHelp"
class="edit-help"
/>
<div class="edit-change mt-20">
<h5 v-t="'advancedSettings.edit.changeSetting'" />
@ -229,7 +233,10 @@ export default {
/>
</div>
<div v-else-if="setting.kind === 'multiline' || setting.kind === 'json'">
<TextAreaAutoGrow v-model:value="value.value" :min-height="254" />
<TextAreaAutoGrow
v-model:value="value.value"
:min-height="254"
/>
</div>
<div v-else>
<LabeledInput

View File

@ -13,7 +13,9 @@ import Loading from '@shell/components/Loading';
import { _CREATE, _VIEW } from '@shell/config/query-params';
import { mapFeature, UNSUPPORTED_STORAGE_DRIVERS } from '@shell/store/features';
import { STORAGE_CLASS, LONGHORN, LONGHORN_DRIVER, SECRET, NAMESPACE } from '@shell/config/types';
import {
STORAGE_CLASS, LONGHORN, LONGHORN_DRIVER, SECRET, NAMESPACE
} from '@shell/config/types';
import { allHash } from '@shell/utils/promise';
import { clone } from '@shell/utils/object';
import { CSI_DRIVER } from '../../types';
@ -84,7 +86,7 @@ export default {
}
];
const allowedTopologies = clone(this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter(t => t.key !== LVM_TOPOLOGY_LABEL);
const allowedTopologies = clone(this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter((t) => t.key !== LVM_TOPOLOGY_LABEL);
this.value['parameters'] = this.value.parameters || {};
this.value['provisioner'] = this.value.provisioner || LONGHORN_DRIVER;
@ -200,7 +202,7 @@ export default {
let parameters = {};
if (provisioner === LVM_DRIVER) {
const matchLabelExpressions = (this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter(t => t.key !== LVM_TOPOLOGY_LABEL);
const matchLabelExpressions = (this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).filter((t) => t.key !== LVM_TOPOLOGY_LABEL);
if (matchLabelExpressions.length > 0) {
this.value['allowedTopologies'] = [{ matchLabelExpressions }];
@ -246,8 +248,8 @@ export default {
},
formatAllowedTopoloties() {
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);
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) {
@ -259,7 +261,7 @@ export default {
return;
}
const matchLabelExpressions = neu.filter(R => !!R.key.trim() && (R.values.length > 0 && !R.values.find(V => !V.trim())));
const matchLabelExpressions = neu.filter((R) => !!R.key.trim() && (R.values.length > 0 && !R.values.find((V) => !V.trim())));
if (matchLabelExpressions.length > 0) {
this.value.allowedTopologies = [{ matchLabelExpressions: [...matchLabelExpressions, ...lvmMatchExpression] }];
@ -287,9 +289,9 @@ export default {
<NameNsDescription
:namespaced="false"
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
:register-before-hook="registerBeforeHook"
@update:value="$emit('update:value', $event)"
/>
<LabeledSelect
v-model:value="provisioner"
@ -302,7 +304,11 @@ export default {
class="mb-20"
/>
<Tabbed :side-tabs="true">
<Tab name="parameters" :label="t('storageClass.parameters.label')" :weight="2">
<Tab
name="parameters"
:label="t('storageClass.parameters.label')"
:weight="2"
>
<component
:is="getComponent(provisioner)"
:key="provisioner"
@ -311,7 +317,10 @@ export default {
:real-mode="realMode"
/>
</Tab>
<Tab name="customize" :label="t('storageClass.customize.label')">
<Tab
name="customize"
:label="t('storageClass.customize.label')"
>
<div class="row mt-20">
<div class="col span-6">
<RadioGroup

View File

@ -78,7 +78,7 @@ export default {
const allSecrets = this.$store.getters[`${ inStore }/all`](SECRET);
// only show non-system secret to user to select
return allSecrets.filter(secret => secret.isSystem === false);
return allSecrets.filter((secret) => secret.isSystem === false);
},
longhornNodes() {
@ -124,7 +124,7 @@ export default {
},
secretOptions() {
return this.secrets.map(secret => secret.id);
return this.secrets.map((secret) => secret.id);
},
volumeEncryptionOptions() {
@ -282,7 +282,10 @@ export default {
:mode="mode"
>
<template #no-options="{ searching }">
<span v-if="!searching" class="text-muted">
<span
v-if="!searching"
class="text-muted"
>
{{ t('harvester.storage.parameters.nodeSelector.no-options', null, true) }}
</span>
</template>
@ -298,7 +301,10 @@ export default {
:mode="mode"
>
<template #no-options="{ searching }">
<span v-if="!searching" class="text-muted">
<span
v-if="!searching"
class="text-muted"
>
{{ t('harvester.storage.parameters.diskSelector.no-options', null, true) }}
</span>
</template>
@ -323,7 +329,10 @@ export default {
:options="volumeEncryptionOptions"
/>
</div>
<div v-if="value.parameters.encrypted === 'true'" class="row mt-20">
<div
v-if="value.parameters.encrypted === 'true'"
class="row mt-20"
>
<div class="col span-6">
<LabeledSelect
v-model:value="secret"

View File

@ -78,7 +78,7 @@ export default {
const allSecrets = this.$store.getters[`${ inStore }/all`](SECRET);
// only show non-system secret to user to select
return allSecrets.filter(secret => secret.isSystem === false);
return allSecrets.filter((secret) => secret.isSystem === false);
},
longhornNodes() {
@ -124,7 +124,7 @@ export default {
},
secretOptions() {
return this.secrets.map(secret => secret.id);
return this.secrets.map((secret) => secret.id);
},
volumeEncryptionOptions() {
@ -282,7 +282,10 @@ export default {
:mode="mode"
>
<template #no-options="{ searching }">
<span v-if="!searching" class="text-muted">
<span
v-if="!searching"
class="text-muted"
>
{{ t('harvester.storage.parameters.nodeSelector.no-options', null, true) }}
</span>
</template>
@ -298,7 +301,10 @@ export default {
:mode="mode"
>
<template #no-options="{ searching }">
<span v-if="!searching" class="text-muted">
<span
v-if="!searching"
class="text-muted"
>
{{ t('harvester.storage.parameters.diskSelector.no-options', null, true) }}
</span>
</template>
@ -325,7 +331,10 @@ export default {
:disabled="true"
/>
</div>
<div v-if="value.parameters.encrypted === 'true'" class="row mt-20">
<div
v-if="value.parameters.encrypted === 'true'"
class="row mt-20"
>
<div class="col span-6">
<LabeledSelect
v-model:value="secret"

View File

@ -52,7 +52,7 @@ export default {
},
data() {
const node = (this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).find(t => t.key === LVM_TOPOLOGY_LABEL)?.values[0];
const node = (this.value.allowedTopologies?.[0]?.matchLabelExpressions || []).find((t) => t.key === LVM_TOPOLOGY_LABEL)?.values[0];
return {
volumeGroupTypes: ['striped', 'dm-thin'],
@ -77,7 +77,7 @@ export default {
const inStore = this.$store.getters['currentProduct'].inStore;
const nodes = this.$store.getters[`${ inStore }/all`](NODE) || [];
return nodes.filter(n => n.labels[LVM_TOPOLOGY_LABEL] === n.name).map(n => n.name);
return nodes.filter((n) => n.labels[LVM_TOPOLOGY_LABEL] === n.name).map((n) => n.name);
},
volumeGroups() {
@ -85,8 +85,8 @@ export default {
const lvmVolumeGroups = this.$store.getters[`${ inStore }/all`](HCI.LVM_VOLUME_GROUP) || [];
return lvmVolumeGroups
.filter(group => group.spec.nodeName === this.node)
.map(g => g.spec.vgName);
.filter((group) => group.spec.nodeName === this.node)
.map((g) => g.spec.vgName);
},
parameters: {
@ -119,7 +119,10 @@ export default {
:required="true"
>
<template #no-options="{ searching }">
<span v-if="!searching" class="text-muted">
<span
v-if="!searching"
class="text-muted"
>
{{ t('harvester.storage.parameters.diskSelector.no-options', null, true) }}
</span>
</template>
@ -136,7 +139,10 @@ export default {
:required="true"
>
<template #no-options="{ searching }">
<span v-if="!searching" class="text-muted">
<span
v-if="!searching"
class="text-muted"
>
{{ t('harvester.storage.parameters.lvmVolumeGroup.no-options', null, true) }}
</span>
</template>

View File

@ -98,7 +98,7 @@ export default {
const backupList = this.$store.getters['harvester/all'](HCI.BACKUP);
return backupList.find( O => O.name === name);
return backupList.find( (O) => O.name === name);
},
disableExisting() {
@ -108,7 +108,7 @@ export default {
backupNamespace() {
const backupList = this.$store.getters['harvester/all'](HCI.BACKUP);
return backupList.find( B => B.metadata.name === this.backupName)?.metadata?.namespace;
return backupList.find( (B) => B.metadata.name === this.backupName)?.metadata?.namespace;
},
namespaces() {
@ -265,7 +265,13 @@ export default {
/>
</div>
<Footer mode="create" class="footer" :errors="errors" @save="saveRestore" @done="cancelAction" />
<Footer
mode="create"
class="footer"
:errors="errors"
@save="saveRestore"
@done="cancelAction"
/>
</div>
</template>

View File

@ -61,7 +61,7 @@ export default {
storageClasses: this.$store.dispatch(`${ inStore }/findAll`, { type: STORAGE_CLASS }),
});
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find(s => s.isDefault);
const defaultStorage = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS).find((s) => s.isDefault);
this['storageClassName'] = this.storageClassName || defaultStorage?.metadata?.name || 'longhorn';
this.images = this.$store.getters[`${ inStore }/all`](HCI.IMAGE);
@ -73,7 +73,7 @@ export default {
// image ns/name = image.id
const sourceImage = `${ securityParameters.sourceImageNamespace }/${ securityParameters.sourceImageName }`;
this.selectedImage = this.images.find(image => image.id === sourceImage);
this.selectedImage = this.images.find((image) => image.id === sourceImage);
}
},
@ -88,11 +88,11 @@ export default {
if (image && cryptoOperation) {
const imageObject = JSON.parse(image);
this.value.spec.securityParameters = {
this.value.spec.securityParameters = {
cryptoOperation,
sourceImageName: imageObject.metadata.name,
sourceImageNamespace: imageObject.metadata.namespace
}
};
}
if (!this.value.metadata.name) {
@ -140,7 +140,7 @@ export default {
const storages = this.$store.getters[`${ inStore }/all`](STORAGE_CLASS);
return storages
.filter(s => !s.parameters?.backingImage && s.provisioner !== LVM_DRIVER) // Lvm storage is not supported.
.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;
@ -167,12 +167,12 @@ export default {
return options;
}
if (this.value.spec.securityParameters.cryptoOperation === ENCRYPT) {
options = this.images.filter(image => !image.isEncrypted);
options = this.images.filter((image) => !image.isEncrypted);
} else {
options = this.images.filter(image => image.isEncrypted);
options = this.images.filter((image) => image.isEncrypted);
}
return options.map(image => image.displayNameWithNamespace);
return options.map((image) => image.displayNameWithNamespace);
},
sourceImage: {
get() {
@ -183,7 +183,7 @@ export default {
return '';
},
set(neu) {
this.selectedImage = this.images.find(i => i.displayNameWithNamespace === 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 || '';
@ -322,7 +322,7 @@ export default {
internalAnnotations(option) {
const optionKeys = [HCI_ANNOTATIONS.OS_TYPE, HCI_ANNOTATIONS.IMAGE_SUFFIX];
return optionKeys.find(O => O === option.key);
return optionKeys.find((O) => O === option.key);
},
calculateOptions(keyName) {
@ -352,7 +352,7 @@ export default {
return OS.find( (os) => {
if (os.match) {
return os.match.find(matchValue => str.toLowerCase().includes(matchValue)) ? os.value : false;
return os.match.find((matchValue) => str.toLowerCase().includes(matchValue)) ? os.value : false;
} else {
return str.toLowerCase().includes(os.value.toLowerCase()) ? os.value : false;
}
@ -376,13 +376,17 @@ export default {
<NameNsDescription
ref="nd"
:value="value"
@update:value="$emit('update:value', $event)"
:mode="mode"
:label="t('generic.name')"
name-key="spec.displayName"
@update:value="$emit('update:value', $event)"
/>
<Tabbed v-bind="$attrs" class="mt-15" :side-tabs="true">
<Tabbed
v-bind="$attrs"
class="mt-15"
:side-tabs="true"
>
<Tab
name="basic"
:label="t('harvester.image.tabs.basics')"
@ -503,7 +507,12 @@ export default {
</div>
</Tab>
<Tab name="labels" :label="t('labels.labels.title')" :weight="2" class="bordered-table">
<Tab
name="labels"
:label="t('labels.labels.title')"
:weight="2"
class="bordered-table"
>
<KeyValue
key="labels"
ref="labels"

View File

@ -99,7 +99,7 @@ export default {
templateId: {
async handler(neu) {
const templates = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_TEMPLATE });
let templateValue = templates.find( V => V.id === neu) || null;
let templateValue = templates.find( (V) => V.id === neu) || null;
let templateSpec = templateValue?.spec;
if (!templateValue) {
@ -131,7 +131,7 @@ export default {
// Set the default version according to annotation:[HCI_ANNOTATIONS.TEMPLATE_VERSION_CUSTOM_NAME]
const versions = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_VERSION, opt: { force: true } });
const version = versions.find( V => V?.metadata?.annotations?.[HCI_ANNOTATIONS.TEMPLATE_VERSION_CUSTOM_NAME] === this.customName);
const version = versions.find( (V) => V?.metadata?.annotations?.[HCI_ANNOTATIONS.TEMPLATE_VERSION_CUSTOM_NAME] === this.customName);
if (version) {
try {
@ -159,7 +159,7 @@ export default {
this.parseVM();
const templates = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_TEMPLATE });
const template = templates.find( O => O.metadata.name === this.templateValue.metadata.name);
const template = templates.find( (O) => O.metadata.name === this.templateValue.metadata.name);
try {
if (!this.templateId) {
@ -223,10 +223,10 @@ export default {
>
<NameNsDescription
:value="value"
@update:value="$emit('update:value', $event)"
:mode="realTemplateMode"
name-label="harvester.vmTemplate.nameNsDescription.name"
:namespaced="true"
@update:value="$emit('update:value', $event)"
/>
<Checkbox
@ -238,9 +238,20 @@ export default {
:mode="mode"
/>
<Tabbed :side-tabs="true" @changed="onTabChanged">
<Tab name="Basics" :label="t('harvester.vmTemplate.tabs.basics')">
<CpuMemory :cpu="cpu" :memory="memory" :disabled="isConfig" @updateCpuMemory="updateCpuMemory" />
<Tabbed
:side-tabs="true"
@changed="onTabChanged"
>
<Tab
name="Basics"
:label="t('harvester.vmTemplate.tabs.basics')"
>
<CpuMemory
:cpu="cpu"
:memory="memory"
:disabled="isConfig"
@updateCpuMemory="updateCpuMemory"
/>
<div class="mb-20">
<SSHKey
@ -254,12 +265,28 @@ export default {
</div>
</Tab>
<Tab name="Volume" :label="t('harvester.tab.volume')" :weight="-1">
<Volume v-model:value="diskRows" :mode="mode" :namespace="value.metadata.namespace" :existing-volume-disabled="true" />
<Tab
name="Volume"
:label="t('harvester.tab.volume')"
:weight="-1"
>
<Volume
v-model:value="diskRows"
:mode="mode"
:namespace="value.metadata.namespace"
:existing-volume-disabled="true"
/>
</Tab>
<Tab name="Network" :label="t('harvester.tab.network')" :weight="-2">
<Network v-model:value="networkRows" :mode="mode" />
<Tab
name="Network"
:label="t('harvester.tab.network')"
:weight="-2"
>
<Network
v-model:value="networkRows"
:mode="mode"
/>
</Tab>
<Tab
@ -276,7 +303,11 @@ export default {
</template>
</Tab>
<Tab :label="t('harvester.tab.vmScheduling')" name="vmScheduling" :weight="-4">
<Tab
:label="t('harvester.tab.vmScheduling')"
name="vmScheduling"
:weight="-4"
>
<template #default>
<PodAffinity
:mode="mode"
@ -318,7 +349,11 @@ export default {
</Labels>
</Tab>
<Tab name="advanced" :label="t('harvester.tab.advanced')" :weight="-99">
<Tab
name="advanced"
:label="t('harvester.tab.advanced')"
:weight="-99"
>
<div class="row mb-20">
<div class="col span-6">
<LabeledSelect
@ -371,8 +406,18 @@ export default {
</div>
<div class="row mb-20">
<a v-if="showAdvanced" v-t="'harvester.generic.showMore'" role="button" @click="toggleAdvanced" />
<a v-else v-t="'harvester.generic.showMore'" role="button" @click="toggleAdvanced" />
<a
v-if="showAdvanced"
v-t="'harvester.generic.showMore'"
role="button"
@click="toggleAdvanced"
/>
<a
v-else
v-t="'harvester.generic.showMore'"
role="button"
@click="toggleAdvanced"
/>
</div>
<div v-if="showAdvanced">

View File

@ -94,7 +94,7 @@ export default {
const backupList = this.$store.getters['harvester/all'](HCI.BACKUP);
return backupList.find( O => O.name === name);
return backupList.find( (O) => O.name === name);
},
disableExisting() {
@ -104,7 +104,7 @@ export default {
snapshotNamespace() {
const backupList = this.$store.getters['harvester/all'](HCI.BACKUP);
return backupList.find( B => B.metadata.name === this.snapshotName)?.metadata?.namespace;
return backupList.find( (B) => B.metadata.name === this.snapshotName)?.metadata?.namespace;
},
namespaces() {
@ -113,7 +113,7 @@ export default {
const systemNamespaces = this.$store.getters['systemNamespaces'];
const out = sortBy(
choices.filter(N => !systemNamespaces.includes(N.metadata.name)).map((obj) => {
choices.filter((N) => !systemNamespaces.includes(N.metadata.name)).map((obj) => {
return {
label: obj.nameDisplay,
value: obj.id,
@ -239,12 +239,28 @@ export default {
</div>
</div>
<LabeledSelect v-model:value="snapshotName" class="mb-20" :label="t('harvester.vmSnapshot.snapshot')" :options="snapshotOption" />
<LabeledSelect
v-model:value="snapshotName"
class="mb-20"
:label="t('harvester.vmSnapshot.snapshot')"
:options="snapshotOption"
/>
<LabeledSelect v-if="!restoreNewVm" v-model:value="deletionPolicy" :label="t('harvester.backup.restore.deletePreviousVolumes')" :options="deletionPolicyOption" />
<LabeledSelect
v-if="!restoreNewVm"
v-model:value="deletionPolicy"
:label="t('harvester.backup.restore.deletePreviousVolumes')"
:options="deletionPolicyOption"
/>
</div>
<Footer mode="create" class="footer" :errors="errors" @save="saveRestore" @done="cancelAction" />
<Footer
mode="create"
class="footer"
:errors="errors"
@save="saveRestore"
@done="cancelAction"
/>
</div>
</template>

View File

@ -65,7 +65,7 @@ export default {
this.snapshots = hash.snapshots;
this.images = hash.images;
const defaultStorage = this.$store.getters[`harvester/all`](STORAGE_CLASS).find( O => O.isDefault);
const defaultStorage = this.$store.getters[`harvester/all`](STORAGE_CLASS).find( (O) => O.isDefault);
this.value.spec['storageClassName'] = this.value?.spec?.storageClassName || defaultStorage?.metadata?.name || 'longhorn';
},
@ -97,7 +97,7 @@ export default {
isBlank() {
return this.source === 'blank';
},
isEdit() {
return this.mode === _EDIT;
},
@ -123,7 +123,7 @@ export default {
imageOption() {
return sortBy(
this.images
.filter(obj => obj.isReady)
.filter((obj) => obj.isReady)
.map((obj) => {
return {
label: `${ obj.metadata.namespace }/${ obj.spec.displayName }`,
@ -174,7 +174,7 @@ export default {
},
storageClassOptions() {
return this.storageClasses.filter(s => !s.parameters?.backingImage).map((s) => {
return this.storageClasses.filter((s) => !s.parameters?.backingImage).map((s) => {
const label = s.isDefault ? `${ s.name } (${ this.t('generic.default') })` : s.name;
return {
@ -243,7 +243,7 @@ export default {
let imageAnnotations = '';
let storageClassName = this.value.spec.storageClassName;
const storageClass = this.storageClasses.find(sc => sc.name === storageClassName);
const storageClass = this.storageClasses.find((sc) => sc.name === storageClassName);
const storageClassProvisioner = storageClass?.provisioner;
const storageClassDataEngine = storageClass?.parameters?.dataEngine;
@ -254,7 +254,7 @@ export default {
...this.value.metadata.annotations,
[HCI_ANNOTATIONS.IMAGE_ID]: this.imageId
};
storageClassName = images?.find(image => this.imageId === image.id)?.storageClassName;
storageClassName = images?.find((image) => this.imageId === image.id)?.storageClassName;
} else {
imageAnnotations = { ...this.value.metadata.annotations };
}
@ -272,7 +272,7 @@ export default {
},
updateImage() {
if (this.isVMImage && this.imageId) {
const imageResource = this.images?.find(image => this.imageId === image.id);
const imageResource = this.images?.find((image) => this.imageId === image.id);
const imageSize = Math.max(imageResource?.status?.size, imageResource?.status?.virtualSize);
if (imageSize) {
@ -300,7 +300,12 @@ export default {
:apply-hooks="applyHooks"
@finish="save"
>
<NameNsDescription :value="value" @update:value="$emit('update:value', $event)" :namespaced="true" :mode="mode" />
<NameNsDescription
:value="value"
:namespaced="true"
:mode="mode"
@update:value="$emit('update:value', $event)"
/>
<ResourceTabs
v-model:value="value"
@ -310,7 +315,12 @@ export default {
:side-tabs="true"
:mode="mode"
>
<Tab name="basic" :label="t('harvester.volume.tabs.basics')" :weight="3" class="bordered-table">
<Tab
name="basic"
:label="t('harvester.volume.tabs.basics')"
:weight="3"
class="bordered-table"
>
<LabeledSelect
v-model:value="source"
:label="t('harvester.volume.source')"
@ -358,14 +368,41 @@ export default {
@update:value="update"
/>
<Banner v-if="isLonghornV2 && isEdit" color="warning">
<Banner
v-if="isLonghornV2 && isEdit"
color="warning"
>
<span>{{ t('harvester.volume.longhorn.disableResize') }}</span>
</Banner>
</Tab>
<Tab v-if="!isCreate" name="details" :label="t('harvester.volume.tabs.details')" :weight="2.5" class="bordered-table">
<LabeledInput v-model:value="frontendDisplay" class="mb-20" :mode="mode" :disabled="true" :label="t('harvester.volume.frontend')" />
<LabeledInput v-model:value="attachedNode" class="mb-20" :mode="mode" :disabled="true" :label="t('harvester.volume.attachedNode')" />
<LabeledInput v-model:value="endpoint" class="mb-20" :mode="mode" :disabled="true" :label="t('harvester.volume.endpoint')" />
<Tab
v-if="!isCreate"
name="details"
:label="t('harvester.volume.tabs.details')"
:weight="2.5"
class="bordered-table"
>
<LabeledInput
v-model:value="frontendDisplay"
class="mb-20"
:mode="mode"
:disabled="true"
:label="t('harvester.volume.frontend')"
/>
<LabeledInput
v-model:value="attachedNode"
class="mb-20"
:mode="mode"
:disabled="true"
:label="t('harvester.volume.attachedNode')"
/>
<LabeledInput
v-model:value="endpoint"
class="mb-20"
:mode="mode"
:disabled="true"
:label="t('harvester.volume.endpoint')"
/>
<LabeledSelect
v-model:value="diskTags"
:multiple="true"
@ -384,23 +421,63 @@ export default {
:mode="mode"
class="mb-20"
/>
<LabeledInput v-model:value="lastBackup" class="mb-20" :mode="mode" :disabled="true" :label="t('harvester.volume.lastBackup')" />
<LabeledInput v-model:value="lastBackupAt" class="mb-20" :mode="mode" :disabled="true" :label="t('harvester.volume.lastBackupAt')" />
<LabeledInput v-model:value="replicasNumber" class="mb-20" :mode="mode" :disabled="true" :label="t('harvester.volume.replicasNumber')" />
<LabeledInput
v-model:value="lastBackup"
class="mb-20"
:mode="mode"
:disabled="true"
:label="t('harvester.volume.lastBackup')"
/>
<LabeledInput
v-model:value="lastBackupAt"
class="mb-20"
:mode="mode"
:disabled="true"
:label="t('harvester.volume.lastBackupAt')"
/>
<LabeledInput
v-model:value="replicasNumber"
class="mb-20"
:mode="mode"
:disabled="true"
:label="t('harvester.volume.replicasNumber')"
/>
</Tab>
<Tab v-if="!isCreate" name="instances" :label="t('harvester.volume.tabs.snapshots')" :weight="2" class="bordered-table">
<Tab
v-if="!isCreate"
name="instances"
:label="t('harvester.volume.tabs.snapshots')"
:weight="2"
class="bordered-table"
>
<SortableTable
v-bind="$attrs"
:headers="snapshotHeaders"
default-sort-by="age"
:rows="value.relatedVolumeSnapshotCounts"
key-field="_key"
/>
</Tab>
<Tab v-if="!isCreate && value.spec.dataSource" name="datasource" :label="t('harvester.volume.tabs.datasource')" :weight="1" class="bordered-table">
<LabeledInput v-model:value="dataSourceKind" class="mb-20" :mode="mode" :disabled="true" :label="t('harvester.volume.kind')" />
<LabeledInput v-model:value="value.spec.dataSource.name" :mode="mode" :disabled="true" :label="t('nameNsDescription.name.label')" />
<Tab
v-if="!isCreate && value.spec.dataSource"
name="datasource"
:label="t('harvester.volume.tabs.datasource')"
:weight="1"
class="bordered-table"
>
<LabeledInput
v-model:value="dataSourceKind"
class="mb-20"
:mode="mode"
:disabled="true"
:label="t('harvester.volume.kind')"
/>
<LabeledInput
v-model:value="value.spec.dataSource.name"
:mode="mode"
:disabled="true"
:label="t('nameNsDescription.name.label')"
/>
</Tab>
</ResourceTabs>
</CruResource>

View File

@ -10,7 +10,7 @@ import { HCI as HCI_ANNOTATIONS } from '@shell/config/labels-annotations';
import { HCI } from '../types';
export default {
name: 'HarvesterSnapshot',
name: 'HarvesterSnapshot',
emits: ['update:value'],
@ -65,7 +65,12 @@ export default {
:apply-hooks="applyHooks"
@finish="save"
>
<NameNsDescription :value="value" @update:value="$emit('update:value', $event)" :namespaced="true" :mode="mode" />
<NameNsDescription
:value="value"
:namespaced="true"
:mode="mode"
@update:value="$emit('update:value', $event)"
/>
<ResourceTabs
v-model:value="value"
class="mt-15"
@ -74,20 +79,42 @@ export default {
:side-tabs="true"
:mode="mode"
>
<Tab name="basics" :label="t('harvester.virtualMachine.detail.tabs.basics')" class="bordered-table">
<Tab
name="basics"
:label="t('harvester.virtualMachine.detail.tabs.basics')"
class="bordered-table"
>
<div class="row">
<div class="col span-12">
<LabeledInput v-model:value="size" :label="t('harvester.snapshot.size')" class="mt-20" :disabled="true" />
<LabeledInput
v-model:value="size"
:label="t('harvester.snapshot.size')"
class="mt-20"
:disabled="true"
/>
</div>
</div>
<div class="row">
<div class="col span-12">
<LabeledInput v-model:value="targetVolume" :label="t('harvester.snapshot.targetVolume')" class="mt-20" :disabled="true" />
<LabeledInput
v-model:value="targetVolume"
:label="t('harvester.snapshot.targetVolume')"
class="mt-20"
:disabled="true"
/>
</div>
</div>
<div v-if="isImageVolume" class="row">
<div
v-if="isImageVolume"
class="row"
>
<div class="col span-12">
<LabeledInput v-model:value="imageName" :label="t('harvester.snapshot.image')" class="mt-20" :disabled="true" />
<LabeledInput
v-model:value="imageName"
:label="t('harvester.snapshot.image')"
class="mt-20"
:disabled="true"
/>
</div>
</div>
</Tab>

View File

@ -82,16 +82,28 @@ export default {
</div>
<div>{{ t('harvester.devices.matrixHostName') }}</div>
</div>
<div v-for="(nodeName, i) in allNodeNames" :key="i" >
<div
v-for="(nodeName, i) in allNodeNames"
:key="i"
>
<span> {{ nodeName }}</span>
</div>
</div>
<div v-for="(deviceCRD, i) in enabledDevices" :key="i" >
<div v-clean-tooltip="deviceTooltip(deviceCRD)" class="compat-cell device-label" :class="{'text-muted': noneAvailable(deviceCRD)}">
<div
v-for="(deviceCRD, i) in enabledDevices"
:key="i"
>
<div
v-clean-tooltip="deviceTooltip(deviceCRD)"
class="compat-cell device-label"
:class="{'text-muted': noneAvailable(deviceCRD)}"
>
{{ deviceCRD.metadata.name }}
</div>
<div
v-for="(nodeName, k) in allNodeNames" :key="k" class="compat-cell"
v-for="(nodeName, k) in allNodeNames"
:key="k"
class="compat-cell"
:class="{'has-device': nodeHasDevice(nodeName, deviceCRD)}"
/>
</div>

View File

@ -11,7 +11,7 @@ const _NEW = '_NEW';
export default {
emits: ['update:user', 'update:newUser'],
components: {
LabeledInput,
LabeledSelect,

View File

@ -14,7 +14,7 @@ const _NEW = '_NEW';
export default {
emits: ['update:value'],
components: {
Banner,
InfoBox
@ -152,11 +152,23 @@ export default {
<template>
<div>
<Banner class="mb-20" color="info" :label="t('harvester.virtualMachine.accessCredentials.tips')" />
<Banner
class="mb-20"
color="info"
:label="t('harvester.virtualMachine.accessCredentials.tips')"
/>
<div v-for="(row, i) in rows" :key="i">
<div
v-for="(row, i) in rows"
:key="i"
>
<InfoBox class="volume-source">
<button v-if="isEdit" type="button" class="role-link btn btn-sm remove-vol" @click="remove(row)">
<button
v-if="isEdit"
type="button"
class="role-link btn btn-sm remove-vol"
@click="remove(row)"
>
<i class="icon icon-x" />
</button>
<h3>
@ -169,7 +181,7 @@ export default {
:is="componentFor(row.source)"
v-model:value="rows[i]"
:rows="rows"
:resourceType="resourceType"
:resource-type="resourceType"
:user-options="userOptions"
:mode="mode"
:idx="i"
@ -180,7 +192,10 @@ export default {
</InfoBox>
</div>
<div v-if="isEdit && isQemuInstalled" class="mt-20">
<div
v-if="isEdit && isQemuInstalled"
class="mt-20"
>
<button
type="button"
class="btn btn-sm bg-primary mr-15 mb-10"

Some files were not shown because too many files have changed in this diff Show More