From d93efedc1195fbd6d1665475b815b894e63502ce Mon Sep 17 00:00:00 2001 From: Amir Raminfar Date: Mon, 30 Dec 2024 09:24:55 -0800 Subject: [PATCH] feat: supports downloading a group of containers in a zip file (#3490) --- assets/auto-imports.d.ts | 4 + .../ContainerActionsToolbar.vue | 2 +- .../LogViewer/MultiContainerActionToolbar.vue | 17 ++- internal/web/download.go | 100 ++++++++++++++++++ internal/web/download_test.go | 7 +- internal/web/logs.go | 65 ------------ internal/web/routes.go | 2 +- 7 files changed, 124 insertions(+), 73 deletions(-) create mode 100644 internal/web/download.go diff --git a/assets/auto-imports.d.ts b/assets/auto-imports.d.ts index d089f7ab..01c953e5 100644 --- a/assets/auto-imports.d.ts +++ b/assets/auto-imports.d.ts @@ -280,6 +280,7 @@ declare global { const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] + const usePreferredReducedTransparency: typeof import('@vueuse/core')['usePreferredReducedTransparency'] const usePrevious: typeof import('@vueuse/core')['usePrevious'] const useProfileStorage: typeof import('./composable/profileStorage')['useProfileStorage'] const useRafFn: typeof import('@vueuse/core')['useRafFn'] @@ -288,6 +289,7 @@ declare global { const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] const useRoute: typeof import('vue-router')['useRoute'] const useRouter: typeof import('vue-router')['useRouter'] + const useSSRWidth: typeof import('@vueuse/core')['useSSRWidth'] const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] @@ -665,6 +667,7 @@ declare module 'vue' { readonly usePreferredDark: UnwrapRef readonly usePreferredLanguages: UnwrapRef readonly usePreferredReducedMotion: UnwrapRef + readonly usePreferredReducedTransparency: UnwrapRef readonly usePrevious: UnwrapRef readonly useProfileStorage: UnwrapRef readonly useRafFn: UnwrapRef @@ -673,6 +676,7 @@ declare module 'vue' { readonly useResizeObserver: UnwrapRef readonly useRoute: UnwrapRef readonly useRouter: UnwrapRef + readonly useSSRWidth: UnwrapRef readonly useScreenOrientation: UnwrapRef readonly useScreenSafeArea: UnwrapRef readonly useScriptTag: UnwrapRef diff --git a/assets/components/ContainerViewer/ContainerActionsToolbar.vue b/assets/components/ContainerViewer/ContainerActionsToolbar.vue index 73f30c53..1f56b5bb 100644 --- a/assets/components/ContainerViewer/ContainerActionsToolbar.vue +++ b/assets/components/ContainerViewer/ContainerActionsToolbar.vue @@ -169,7 +169,7 @@ const downloadParams = computed(() => const downloadUrl = computed(() => withBase( - `/api/hosts/${container.host}/containers/${container.id}/logs/download?${new URLSearchParams(downloadParams.value).toString()}`, + `/api/containers/${container.host}:${container.id}/download?${new URLSearchParams(downloadParams.value).toString()}`, ), ); diff --git a/assets/components/LogViewer/MultiContainerActionToolbar.vue b/assets/components/LogViewer/MultiContainerActionToolbar.vue index 1ebcea75..9287ff92 100644 --- a/assets/components/LogViewer/MultiContainerActionToolbar.vue +++ b/assets/components/LogViewer/MultiContainerActionToolbar.vue @@ -11,6 +11,9 @@ +
  • + {{ $t("toolbar.download") }} +
  • {{ $t("toolbar.search") }} @@ -84,7 +87,19 @@ const { showSearch } = useSearchFilter(); const clear = defineEmit(); -const { streamConfig, showHostname, showContainerName } = useLoggingContext(); +const { streamConfig, showHostname, showContainerName, containers } = useLoggingContext(); + +const downloadParams = computed(() => + Object.entries(toValue(streamConfig)) + .filter(([, value]) => value) + .reduce((acc, [key]) => ({ ...acc, [key]: "1" }), {}), +); + +const downloadUrl = computed(() => + withBase( + `/api/containers/${containers.value.map((c) => c.host + ":" + c.id).join(",")}/download?${new URLSearchParams(downloadParams.value).toString()}`, + ), +);