feat(xo6/pool): add forget action (#10130)

This commit is contained in:
Alina D
2026-08-18 11:17:18 +02:00
committed by GitHub
parent de1c231873
commit db0d009d5b
10 changed files with 142 additions and 5 deletions

View File

@@ -879,6 +879,9 @@
"pool-connection-ip-info": "Provide the primary hosts address of the pool you want to connect to.",
"pool-connection-success": "You have successfully connected to the pool. You can now find it in your treeview and start managing your hosts and VMs.",
"pool-cpu-usage": "Pool CPU Usage",
"pool-disconnect-info": "You will no longer be able to manage this pool from XO. You can reconnect it later.",
"pool-forget-confirm-title": "You are about to remove {name} host",
"pool-forget-confirm-info": "This will permanently remove this host from XO. To reconnect, you will need to add it again.",
"pool-management": "Pool management",
"pool-ram-usage": "Pool RAM Usage",
"pool:status:connected": "@:status:connected",

View File

@@ -879,6 +879,9 @@
"pool-connection-ip-info": "Entrez ladresse de lhôte primaire du pool auquel vous souhaitez vous connecter.",
"pool-connection-success": "Vous êtes connecté au pool. Vous pouvez désormais le retrouver dans votre arborescence et commencer à gérer vos hôtes et vos machines virtuelles.",
"pool-cpu-usage": "Utilisation CPU du Pool",
"pool-disconnect-info": "Vous ne pourrez plus gérer ce pool depuis XO. Vous pourrez le reconnecter ultérieurement.",
"pool-forget-confirm-title": "Vous êtes sur le point de supprimer l'hôte {name}",
"pool-forget-confirm-info": "Cela supprimera définitivement cet hôte de XO. Pour vous reconnecter, vous devrez l'ajouter à nouveau.",
"pool-management": "Gestion du Pool",
"pool-ram-usage": "Utilisation RAM du Pool",
"pool:status:connected": "@:status:connected",

View File

@@ -0,0 +1,35 @@
<template>
<MenuItem
v-tooltip="!canForgetServer && forgetServerErrorMessage"
icon="action:forget"
:disabled="!canForgetServer"
:busy="isForgettingServer"
class="forget"
@click="forgetServer()"
>
{{ t('action:forget') }}
</MenuItem>
</template>
<script lang="ts" setup>
import { useServerForget } from '@/modules/server/composables/use-server-forget.composable.ts'
import { type FrontXoServer } from '@/modules/server/remote-resources/use-xo-server-collection.ts'
import MenuItem from '@core/components/menu/MenuItem.vue'
import { vTooltip } from '@core/directives/tooltip.directive.ts'
import { useI18n } from 'vue-i18n'
const { server } = defineProps<{ server: FrontXoServer }>()
const { t } = useI18n()
const { forgetServer, canForgetServer, isForgettingServer, forgetServerErrorMessage } = useServerForget(
() => server.id,
() => server.label
)
</script>
<style lang="postcss" scoped>
.forget {
color: var(--color-danger-item-base);
}
</style>

View File

@@ -55,7 +55,7 @@
<script setup lang="ts">
import { useXoServerConnectJob } from '@/modules/server/jobs/xo-server-connect.job.ts'
import { useXoServerCreateJob } from '@/modules/server/jobs/xo-server-create.job.ts'
import { useXoServerRemoveJob } from '@/modules/server/jobs/xo-server-remove.job.ts'
import { useXoServerForgetJob } from '@/modules/server/jobs/xo-server-forget.job.ts'
import VtsInputWrapper from '@core/components/input-wrapper/VtsInputWrapper.vue'
import UiButton from '@core/components/ui/button/UiButton.vue'
import UiCheckbox from '@core/components/ui/checkbox/UiCheckbox.vue'
@@ -112,7 +112,7 @@ const payload = computed(() => ({
// so only handle a single payload
const { canRun: createCanRun, isRunning: createIsRunning, run: create } = useXoServerCreateJob([payload])
const { isRunning: connectIsRunning, run: connect } = useXoServerConnectJob([serverId])
const { isRunning: removeIsRunning, run: remove } = useXoServerRemoveJob([serverId])
const { isRunning: removeIsRunning, run: remove } = useXoServerForgetJob([serverId])
const isServerJobRunning = logicOr(connectIsRunning, createIsRunning, removeIsRunning)

View File

@@ -29,6 +29,7 @@ import {
usePoolEnhancedData,
} from '@/modules/pool/composables/use-pool-enhanced-data.composable.ts'
import { useServerDisconnect } from '@/modules/server/composables/use-server-disconnect.composable.ts'
import { useServerForget } from '@/modules/server/composables/use-server-forget.composable.ts'
import { useXoServerConnectJob } from '@/modules/server/jobs/xo-server-connect.job.ts'
import {
type FrontXoServer,
@@ -131,6 +132,11 @@ const { HeadCells, BodyCells } = useServerColumns({
}
}
const { forgetServer, isForgettingServer } = useServerForget(
() => server.id,
() => server.label
)
return {
pool: r => r(poolInfo.value),
hostIp: r => r(server.masterHostIp),
@@ -173,6 +179,12 @@ const { HeadCells, BodyCells } = useServerColumns({
disabled: isDownloadDisabled.value,
onClick: () => downloadBugTools(),
},
{
label: t('action:forget'),
icon: 'action:forget',
busy: isForgettingServer.value,
onClick: () => forgetServer(),
},
],
}),
}

View File

@@ -2,7 +2,7 @@
<VtsSidePanel :has-selection="!!server" @close="emit('close')">
<template v-if="server" #actions>
<PoolConnectionToggleButton :server-id="server.id" />
<MenuList v-if="server.poolId !== undefined" placement="bottom-end">
<MenuList placement="bottom-end">
<template #trigger="{ open }">
<UiButtonIcon
v-tooltip="{ placement: 'left', content: t('more-actions') }"
@@ -12,7 +12,8 @@
@click="open($event)"
/>
</template>
<PoolDownloadButton :pool-id="server.poolId" />
<PoolDownloadButton v-if="server.poolId !== undefined" :pool-id="server.poolId" />
<PoolForgetButton :server />
</MenuList>
</template>
<template v-if="server">
@@ -177,6 +178,7 @@
import { useXoHostCollection } from '@/modules/host/remote-resources/use-xo-host-collection.ts'
import PoolConnectionToggleButton from '@/modules/pool/components/actions/connection/PoolConnectionToggleButton.vue'
import PoolDownloadButton from '@/modules/pool/components/actions/download/PoolDownloadButton.vue'
import PoolForgetButton from '@/modules/pool/components/actions/forget/PoolForgetButton.vue'
import { useXoPoolCollection } from '@/modules/pool/remote-resources/use-xo-pool-collection.ts'
import type { FrontXoServer } from '@/modules/server/remote-resources/use-xo-server-collection.ts'
import VtsCardRowKeyValue from '@core/components/card/VtsCardRowKeyValue.vue'

View File

@@ -0,0 +1,38 @@
<template>
<UiModal accent="warning" icon="action:forget" @confirm="emit('confirm')" @dismiss="emit('cancel')">
<template #title>
<I18nT keypath="pool-forget-confirm-title" scope="global" tag="div">
<template #name>
<strong>{{ serverLabel }}</strong>
</template>
</I18nT>
</template>
<template #content>
{{ t('pool-forget-confirm-info') }}
</template>
<template #buttons>
<VtsOverlayCancelButton @click="emit('cancel')">{{ t('action:go-back') }}</VtsOverlayCancelButton>
<VtsOverlayConfirmButton>
{{ t('action:forget') }}
</VtsOverlayConfirmButton>
</template>
</UiModal>
</template>
<script lang="ts" setup>
import VtsOverlayCancelButton from '@xen-orchestra/web-core/components/overlay/VtsOverlayCancelButton.vue'
import VtsOverlayConfirmButton from '@xen-orchestra/web-core/components/overlay/VtsOverlayConfirmButton.vue'
import UiModal from '@xen-orchestra/web-core/components/ui/modal/UiModal.vue'
import { I18nT, useI18n } from 'vue-i18n'
defineProps<{
serverLabel: string
}>()
const emit = defineEmits<{
confirm: []
cancel: []
}>()
const { t } = useI18n()
</script>

View File

@@ -0,0 +1,43 @@
import { useXoServerForgetJob } from '@/modules/server/jobs/xo-server-forget.job.ts'
import type { FrontXoServer } from '@/modules/server/remote-resources/use-xo-server-collection.ts'
import { useOverlay } from '@core/packages/overlay/use-overlay.ts'
import { toComputed } from '@core/utils/to-computed.util.ts'
import type { MaybeRefOrGetter } from 'vue'
export function useServerForget(
rawServerId: MaybeRefOrGetter<FrontXoServer['id']>,
rawServerLabel: MaybeRefOrGetter<FrontXoServer['label']>
) {
const serverId = toComputed(rawServerId)
const serverLabel = toComputed(rawServerLabel)
const {
run,
canRun: canForgetServer,
isRunning: isForgettingServer,
errorMessage: forgetServerErrorMessage,
} = useXoServerForgetJob([serverId])
const { open } = useOverlay({
component: () => import('@/modules/server/components/modal/ServerForgetModal.vue'),
events: {
onConfirm: async () => {
try {
await run()
} catch (error) {
console.error('Error when forgetting server:', error)
}
},
onCancel: true,
},
})
function forgetServer() {
return open({
props: { serverLabel: serverLabel.value ?? '' },
})
}
return { forgetServer, canForgetServer, isForgettingServer, forgetServerErrorMessage }
}

View File

@@ -2,7 +2,7 @@ import { xoServerIdsArg } from '@/modules/server/jobs/xo-server-args.job.ts'
import { fetchDelete } from '@/shared/utils/fetch.util.ts'
import { defineJob, JobError, JobRunningError } from '@core/packages/job'
export const useXoServerRemoveJob = defineJob('server.remove', [xoServerIdsArg], () => {
export const useXoServerForgetJob = defineJob('server.remove', [xoServerIdsArg], () => {
return {
run(serverIds) {
return Promise.allSettled(serverIds.map(async serverId => fetchDelete(`servers/${serverId.value}`)))

View File

@@ -11,6 +11,7 @@
> Users must be able to say: "Nice enhancement, I'm eager to test it"
- [XO6/Pool] Add forget action on page Site (PR [#10130](https://github.com/vatesfr/xen-orchestra/pull/10130))
- [XO6/Host] Add possibility to shut down and start an host (PR [#10088](https://github.com/vatesfr/xen-orchestra/pull/10088))
- [REST API] Add `hosts/:id/actions/scan_pifs` endpoint (PR [#10187](https://github.com/vatesfr/xen-orchestra/pull/10187))
- [XO6/Host] Add possibility to scan PIFs directly from the host (PR [#10191](https://github.com/vatesfr/xen-orchestra/pull/10191))