From 12db558e416b2c8191f89f14b0fb6282e53a4e67 Mon Sep 17 00:00:00 2001 From: Vitkor Kessler Date: Tue, 30 Dec 2025 08:46:34 +0100 Subject: [PATCH 1/4] wip --- openapi/management-open-api.yaml | 544 +++++++++++++++++++++------ src/gen/iceberg/client/client.gen.ts | 35 +- src/gen/iceberg/client/index.ts | 1 - src/gen/iceberg/client/types.gen.ts | 27 -- src/gen/management/sdk.gen.ts | 60 ++- src/gen/management/types.gen.ts | 354 +++++++++++++---- 6 files changed, 816 insertions(+), 205 deletions(-) diff --git a/openapi/management-open-api.yaml b/openapi/management-open-api.yaml index 066e2a1..598f3cf 100644 --- a/openapi/management-open-api.yaml +++ b/openapi/management-open-api.yaml @@ -1478,6 +1478,116 @@ paths: application/json: schema: $ref: '#/components/schemas/IcebergErrorResponse' + /management/v1/project/task/by-id/{task_id}: + get: + tags: + - tasks + summary: Get Details about a specific Project-level task by its ID. + operationId: get_project_task_details + parameters: + - name: task_id + in: path + required: true + schema: + type: string + format: uuid + - name: numAttempts + in: query + description: 'Number of attempts to retrieve (default: 5)' + required: false + schema: + type: + - integer + - 'null' + format: int32 + default: 5 + minimum: 0 + - name: x-project-id + in: header + description: Project ID (optional; falls back to the default project if not provided) + required: false + schema: + type: + - string + - 'null' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetProjectTaskDetailsResponse' + 4XX: + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/IcebergErrorResponse' + /management/v1/project/task/control: + post: + tags: + - tasks + summary: Control a set of Project-level tasks by their IDs (e.g., cancel, request stop, run now) + description: Accepts at most 100 task IDs in one request. + operationId: control_project_tasks + parameters: + - name: x-project-id + in: header + description: Project ID (optional; falls back to the default project if not provided) + required: false + schema: + type: + - string + - 'null' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ControlTasksRequest' + required: true + responses: + '204': + description: All requested actions were successful + 4XX: + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/IcebergErrorResponse' + /management/v1/project/task/list: + post: + tags: + - tasks + summary: List active and historic Project-level tasks. + operationId: list_project_tasks + parameters: + - name: x-project-id + in: header + description: Project ID (optional; falls back to the default project if not provided) + required: false + schema: + type: + - string + - 'null' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ListProjectTasksRequest' + required: true + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListProjectTasksResponse' + 4XX: + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/IcebergErrorResponse' /management/v1/project/{project_id}: get: tags: @@ -4431,6 +4541,28 @@ components: project-name: type: string description: Name of the project + GetProjectTaskDetailsResponse: + allOf: + - $ref: '#/components/schemas/ProjectTaskInfo' + description: Most recent task information + - type: object + required: + - task-data + - attempts + properties: + attempts: + type: array + items: + $ref: '#/components/schemas/TaskAttempt' + description: History of past attempts + execution-details: + type: + - object + - 'null' + description: Execution details for the current attempt + task-data: + type: object + description: Task-specific data GetPurgeQueueConfig: type: object required: @@ -4511,7 +4643,7 @@ components: $ref: '#/components/schemas/TabularExpirationQueueConfig' GetTaskDetailsResponse: allOf: - - $ref: '#/components/schemas/Task' + - $ref: '#/components/schemas/WarehouseTaskInfo' description: Most recent task information - type: object required: @@ -4835,6 +4967,38 @@ components: type: string enum: - get_endpoint_statistics + - type: object + required: + - action + properties: + action: + type: string + enum: + - modify_task_queue_config + - type: object + required: + - action + properties: + action: + type: string + enum: + - get_task_queue_config + - type: object + required: + - action + properties: + action: + type: string + enum: + - get_project_tasks + - type: object + required: + - action + properties: + action: + type: string + enum: + - control_project_tasks LakekeeperRoleAction: oneOf: - type: object @@ -5356,6 +5520,66 @@ components: items: $ref: '#/components/schemas/DeletedTabularResponse' description: List of tabulars + ListProjectTasksRequest: + type: object + properties: + created-after: + type: + - string + - 'null' + format: date-time + description: Filter tasks created after this timestamp + example: 2025-12-31T23:59:59Z + created-before: + type: + - string + - 'null' + format: date-time + description: Filter tasks created before this timestamp + example: 2025-12-31T23:59:59Z + page-size: + type: + - integer + - 'null' + format: int64 + description: Number of results per page + page-token: + type: + - string + - 'null' + description: |- + Next page token, re-use the same request as for the original request, + but set this to the `next_page_token` from the previous response. + Stop iterating when no more items are returned in a page. + queue-name: + type: + - array + - 'null' + items: + type: string + description: Filter by one or more queue names + status: + type: + - array + - 'null' + items: + $ref: '#/components/schemas/TaskStatus' + description: Filter by task status + ListProjectTasksResponse: + type: object + required: + - tasks + properties: + next-page-token: + type: + - string + - 'null' + description: Token for the next page of results + tasks: + type: array + items: + $ref: '#/components/schemas/ProjectTaskInfo' + description: List of tasks ListProjectsResponse: type: object required: @@ -5401,7 +5625,7 @@ components: - array - 'null' items: - $ref: '#/components/schemas/TaskEntity' + $ref: '#/components/schemas/WarehouseTaskEntityFilter' description: Filter by specific entity page-size: type: @@ -5444,7 +5668,7 @@ components: tasks: type: array items: - $ref: '#/components/schemas/Task' + $ref: '#/components/schemas/WarehouseTaskInfo' description: List of tasks ListUsersResponse: type: object @@ -5786,6 +6010,71 @@ components: - select - create - modify + ProjectTaskInfo: + type: object + required: + - task-id + - project-id + - queue-name + - status + - scheduled-for + - attempt + - progress + - created-at + properties: + attempt: + type: integer + format: int32 + description: Current attempt number + created-at: + type: string + format: date-time + description: When this task attempt was created + last-heartbeat-at: + type: + - string + - 'null' + format: date-time + description: Last heartbeat timestamp for running tasks + parent-task-id: + type: + - string + - 'null' + format: uuid + description: Parent task ID if this is a sub-task + picked-up-at: + type: + - string + - 'null' + format: date-time + description: When the latest attempt of the task was picked up for processing by a worker. + progress: + type: number + format: float + description: Progress of the task (0.0 to 1.0) + project-id: + type: string + description: Project ID associated with the task + queue-name: + type: string + description: Name of the queue processing this task + scheduled-for: + type: string + format: date-time + description: When the latest attempt of the task is scheduled for + status: + $ref: '#/components/schemas/TaskStatus' + description: Current status of the task + task-id: + type: string + format: uuid + description: Unique identifier for the task + updated-at: + type: + - string + - 'null' + format: date-time + description: When the task was last updated ProtectionResponse: type: object required: @@ -6762,82 +7051,6 @@ components: enum: - table - view - Task: - type: object - required: - - task-id - - warehouse-id - - queue-name - - entity - - entity-name - - status - - scheduled-for - - attempt - - progress - - created-at - properties: - attempt: - type: integer - format: int32 - description: Current attempt number - created-at: - type: string - format: date-time - description: When this task attempt was created - entity: - $ref: '#/components/schemas/TaskEntity' - description: Type of entity this task operates on - entity-name: - type: array - items: - type: string - description: Name of the entity this task operates on - last-heartbeat-at: - type: - - string - - 'null' - format: date-time - description: Last heartbeat timestamp for running tasks - parent-task-id: - type: - - string - - 'null' - format: uuid - description: Parent task ID if this is a sub-task - picked-up-at: - type: - - string - - 'null' - format: date-time - description: When the latest attempt of the task was picked up for processing by a worker. - progress: - type: number - format: float - description: Progress of the task (0.0 to 1.0) - queue-name: - type: string - description: Name of the queue processing this task - scheduled-for: - type: string - format: date-time - description: When the latest attempt of the task is scheduled for - status: - $ref: '#/components/schemas/TaskStatus' - description: Current status of the task - task-id: - type: string - format: uuid - description: Unique identifier for the task - updated-at: - type: - - string - - 'null' - format: date-time - description: When the task was last updated - warehouse-id: - type: string - format: uuid - description: Warehouse ID associated with the task TaskAttempt: type: object required: @@ -6888,32 +7101,6 @@ components: status: $ref: '#/components/schemas/TaskStatus' description: Status of this attempt - TaskEntity: - oneOf: - - type: object - required: - - table-id - - type - properties: - table-id: - type: string - format: uuid - type: - type: string - enum: - - table - - type: object - required: - - view-id - - type - properties: - type: - type: string - enum: - - view - view-id: - type: string - format: uuid TaskStatus: type: string enum: @@ -7488,6 +7675,153 @@ components: enum: - active - inactive + WarehouseTaskEntityFilter: + oneOf: + - type: object + description: Get tasks for a specific table + required: + - table-id + - type + properties: + table-id: + type: string + format: uuid + type: + type: string + enum: + - table + - type: object + description: Get tasks for a specific view + required: + - view-id + - type + properties: + type: + type: string + enum: + - view + view-id: + type: string + format: uuid + - type: object + description: |- + Get Warehouse-level tasks which are not associated with a specific entity + inside the warehouse + required: + - type + properties: + type: + type: string + enum: + - warehouse + WarehouseTaskEntityId: + oneOf: + - type: object + required: + - table-id + - type + properties: + table-id: + type: string + format: uuid + type: + type: string + enum: + - table + - type: object + required: + - view-id + - type + properties: + type: + type: string + enum: + - view + view-id: + type: string + format: uuid + WarehouseTaskInfo: + type: object + required: + - task-id + - project-id + - warehouse-id + - queue-name + - status + - scheduled-for + - attempt + - progress + - created-at + properties: + attempt: + type: integer + format: int32 + description: Current attempt number + created-at: + type: string + format: date-time + description: When this task attempt was created + entity: + oneOf: + - type: 'null' + - $ref: '#/components/schemas/WarehouseTaskEntityId' + description: Type of the sub-entity this task operates on. None if this is a warehouse-level task. + entity-name: + type: + - array + - 'null' + items: + type: string + description: Name of the entity this task operates on. None if this is a warehouse-level task. + last-heartbeat-at: + type: + - string + - 'null' + format: date-time + description: Last heartbeat timestamp for running tasks + parent-task-id: + type: + - string + - 'null' + format: uuid + description: Parent task ID if this is a sub-task + picked-up-at: + type: + - string + - 'null' + format: date-time + description: When the latest attempt of the task was picked up for processing by a worker. + progress: + type: number + format: float + description: Progress of the task (0.0 to 1.0) + project-id: + type: string + description: Project ID associated with the task + queue-name: + type: string + description: Name of the queue processing this task + scheduled-for: + type: string + format: date-time + description: When the latest attempt of the task is scheduled for + status: + $ref: '#/components/schemas/TaskStatus' + description: Current status of the task + task-id: + type: string + format: uuid + description: Unique identifier for the task + updated-at: + type: + - string + - 'null' + format: date-time + description: When the task was last updated + warehouse-id: + type: string + format: uuid + description: Warehouse ID associated with the task securitySchemes: bearerAuth: type: http diff --git a/src/gen/iceberg/client/client.gen.ts b/src/gen/iceberg/client/client.gen.ts index a439d27..c2a5190 100644 --- a/src/gen/iceberg/client/client.gen.ts +++ b/src/gen/iceberg/client/client.gen.ts @@ -95,7 +95,40 @@ export const createClient = (config: Config = {}): Client => { // fetch must be assigned here, otherwise it would throw the error: // TypeError: Failed to execute 'fetch' on 'Window': Illegal invocation const _fetch = opts.fetch!; - let response = await _fetch(request); + let response: Response; + + try { + response = await _fetch(request); + } catch (error) { + // Handle fetch exceptions (AbortError, network errors, etc.) + let finalError = error; + + for (const fn of interceptors.error.fns) { + if (fn) { + finalError = (await fn( + error, + undefined as any, + request, + opts, + )) as unknown; + } + } + + finalError = finalError || ({} as unknown); + + if (opts.throwOnError) { + throw finalError; + } + + // Return error response + return opts.responseStyle === 'data' + ? undefined + : { + error: finalError, + request, + response: undefined as any, + }; + } for (const fn of interceptors.response.fns) { if (fn) { diff --git a/src/gen/iceberg/client/index.ts b/src/gen/iceberg/client/index.ts index cbf8dfe..b295ede 100644 --- a/src/gen/iceberg/client/index.ts +++ b/src/gen/iceberg/client/index.ts @@ -16,7 +16,6 @@ export type { Config, CreateClientConfig, Options, - OptionsLegacyParser, RequestOptions, RequestResult, ResolvedRequestOptions, diff --git a/src/gen/iceberg/client/types.gen.ts b/src/gen/iceberg/client/types.gen.ts index 5c70971..b4a499c 100644 --- a/src/gen/iceberg/client/types.gen.ts +++ b/src/gen/iceberg/client/types.gen.ts @@ -239,30 +239,3 @@ export type Options< 'body' | 'path' | 'query' | 'url' > & ([TData] extends [never] ? unknown : Omit); - -export type OptionsLegacyParser< - TData = unknown, - ThrowOnError extends boolean = boolean, - TResponseStyle extends ResponseStyle = 'fields', -> = TData extends { body?: any } - ? TData extends { headers?: any } - ? OmitKeys< - RequestOptions, - 'body' | 'headers' | 'url' - > & - TData - : OmitKeys< - RequestOptions, - 'body' | 'url' - > & - TData & - Pick, 'headers'> - : TData extends { headers?: any } - ? OmitKeys< - RequestOptions, - 'headers' | 'url' - > & - TData & - Pick, 'body'> - : OmitKeys, 'url'> & - TData; diff --git a/src/gen/management/sdk.gen.ts b/src/gen/management/sdk.gen.ts index a058902..8dc4ea8 100644 --- a/src/gen/management/sdk.gen.ts +++ b/src/gen/management/sdk.gen.ts @@ -2,7 +2,7 @@ import type { Client, Options as Options2, TDataShape } from './client'; import { client } from './client.gen'; -import type { ActivateWarehouseData, ActivateWarehouseErrors, ActivateWarehouseResponses, BatchCheckActionsData, BatchCheckActionsErrors, BatchCheckActionsResponses, BootstrapData, BootstrapErrors, BootstrapResponses, CheckData, CheckResponses, ControlTasksData, ControlTasksErrors, ControlTasksResponses, CreateProjectData, CreateProjectErrors, CreateProjectResponses, CreateRoleData, CreateRoleErrors, CreateRoleResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWarehouseData, CreateWarehouseErrors, CreateWarehouseResponses, DeactivateWarehouseData, DeactivateWarehouseErrors, DeactivateWarehouseResponses, DeleteProjectByIdDeprecatedData, DeleteProjectByIdDeprecatedErrors, DeleteProjectByIdDeprecatedResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteRoleData, DeleteRoleErrors, DeleteRoleResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWarehouseData, DeleteWarehouseErrors, DeleteWarehouseResponses, GetAuthorizerNamespaceActionsData, GetAuthorizerNamespaceActionsResponses, GetAuthorizerProjectActionsData, GetAuthorizerProjectActionsResponses, GetAuthorizerRoleActionsData, GetAuthorizerRoleActionsResponses, GetAuthorizerServerActionsData, GetAuthorizerServerActionsResponses, GetAuthorizerTableActionsData, GetAuthorizerTableActionsResponses, GetAuthorizerViewActionsData, GetAuthorizerViewActionsResponses, GetAuthorizerWarehouseActionsData, GetAuthorizerWarehouseActionsResponses, GetEndpointStatisticsData, GetEndpointStatisticsErrors, GetEndpointStatisticsResponses, GetNamespaceAccessByIdData, GetNamespaceAccessByIdResponses, GetNamespaceActionsData, GetNamespaceActionsErrors, GetNamespaceActionsResponses, GetNamespaceAssignmentsByIdData, GetNamespaceAssignmentsByIdResponses, GetNamespaceByIdData, GetNamespaceByIdResponses, GetNamespaceProtectionData, GetNamespaceProtectionErrors, GetNamespaceProtectionResponses, GetProjectAccessByIdData, GetProjectAccessByIdResponses, GetProjectAccessData, GetProjectAccessResponses, GetProjectActionsData, GetProjectActionsErrors, GetProjectActionsResponses, GetProjectAssignmentsByIdData, GetProjectAssignmentsByIdResponses, GetProjectAssignmentsData, GetProjectAssignmentsResponses, GetProjectByIdDeprecatedData, GetProjectByIdDeprecatedErrors, GetProjectByIdDeprecatedResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetRoleAccessByIdData, GetRoleAccessByIdResponses, GetRoleActionsData, GetRoleActionsErrors, GetRoleActionsResponses, GetRoleAssignmentsByIdData, GetRoleAssignmentsByIdResponses, GetRoleData, GetRoleErrors, GetRoleMetadataData, GetRoleMetadataErrors, GetRoleMetadataResponses, GetRoleResponses, GetServerAccessData, GetServerAccessResponses, GetServerActionsData, GetServerActionsErrors, GetServerActionsResponses, GetServerAssignmentsData, GetServerAssignmentsResponses, GetServerInfoData, GetServerInfoErrors, GetServerInfoResponses, GetTableAccessByIdData, GetTableAccessByIdResponses, GetTableActionsData, GetTableActionsErrors, GetTableActionsResponses, GetTableAssignmentsByIdData, GetTableAssignmentsByIdResponses, GetTableProtectionData, GetTableProtectionErrors, GetTableProtectionResponses, GetTaskDetailsData, GetTaskDetailsErrors, GetTaskDetailsResponses, GetTaskQueueConfigTabularExpirationData, GetTaskQueueConfigTabularExpirationErrors, GetTaskQueueConfigTabularExpirationResponses, GetTaskQueueConfigTabularPurgeData, GetTaskQueueConfigTabularPurgeErrors, GetTaskQueueConfigTabularPurgeResponses, GetUserActionsData, GetUserActionsErrors, GetUserActionsResponses, GetUserData, GetUserErrors, GetUserResponses, GetViewAccessByIdData, GetViewAccessByIdResponses, GetViewActionsData, GetViewActionsErrors, GetViewActionsResponses, GetViewAssignmentsByIdData, GetViewAssignmentsByIdResponses, GetViewProtectionData, GetViewProtectionErrors, GetViewProtectionResponses, GetWarehouseAccessByIdData, GetWarehouseAccessByIdResponses, GetWarehouseActionsData, GetWarehouseActionsErrors, GetWarehouseActionsResponses, GetWarehouseAssignmentsByIdData, GetWarehouseAssignmentsByIdResponses, GetWarehouseByIdData, GetWarehouseByIdResponses, GetWarehouseData, GetWarehouseErrors, GetWarehouseResponses, GetWarehouseStatisticsData, GetWarehouseStatisticsErrors, GetWarehouseStatisticsResponses, ListDeletedTabularsData, ListDeletedTabularsErrors, ListDeletedTabularsResponses, ListProjectsData, ListProjectsErrors, ListProjectsResponses, ListRolesData, ListRolesErrors, ListRolesResponses, ListTasksData, ListTasksErrors, ListTasksResponses, ListUserData, ListUserErrors, ListUserResponses, ListWarehousesData, ListWarehousesErrors, ListWarehousesResponses, RenameProjectByIdDeprecatedData, RenameProjectByIdDeprecatedErrors, RenameProjectByIdDeprecatedResponses, RenameProjectData, RenameProjectErrors, RenameProjectResponses, RenameWarehouseData, RenameWarehouseErrors, RenameWarehouseResponses, SearchRoleData, SearchRoleErrors, SearchRoleResponses, SearchTabularData, SearchTabularErrors, SearchTabularResponses, SearchUserData, SearchUserErrors, SearchUserResponses, SetNamespaceManagedAccessData, SetNamespaceManagedAccessResponses, SetNamespaceProtectionData, SetNamespaceProtectionErrors, SetNamespaceProtectionResponses, SetTableProtectionData, SetTableProtectionErrors, SetTableProtectionResponses, SetTaskQueueConfigTabularExpirationData, SetTaskQueueConfigTabularExpirationErrors, SetTaskQueueConfigTabularExpirationResponses, SetTaskQueueConfigTabularPurgeData, SetTaskQueueConfigTabularPurgeErrors, SetTaskQueueConfigTabularPurgeResponses, SetViewProtectionData, SetViewProtectionErrors, SetViewProtectionResponses, SetWarehouseManagedAccessData, SetWarehouseManagedAccessResponses, SetWarehouseProtectionData, SetWarehouseProtectionErrors, SetWarehouseProtectionResponses, UndropTabularsData, UndropTabularsErrors, UndropTabularsResponses, UpdateNamespaceAssignmentsByIdData, UpdateNamespaceAssignmentsByIdResponses, UpdateProjectAssignmentsByIdData, UpdateProjectAssignmentsByIdResponses, UpdateProjectAssignmentsData, UpdateProjectAssignmentsResponses, UpdateRoleAssignmentsByIdData, UpdateRoleAssignmentsByIdResponses, UpdateRoleData, UpdateRoleErrors, UpdateRoleResponses, UpdateRoleSourceSystemData, UpdateRoleSourceSystemErrors, UpdateRoleSourceSystemResponses, UpdateServerAssignmentsData, UpdateServerAssignmentsResponses, UpdateStorageCredentialData, UpdateStorageCredentialErrors, UpdateStorageCredentialResponses, UpdateStorageProfileData, UpdateStorageProfileErrors, UpdateStorageProfileResponses, UpdateTableAssignmentsByIdData, UpdateTableAssignmentsByIdResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateViewAssignmentsByIdData, UpdateViewAssignmentsByIdResponses, UpdateWarehouseAssignmentsByIdData, UpdateWarehouseAssignmentsByIdResponses, UpdateWarehouseDeleteProfileData, UpdateWarehouseDeleteProfileErrors, UpdateWarehouseDeleteProfileResponses, WhoamiData, WhoamiErrors, WhoamiResponses } from './types.gen'; +import type { ActivateWarehouseData, ActivateWarehouseErrors, ActivateWarehouseResponses, BatchCheckActionsData, BatchCheckActionsErrors, BatchCheckActionsResponses, BootstrapData, BootstrapErrors, BootstrapResponses, CheckData, CheckResponses, ControlProjectTasksData, ControlProjectTasksErrors, ControlProjectTasksResponses, ControlTasksData, ControlTasksErrors, ControlTasksResponses, CreateProjectData, CreateProjectErrors, CreateProjectResponses, CreateRoleData, CreateRoleErrors, CreateRoleResponses, CreateUserData, CreateUserErrors, CreateUserResponses, CreateWarehouseData, CreateWarehouseErrors, CreateWarehouseResponses, DeactivateWarehouseData, DeactivateWarehouseErrors, DeactivateWarehouseResponses, DeleteProjectByIdDeprecatedData, DeleteProjectByIdDeprecatedErrors, DeleteProjectByIdDeprecatedResponses, DeleteProjectData, DeleteProjectErrors, DeleteProjectResponses, DeleteRoleData, DeleteRoleErrors, DeleteRoleResponses, DeleteUserData, DeleteUserErrors, DeleteUserResponses, DeleteWarehouseData, DeleteWarehouseErrors, DeleteWarehouseResponses, GetAuthorizerNamespaceActionsData, GetAuthorizerNamespaceActionsResponses, GetAuthorizerProjectActionsData, GetAuthorizerProjectActionsResponses, GetAuthorizerRoleActionsData, GetAuthorizerRoleActionsResponses, GetAuthorizerServerActionsData, GetAuthorizerServerActionsResponses, GetAuthorizerTableActionsData, GetAuthorizerTableActionsResponses, GetAuthorizerViewActionsData, GetAuthorizerViewActionsResponses, GetAuthorizerWarehouseActionsData, GetAuthorizerWarehouseActionsResponses, GetEndpointStatisticsData, GetEndpointStatisticsErrors, GetEndpointStatisticsResponses, GetNamespaceAccessByIdData, GetNamespaceAccessByIdResponses, GetNamespaceActionsData, GetNamespaceActionsErrors, GetNamespaceActionsResponses, GetNamespaceAssignmentsByIdData, GetNamespaceAssignmentsByIdResponses, GetNamespaceByIdData, GetNamespaceByIdResponses, GetNamespaceProtectionData, GetNamespaceProtectionErrors, GetNamespaceProtectionResponses, GetProjectAccessByIdData, GetProjectAccessByIdResponses, GetProjectAccessData, GetProjectAccessResponses, GetProjectActionsData, GetProjectActionsErrors, GetProjectActionsResponses, GetProjectAssignmentsByIdData, GetProjectAssignmentsByIdResponses, GetProjectAssignmentsData, GetProjectAssignmentsResponses, GetProjectByIdDeprecatedData, GetProjectByIdDeprecatedErrors, GetProjectByIdDeprecatedResponses, GetProjectData, GetProjectErrors, GetProjectResponses, GetProjectTaskDetailsData, GetProjectTaskDetailsErrors, GetProjectTaskDetailsResponses, GetRoleAccessByIdData, GetRoleAccessByIdResponses, GetRoleActionsData, GetRoleActionsErrors, GetRoleActionsResponses, GetRoleAssignmentsByIdData, GetRoleAssignmentsByIdResponses, GetRoleData, GetRoleErrors, GetRoleMetadataData, GetRoleMetadataErrors, GetRoleMetadataResponses, GetRoleResponses, GetServerAccessData, GetServerAccessResponses, GetServerActionsData, GetServerActionsErrors, GetServerActionsResponses, GetServerAssignmentsData, GetServerAssignmentsResponses, GetServerInfoData, GetServerInfoErrors, GetServerInfoResponses, GetTableAccessByIdData, GetTableAccessByIdResponses, GetTableActionsData, GetTableActionsErrors, GetTableActionsResponses, GetTableAssignmentsByIdData, GetTableAssignmentsByIdResponses, GetTableProtectionData, GetTableProtectionErrors, GetTableProtectionResponses, GetTaskDetailsData, GetTaskDetailsErrors, GetTaskDetailsResponses, GetTaskQueueConfigTabularExpirationData, GetTaskQueueConfigTabularExpirationErrors, GetTaskQueueConfigTabularExpirationResponses, GetTaskQueueConfigTabularPurgeData, GetTaskQueueConfigTabularPurgeErrors, GetTaskQueueConfigTabularPurgeResponses, GetUserActionsData, GetUserActionsErrors, GetUserActionsResponses, GetUserData, GetUserErrors, GetUserResponses, GetViewAccessByIdData, GetViewAccessByIdResponses, GetViewActionsData, GetViewActionsErrors, GetViewActionsResponses, GetViewAssignmentsByIdData, GetViewAssignmentsByIdResponses, GetViewProtectionData, GetViewProtectionErrors, GetViewProtectionResponses, GetWarehouseAccessByIdData, GetWarehouseAccessByIdResponses, GetWarehouseActionsData, GetWarehouseActionsErrors, GetWarehouseActionsResponses, GetWarehouseAssignmentsByIdData, GetWarehouseAssignmentsByIdResponses, GetWarehouseByIdData, GetWarehouseByIdResponses, GetWarehouseData, GetWarehouseErrors, GetWarehouseResponses, GetWarehouseStatisticsData, GetWarehouseStatisticsErrors, GetWarehouseStatisticsResponses, ListDeletedTabularsData, ListDeletedTabularsErrors, ListDeletedTabularsResponses, ListProjectsData, ListProjectsErrors, ListProjectsResponses, ListProjectTasksData, ListProjectTasksErrors, ListProjectTasksResponses, ListRolesData, ListRolesErrors, ListRolesResponses, ListTasksData, ListTasksErrors, ListTasksResponses, ListUserData, ListUserErrors, ListUserResponses, ListWarehousesData, ListWarehousesErrors, ListWarehousesResponses, RenameProjectByIdDeprecatedData, RenameProjectByIdDeprecatedErrors, RenameProjectByIdDeprecatedResponses, RenameProjectData, RenameProjectErrors, RenameProjectResponses, RenameWarehouseData, RenameWarehouseErrors, RenameWarehouseResponses, SearchRoleData, SearchRoleErrors, SearchRoleResponses, SearchTabularData, SearchTabularErrors, SearchTabularResponses, SearchUserData, SearchUserErrors, SearchUserResponses, SetNamespaceManagedAccessData, SetNamespaceManagedAccessResponses, SetNamespaceProtectionData, SetNamespaceProtectionErrors, SetNamespaceProtectionResponses, SetTableProtectionData, SetTableProtectionErrors, SetTableProtectionResponses, SetTaskQueueConfigTabularExpirationData, SetTaskQueueConfigTabularExpirationErrors, SetTaskQueueConfigTabularExpirationResponses, SetTaskQueueConfigTabularPurgeData, SetTaskQueueConfigTabularPurgeErrors, SetTaskQueueConfigTabularPurgeResponses, SetViewProtectionData, SetViewProtectionErrors, SetViewProtectionResponses, SetWarehouseManagedAccessData, SetWarehouseManagedAccessResponses, SetWarehouseProtectionData, SetWarehouseProtectionErrors, SetWarehouseProtectionResponses, UndropTabularsData, UndropTabularsErrors, UndropTabularsResponses, UpdateNamespaceAssignmentsByIdData, UpdateNamespaceAssignmentsByIdResponses, UpdateProjectAssignmentsByIdData, UpdateProjectAssignmentsByIdResponses, UpdateProjectAssignmentsData, UpdateProjectAssignmentsResponses, UpdateRoleAssignmentsByIdData, UpdateRoleAssignmentsByIdResponses, UpdateRoleData, UpdateRoleErrors, UpdateRoleResponses, UpdateRoleSourceSystemData, UpdateRoleSourceSystemErrors, UpdateRoleSourceSystemResponses, UpdateServerAssignmentsData, UpdateServerAssignmentsResponses, UpdateStorageCredentialData, UpdateStorageCredentialErrors, UpdateStorageCredentialResponses, UpdateStorageProfileData, UpdateStorageProfileErrors, UpdateStorageProfileResponses, UpdateTableAssignmentsByIdData, UpdateTableAssignmentsByIdResponses, UpdateUserData, UpdateUserErrors, UpdateUserResponses, UpdateViewAssignmentsByIdData, UpdateViewAssignmentsByIdResponses, UpdateWarehouseAssignmentsByIdData, UpdateWarehouseAssignmentsByIdResponses, UpdateWarehouseDeleteProfileData, UpdateWarehouseDeleteProfileErrors, UpdateWarehouseDeleteProfileResponses, WhoamiData, WhoamiErrors, WhoamiResponses } from './types.gen'; export type Options = Options2 & { /** @@ -940,6 +940,64 @@ export const renameProject = (options: Opt }); }; +/** + * Get Details about a specific Project-level task by its ID. + */ +export const getProjectTaskDetails = (options: Options) => { + return (options.client ?? client).get({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/management/v1/project/task/by-id/{task_id}', + ...options + }); +}; + +/** + * Control a set of Project-level tasks by their IDs (e.g., cancel, request stop, run now) + * + * Accepts at most 100 task IDs in one request. + */ +export const controlProjectTasks = (options: Options) => { + return (options.client ?? client).post({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/management/v1/project/task/control', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } + }); +}; + +/** + * List active and historic Project-level tasks. + */ +export const listProjectTasks = (options: Options) => { + return (options.client ?? client).post({ + security: [ + { + scheme: 'bearer', + type: 'http' + } + ], + url: '/management/v1/project/task/list', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } + }); +}; + /** * Delete Project by ID * diff --git a/src/gen/management/types.gen.ts b/src/gen/management/types.gen.ts index f16c642..9e26d1c 100644 --- a/src/gen/management/types.gen.ts +++ b/src/gen/management/types.gen.ts @@ -617,6 +617,25 @@ export type GetProjectResponse = { 'project-name': string; }; +export type GetProjectTaskDetailsResponse = ProjectTaskInfo & { + /** + * History of past attempts + */ + attempts: Array; + /** + * Execution details for the current attempt + */ + 'execution-details'?: { + [key: string]: unknown; + } | null; + /** + * Task-specific data + */ + 'task-data': { + [key: string]: unknown; + }; +}; + export type GetPurgeQueueConfig = { 'max-seconds-since-last-heartbeat'?: number | null; 'queue-config': PurgeQueueConfig; @@ -651,7 +670,7 @@ export type GetTabularExpirationQueueConfig = { 'queue-config': TabularExpirationQueueConfig; }; -export type GetTaskDetailsResponse = Task & { +export type GetTaskDetailsResponse = WarehouseTaskInfo & { /** * History of past attempts */ @@ -797,6 +816,14 @@ export type LakekeeperProjectAction = { action: 'search_roles'; } | { action: 'get_endpoint_statistics'; +} | { + action: 'modify_task_queue_config'; +} | { + action: 'get_task_queue_config'; +} | { + action: 'get_project_tasks'; +} | { + action: 'control_project_tasks'; }; export type LakekeeperRoleAction = { @@ -977,6 +1004,46 @@ export type ListDeletedTabularsResponse = { tabulars: Array; }; +export type ListProjectTasksRequest = { + /** + * Filter tasks created after this timestamp + */ + 'created-after'?: string | null; + /** + * Filter tasks created before this timestamp + */ + 'created-before'?: string | null; + /** + * Number of results per page + */ + 'page-size'?: number | null; + /** + * Next page token, re-use the same request as for the original request, + * but set this to the `next_page_token` from the previous response. + * Stop iterating when no more items are returned in a page. + */ + 'page-token'?: string | null; + /** + * Filter by one or more queue names + */ + 'queue-name'?: Array | null; + /** + * Filter by task status + */ + status?: Array | null; +}; + +export type ListProjectTasksResponse = { + /** + * Token for the next page of results + */ + 'next-page-token'?: string | null; + /** + * List of tasks + */ + tasks: Array; +}; + export type ListProjectsResponse = { /** * List of projects @@ -1001,7 +1068,7 @@ export type ListTasksRequest = { /** * Filter by specific entity */ - entities?: Array | null; + entities?: Array | null; /** * Number of results per page */ @@ -1030,7 +1097,7 @@ export type ListTasksResponse = { /** * List of tasks */ - tasks: Array; + tasks: Array; }; export type ListUsersResponse = { @@ -1112,6 +1179,57 @@ export type ProjectAssignment = (UserOrRole & { export type ProjectRelation = 'project_admin' | 'security_admin' | 'data_admin' | 'role_creator' | 'describe' | 'select' | 'create' | 'modify'; +export type ProjectTaskInfo = { + /** + * Current attempt number + */ + attempt: number; + /** + * When this task attempt was created + */ + 'created-at': string; + /** + * Last heartbeat timestamp for running tasks + */ + 'last-heartbeat-at'?: string | null; + /** + * Parent task ID if this is a sub-task + */ + 'parent-task-id'?: string | null; + /** + * When the latest attempt of the task was picked up for processing by a worker. + */ + 'picked-up-at'?: string | null; + /** + * Progress of the task (0.0 to 1.0) + */ + progress: number; + /** + * Project ID associated with the task + */ + 'project-id': string; + /** + * Name of the queue processing this task + */ + 'queue-name': string; + /** + * When the latest attempt of the task is scheduled for + */ + 'scheduled-for': string; + /** + * Current status of the task + */ + status: TaskStatus; + /** + * Unique identifier for the task + */ + 'task-id': string; + /** + * When the task was last updated + */ + 'updated-at'?: string | null; +}; + export type ProtectionResponse = { /** * Indicates whether the entity is protected @@ -1618,65 +1736,6 @@ export type TabularIdentUuid = { */ export type TabularType = 'table' | 'view'; -export type Task = { - /** - * Current attempt number - */ - attempt: number; - /** - * When this task attempt was created - */ - 'created-at': string; - /** - * Type of entity this task operates on - */ - entity: TaskEntity; - /** - * Name of the entity this task operates on - */ - 'entity-name': Array; - /** - * Last heartbeat timestamp for running tasks - */ - 'last-heartbeat-at'?: string | null; - /** - * Parent task ID if this is a sub-task - */ - 'parent-task-id'?: string | null; - /** - * When the latest attempt of the task was picked up for processing by a worker. - */ - 'picked-up-at'?: string | null; - /** - * Progress of the task (0.0 to 1.0) - */ - progress: number; - /** - * Name of the queue processing this task - */ - 'queue-name': string; - /** - * When the latest attempt of the task is scheduled for - */ - 'scheduled-for': string; - /** - * Current status of the task - */ - status: TaskStatus; - /** - * Unique identifier for the task - */ - 'task-id': string; - /** - * When the task was last updated - */ - 'updated-at'?: string | null; - /** - * Warehouse ID associated with the task - */ - 'warehouse-id': string; -}; - export type TaskAttempt = { /** * Attempt number @@ -1718,14 +1777,6 @@ export type TaskAttempt = { status: TaskStatus; }; -export type TaskEntity = { - 'table-id': string; - type: 'table'; -} | { - type: 'view'; - 'view-id': string; -}; - export type TaskStatus = 'RUNNING' | 'SCHEDULED' | 'STOPPING' | 'CANCELLED' | 'SUCCESS' | 'FAILED'; export type TimeWindowSelector = { @@ -1984,6 +2035,84 @@ export type WarehouseStatisticsResponse = { */ export type WarehouseStatus = 'active' | 'inactive'; +export type WarehouseTaskEntityFilter = { + 'table-id': string; + type: 'table'; +} | { + type: 'view'; + 'view-id': string; +} | { + type: 'warehouse'; +}; + +export type WarehouseTaskEntityId = { + 'table-id': string; + type: 'table'; +} | { + type: 'view'; + 'view-id': string; +}; + +export type WarehouseTaskInfo = { + /** + * Current attempt number + */ + attempt: number; + /** + * When this task attempt was created + */ + 'created-at': string; + entity?: null | WarehouseTaskEntityId; + /** + * Name of the entity this task operates on. None if this is a warehouse-level task. + */ + 'entity-name'?: Array | null; + /** + * Last heartbeat timestamp for running tasks + */ + 'last-heartbeat-at'?: string | null; + /** + * Parent task ID if this is a sub-task + */ + 'parent-task-id'?: string | null; + /** + * When the latest attempt of the task was picked up for processing by a worker. + */ + 'picked-up-at'?: string | null; + /** + * Progress of the task (0.0 to 1.0) + */ + progress: number; + /** + * Project ID associated with the task + */ + 'project-id': string; + /** + * Name of the queue processing this task + */ + 'queue-name': string; + /** + * When the latest attempt of the task is scheduled for + */ + 'scheduled-for': string; + /** + * Current status of the task + */ + status: TaskStatus; + /** + * Unique identifier for the task + */ + 'task-id': string; + /** + * When the task was last updated + */ + 'updated-at'?: string | null; + /** + * Warehouse ID associated with the task + */ + 'warehouse-id': string; +}; + export type BatchCheckActionsData = { body: CatalogActionsBatchCheckRequest; path?: never; @@ -3130,6 +3259,91 @@ export type RenameProjectResponses = { 200: unknown; }; +export type GetProjectTaskDetailsData = { + body?: never; + headers?: { + /** + * Project ID (optional; falls back to the default project if not provided) + */ + 'x-project-id'?: string | null; + }; + path: { + task_id: string; + }; + query?: { + /** + * Number of attempts to retrieve (default: 5) + */ + numAttempts?: number | null; + }; + url: '/management/v1/project/task/by-id/{task_id}'; +}; + +export type GetProjectTaskDetailsErrors = { + '4XX': IcebergErrorResponse; +}; + +export type GetProjectTaskDetailsError = GetProjectTaskDetailsErrors[keyof GetProjectTaskDetailsErrors]; + +export type GetProjectTaskDetailsResponses = { + 200: GetProjectTaskDetailsResponse; +}; + +export type GetProjectTaskDetailsResponse2 = GetProjectTaskDetailsResponses[keyof GetProjectTaskDetailsResponses]; + +export type ControlProjectTasksData = { + body: ControlTasksRequest; + headers?: { + /** + * Project ID (optional; falls back to the default project if not provided) + */ + 'x-project-id'?: string | null; + }; + path?: never; + query?: never; + url: '/management/v1/project/task/control'; +}; + +export type ControlProjectTasksErrors = { + '4XX': IcebergErrorResponse; +}; + +export type ControlProjectTasksError = ControlProjectTasksErrors[keyof ControlProjectTasksErrors]; + +export type ControlProjectTasksResponses = { + /** + * All requested actions were successful + */ + 204: void; +}; + +export type ControlProjectTasksResponse = ControlProjectTasksResponses[keyof ControlProjectTasksResponses]; + +export type ListProjectTasksData = { + body: ListProjectTasksRequest; + headers?: { + /** + * Project ID (optional; falls back to the default project if not provided) + */ + 'x-project-id'?: string | null; + }; + path?: never; + query?: never; + url: '/management/v1/project/task/list'; +}; + +export type ListProjectTasksErrors = { + '4XX': IcebergErrorResponse; +}; + +export type ListProjectTasksError = ListProjectTasksErrors[keyof ListProjectTasksErrors]; + +export type ListProjectTasksResponses = { + 200: ListProjectTasksResponse; +}; + +export type ListProjectTasksResponse2 = ListProjectTasksResponses[keyof ListProjectTasksResponses]; + export type DeleteProjectByIdDeprecatedData = { body?: never; path: { From 806774f64dbfddc06a9c92fcf839a0de94614548 Mon Sep 17 00:00:00 2001 From: Vitkor Kessler Date: Tue, 30 Dec 2025 09:28:07 +0100 Subject: [PATCH 2/4] init --- src/components/ProjectManager.vue | 6 + src/components/ProjectTaskManager.vue | 870 ++++++++++++++++++++++++++ src/components/TaskManager.vue | 2 +- src/index.ts | 3 +- src/plugins/functions.ts | 92 +++ 5 files changed, 971 insertions(+), 2 deletions(-) create mode 100644 src/components/ProjectTaskManager.vue diff --git a/src/components/ProjectManager.vue b/src/components/ProjectManager.vue index 015ff28..7f50b2d 100644 --- a/src/components/ProjectManager.vue +++ b/src/components/ProjectManager.vue @@ -25,6 +25,7 @@ Permissions + Tasks Statistics @@ -120,6 +121,10 @@ :relation-type="permissionType" /> + + + + @@ -144,6 +149,7 @@ import { } from '../gen/management/types.gen'; import { Header, RelationType } from '../common/interfaces'; import { useRouter } from 'vue-router'; +import ProjectTaskManager from './ProjectTaskManager.vue'; const dialog = ref(false); const tab = ref('overview'); diff --git a/src/components/ProjectTaskManager.vue b/src/components/ProjectTaskManager.vue new file mode 100644 index 0000000..a941a19 --- /dev/null +++ b/src/components/ProjectTaskManager.vue @@ -0,0 +1,870 @@ + + + diff --git a/src/components/TaskManager.vue b/src/components/TaskManager.vue index 1619404..ee12b35 100644 --- a/src/components/TaskManager.vue +++ b/src/components/TaskManager.vue @@ -441,7 +441,7 @@ import { reactive, ref, onMounted, computed, inject } from 'vue'; import TaskDetails from './TaskDetails.vue'; import { getStatusColor, formatDateTime } from '../common/taskUtils'; import type { - Task, + WarehouseTaskInfo as Task, TaskStatus, ListTasksRequest, ListTasksResponse, diff --git a/src/index.ts b/src/index.ts index 2d8e143..11026dd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -204,7 +204,8 @@ export type { Role, User, ServerInfo, - Task, + WarehouseTaskInfo, + ProjectTaskInfo, TaskStatus, } from './gen/management/types.gen'; diff --git a/src/plugins/functions.ts b/src/plugins/functions.ts index 80b8a4c..2cf2d85 100644 --- a/src/plugins/functions.ts +++ b/src/plugins/functions.ts @@ -12,6 +12,9 @@ import { GetTaskDetailsResponse, ControlTasksRequest, ControlTaskAction, + ListProjectTasksRequest, + ListProjectTasksResponse, + GetProjectTaskDetailsResponse, } from '@/gen/management/types.gen'; import { Type } from '@/common/enums'; import * as ice from '@/gen/iceberg/sdk.gen'; @@ -2833,6 +2836,91 @@ async function listTasks( } } +// Project Task Functions +async function listProjectTasks( + request: ListProjectTasksRequest, +): Promise { + try { + init(); + + const client = mngClient.client; + const { data, error } = await mng.listProjectTasks({ + client, + body: request, + }); + if (error) throw error; + return data as ListProjectTasksResponse; + } catch (error: any) { + handleError(error, 'listProjectTasks'); + throw error; + } +} + +async function getProjectTaskDetails(taskId: string): Promise { + try { + init(); + + const client = mngClient.client; + const { data, error } = await mng.getProjectTaskDetails({ + client, + path: { task_id: taskId }, + }); + if (error) throw error; + return data as GetProjectTaskDetailsResponse; + } catch (error: any) { + handleError(error, 'getProjectTaskDetails'); + throw error; + } +} + +async function controlProjectTasks( + action: ControlTaskAction, + taskIds: string[], + notify?: boolean, +): Promise { + try { + init(); + + const client = mngClient.client; + const body: ControlTasksRequest = { + action, + 'task-ids': taskIds, + }; + const { error } = await mng.controlProjectTasks({ + client, + body, + }); + if (error) throw error; + + if (notify) { + const actionText = action['action-type']; + const taskText = taskIds.length === 1 ? `Task ${taskIds[0]}` : `${taskIds.length} tasks`; + let message = ''; + + switch (actionText) { + case 'stop': + message = `${taskText} stop requested`; + break; + case 'cancel': + message = `${taskText} cancelled`; + break; + case 'run-now': + message = `${taskText} scheduled to run now`; + break; + default: + message = `${taskText} ${actionText} completed`; + } + + handleSuccess('controlProjectTasks', message, notify); + } + + return true; + } catch (error: any) { + handleError(error, 'controlProjectTasks'); + throw error; + } +} + // Authorizer Actions - OpenFGA relations for permission delegation // These work with ALL authorization backends (allow-all, openfga, future backends) @@ -3643,6 +3731,10 @@ export function useFunctions(config?: any) { getTaskDetails, controlTasks, listTasks, + // Project task functions + listProjectTasks, + getProjectTaskDetails, + controlProjectTasks, getNewToken, handleError, }; From 6e47c1540f240e4f218e9aa8533629cd41030dd7 Mon Sep 17 00:00:00 2001 From: Vitkor Kessler Date: Tue, 30 Dec 2025 09:35:49 +0100 Subject: [PATCH 3/4] fix load pr tasks --- src/components/ProjectManager.vue | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/components/ProjectManager.vue b/src/components/ProjectManager.vue index 7f50b2d..4f47290 100644 --- a/src/components/ProjectManager.vue +++ b/src/components/ProjectManager.vue @@ -25,7 +25,9 @@ Permissions - Tasks + + Tasks + Statistics @@ -122,7 +124,10 @@ - + @@ -154,6 +159,7 @@ import ProjectTaskManager from './ProjectTaskManager.vue'; const dialog = ref(false); const tab = ref('overview'); const userStorage = useUserStore(); +const projectTaskManagerRef = ref | null>(null); const visual = useVisualStore(); const functions = useFunctions(); @@ -218,6 +224,13 @@ async function init() { } } +async function loadProjectTasks() { + // Refresh tasks when tab is clicked + if (projectTaskManagerRef.value) { + await projectTaskManagerRef.value.refreshTasks(); + } +} + async function getEndpointStatistcs() { // Only load if not already loaded if (loadedStatistics.value && statistics['called-endpoints'].length > 0) { From 171b8210404c8ec8f55782d9d51541b67c7c2354 Mon Sep 17 00:00:00 2001 From: Vitkor Kessler Date: Tue, 30 Dec 2025 13:15:56 +0100 Subject: [PATCH 4/4] add 'gcs' --- src/composables/useStorageValidation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/composables/useStorageValidation.ts b/src/composables/useStorageValidation.ts index 0fa8c8e..f0fd215 100644 --- a/src/composables/useStorageValidation.ts +++ b/src/composables/useStorageValidation.ts @@ -14,7 +14,7 @@ export function useStorageValidation( catalogUrl: Ref, ) { // List of supported storage types for DuckDB WASM - const supportedStorageTypes = ['s3']; //, 'gcs' + const supportedStorageTypes = ['s3', 'gcs']; //, 'gcs' // List of supported protocols for DuckDB WASM const supportedProtocols = ['https:', 'http:']; // 'http:' disabled since duckdb is not supporting it well