mirror of
https://github.com/vatesfr/xen-orchestra.git
synced 2026-09-10 22:14:48 -05:00
feat(xo6/pool): add forget action (#10130)
This commit is contained in:
@@ -879,6 +879,9 @@
|
||||
"pool-connection-ip-info": "Provide the primary host’s 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",
|
||||
|
||||
@@ -879,6 +879,9 @@
|
||||
"pool-connection-ip-info": "Entrez l’adresse de l’hô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",
|
||||
|
||||
@@ -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>
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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(),
|
||||
},
|
||||
],
|
||||
}),
|
||||
}
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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>
|
||||
@@ -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 }
|
||||
}
|
||||
@@ -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}`)))
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user