From b9ea7133febdfb48421a75a355bf139da18939be Mon Sep 17 00:00:00 2001 From: Joshen Lim Date: Wed, 30 Sep 2026 16:27:14 +0800 Subject: [PATCH] Fix iceberg --- .../AnalyticsBucketDetails.utils.ts | 4 ---- .../useAnalyticsBucketWrapperInstance.tsx | 4 ++-- .../useS3VectorsWrapperInstance.tsx | 4 ++-- .../storage/iceberg-wrapper-create-mutation.ts | 16 +++++++++++----- .../s3-vectors-wrapper-create-mutation.ts | 12 +++++++++--- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/AnalyticsBucketDetails.utils.ts b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/AnalyticsBucketDetails.utils.ts index 871195c02d8..81c3ca26f06 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/AnalyticsBucketDetails.utils.ts +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/AnalyticsBucketDetails.utils.ts @@ -8,10 +8,6 @@ export const getAnalyticsBucketS3KeyName = (bucketId: string) => { return `${snakeCase(bucketId)}_keys` } -export const getAnalyticsBucketFDWName = (bucketId: string) => { - return `${snakeCase(bucketId)}_fdw` -} - export const getAnalyticsBucketFDWServerName = (bucketId: string) => { return `${snakeCase(bucketId)}_fdw_server` } diff --git a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx index c5d4dfeadcc..123d28a4cd4 100644 --- a/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx +++ b/apps/studio/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/useAnalyticsBucketWrapperInstance.tsx @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { getAnalyticsBucketFDWName } from './AnalyticsBucketDetails.utils' +import { getAnalyticsBucketFDWServerName } from './AnalyticsBucketDetails.utils' import { WRAPPER_HANDLERS } from '@/components/interfaces/Integrations/Wrappers/Wrappers.constants' import { getWrapperMetaForWrapper, @@ -32,7 +32,7 @@ export const useAnalyticsBucketWrapperInstance = ( wrapper ) ) - .find((w) => w.name === getAnalyticsBucketFDWName(bucketId ?? '')) + .find((w) => w.server_name === getAnalyticsBucketFDWServerName(bucketId ?? '')) }, [data, bucketId]) const icebergWrapperMeta = getWrapperMetaForWrapper(icebergWrapper) diff --git a/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx b/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx index c87ba11625e..a12f8288f18 100644 --- a/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx +++ b/apps/studio/components/interfaces/Storage/VectorBuckets/useS3VectorsWrapperInstance.tsx @@ -1,6 +1,6 @@ import { useMemo } from 'react' -import { getVectorBucketFDWName } from './VectorBuckets.utils' +import { getVectorBucketFDWServerName } from './VectorBuckets.utils' import { WRAPPER_HANDLERS, WRAPPERS, @@ -30,7 +30,7 @@ export const useS3VectorsWrapperInstance = ({ bucketId }: { bucketId?: string }) wrapper ) ) - .find((w) => w.name === getVectorBucketFDWName(bucketId ?? '')) + .find((w) => w.server_name === getVectorBucketFDWServerName(bucketId ?? '')) }, [data, bucketId]) const s3VectorsWrapperMeta = WRAPPERS.find((w) => w.handlerName === WRAPPER_HANDLERS.S3_VECTORS) diff --git a/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts b/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts index c98ad6d0217..8b6499ab611 100644 --- a/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts +++ b/apps/studio/data/storage/iceberg-wrapper-create-mutation.ts @@ -3,7 +3,7 @@ import { PermissionAction } from '@supabase/shared-types/out/constants' import { useS3AccessKeyCreateMutation } from './s3-access-key-create-mutation' import { WRAPPERS } from '@/components/interfaces/Integrations/Wrappers/Wrappers.constants' import { - getAnalyticsBucketFDWName, + getAnalyticsBucketFDWServerName, getAnalyticsBucketS3KeyName, } from '@/components/interfaces/Storage/AnalyticsBuckets/AnalyticsBucketDetails/AnalyticsBucketDetails.utils' import { @@ -13,6 +13,7 @@ import { import { useAPIKeys } from '@/data/api-keys/api-keys-query' import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' import { FDWCreateVariables, useFDWCreateMutation } from '@/data/fdw/fdw-create-mutation' +import { useFDWsQuery } from '@/data/fdw/fdws-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' @@ -33,6 +34,12 @@ export const useIcebergWrapperCreateMutation = () => { const wrapperMeta = WRAPPERS.find((wrapper) => wrapper.name === 'iceberg_wrapper') + const { data: fdws } = useFDWsQuery({ + projectRef: project?.ref, + connectionString: project?.connectionString, + }) + const hasExistingWrapper = fdws?.some((wrapper) => wrapper.name === wrapperMeta?.name) ?? false + const { can: canCreateCredentials } = useAsyncCheckPermissions( PermissionAction.STORAGE_ADMIN_WRITE, '*' @@ -49,15 +56,14 @@ export const useIcebergWrapperCreateMutation = () => { description: getAnalyticsBucketS3KeyName(bucketName), }) - const wrapperName = getAnalyticsBucketFDWName(bucketName) - const params: FDWCreateVariables = { projectRef: project?.ref, connectionString: project?.connectionString, + hasExistingWrapper, wrapperMeta: wrapperMeta!, formState: { - wrapper_name: wrapperName, - server_name: `${wrapperName}_server`, + wrapper_name: wrapperMeta!.name, + server_name: getAnalyticsBucketFDWServerName(bucketName), vault_aws_access_key_id: createS3KeyData?.access_key, vault_aws_secret_access_key: createS3KeyData?.secret_key, vault_token: apiKey, diff --git a/apps/studio/data/storage/s3-vectors-wrapper-create-mutation.ts b/apps/studio/data/storage/s3-vectors-wrapper-create-mutation.ts index c77b8c329a6..8ea7613ebcf 100644 --- a/apps/studio/data/storage/s3-vectors-wrapper-create-mutation.ts +++ b/apps/studio/data/storage/s3-vectors-wrapper-create-mutation.ts @@ -6,12 +6,12 @@ import { useS3AccessKeyCreateMutation } from './s3-access-key-create-mutation' import { WRAPPERS } from '@/components/interfaces/Integrations/Wrappers/Wrappers.constants' import { getVectorURI } from '@/components/interfaces/Storage/StorageSettings/StorageSettings.utils' import { - getVectorBucketFDWName, getVectorBucketFDWServerName, getVectorBucketS3KeyName, } from '@/components/interfaces/Storage/VectorBuckets/VectorBuckets.utils' import { useProjectSettingsV2Query } from '@/data/config/project-settings-v2-query' import { FDWCreateVariables, useFDWCreateMutation } from '@/data/fdw/fdw-create-mutation' +import { useFDWsQuery } from '@/data/fdw/fdws-query' import { useAsyncCheckPermissions } from '@/hooks/misc/useCheckPermissions' import { useDeploymentMode } from '@/hooks/misc/useDeploymentMode' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' @@ -39,6 +39,12 @@ export const useS3VectorsWrapperCreateMutation = () => { const wrapperMeta = WRAPPERS.find((wrapper) => wrapper.name === 's3_vectors_wrapper') + const { data: fdws } = useFDWsQuery({ + projectRef: project?.ref, + connectionString: project?.connectionString, + }) + const hasExistingWrapper = fdws?.some((wrapper) => wrapper.name === wrapperMeta?.name) ?? false + const { can: canCreateCredentials } = useAsyncCheckPermissions( PermissionAction.STORAGE_ADMIN_WRITE, '*' @@ -74,15 +80,15 @@ export const useS3VectorsWrapperCreateMutation = () => { ) } - const wrapperName = getVectorBucketFDWName(bucketName) const serverName = getVectorBucketFDWServerName(bucketName) const params: FDWCreateVariables = { projectRef: project?.ref, connectionString: project?.connectionString, + hasExistingWrapper, wrapperMeta: wrapperMeta!, formState: { - wrapper_name: wrapperName, + wrapper_name: wrapperMeta!.name, server_name: serverName, vault_access_key_id: accessKey, vault_secret_access_key: secretKey,