mirror of
https://github.com/harvester/harvester-ui-extension.git
synced 2026-10-04 13:16:05 +08:00
Lint fixes
Signed-off-by: Francesco Torchia <francesco.torchia@suse.com>
This commit is contained in:
@@ -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>
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ const _NEW = '_NEW';
|
||||
|
||||
export default {
|
||||
emits: ['update:user', 'update:newUser'],
|
||||
|
||||
|
||||
components: {
|
||||
LabeledInput,
|
||||
LabeledSelect,
|
||||
|
||||
+21
-6
@@ -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"
|
||||
|
||||
+7
-4
@@ -3,10 +3,10 @@ import Password from '@shell/components/form/Password';
|
||||
import AccessCredentialsUsers from '../AccessCredentialsUsers';
|
||||
|
||||
export default {
|
||||
name: 'HarvesterEditVolume',
|
||||
name: 'HarvesterEditVolume',
|
||||
|
||||
emits: ['update', 'update:newUser'],
|
||||
|
||||
|
||||
components: { Password, AccessCredentialsUsers },
|
||||
|
||||
props: {
|
||||
@@ -64,11 +64,14 @@ export default {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="row" @update:value="update">
|
||||
<div
|
||||
class="row"
|
||||
@update:value="update"
|
||||
>
|
||||
<div class="col span-6">
|
||||
<AccessCredentialsUsers
|
||||
v-model:value="value.username"
|
||||
:resourceType="resourceType"
|
||||
:resource-type="resourceType"
|
||||
:user-options="userOptions"
|
||||
:multiple="false"
|
||||
:mode="mode"
|
||||
|
||||
+2
-2
@@ -3,7 +3,7 @@ import SSHKey from '../../VirtualMachineSSHKey';
|
||||
import AccessCredentialsUsers from '../AccessCredentialsUsers';
|
||||
|
||||
export default {
|
||||
name: 'HarvesterEditVolume',
|
||||
name: 'HarvesterEditVolume',
|
||||
|
||||
emits: ['update', 'update:newUser'],
|
||||
|
||||
@@ -65,7 +65,7 @@ export default {
|
||||
<div class="col span-6">
|
||||
<AccessCredentialsUsers
|
||||
v-model:value="value.users"
|
||||
:resourceType="resourceType"
|
||||
:resource-type="resourceType"
|
||||
:user-options="userOptions"
|
||||
:mode="mode"
|
||||
:multiple="true"
|
||||
|
||||
+4
-1
@@ -114,7 +114,10 @@ export default {
|
||||
<div class="mb-20">
|
||||
<h3>{{ t(`harvester.virtualMachine.cloudConfig.${type}.title`) }}</h3>
|
||||
<p class="text-muted mb-20">
|
||||
<t :k="`harvester.virtualMachine.cloudConfig.${type}.tip`" :raw="true" />
|
||||
<t
|
||||
:k="`harvester.virtualMachine.cloudConfig.${type}.tip`"
|
||||
:raw="true"
|
||||
/>
|
||||
</p>
|
||||
|
||||
<LabeledSelect
|
||||
|
||||
@@ -14,7 +14,7 @@ const _NEW = '_NEW';
|
||||
|
||||
export default {
|
||||
emits: ['updateUserData', 'updateNetworkData', 'updateDataTemplateId'],
|
||||
|
||||
|
||||
components: {
|
||||
DataTemplate, YamlEditor, LabeledInput, ModalWithCard
|
||||
},
|
||||
|
||||
@@ -3,10 +3,10 @@ import UnitInput from '@shell/components/form/UnitInput';
|
||||
import InputOrDisplay from '@shell/components/InputOrDisplay';
|
||||
|
||||
export default {
|
||||
name: 'HarvesterEditCpuMemory',
|
||||
name: 'HarvesterEditCpuMemory',
|
||||
|
||||
emits: ['updateCpuMemory'],
|
||||
|
||||
|
||||
components: { UnitInput, InputOrDisplay },
|
||||
|
||||
props: {
|
||||
@@ -78,7 +78,11 @@ export default {
|
||||
<template>
|
||||
<div class="row">
|
||||
<div class="col span-6 mb-10">
|
||||
<InputOrDisplay name="CPU" :value="cupDisplay" :mode="mode">
|
||||
<InputOrDisplay
|
||||
name="CPU"
|
||||
:value="cupDisplay"
|
||||
:mode="mode"
|
||||
>
|
||||
<UnitInput
|
||||
v-model:value="localCpu"
|
||||
label="CPU"
|
||||
@@ -94,7 +98,11 @@ export default {
|
||||
</div>
|
||||
|
||||
<div class="col span-6 mb-10">
|
||||
<InputOrDisplay :name="t('harvester.virtualMachine.input.memory')" :value="memoryDisplay" :mode="mode">
|
||||
<InputOrDisplay
|
||||
:name="t('harvester.virtualMachine.input.memory')"
|
||||
:value="memoryDisplay"
|
||||
:mode="mode"
|
||||
>
|
||||
<UnitInput
|
||||
v-model:value="localMemory"
|
||||
:label="t('harvester.virtualMachine.input.memory')"
|
||||
|
||||
@@ -28,10 +28,10 @@ const MODEL = [{
|
||||
}];
|
||||
|
||||
export default {
|
||||
name: 'HarvesterEditNetwork',
|
||||
name: 'HarvesterEditNetwork',
|
||||
|
||||
emits: ['update'],
|
||||
|
||||
|
||||
components: {
|
||||
LabeledInput, LabeledSelect, InputOrDisplay
|
||||
},
|
||||
@@ -139,7 +139,7 @@ export default {
|
||||
watch: {
|
||||
rows: {
|
||||
handler(neu) {
|
||||
const hasManagementNetwork = !!neu.some(N => N.isPod);
|
||||
const hasManagementNetwork = !!neu.some((N) => N.isPod);
|
||||
|
||||
this['hasManagementNetwork'] = hasManagementNetwork;
|
||||
},
|
||||
@@ -233,7 +233,10 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" :class="{'mb-20': !isMasquerade}">
|
||||
<div
|
||||
class="row"
|
||||
:class="{'mb-20': !isMasquerade}"
|
||||
>
|
||||
<div
|
||||
data-testid="input-hen-networkName"
|
||||
class="col span-6"
|
||||
@@ -278,7 +281,10 @@ export default {
|
||||
|
||||
<div v-if="!isMasquerade && isSingle">
|
||||
<div class="row mb-20">
|
||||
<a role="button" @click="toggleAdvanced">
|
||||
<a
|
||||
role="button"
|
||||
@click="toggleAdvanced"
|
||||
>
|
||||
{{ showAdvanced ? t('harvester.generic.hideMore') : t('harvester.generic.showMore') }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -109,7 +109,7 @@ export default {
|
||||
|
||||
while (hasUsed) {
|
||||
name = `nic-${ this.nameIdx }`;
|
||||
hasUsed = this.rows.find( O => O.name === name);
|
||||
hasUsed = this.rows.find( (O) => O.name === name);
|
||||
this.nameIdx++;
|
||||
}
|
||||
|
||||
@@ -125,8 +125,16 @@ export default {
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<InfoBox v-for="(row, i) in rows" :key="i">
|
||||
<button v-if="!isView" type="button" class="role-link remove-vol" @click="remove(row)">
|
||||
<InfoBox
|
||||
v-for="(row, i) in rows"
|
||||
:key="i"
|
||||
>
|
||||
<button
|
||||
v-if="!isView"
|
||||
type="button"
|
||||
class="role-link remove-vol"
|
||||
@click="remove(row)"
|
||||
>
|
||||
<i class="icon icon-x" />
|
||||
</button>
|
||||
|
||||
@@ -142,7 +150,12 @@ export default {
|
||||
/>
|
||||
</InfoBox>
|
||||
|
||||
<button v-if="!isView" type="button" class="btn btn-sm bg-primary" @click="add">
|
||||
<button
|
||||
v-if="!isView"
|
||||
type="button"
|
||||
class="btn btn-sm bg-primary"
|
||||
@click="add"
|
||||
>
|
||||
{{ t('harvester.virtualMachine.network.addNetwork') }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
+22
-5
@@ -131,7 +131,7 @@ export default {
|
||||
});
|
||||
},
|
||||
groupIsAllEnabled(rows = []) {
|
||||
return !rows.find(device => !device.passthroughClaim);
|
||||
return !rows.find((device) => !device.passthroughClaim);
|
||||
},
|
||||
|
||||
changeRows(filterRows, parentSriov) {
|
||||
@@ -162,11 +162,25 @@ export default {
|
||||
:rows-per-page="10"
|
||||
>
|
||||
<template #group-by="{group}">
|
||||
<div :ref="group.key" v-trim-whitespace class="group-tab">
|
||||
<button v-if="groupIsAllEnabled(group.rows)" type="button" class="btn btn-sm role-secondary mr-5" @click="e=>{disableGroup(group.rows); e.target.blur()}">
|
||||
<div
|
||||
:ref="group.key"
|
||||
v-trim-whitespace
|
||||
class="group-tab"
|
||||
>
|
||||
<button
|
||||
v-if="groupIsAllEnabled(group.rows)"
|
||||
type="button"
|
||||
class="btn btn-sm role-secondary mr-5"
|
||||
@click="e=>{disableGroup(group.rows); e.target.blur()}"
|
||||
>
|
||||
{{ t('harvester.pci.disableGroup') }}
|
||||
</button>
|
||||
<button v-else type="button" class="btn btn-sm role-secondary mr-5" @click="e=>{enableGroup(group.rows); e.target.blur()}">
|
||||
<button
|
||||
v-else
|
||||
type="button"
|
||||
class="btn btn-sm role-secondary mr-5"
|
||||
@click="e=>{enableGroup(group.rows); e.target.blur()}"
|
||||
>
|
||||
{{ t('harvester.pci.enableGroup') }}
|
||||
</button>
|
||||
<span v-clean-html="group.key" />
|
||||
@@ -174,7 +188,10 @@ export default {
|
||||
</template>
|
||||
<template #cell:claimed="{row}">
|
||||
<span v-if="row.isEnabled">{{ row.claimedBy }}</span>
|
||||
<span v-else class="text-muted">—</span>
|
||||
<span
|
||||
v-else
|
||||
class="text-muted"
|
||||
>—</span>
|
||||
</template>
|
||||
<template #more-header-middle>
|
||||
<FilterBySriov
|
||||
|
||||
@@ -60,7 +60,7 @@ export default {
|
||||
|
||||
if (checkName && name.includes(checkName) && !otherDevices.includes(name)) {
|
||||
oldFormatDevices.push(name);
|
||||
} else if (this.enabledDevices.find(device => device?.metadata?.name === name)) {
|
||||
} else if (this.enabledDevices.find((device) => device?.metadata?.name === name)) {
|
||||
selectedDevices.push(name);
|
||||
}
|
||||
});
|
||||
@@ -87,7 +87,7 @@ export default {
|
||||
watch: {
|
||||
selectedDevices(neu) {
|
||||
const formatted = neu.map((selectedDevice) => {
|
||||
const deviceCRD = this.enabledDevices.find(device => device.metadata.name === selectedDevice);
|
||||
const deviceCRD = this.enabledDevices.find((device) => device.metadata.name === selectedDevice);
|
||||
const deviceName = deviceCRD?.status?.resourceName;
|
||||
|
||||
return {
|
||||
@@ -153,7 +153,7 @@ export default {
|
||||
|
||||
this.selectedDevices.forEach((deviceUid) => {
|
||||
remove(out, (nodeName) => {
|
||||
const device = this.enabledDevices.find(deviceCRD => deviceCRD.metadata.name === deviceUid);
|
||||
const device = this.enabledDevices.find((deviceCRD) => deviceCRD.metadata.name === deviceUid);
|
||||
|
||||
return device.status.nodeName !== nodeName;
|
||||
});
|
||||
@@ -166,7 +166,7 @@ export default {
|
||||
deviceOpts() {
|
||||
const filteredOptions = this.enabledDevices.filter((deviceCRD) => {
|
||||
if (this.selectedDevices.length > 0) {
|
||||
const selectedDevice = this.enabledDevices.find(device => device.metadata.name === this.selectedDevices[0]);
|
||||
const selectedDevice = this.enabledDevices.find((device) => device.metadata.name === this.selectedDevices[0]);
|
||||
|
||||
return !this.devicesInUse[deviceCRD?.metadata.name] && deviceCRD.status.nodeName === selectedDevice.status.nodeName;
|
||||
}
|
||||
@@ -192,13 +192,13 @@ export default {
|
||||
|
||||
methods: {
|
||||
otherDevices(vmDevices) {
|
||||
return vmDevices.filter(device => !this.pciDevices.find(pci => device.name === pci.name));
|
||||
return vmDevices.filter((device) => !this.pciDevices.find((pci) => device.name === pci.name));
|
||||
},
|
||||
|
||||
nodeNameFromUid(uid) {
|
||||
for (const deviceUid in this.uniqueDevices) {
|
||||
const nodes = this.uniqueDevices[deviceUid].nodes;
|
||||
const thisNode = nodes.find(node => node.systemUUID === uid);
|
||||
const thisNode = nodes.find((node) => node.systemUUID === uid);
|
||||
|
||||
if (thisNode) {
|
||||
return thisNode.name;
|
||||
@@ -227,7 +227,10 @@ export default {
|
||||
<Banner color="info">
|
||||
<t k="harvester.pci.howToUseDevice" />
|
||||
</Banner>
|
||||
<Banner v-if="selectedDevices.length > 0" color="info">
|
||||
<Banner
|
||||
v-if="selectedDevices.length > 0"
|
||||
color="info"
|
||||
>
|
||||
<t k="harvester.pci.deviceInTheSameHost" />
|
||||
</Banner>
|
||||
</div>
|
||||
@@ -250,28 +253,52 @@ export default {
|
||||
</LabeledSelect>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="compatibleNodes.length && selectedDevices.length" class="row">
|
||||
<div
|
||||
v-if="compatibleNodes.length && selectedDevices.length"
|
||||
class="row"
|
||||
>
|
||||
<div class="col span-12 text-muted">
|
||||
Compatible hosts:
|
||||
<!-- eslint-disable-next-line vue/no-parsing-error -->
|
||||
<span v-for="(node, idx) in compatibleNodes" :key="idx">{{ node }}{{ idx < compatibleNodes.length-1 ? ', ' : '' }}</span>
|
||||
<span
|
||||
v-for="(node, idx) in compatibleNodes"
|
||||
:key="idx"
|
||||
>{{ node }}{{ idx < compatibleNodes.length-1 ? ', ' : '' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="selectedDevices.length" class="text-error">
|
||||
<div
|
||||
v-else-if="selectedDevices.length"
|
||||
class="text-error"
|
||||
>
|
||||
{{ t('harvester.pci.impossibleSelection') }}
|
||||
</div>
|
||||
<button type="button" class="btn btn-sm role-link pl-0" @click="e=>{showMatrix = !showMatrix; e.target.blur()}">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-sm role-link pl-0"
|
||||
@click="e=>{showMatrix = !showMatrix; e.target.blur()}"
|
||||
>
|
||||
{{ showMatrix ? t('harvester.pci.hideCompatibility') : t('harvester.pci.showCompatibility') }}
|
||||
</button>
|
||||
<div v-if="showMatrix" class="row mt-20">
|
||||
<div
|
||||
v-if="showMatrix"
|
||||
class="row mt-20"
|
||||
>
|
||||
<div class="col span-12">
|
||||
<CompatibilityMatrix :enabled-devices="enabledDevices" :devices-by-node="devicesByNode" :devices-in-use="devicesInUse" />
|
||||
<CompatibilityMatrix
|
||||
:enabled-devices="enabledDevices"
|
||||
:devices-by-node="devicesByNode"
|
||||
:devices-in-use="devicesInUse"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="row mt-20">
|
||||
<div class="col span-12">
|
||||
<DeviceList :schema="pciDeviceSchema" :devices="pciDevices" @submit.prevent />
|
||||
<DeviceList
|
||||
:schema="pciDeviceSchema"
|
||||
:devices="pciDevices"
|
||||
@submit.prevent
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
import UnitInput from '@shell/components/form/UnitInput';
|
||||
|
||||
export default {
|
||||
name: 'HarvesterReserved',
|
||||
name: 'HarvesterReserved',
|
||||
|
||||
emits: ['updateReserved'],
|
||||
|
||||
|
||||
components: { UnitInput },
|
||||
|
||||
props: {
|
||||
|
||||
@@ -16,7 +16,7 @@ const _NEW = '_NEW';
|
||||
|
||||
export default {
|
||||
emits: ['update:sshKey'],
|
||||
|
||||
|
||||
components: {
|
||||
LabeledInput,
|
||||
ModalWithCard,
|
||||
@@ -83,7 +83,7 @@ export default {
|
||||
},
|
||||
|
||||
isCreatable() {
|
||||
if ( this.schema && !this.schema?.collectionMethods.find(x => ['blocked-post', 'post'].includes(x.toLowerCase())) ) {
|
||||
if ( this.schema && !this.schema?.collectionMethods.find((x) => ['blocked-post', 'post'].includes(x.toLowerCase())) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ export default {
|
||||
|
||||
const namespaces = await this.$store.dispatch('harvester/findAll', { type: NAMESPACE });
|
||||
|
||||
const exists = namespaces?.find(n => n.name === this.namespace);
|
||||
const exists = namespaces?.find((n) => n.name === this.namespace);
|
||||
|
||||
if (!exists) {
|
||||
const ns = await this.$store.dispatch('harvester/createNamespace', { name: this.namespace }, { root: true });
|
||||
|
||||
+22
-5
@@ -108,7 +108,7 @@ export default {
|
||||
});
|
||||
},
|
||||
groupIsAllEnabled(rows = []) {
|
||||
return !rows.find(device => !device.passthroughClaim);
|
||||
return !rows.find((device) => !device.passthroughClaim);
|
||||
},
|
||||
|
||||
changeRows(filterRows) {
|
||||
@@ -142,11 +142,25 @@ export default {
|
||||
:rows-per-page="10"
|
||||
>
|
||||
<template #group-by="{group}">
|
||||
<div :ref="group.key" v-trim-whitespace class="group-tab">
|
||||
<button v-if="groupIsAllEnabled(group.rows)" type="button" class="btn btn-sm role-secondary mr-5" @click="e=>{disableGroup(group.rows); e.target.blur()}">
|
||||
<div
|
||||
:ref="group.key"
|
||||
v-trim-whitespace
|
||||
class="group-tab"
|
||||
>
|
||||
<button
|
||||
v-if="groupIsAllEnabled(group.rows)"
|
||||
type="button"
|
||||
class="btn btn-sm role-secondary mr-5"
|
||||
@click="e=>{disableGroup(group.rows); e.target.blur()}"
|
||||
>
|
||||
{{ t('harvester.usb.disableGroup') }}
|
||||
</button>
|
||||
<button v-else type="button" class="btn btn-sm role-secondary mr-5" @click="e=>{enableGroup(group.rows); e.target.blur()}">
|
||||
<button
|
||||
v-else
|
||||
type="button"
|
||||
class="btn btn-sm role-secondary mr-5"
|
||||
@click="e=>{enableGroup(group.rows); e.target.blur()}"
|
||||
>
|
||||
{{ t('harvester.usb.enableGroup') }}
|
||||
</button>
|
||||
<span v-clean-html="group.key" />
|
||||
@@ -154,7 +168,10 @@ export default {
|
||||
</template>
|
||||
<template #cell:claimed="{row}">
|
||||
<span v-if="row.status.enabled">{{ row.claimedBy }}</span>
|
||||
<span v-else class="text-muted">—</span>
|
||||
<span
|
||||
v-else
|
||||
class="text-muted"
|
||||
>—</span>
|
||||
</template>
|
||||
</ResourceTable>
|
||||
</template>
|
||||
|
||||
@@ -50,7 +50,7 @@ export default {
|
||||
|
||||
this.selectedDevices = (this.value?.domain?.devices?.hostDevices || [])
|
||||
.map(({ name }) => name)
|
||||
.filter(name => this.enabledDevices.find(device => device?.metadata?.name === name));
|
||||
.filter((name) => this.enabledDevices.find((device) => device?.metadata?.name === name));
|
||||
},
|
||||
|
||||
data() {
|
||||
@@ -70,7 +70,7 @@ export default {
|
||||
watch: {
|
||||
selectedDevices(neu) {
|
||||
const formatted = neu.map((selectedDevice) => {
|
||||
const deviceCRD = this.enabledDevices.find(device => device.metadata.name === selectedDevice);
|
||||
const deviceCRD = this.enabledDevices.find((device) => device.metadata.name === selectedDevice);
|
||||
const deviceName = deviceCRD?.status?.resourceName;
|
||||
|
||||
return {
|
||||
@@ -92,7 +92,7 @@ export default {
|
||||
deviceOpts() {
|
||||
const filteredOptions = this.enabledDevices.filter((deviceCRD) => {
|
||||
if (this.selectedDevices.length > 0) {
|
||||
const selectedDevice = this.enabledDevices.find(device => device.metadata.name === this.selectedDevices[0]);
|
||||
const selectedDevice = this.enabledDevices.find((device) => device.metadata.name === this.selectedDevices[0]);
|
||||
|
||||
return !this.devicesInUse[deviceCRD?.metadata.name] && deviceCRD.status.nodeName === selectedDevice?.status.nodeName;
|
||||
}
|
||||
@@ -152,7 +152,7 @@ export default {
|
||||
|
||||
this.selectedDevices.forEach((deviceUid) => {
|
||||
remove(out, (nodeName) => {
|
||||
const device = this.enabledDevices.find(deviceCRD => deviceCRD.metadata.name === deviceUid);
|
||||
const device = this.enabledDevices.find((deviceCRD) => deviceCRD.metadata.name === deviceUid);
|
||||
|
||||
return device?.status.nodeName !== nodeName;
|
||||
});
|
||||
@@ -164,7 +164,7 @@ export default {
|
||||
|
||||
methods: {
|
||||
otherDevices(vmDevices) {
|
||||
return vmDevices.filter(device => !this.devices.find(usb => device.name === usb.name));
|
||||
return vmDevices.filter((device) => !this.devices.find((usb) => device.name === usb.name));
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -177,7 +177,10 @@ export default {
|
||||
<Banner color="info">
|
||||
<t k="harvester.usb.howToUseDevice" />
|
||||
</Banner>
|
||||
<Banner v-if="selectedDevices.length > 0" color="info">
|
||||
<Banner
|
||||
v-if="selectedDevices.length > 0"
|
||||
color="info"
|
||||
>
|
||||
<t k="harvester.usb.deviceInTheSameHost" />
|
||||
</Banner>
|
||||
</div>
|
||||
@@ -200,28 +203,52 @@ export default {
|
||||
</LabeledSelect>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="compatibleNodes.length && selectedDevices.length" class="row">
|
||||
<div
|
||||
v-if="compatibleNodes.length && selectedDevices.length"
|
||||
class="row"
|
||||
>
|
||||
<div class="col span-12 text-muted">
|
||||
Compatible hosts:
|
||||
<!-- eslint-disable-next-line vue/no-parsing-error -->
|
||||
<span v-for="(node, idx) in compatibleNodes" :key="node">{{ node }}{{ idx < compatibleNodes.length-1 ? ', ' : '' }}</span>
|
||||
<span
|
||||
v-for="(node, idx) in compatibleNodes"
|
||||
:key="node"
|
||||
>{{ node }}{{ idx < compatibleNodes.length-1 ? ', ' : '' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="selectedDevices.length" class="text-error">
|
||||
<div
|
||||
v-else-if="selectedDevices.length"
|
||||
class="text-error"
|
||||
>
|
||||
{{ t('harvester.usb.impossibleSelection') }}
|
||||
</div>
|
||||
<button type="button" class="btn btn-sm role-link pl-0" @click="e=>{showMatrix = !showMatrix; e.target.blur()}">
|
||||
<button
|
||||
type="button"
|
||||
class="btn btn-sm role-link pl-0"
|
||||
@click="e=>{showMatrix = !showMatrix; e.target.blur()}"
|
||||
>
|
||||
{{ showMatrix ? t('harvester.usb.hideCompatibility') : t('harvester.usb.showCompatibility') }}
|
||||
</button>
|
||||
<div v-if="showMatrix" class="row mt-20">
|
||||
<div
|
||||
v-if="showMatrix"
|
||||
class="row mt-20"
|
||||
>
|
||||
<div class="col span-12">
|
||||
<CompatibilityMatrix :enabled-devices="enabledDevices" :devices-by-node="devicesByNode" :devices-in-use="devicesInUse" />
|
||||
<CompatibilityMatrix
|
||||
:enabled-devices="enabledDevices"
|
||||
:devices-by-node="devicesByNode"
|
||||
:devices-in-use="devicesInUse"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<div class="row mt-20">
|
||||
<div class="col span-12">
|
||||
<DeviceList :schema="deviceSchema" :devices="devices" @submit.prevent />
|
||||
<DeviceList
|
||||
:schema="deviceSchema"
|
||||
:devices="devices"
|
||||
@submit.prevent
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -50,7 +50,7 @@ export default {
|
||||
...(this.value?.domain?.devices?.gpus || []).map(({ name }) => name),
|
||||
...Object.values(this.vm?.provisionedVGpus).reduce((acc, gpus) => [...acc, ...gpus], [])
|
||||
]).forEach((name) => {
|
||||
if (this.enabledDevices.find(device => device?.metadata?.name === name)) {
|
||||
if (this.enabledDevices.find((device) => device?.metadata?.name === name)) {
|
||||
this.selectedDevices.push(name);
|
||||
}
|
||||
});
|
||||
@@ -68,7 +68,7 @@ export default {
|
||||
watch: {
|
||||
selectedDevices(neu) {
|
||||
const formatted = neu.map((selectedDevice) => {
|
||||
const deviceCRD = this.enabledDevices.find(device => device.metadata.name === selectedDevice);
|
||||
const deviceCRD = this.enabledDevices.find((device) => device.metadata.name === selectedDevice);
|
||||
const deviceName = `nvidia.com/${ deviceCRD?.status?.configureVGPUTypeName?.replace(/\s+/g, '_') }`;
|
||||
|
||||
return {
|
||||
@@ -125,7 +125,7 @@ export default {
|
||||
|
||||
this.selectedDevices.forEach((deviceUid) => {
|
||||
remove(out, (nodeName) => {
|
||||
const device = this.enabledDevices.find(deviceCRD => deviceCRD.metadata.name === deviceUid);
|
||||
const device = this.enabledDevices.find((deviceCRD) => deviceCRD.metadata.name === deviceUid);
|
||||
|
||||
return device.spec.nodeName !== nodeName;
|
||||
});
|
||||
@@ -137,7 +137,7 @@ export default {
|
||||
deviceOpts() {
|
||||
const filteredOptions = this.enabledDevices.filter((deviceCRD) => {
|
||||
if (this.selectedDevices.length > 0) {
|
||||
const selectedDevice = this.enabledDevices.find(device => device.metadata.name === this.selectedDevices[0]);
|
||||
const selectedDevice = this.enabledDevices.find((device) => device.metadata.name === this.selectedDevices[0]);
|
||||
|
||||
return !this.devicesInUse[deviceCRD?.metadata.name] && deviceCRD.spec.nodeName === selectedDevice.spec.nodeName;
|
||||
}
|
||||
@@ -163,7 +163,10 @@ export default {
|
||||
<Banner color="info">
|
||||
<t k="harvester.vgpu.howToUseDevice" />
|
||||
</Banner>
|
||||
<Banner v-if="selectedDevices.length > 0" color="info">
|
||||
<Banner
|
||||
v-if="selectedDevices.length > 0"
|
||||
color="info"
|
||||
>
|
||||
<t k="harvester.vgpu.deviceInTheSameHost" />
|
||||
</Banner>
|
||||
</div>
|
||||
@@ -186,20 +189,33 @@ export default {
|
||||
</LabeledSelect>
|
||||
</div>
|
||||
</div>
|
||||
<div v-if="compatibleNodes.length && selectedDevices.length" class="row">
|
||||
<div
|
||||
v-if="compatibleNodes.length && selectedDevices.length"
|
||||
class="row"
|
||||
>
|
||||
<div class="col span-12 text-muted">
|
||||
Compatible hosts:
|
||||
<!-- eslint-disable-next-line vue/no-parsing-error -->
|
||||
<span v-for="(node, idx) in compatibleNodes" :key="idx">{{ node }}{{ idx < compatibleNodes.length-1 ? ', ' : '' }}</span>
|
||||
<span
|
||||
v-for="(node, idx) in compatibleNodes"
|
||||
:key="idx"
|
||||
>{{ node }}{{ idx < compatibleNodes.length-1 ? ', ' : '' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div v-else-if="selectedDevices.length" class="text-error">
|
||||
<div
|
||||
v-else-if="selectedDevices.length"
|
||||
class="text-error"
|
||||
>
|
||||
{{ t('harvester.vgpu.impossibleSelection') }}
|
||||
</div>
|
||||
</template>
|
||||
<div class="row mt-20">
|
||||
<div class="col span-12">
|
||||
<VGpuDeviceList :schema="deviceSchema" :devices="devices" @submit.prevent />
|
||||
<VGpuDeviceList
|
||||
:schema="deviceSchema"
|
||||
:devices="devices"
|
||||
@submit.prevent
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script>
|
||||
import { Sortable } from "sortablejs-vue3";
|
||||
import { Sortable } from 'sortablejs-vue3';
|
||||
import InfoBox from '@shell/components/InfoBox';
|
||||
import { Banner } from '@components/Banner';
|
||||
import BadgeStateFormatter from '@shell/components/formatter/BadgeStateFormatter';
|
||||
@@ -20,7 +20,7 @@ import { HCI } from '../../../types';
|
||||
|
||||
export default {
|
||||
emits: ['update:value'],
|
||||
|
||||
|
||||
components: {
|
||||
Banner, BadgeStateFormatter, Sortable, InfoBox, LabeledInput, UnitInput, LabeledSelect, ModalWithCard
|
||||
},
|
||||
@@ -146,7 +146,7 @@ export default {
|
||||
query: { mode: _EDIT }
|
||||
};
|
||||
|
||||
V.pvc = this.pvcs.find(pvc => pvc.metadata.name === V.realName);
|
||||
V.pvc = this.pvcs.find((pvc) => pvc.metadata.name === V.realName);
|
||||
}
|
||||
|
||||
return V;
|
||||
@@ -189,7 +189,7 @@ export default {
|
||||
|
||||
while (hasName) {
|
||||
name = `disk-${ this.nameIdx }`;
|
||||
hasName = this.rows.find(O => O.name === name);
|
||||
hasName = this.rows.find((O) => O.name === name);
|
||||
this.nameIdx++;
|
||||
}
|
||||
|
||||
@@ -255,7 +255,7 @@ export default {
|
||||
},
|
||||
|
||||
getImageDisplayName(id) {
|
||||
return this.$store.getters['harvester/all'](HCI.IMAGE).find(image => image.id === id)?.spec?.displayName;
|
||||
return this.$store.getters['harvester/all'](HCI.IMAGE).find((image) => image.id === id)?.spec?.displayName;
|
||||
},
|
||||
|
||||
isLonghornV2(volume) {
|
||||
@@ -275,8 +275,8 @@ export default {
|
||||
<Sortable
|
||||
:list="rows"
|
||||
:options="{disabled: isView}"
|
||||
@end="update"
|
||||
item-key="id"
|
||||
@end="update"
|
||||
>
|
||||
<template #item="{element: volume, index: i}">
|
||||
<div :key="volume.name">
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import { VOLUME_TYPE, InterfaceOption } from '../../../../config/harvester-map';
|
||||
import { Banner } from '@components/Banner';
|
||||
|
||||
export default {
|
||||
name: 'HarvesterEditContainer',
|
||||
name: 'HarvesterEditContainer',
|
||||
|
||||
emits: ['update'],
|
||||
|
||||
|
||||
+4
-4
@@ -13,7 +13,7 @@ import { HCI } from '../../../../types';
|
||||
import { VOLUME_TYPE, InterfaceOption } from '../../../../config/harvester-map';
|
||||
|
||||
export default {
|
||||
name: 'HarvesterEditExisting',
|
||||
name: 'HarvesterEditExisting',
|
||||
|
||||
emits: ['update'],
|
||||
|
||||
@@ -79,7 +79,7 @@ export default {
|
||||
},
|
||||
|
||||
image() {
|
||||
const imageResource = this.$store.getters['harvester/all'](HCI.IMAGE).find(I => I.id === this.pvcResource?.metadata?.annotations?.[HCI_ANNOTATIONS.IMAGE_ID]);
|
||||
const imageResource = this.$store.getters['harvester/all'](HCI.IMAGE).find((I) => I.id === this.pvcResource?.metadata?.annotations?.[HCI_ANNOTATIONS.IMAGE_ID]);
|
||||
|
||||
if (!imageResource) {
|
||||
return;
|
||||
@@ -89,7 +89,7 @@ export default {
|
||||
},
|
||||
|
||||
pvcResource() {
|
||||
return this.allPVCs.find( P => P.metadata.name === this.value.volumeName );
|
||||
return this.allPVCs.find( (P) => P.metadata.name === this.value.volumeName );
|
||||
},
|
||||
|
||||
volumeOption() {
|
||||
@@ -130,7 +130,7 @@ export default {
|
||||
|
||||
watch: {
|
||||
'value.volumeName'(neu) {
|
||||
const pvcResource = this.allPVCs.find( P => P.metadata.name === neu);
|
||||
const pvcResource = this.allPVCs.find( (P) => P.metadata.name === neu);
|
||||
|
||||
if (!pvcResource) {
|
||||
return;
|
||||
|
||||
+12
-5
@@ -88,7 +88,7 @@ export default {
|
||||
},
|
||||
|
||||
imagesOption() {
|
||||
return this.images.filter(c => c.isReady).sort((a, b) => a.creationTimestamp > b.creationTimestamp ? -1 : 1).map( (I) => {
|
||||
return this.images.filter((c) => c.isReady).sort((a, b) => a.creationTimestamp > b.creationTimestamp ? -1 : 1).map( (I) => {
|
||||
return {
|
||||
label: `${ I.metadata.namespace }/${ I.spec.displayName }`,
|
||||
value: I.id
|
||||
@@ -97,7 +97,7 @@ export default {
|
||||
},
|
||||
|
||||
imageName() {
|
||||
const image = this.imagesOption.find(I => I.value === this.value.image);
|
||||
const image = this.imagesOption.find((I) => I.value === this.value.image);
|
||||
|
||||
return image ? image.label : '-';
|
||||
},
|
||||
@@ -163,7 +163,7 @@ export default {
|
||||
},
|
||||
|
||||
onImageChange() {
|
||||
const imageResource = this.$store.getters['harvester/all'](HCI.IMAGE)?.find( I => this.value.image === I.id);
|
||||
const imageResource = this.$store.getters['harvester/all'](HCI.IMAGE)?.find( (I) => this.value.image === I.id);
|
||||
const isIsoImage = /iso$/i.test(imageResource?.imageSuffix);
|
||||
const imageSize = Math.max(imageResource?.status?.size, imageResource?.status?.virtualSize);
|
||||
|
||||
@@ -212,7 +212,11 @@ export default {
|
||||
data-testid="input-hevi-name"
|
||||
class="col span-6"
|
||||
>
|
||||
<InputOrDisplay :name="t('harvester.fields.name')" :value="value.name" :mode="mode">
|
||||
<InputOrDisplay
|
||||
:name="t('harvester.fields.name')"
|
||||
:value="value.name"
|
||||
:mode="mode"
|
||||
>
|
||||
<LabeledInput
|
||||
v-model:value="value.name"
|
||||
:label="t('harvester.fields.name')"
|
||||
@@ -321,7 +325,10 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-20">
|
||||
<div v-if="value.volumeBackups && isView" class="col span-3">
|
||||
<div
|
||||
v-if="value.volumeBackups && isView"
|
||||
class="col span-3"
|
||||
>
|
||||
<LabelValue
|
||||
:name="t('harvester.virtualMachine.volume.readyToUse')"
|
||||
:value="readyToUse"
|
||||
|
||||
@@ -14,7 +14,7 @@ import { LVM_DRIVER } from '../../../../models/harvester/storage.k8s.io.storagec
|
||||
import { DATA_ENGINE_V2 } from '../../../../edit/harvesterhci.io.storage/index.vue';
|
||||
|
||||
export default {
|
||||
name: 'HarvesterEditVolume',
|
||||
name: 'HarvesterEditVolume',
|
||||
|
||||
emits: ['update'],
|
||||
|
||||
@@ -82,7 +82,7 @@ export default {
|
||||
pvcsResource() {
|
||||
const allPVCs = this.$store.getters['harvester/all'](PVC) || [];
|
||||
|
||||
return allPVCs.find(P => P.id === `${ this.namespace }/${ this.value.volumeName }`);
|
||||
return allPVCs.find((P) => P.id === `${ this.namespace }/${ this.value.volumeName }`);
|
||||
},
|
||||
|
||||
isDisabled() {
|
||||
@@ -94,7 +94,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 {
|
||||
@@ -113,7 +113,7 @@ export default {
|
||||
'value.storageClassName': {
|
||||
immediate: true,
|
||||
handler(neu) {
|
||||
const storageClass = this.storageClasses.find(sc => sc.name === neu);
|
||||
const storageClass = this.storageClasses.find((sc) => sc.name === neu);
|
||||
const provisioner = storageClass?.provisioner;
|
||||
const engine = storageClass?.parameters?.dataEngine;
|
||||
|
||||
@@ -158,7 +158,10 @@ export default {
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<Loading mode="relative" :loading="loading" />
|
||||
<Loading
|
||||
mode="relative"
|
||||
:loading="loading"
|
||||
/>
|
||||
<div class="row mb-20">
|
||||
<div
|
||||
class="col span-6"
|
||||
@@ -249,7 +252,11 @@ export default {
|
||||
data-testid="input-hev-bus"
|
||||
class="col span-6"
|
||||
>
|
||||
<InputOrDisplay :name="t('harvester.virtualMachine.volume.bus')" :value="value.bus" :mode="mode">
|
||||
<InputOrDisplay
|
||||
:name="t('harvester.virtualMachine.volume.bus')"
|
||||
:value="value.bus"
|
||||
:mode="mode"
|
||||
>
|
||||
<LabeledSelect
|
||||
v-model:value="value.bus"
|
||||
:label="t('harvester.virtualMachine.volume.bus')"
|
||||
@@ -271,7 +278,10 @@ export default {
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-20">
|
||||
<div v-if="value.volumeBackups && isView" class="col span-3">
|
||||
<div
|
||||
v-if="value.volumeBackups && isView"
|
||||
class="col span-3"
|
||||
>
|
||||
<LabelValue
|
||||
:name="t('harvester.virtualMachine.volume.readyToUse')"
|
||||
:value="readyToUse"
|
||||
|
||||
@@ -142,7 +142,7 @@ export default {
|
||||
versionOptions() {
|
||||
const defaultVersion = this.curTemplateResource?.defaultVersion;
|
||||
|
||||
return this.versions.filter( O => O.templateId === this.templateId).map( (T) => {
|
||||
return this.versions.filter( (O) => O.templateId === this.templateId).map( (T) => {
|
||||
const version = T.version;
|
||||
|
||||
const label = defaultVersion === version ? `${ version } (${ this.t('generic.default') })` : version;
|
||||
@@ -157,7 +157,7 @@ export default {
|
||||
},
|
||||
|
||||
curTemplateResource() {
|
||||
return this.templates.find( O => O.id === this.templateId);
|
||||
return this.templates.find( (O) => O.id === this.templateId);
|
||||
},
|
||||
|
||||
nameLabel() {
|
||||
@@ -190,7 +190,7 @@ export default {
|
||||
|
||||
enableCpuPinningCheckbox() {
|
||||
if (this.mode === 'create') {
|
||||
return this.nodes.some(node => node.isCPUManagerEnabled); // any one of nodes has label cpuManager=true
|
||||
return this.nodes.some((node) => node.isCPUManagerEnabled); // any one of nodes has label cpuManager=true
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -202,7 +202,7 @@ export default {
|
||||
}
|
||||
|
||||
if (this.mode === 'create') {
|
||||
return this.nodes.every(node => !node.isCPUManagerEnabled); // no node enabled CPU manager
|
||||
return this.nodes.every((node) => !node.isCPUManagerEnabled); // no node enabled CPU manager
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -218,7 +218,7 @@ export default {
|
||||
if (id !== old && !this.templateVersionId) {
|
||||
const templates = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_TEMPLATE });
|
||||
|
||||
this.templateVersionId = templates.find( O => O.id === id)?.spec?.defaultVersionId;
|
||||
this.templateVersionId = templates.find( (O) => O.id === id)?.spec?.defaultVersionId;
|
||||
}
|
||||
},
|
||||
immediate: false
|
||||
@@ -230,7 +230,7 @@ export default {
|
||||
return;
|
||||
}
|
||||
const versions = await this.$store.dispatch('harvester/findAll', { type: HCI.VM_VERSION });
|
||||
const curVersion = versions.find( V => V.id === id);
|
||||
const curVersion = versions.find( (V) => V.id === id);
|
||||
const cloneVersionVM = clone(curVersion.spec.vm);
|
||||
|
||||
delete cloneVersionVM.spec?.template?.spec?.accessCredentials;
|
||||
@@ -458,7 +458,7 @@ export default {
|
||||
hasAvailableVersion(templateId) {
|
||||
let hasAvailableVersion = false;
|
||||
|
||||
this.versions.filter( O => O.templateId === templateId).find( (T) => {
|
||||
this.versions.filter( (O) => O.templateId === templateId).find( (T) => {
|
||||
if (T.isReady) {
|
||||
hasAvailableVersion = true;
|
||||
}
|
||||
@@ -483,7 +483,7 @@ export default {
|
||||
id="vm"
|
||||
:done-route="doneRoute"
|
||||
:resource="value"
|
||||
:cancelEvent="true"
|
||||
:cancel-event="true"
|
||||
:mode="mode"
|
||||
:can-yaml="isSingle ? true : false"
|
||||
:errors="errors"
|
||||
@@ -503,13 +503,13 @@ export default {
|
||||
|
||||
<NameNsDescription
|
||||
:value="value"
|
||||
@update:value="$emit('update:value', $event)"
|
||||
:mode="mode"
|
||||
:has-extra="!isSingle"
|
||||
:name-label="nameLabel"
|
||||
:namespaced="true"
|
||||
:name-placeholder="isSingle ? 'nameNsDescription.name.placeholder' : 'harvester.virtualMachine.instance.multiple.nameNsDescription'"
|
||||
:extra-columns="isSingle ? [] :['type']"
|
||||
@update:value="$emit('update:value', $event)"
|
||||
>
|
||||
<template #type>
|
||||
<LabeledInput
|
||||
@@ -653,16 +653,44 @@ export default {
|
||||
/>
|
||||
</Tab>
|
||||
|
||||
<Tab v-if="enabledSriovgpu" :label="t('harvester.tab.vGpuDevices')" name="vGpuDevices" :weight="-6">
|
||||
<VGpuDevices :mode="mode" :value="spec.template.spec" :vm="value" />
|
||||
<Tab
|
||||
v-if="enabledSriovgpu"
|
||||
:label="t('harvester.tab.vGpuDevices')"
|
||||
name="vGpuDevices"
|
||||
:weight="-6"
|
||||
>
|
||||
<VGpuDevices
|
||||
:mode="mode"
|
||||
:value="spec.template.spec"
|
||||
:vm="value"
|
||||
/>
|
||||
</Tab>
|
||||
|
||||
<Tab v-if="enabledPCI" :label="t('harvester.tab.usbDevices')" name="usbDevices" :weight="-7">
|
||||
<UsbDevices :mode="mode" :value="spec.template.spec" :vm="value" />
|
||||
<Tab
|
||||
v-if="enabledPCI"
|
||||
:label="t('harvester.tab.usbDevices')"
|
||||
name="usbDevices"
|
||||
:weight="-7"
|
||||
>
|
||||
<UsbDevices
|
||||
:mode="mode"
|
||||
:value="spec.template.spec"
|
||||
:vm="value"
|
||||
/>
|
||||
</Tab>
|
||||
|
||||
<Tab v-if="isEdit" :label="t('harvester.tab.accessCredentials')" name="accessCredentials" :weight="-8">
|
||||
<AccessCredentials v-model:value="accessCredentials" :mode="mode" :resourceType="value" :is-qemu-installed="isQemuInstalled" />
|
||||
<Tab
|
||||
v-if="isEdit"
|
||||
:label="t('harvester.tab.accessCredentials')"
|
||||
name="accessCredentials"
|
||||
:weight="-8"
|
||||
>
|
||||
<AccessCredentials
|
||||
v-model:value="accessCredentials"
|
||||
:mode="mode"
|
||||
:resource-type="value"
|
||||
:is-qemu-installed="isQemuInstalled"
|
||||
/>
|
||||
</Tab>
|
||||
|
||||
<Tab
|
||||
@@ -739,11 +767,24 @@ 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" class="mb-20">
|
||||
<div
|
||||
v-if="showAdvanced"
|
||||
class="mb-20"
|
||||
>
|
||||
<div class="row mb-20">
|
||||
<div class="col span-6">
|
||||
<LabeledInput
|
||||
|
||||
Reference in New Issue
Block a user