This is an automated email from the ASF dual-hosted git repository.
yufei pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new 4f7cf97e Use upstream 1.7.1 rest-catalog-open-api.yaml instead. (#936)
4f7cf97e is described below
commit 4f7cf97e26c1c0053ac19924509a387134f20a1b
Author: Honah (Jonas) J. <[email protected]>
AuthorDate: Wed Feb 26 12:48:14 2025 -0600
Use upstream 1.7.1 rest-catalog-open-api.yaml instead. (#936)
---
LICENSE | 3 +-
regtests/README.md | 2 +-
...api.yaml => iceberg-rest-catalog-open-api.yaml} | 784 ++++++++++++++++-----
spec/polaris-catalog-apis/notifications-api.yaml | 26 +-
spec/polaris-catalog-apis/oauth-tokens-api.yaml | 282 ++++++++
spec/polaris-catalog-service.yaml | 49 +-
6 files changed, 926 insertions(+), 220 deletions(-)
diff --git a/LICENSE b/LICENSE
index 9d52f8ad..e9c023b3 100644
--- a/LICENSE
+++ b/LICENSE
@@ -215,7 +215,8 @@ License: https://www.apache.org/licenses/LICENSE-2.0
This product includes code from Apache Iceberg.
-* spec/rest-catalog-open-api.yaml
+* spec/iceberg-rest-catalog-open-api.yaml
+* spec/polaris-catalog-apis/oauth-tokens-api.yaml
*
integration-tests/src/main/java/org/apache/polaris/service/it/test/PolarisRestCatalogIntegrationTest.java
Copyright: Copyright 2017-2025 The Apache Software Foundation
diff --git a/regtests/README.md b/regtests/README.md
index 4c2d5c55..1fb1bbcd 100644
--- a/regtests/README.md
+++ b/regtests/README.md
@@ -186,7 +186,7 @@ docker run --rm \
# generate the iceberg rest client
docker run --rm \
-v ${PWD}:/local openapitools/openapi-generator-cli generate \
- -i /local/spec/rest-catalog-open-api.yaml \
+ -i /local/spec/polaris-catalog-service.yaml \
-g python \
-o /local/regtests/client/python
--additional-properties=packageName=polaris.catalog
--additional-properties=apiNameSuffix=""
--additional-properties=apiNamePrefix=Iceberg
```
diff --git a/spec/rest-catalog-open-api.yaml
b/spec/iceberg-rest-catalog-open-api.yaml
similarity index 87%
rename from spec/rest-catalog-open-api.yaml
rename to spec/iceberg-rest-catalog-open-api.yaml
index cfcd4987..b4adb6be 100644
--- a/spec/rest-catalog-open-api.yaml
+++ b/spec/iceberg-rest-catalog-open-api.yaml
@@ -17,6 +17,10 @@
# under the License.
#
+# CODE_COPIED_TO_POLARIS
+
+# Apache Iceberg Version: 1.7.1
+
---
openapi: 3.0.3
info:
@@ -221,12 +225,6 @@ paths:
Clients may also use the token exchange flow to refresh a token that
is about to expire by
sending a token exchange request (3). The request's "subject" token
should be the expiring
token. This request should use the subject token in the
"Authorization" header.
- parameters:
- - name: Authorization
- in: header
- schema:
- type: string
- required: false
requestBody:
required: true
content:
@@ -242,8 +240,6 @@ paths:
$ref: '#/components/responses/OAuthErrorResponse'
5XX:
$ref: '#/components/responses/OAuthErrorResponse'
- security:
- - BearerAuth: []
/v1/{prefix}/namespaces:
parameters:
@@ -601,6 +597,261 @@ paths:
5XX:
$ref: '#/components/responses/ServerErrorResponse'
+ /v1/{prefix}/namespaces/{namespace}/tables/{table}/plan:
+ parameters:
+ - $ref: '#/components/parameters/prefix'
+ - $ref: '#/components/parameters/namespace'
+ - $ref: '#/components/parameters/table'
+ post:
+ tags:
+ - Catalog API
+ summary: Submit a scan for planning
+ description: >
+ Submits a scan for server-side planning.
+
+
+ Point-in-time scans are planned by passing snapshot-id to identify the
+ table snapshot to scan. Incremental scans are planned by passing both
+ start-snapshot-id and end-snapshot-id. Requests that include both point
+ in time config properties and incremental config properties are
+ invalid. If the request does not include either incremental or
+ point-in-time config properties, scan planning should produce a
+ point-in-time scan of the latest snapshot in the table's main branch.
+
+
+ Responses must include a valid status listed below. A "cancelled"
status is considered invalid for this endpoint.
+
+ - When "completed" the planning operation has produced plan tasks and
+ file scan tasks that must be returned in the response (not fetched
+ later by calling fetchPlanningResult)
+
+ - When "submitted" the response must include a plan-id used to poll
+ fetchPlanningResult to fetch the planning result when it is ready
+
+ - When "failed" the response must be a valid error response
+
+ The response for a "completed" planning operation includes two types of
+ tasks (file scan tasks and plan tasks) and both may be included in the
+ response. Tasks must not be included for any other response status.
+
+
+ Responses that include a plan-id indicate that the service is holding
+ state or performing work for the client.
+
+
+ - Clients should use the plan-id to fetch results from
+ fetchPlanningResult when the response status is "submitted"
+
+ - Clients should inform the service if planning results are no longer
+ needed by calling cancelPlanning. Cancellation is not necessary after
+ fetchScanTasks has been used to fetch scan tasks for each plan task.
+ operationId: planTableScan
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlanTableScanRequest'
+ responses:
+ 200:
+ $ref: '#/components/responses/PlanTableScanResponse'
+ 400:
+ $ref: '#/components/responses/BadRequestErrorResponse'
+ 401:
+ $ref: '#/components/responses/UnauthorizedResponse'
+ 403:
+ $ref: '#/components/responses/ForbiddenResponse'
+ 404:
+ description:
+ Not Found
+ - NoSuchTableException, the table does not exist
+ - NoSuchNamespaceException, the namespace does not exist
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/IcebergErrorResponse'
+ examples:
+ TableDoesNotExist:
+ $ref: '#/components/examples/NoSuchTableError'
+ NamespaceDoesNotExist:
+ $ref: '#/components/examples/NoSuchNamespaceError'
+ 406:
+ $ref: '#/components/responses/UnsupportedOperationResponse'
+ 419:
+ $ref: '#/components/responses/AuthenticationTimeoutResponse'
+ 503:
+ $ref: '#/components/responses/ServiceUnavailableResponse'
+ 5XX:
+ $ref: '#/components/responses/ServerErrorResponse'
+
+ /v1/{prefix}/namespaces/{namespace}/tables/{table}/plan/{plan-id}:
+ parameters:
+ - $ref: '#/components/parameters/prefix'
+ - $ref: '#/components/parameters/namespace'
+ - $ref: '#/components/parameters/table'
+ - $ref: '#/components/parameters/plan-id'
+
+ get:
+ tags:
+ - Catalog API
+ summary: Fetches the result of scan planning for a plan-id
+ operationId: fetchPlanningResult
+ description: >
+ Fetches the result of scan planning for a plan-id.
+
+
+ Responses must include a valid status
+
+ - When "completed" the planning operation has produced plan-tasks and
+ file-scan-tasks that must be returned in the response
+
+ - When "submitted" the planning operation has not completed; the client
+ should wait to call this endpoint again to fetch a completed response
+
+ - When "failed" the response must be a valid error response
+
+ - When "cancelled" the plan-id is invalid and should be discarded
+
+
+ The response for a "completed" planning operation includes two types of
+ tasks (file scan tasks and plan tasks) and both may be included in the
+ response. Tasks must not be included for any other response status.
+ responses:
+ 200:
+ $ref: '#/components/responses/FetchPlanningResultResponse'
+ 400:
+ $ref: '#/components/responses/BadRequestErrorResponse'
+ 401:
+ $ref: '#/components/responses/UnauthorizedResponse'
+ 403:
+ $ref: '#/components/responses/ForbiddenResponse'
+ 404:
+ description:
+ Not Found
+ - NoSuchPlanIdException, the plan-id does not exist
+ - NoSuchTableException, the table does not exist
+ - NoSuchNamespaceException, the namespace does not exist
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/IcebergErrorResponse'
+ examples:
+ PlanIdDoesNotExist:
+ $ref: '#/components/examples/NoSuchPlanIdError'
+ TableDoesNotExist:
+ $ref: '#/components/examples/NoSuchTableError'
+ NamespaceDoesNotExist:
+ $ref: '#/components/examples/NoSuchNamespaceError'
+ 419:
+ $ref: '#/components/responses/AuthenticationTimeoutResponse'
+ 503:
+ $ref: '#/components/responses/ServiceUnavailableResponse'
+ 5XX:
+ $ref: '#/components/responses/ServerErrorResponse'
+
+ delete:
+ tags:
+ - Catalog API
+ summary: Cancels scan planning for a plan-id
+ operationId: cancelPlanning
+ description: >
+ Cancels scan planning for a plan-id.
+
+
+ This notifies the service that it can release resources held for the
+ scan. Clients should cancel scans that are no longer needed, either
+ while the plan-id returns a "submitted" status or while there are
+ remaining plan tasks that have not been fetched.
+
+
+ Cancellation is not necessary when
+
+ - Scan tasks for each plan task have been fetched using fetchScanTasks
+
+ - A plan-id has produced a "failed" or "cancelled" status from
+ planTableScan or fetchPlanningResult
+ responses:
+ 204:
+ description: Success, no content
+ 400:
+ $ref: '#/components/responses/BadRequestErrorResponse'
+ 401:
+ $ref: '#/components/responses/UnauthorizedResponse'
+ 403:
+ $ref: '#/components/responses/ForbiddenResponse'
+ 404:
+ description:
+ Not Found
+ - NoSuchTableException, the table does not exist
+ - NoSuchNamespaceException, the namespace does not exist
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/IcebergErrorResponse'
+ examples:
+ TableDoesNotExist:
+ $ref: '#/components/examples/NoSuchTableError'
+ NamespaceDoesNotExist:
+ $ref: '#/components/examples/NoSuchNamespaceError'
+ 419:
+ $ref: '#/components/responses/AuthenticationTimeoutResponse'
+ 503:
+ $ref: '#/components/responses/ServiceUnavailableResponse'
+ 5XX:
+ $ref: '#/components/responses/ServerErrorResponse'
+
+
+ /v1/{prefix}/namespaces/{namespace}/tables/{table}/tasks:
+ parameters:
+ - $ref: '#/components/parameters/prefix'
+ - $ref: '#/components/parameters/namespace'
+ - $ref: '#/components/parameters/table'
+
+ post:
+ tags:
+ - Catalog API
+ summary: Fetches result tasks for a plan task
+ operationId: fetchScanTasks
+ description: Fetches result tasks for a plan task.
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FetchScanTasksRequest'
+ responses:
+ 200:
+ $ref: '#/components/responses/FetchScanTasksResponse'
+ 400:
+ $ref: '#/components/responses/BadRequestErrorResponse'
+ 401:
+ $ref: '#/components/responses/UnauthorizedResponse'
+ 403:
+ $ref: '#/components/responses/ForbiddenResponse'
+ 404:
+ description:
+ Not Found
+ - NoSuchPlanTaskException, the plan-task does not exist
+ - NoSuchTableException, the table does not exist
+ - NoSuchNamespaceException, the namespace does not exist
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/IcebergErrorResponse'
+ examples:
+ PlanTaskDoesNotExist:
+ $ref: '#/components/examples/NoSuchPlanTaskError'
+ TableDoesNotExist:
+ $ref: '#/components/examples/NoSuchTableError'
+ NamespaceDoesNotExist:
+ $ref: '#/components/examples/NoSuchNamespaceError'
+ 419:
+ $ref: '#/components/responses/AuthenticationTimeoutResponse'
+ 503:
+ $ref: '#/components/responses/ServiceUnavailableResponse'
+ 5XX:
+ $ref: '#/components/responses/ServerErrorResponse'
+
+
+
/v1/{prefix}/namespaces/{namespace}/register:
parameters:
- $ref: '#/components/parameters/prefix'
@@ -694,7 +945,7 @@ paths:
required: false
schema:
type: string
- enum: [all, refs]
+ enum: [ all, refs ]
responses:
200:
$ref: '#/components/responses/LoadTableResponse'
@@ -1056,76 +1307,6 @@ paths:
5XX:
$ref: '#/components/responses/ServerErrorResponse'
- /v1/{prefix}/namespaces/{namespace}/tables/{table}/notifications:
- parameters:
- - $ref: '#/components/parameters/prefix'
- - $ref: '#/components/parameters/namespace'
- - $ref: '#/components/parameters/table'
-
- post:
- tags:
- - Catalog API
- summary: Sends a notification to the table
- operationId: sendNotification
- requestBody:
- description:
- The request containing the notification to be sent.
-
- For each table, Polaris will reject any notification where the
timestamp in the request body
- is older than or equal to the most recent time Polaris has already
processed for the table.
- The responsibility of ensuring the correct order of timestamps for a
sequence of notifications
- lies with the caller of the API. This includes managing potential
clock skew or inconsistencies
- when notifications are sent from multiple sources.
-
- A VALIDATE request behaves like a dry-run of a CREATE or UPDATE
request up to but not including
- loading the contents of a metadata file; this includes validations
of permissions, the specified
- metadata path being within ALLOWED_LOCATIONS, having an EXTERNAL
catalog, etc. The intended use
- case for a VALIDATE notification is to allow a remote catalog to
pre-validate the general
- settings of a receiving catalog against an intended new table
location before possibly creating
- a table intended for sending notifications in the remote catalog at
all. For a VALIDATE request,
- the specified metadata-location can either be a prospective full
metadata file path, or a
- relevant parent directory of the intended table to validate against
ALLOWED_LOCATIONS.
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/NotificationRequest'
- required: true
- responses:
- 204:
- description: Success, no content
- 400:
- $ref: '#/components/responses/BadRequestErrorResponse'
- 401:
- $ref: '#/components/responses/UnauthorizedResponse'
- 403:
- $ref: '#/components/responses/ForbiddenResponse'
- 404:
- description:
- Not Found - NoSuchTableException, table to load does not exist
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/IcebergErrorResponse'
- examples:
- TableToLoadDoesNotExist:
- $ref: '#/components/examples/NoSuchTableError'
- 409:
- description:
- Conflict - The timestamp of the received notification is older
than or equal to the
- most recent timestamp Polaris has already processed for the
specified table.
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/IcebergErrorResponse'
- example:
- $ref: '#/components/examples/OutOfOrderNotificationError'
- 419:
- $ref: '#/components/responses/AuthenticationTimeoutResponse'
- 503:
- $ref: '#/components/responses/ServiceUnavailableResponse'
- 5XX:
- $ref: '#/components/responses/ServerErrorResponse'
-
/v1/{prefix}/transactions/commit:
parameters:
- $ref: '#/components/parameters/prefix'
@@ -1634,6 +1815,14 @@ components:
type: string
example: "sales"
+ plan-id:
+ name: plan-id
+ in: path
+ description: ID used to track a planning request
+ required: true
+ schema:
+ type: string
+
view:
name: view
in: path
@@ -1762,8 +1951,8 @@ components:
properties:
type: object
description: Configured string to string map of properties for the
namespace
- example: {"owner": "Hank Bendickson"}
- default: {}
+ example: { "owner": "Hank Bendickson" }
+ default: { }
additionalProperties:
type: string
@@ -1775,10 +1964,10 @@ components:
uniqueItems: true
items:
type: string
- example: ["department", "access_group"]
+ example: [ "department", "access_group" ]
updates:
type: object
- example: {"owner": "Hank Bendickson"}
+ example: { "owner": "Hank Bendickson" }
additionalProperties:
type: string
@@ -1798,7 +1987,7 @@ components:
type: array
items:
type: string
- example: ["accounting", "tax"]
+ example: [ "accounting", "tax" ]
PageToken:
description:
@@ -2545,7 +2734,7 @@ components:
properties:
action:
type: string
- enum: ["set-default-spec"]
+ enum: [ "set-default-spec" ]
spec-id:
type: integer
description: Partition spec ID to set as the default, or -1 to set
last added spec
@@ -2559,7 +2748,7 @@ components:
properties:
action:
type: string
- enum: ["add-sort-order"]
+ enum: [ "add-sort-order" ]
sort-order:
$ref: '#/components/schemas/SortOrder'
@@ -2572,7 +2761,7 @@ components:
properties:
action:
type: string
- enum: ["set-default-sort-order"]
+ enum: [ "set-default-sort-order" ]
sort-order-id:
type: integer
description: Sort order ID to set as the default, or -1 to set last
added sort order
@@ -2586,7 +2775,7 @@ components:
properties:
action:
type: string
- enum: ["add-snapshot"]
+ enum: [ "add-snapshot" ]
snapshot:
$ref: '#/components/schemas/Snapshot'
@@ -2600,7 +2789,7 @@ components:
properties:
action:
type: string
- enum: ["set-snapshot-ref"]
+ enum: [ "set-snapshot-ref" ]
ref-name:
type: string
@@ -2613,7 +2802,7 @@ components:
properties:
action:
type: string
- enum: ["remove-snapshots"]
+ enum: [ "remove-snapshots" ]
snapshot-ids:
type: array
items:
@@ -2629,7 +2818,7 @@ components:
properties:
action:
type: string
- enum: ["remove-snapshot-ref"]
+ enum: [ "remove-snapshot-ref" ]
ref-name:
type: string
@@ -2642,7 +2831,7 @@ components:
properties:
action:
type: string
- enum: ["set-location"]
+ enum: [ "set-location" ]
location:
type: string
@@ -2655,7 +2844,7 @@ components:
properties:
action:
type: string
- enum: ["set-properties"]
+ enum: [ "set-properties" ]
updates:
type: object
additionalProperties:
@@ -2670,7 +2859,7 @@ components:
properties:
action:
type: string
- enum: ["remove-properties"]
+ enum: [ "remove-properties" ]
removals:
type: array
items:
@@ -2685,7 +2874,7 @@ components:
properties:
action:
type: string
- enum: ["add-view-version"]
+ enum: [ "add-view-version" ]
view-version:
$ref: '#/components/schemas/ViewVersion'
@@ -2698,7 +2887,7 @@ components:
properties:
action:
type: string
- enum: ["set-current-view-version"]
+ enum: [ "set-current-view-version" ]
view-version-id:
type: integer
description: The view version id to set as current, or -1 to set
last added view version id
@@ -2713,7 +2902,7 @@ components:
properties:
action:
type: string
- enum: ["set-statistics"]
+ enum: [ "set-statistics" ]
snapshot-id:
type: integer
format: int64
@@ -2729,7 +2918,7 @@ components:
properties:
action:
type: string
- enum: ["remove-statistics"]
+ enum: [ "remove-statistics" ]
snapshot-id:
type: integer
format: int64
@@ -2743,7 +2932,7 @@ components:
properties:
action:
type: string
- enum: ["set-partition-statistics"]
+ enum: [ "set-partition-statistics" ]
partition-statistics:
$ref: '#/components/schemas/PartitionStatisticsFile'
@@ -2756,7 +2945,7 @@ components:
properties:
action:
type: string
- enum: ["remove-partition-statistics"]
+ enum: [ "remove-partition-statistics" ]
snapshot-id:
type: integer
format: int64
@@ -2863,7 +3052,7 @@ components:
properties:
type:
type: string
- enum: ["assert-ref-snapshot-id"]
+ enum: [ "assert-ref-snapshot-id" ]
ref:
type: string
snapshot-id:
@@ -2879,7 +3068,7 @@ components:
properties:
type:
type: string
- enum: ["assert-last-assigned-field-id"]
+ enum: [ "assert-last-assigned-field-id" ]
last-assigned-field-id:
type: integer
@@ -2892,7 +3081,7 @@ components:
properties:
type:
type: string
- enum: ["assert-current-schema-id"]
+ enum: [ "assert-current-schema-id" ]
current-schema-id:
type: integer
@@ -2905,7 +3094,7 @@ components:
properties:
type:
type: string
- enum: ["assert-last-assigned-partition-id"]
+ enum: [ "assert-last-assigned-partition-id" ]
last-assigned-partition-id:
type: integer
@@ -2918,7 +3107,7 @@ components:
properties:
type:
type: string
- enum: ["assert-default-spec-id"]
+ enum: [ "assert-default-spec-id" ]
default-spec-id:
type: integer
@@ -2931,7 +3120,7 @@ components:
properties:
type:
type: string
- enum: ["assert-default-sort-order-id"]
+ enum: [ "assert-default-sort-order-id" ]
default-sort-order-id:
type: integer
@@ -2952,7 +3141,7 @@ components:
properties:
type:
type: string
- enum: ["assert-view-uuid"]
+ enum: [ "assert-view-uuid" ]
uuid:
type: string
@@ -3030,6 +3219,140 @@ components:
items:
$ref: '#/components/schemas/StorageCredential'
+ ScanTasks:
+ type: object
+ description: >
+ Scan and planning tasks for server-side scan planning
+
+
+ - `plan-tasks` contains opaque units of planning work
+
+ - `file-scan-tasks` contains a partial or complete list of table scan
tasks
+
+ - `delete-files` contains delete files referenced by file scan tasks
+
+
+ Each plan task must be passed to the fetchScanTasks endpoint to fetch
+ the file scan tasks for the plan task.
+
+
+ The list of delete files must contain all delete files referenced by
+ the file scan tasks.
+ properties:
+ delete-files:
+ description: Delete files referenced by file scan tasks
+ type: array
+ items:
+ $ref: '#/components/schemas/DeleteFile'
+ file-scan-tasks:
+ type: array
+ items:
+ $ref: '#/components/schemas/FileScanTask'
+ plan-tasks:
+ type: array
+ items:
+ $ref: '#/components/schemas/PlanTask'
+
+ CompletedPlanningResult:
+ type: object
+ description: Completed server-side planning result
+ allOf:
+ - $ref: '#/components/schemas/ScanTasks'
+ - type: object
+ required:
+ - status
+ properties:
+ status:
+ $ref: '#/components/schemas/PlanStatus'
+ enum: ["completed"]
+
+ CompletedPlanningWithIDResult:
+ type: object
+ allOf:
+ - $ref: '#/components/schemas/CompletedPlanningResult'
+ - type: object
+ properties:
+ plan-id:
+ description: ID used to track a planning request
+ type: string
+
+ FailedPlanningResult:
+ type: object
+ description: Failed server-side planning result
+ allOf:
+ - $ref: '#/components/schemas/IcebergErrorResponse'
+ - type: object
+ required:
+ - status
+ properties:
+ status:
+ $ref: '#/components/schemas/PlanStatus'
+ enum: ["failed"]
+
+ AsyncPlanningResult:
+ type: object
+ required:
+ - status
+ properties:
+ status:
+ $ref: '#/components/schemas/PlanStatus'
+ enum: ["submitted"]
+ plan-id:
+ description: ID used to track a planning request
+ type: string
+
+ EmptyPlanningResult:
+ type: object
+ description: Empty server-side planning result
+ required:
+ - status
+ properties:
+ status:
+ $ref: '#/components/schemas/PlanStatus'
+ enum: ["submitted", "cancelled"]
+
+ PlanStatus:
+ description: Status of a server-side planning operation
+ type: string
+ enum: ["completed", "submitted", "cancelled", "failed"]
+
+ FetchPlanningResult:
+ type: object
+ description: Result of server-side scan planning for fetchPlanningResult
+ discriminator:
+ propertyName: status
+ mapping:
+ completed: '#/components/schemas/CompletedPlanningResult'
+ submitted: '#/components/schemas/EmptyPlanningResult'
+ cancelled: '#/components/schemas/EmptyPlanningResult'
+ failed: '#/components/schemas/FailedPlanningResult'
+ oneOf:
+ - $ref: '#/components/schemas/CompletedPlanningResult'
+ - $ref: '#/components/schemas/FailedPlanningResult'
+ - $ref: '#/components/schemas/EmptyPlanningResult'
+
+ PlanTableScanResult:
+ type: object
+ description: Result of server-side scan planning for planTableScan
+ discriminator:
+ propertyName: status
+ mapping:
+ completed: '#/components/schemas/CompletedPlanningWithIDResult'
+ submitted: '#/components/schemas/AsyncPlanningResult'
+ cancelled: '#/components/schemas/EmptyPlanningResult'
+ failed: '#/components/schemas/FailedPlanningResult'
+ oneOf:
+ - $ref: '#/components/schemas/CompletedPlanningWithIDResult'
+ - $ref: '#/components/schemas/FailedPlanningResult'
+ - $ref: '#/components/schemas/AsyncPlanningResult'
+ - $ref: '#/components/schemas/EmptyPlanningResult'
+
+ FetchScanTasksResult:
+ type: object
+ description: Response schema for fetchScanTasks
+ allOf:
+ - $ref: '#/components/schemas/ScanTasks'
+
CommitTableRequest:
type: object
required:
@@ -3147,7 +3470,6 @@ components:
## General Configurations
- `token`: Authorization bearer token to use for view requests if
OAuth2 security is enabled
-
type: object
required:
- metadata-location
@@ -3412,45 +3734,6 @@ components:
additionalProperties:
type: string
- NotificationRequest:
- required:
- - notification-type
- - payload
- properties:
- notification-type:
- $ref: '#/components/schemas/NotificationType'
- payload:
- $ref: '#/components/schemas/TableUpdateNotification'
-
- NotificationType:
- type: string
- enum:
- - UNKNOWN
- - CREATE
- - UPDATE
- - DROP
- - VALIDATE
-
- TableUpdateNotification:
- type: object
- required:
- - table-name
- - timestamp
- - table-uuid
- - metadata-location
- properties:
- table-name:
- type: string
- timestamp:
- type: integer
- format: int64
- table-uuid:
- type: string
- metadata-location:
- type: string
- metadata:
- $ref: '#/components/schemas/TableMetadata'
-
OAuthError:
deprecated: true
description:
@@ -3543,8 +3826,8 @@ components:
type: string
description:
Properties stored on the namespace, if supported by the server.
- example: {"owner": "Ralph", "created_at": "1452120468"}
- default: {}
+ example: { "owner": "Ralph", "created_at": "1452120468" }
+ default: { }
GetNamespaceResponse:
type: object
@@ -3561,8 +3844,8 @@ components:
If namespace properties are supported, but none are set, it should
return an empty object.
additionalProperties:
type: string
- example: {"owner": "Ralph", 'transient_lastDdlTime': '1452120468'}
- default: {}
+ example: { "owner": "Ralph", 'transient_lastDdlTime': '1452120468' }
+ default: { }
nullable: true
ListTablesResponse:
@@ -3805,8 +4088,8 @@ components:
description: "List of Long values, matched to 'keys' by index"
example:
{
- "keys": [1, 2],
- "values": [100,200]
+ "keys": [ 1, 2 ],
+ "values": [ 100,200 ]
}
ValueMap:
@@ -3824,8 +4107,8 @@ components:
description: "List of primitive type values, matched to 'keys' by
index"
example:
{
- "keys": [1, 2],
- "values": [100, "test"]
+ "keys": [ 1, 2 ],
+ "values": [ 100, "test" ]
}
PrimitiveTypeValue:
@@ -3917,7 +4200,7 @@ components:
properties:
content:
type: string
- enum: ["data"]
+ enum: [ "data" ]
column-sizes:
allOf:
- $ref: '#/components/schemas/CountMap'
@@ -3961,7 +4244,7 @@ components:
properties:
content:
type: string
- enum: ["position-deletes"]
+ enum: [ "position-deletes" ]
EqualityDeleteFile:
allOf:
@@ -3971,13 +4254,113 @@ components:
properties:
content:
type: string
- enum: ["equality-deletes"]
+ enum: [ "equality-deletes" ]
equality-ids:
type: array
items:
type: integer
description: "List of equality field IDs"
+ PlanTableScanRequest:
+ type: object
+ properties:
+ snapshot-id:
+ description:
+ Identifier for the snapshot to scan in a point-in-time scan
+ type: integer
+ format: int64
+ select:
+ description: List of selected schema fields
+ type: array
+ items:
+ $ref: '#/components/schemas/FieldName'
+ filter:
+ description:
+ Expression used to filter the table data
+ $ref: '#/components/schemas/Expression'
+ case-sensitive:
+ description: Enables case sensitive field matching for filter and
select
+ type: boolean
+ default: true
+ use-snapshot-schema:
+ description:
+ Whether to use the schema at the time the snapshot was written.
+
+ When time travelling, the snapshot schema should be used (true).
+ When scanning a branch, the table schema should be used (false).
+ type: boolean
+ default: false
+ start-snapshot-id:
+ description: Starting snapshot ID for an incremental scan (exclusive)
+ type: integer
+ format: int64
+ end-snapshot-id:
+ description:
+ Ending snapshot ID for an incremental scan (inclusive).
+
+ Required when start-snapshot-id is specified.
+ type: integer
+ format: int64
+ stats-fields:
+ description:
+ List of fields for which the service should send column stats.
+ type: array
+ items:
+ $ref: '#/components/schemas/FieldName'
+
+ FieldName:
+ description:
+ A full field name (including parent field names), such as those passed
+ in APIs like Java `Schema#findField(String name)`.
+
+ The nested field name follows these rules
+ - Nested struct fields are named by concatenating field names at each
+ struct level using dot (`.`) delimiter, e.g.
+ employer.contact_info.address.zip_code
+ - Nested fields in a map key are named using the keyword `key`, e.g.
+ employee_address_map.key.first_name
+ - Nested fields in a map value are named using the keyword `value`,
+ e.g. employee_address_map.value.zip_code
+ - Nested fields in a list are named using the keyword `element`, e.g.
+ employees.element.first_name
+ type: string
+
+ FetchScanTasksRequest:
+ type: object
+ required:
+ - plan-task
+ properties:
+ plan-task:
+ $ref: '#/components/schemas/PlanTask'
+
+ PlanTask:
+ description:
+ An opaque string provided by the REST server that represents a
+ unit of work to produce file scan tasks for scan planning. This allows
+ clients to fetch tasks across multiple requests to accommodate large
result sets.
+ type: string
+
+ FileScanTask:
+ type: object
+ required:
+ - data-file
+ properties:
+ data-file:
+ $ref: '#/components/schemas/DataFile'
+ delete-file-references:
+ description: A list of indices in the delete files array (0-based)
+ type: array
+ items:
+ type: integer
+ residual-filter:
+ description:
+ An optional filter to be applied to rows in this file scan task.
+
+ If the residual is not present, the client must produce the
+ residual or use the original filter.
+ allOf:
+ - $ref: '#/components/schemas/Expression'
+
#############################
# Reusable Response Objects #
#############################
@@ -4075,7 +4458,7 @@ components:
"message": "The server does not support this operation",
"type": "UnsupportedOperationException",
"code": 406
- }}
+ } }
CreateNamespaceResponse:
description:
@@ -4089,7 +4472,7 @@ components:
$ref: '#/components/schemas/CreateNamespaceResponse'
example: {
"namespace": ["accounting", "tax"],
- "properties": {"owner": "Ralph", "created_at": "1452120468"}
+ "properties": { "owner": "Ralph", "created_at": "1452120468" }
}
GetNamespaceResponse:
@@ -4182,9 +4565,9 @@ components:
schema:
$ref: '#/components/schemas/UpdateNamespacePropertiesResponse'
example: {
- "updated": ["owner"],
- "removed": ["foo"],
- "missing": ["bar"]
+ "updated": [ "owner" ],
+ "removed": [ "foo" ],
+ "missing": [ "bar" ]
}
CreateTableResponse:
@@ -4194,6 +4577,27 @@ components:
schema:
$ref: '#/components/schemas/LoadTableResult'
+ PlanTableScanResponse:
+ description: Result of submitting a table scan to plan
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PlanTableScanResult'
+
+ FetchPlanningResultResponse:
+ description: Result of fetching a submitted scan planning operation
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FetchPlanningResult'
+
+ FetchScanTasksResponse:
+ description: Result of retrieving additional plan tasks and file scan
tasks.
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/FetchScanTasksResult'
+
LoadTableResponse:
description: Table metadata result when loading a table
content:
@@ -4233,13 +4637,13 @@ components:
ListTablesEmptyExample:
summary: An empty list for a namespace with no tables
value: {
- "identifiers": []
+ "identifiers": [ ]
}
ListNamespacesEmptyExample:
summary: An empty list of namespaces
value: {
- "namespaces": []
+ "namespaces": [ ]
}
ListNamespacesNonEmptyExample:
@@ -4255,8 +4659,8 @@ components:
summary: A non-empty list of table identifiers
value: {
"identifiers": [
- {"namespace": ["accounting", "tax"], "name": "paid"},
- {"namespace": ["accounting", "tax"], "name": "owed"}
+ { "namespace": ["accounting", "tax"], "name": "paid" },
+ { "namespace": ["accounting", "tax"], "name": "owed" }
]
}
@@ -4265,7 +4669,7 @@ components:
value: "accounting%1Ftax"
NamespaceAsPathVariable:
- summary: A single part namespace, as represented in a path parameter
+ summary: A single part namespace, as represented in a path paremeter
value: "accounting"
NamespaceAlreadyExistsError:
@@ -4278,6 +4682,26 @@ components:
}
}
+ NoSuchPlanIdError:
+ summary: The plan id does not exist
+ value: {
+ "error": {
+ "message": "The plan id does not exist",
+ "type": "NoSuchPlanIdException",
+ "code": 404
+ }
+ }
+
+ NoSuchPlanTaskError:
+ summary: The plan task does not exist
+ value: {
+ "error": {
+ "message": "The plan task does not exist",
+ "type": "NoSuchPlanTaskException",
+ "code": 404
+ }
+ }
+
NoSuchTableError:
summary: The requested table does not exist
value: {
@@ -4311,15 +4735,15 @@ components:
RenameTableSameNamespace:
summary: Rename a table in the same namespace
value: {
- "source": {"namespace": ["accounting", "tax"], "name": "paid"},
- "destination": {"namespace": ["accounting", "tax"], "name": "owed"}
+ "source": { "namespace": ["accounting", "tax"], "name": "paid" },
+ "destination": { "namespace": ["accounting", "tax"], "name": "owed" }
}
RenameViewSameNamespace:
summary: Rename a view in the same namespace
value: {
- "source": {"namespace": ["accounting", "tax"], "name": "paid-view"},
- "destination": {"namespace": ["accounting", "tax"], "name":
"owed-view"}
+ "source": { "namespace": [ "accounting", "tax" ], "name": "paid-view"
},
+ "destination": { "namespace": [ "accounting", "tax" ], "name":
"owed-view" }
}
TableAlreadyExistsError:
@@ -4358,20 +4782,8 @@ components:
UpdateAndRemoveNamespacePropertiesRequest:
summary: An update namespace properties request with both properties to
remove and properties to upsert.
value: {
- "removals": ["foo", "bar"],
- "updates": {"owner": "Raoul"}
- }
-
- OutOfOrderNotificationError:
- summary:
- The timestamp of the received notification is older than or equal to
the most recent timestamp
- Polaris has already processed for the specified table.
- value: {
- "error": {
- "message": "A notification with a newer timestamp has been admitted
for table",
- "type": "AlreadyExistsException",
- "code": 409
- }
+ "removals": [ "foo", "bar" ],
+ "updates": { "owner": "Raoul" }
}
securitySchemes:
diff --git a/spec/polaris-catalog-apis/notifications-api.yaml
b/spec/polaris-catalog-apis/notifications-api.yaml
index aa11ab32..ec40bfc0 100644
--- a/spec/polaris-catalog-apis/notifications-api.yaml
+++ b/spec/polaris-catalog-apis/notifications-api.yaml
@@ -21,9 +21,9 @@
paths:
/v1/{prefix}/namespaces/{namespace}/tables/{table}/notifications:
parameters:
- - $ref: '../rest-catalog-open-api.yaml#/components/parameters/prefix'
- - $ref: '../rest-catalog-open-api.yaml#/components/parameters/namespace'
- - $ref: '../rest-catalog-open-api.yaml#/components/parameters/table'
+ - $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/parameters/prefix'
+ - $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/parameters/namespace'
+ - $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/parameters/table'
post:
tags:
@@ -57,21 +57,21 @@ paths:
204:
description: Success, no content
400:
- $ref:
'../rest-catalog-open-api.yaml#/components/responses/BadRequestErrorResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/responses/BadRequestErrorResponse'
401:
- $ref:
'../rest-catalog-open-api.yaml#/components/responses/UnauthorizedResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/responses/UnauthorizedResponse'
403:
- $ref:
'../rest-catalog-open-api.yaml#/components/responses/ForbiddenResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/responses/ForbiddenResponse'
404:
description:
Not Found - NoSuchTableException, table to load does not exist
content:
application/json:
schema:
- $ref:
'../rest-catalog-open-api.yaml#/components/schemas/IcebergErrorResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/schemas/IcebergErrorResponse'
examples:
TableToLoadDoesNotExist:
- $ref:
'../rest-catalog-open-api.yaml#/components/examples/NoSuchTableError'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/examples/NoSuchTableError'
409:
description:
Conflict - The timestamp of the received notification is older
than or equal to the
@@ -79,15 +79,15 @@ paths:
content:
application/json:
schema:
- $ref:
'../rest-catalog-open-api.yaml#/components/schemas/IcebergErrorResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/schemas/IcebergErrorResponse'
example:
$ref: '#/components/examples/OutOfOrderNotificationError'
419:
- $ref:
'../rest-catalog-open-api.yaml#/components/responses/AuthenticationTimeoutResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/responses/AuthenticationTimeoutResponse'
503:
- $ref:
'../rest-catalog-open-api.yaml#/components/responses/ServiceUnavailableResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/responses/ServiceUnavailableResponse'
5XX:
- $ref:
'../rest-catalog-open-api.yaml#/components/responses/ServerErrorResponse'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/responses/ServerErrorResponse'
components:
schemas:
@@ -128,7 +128,7 @@ components:
metadata-location:
type: string
metadata:
- $ref:
'../rest-catalog-open-api.yaml#/components/schemas/TableMetadata'
+ $ref:
'../iceberg-rest-catalog-open-api.yaml#/components/schemas/TableMetadata'
examples:
OutOfOrderNotificationError:
diff --git a/spec/polaris-catalog-apis/oauth-tokens-api.yaml
b/spec/polaris-catalog-apis/oauth-tokens-api.yaml
new file mode 100644
index 00000000..a57f8607
--- /dev/null
+++ b/spec/polaris-catalog-apis/oauth-tokens-api.yaml
@@ -0,0 +1,282 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# CODE_COPIED_TO_POLARIS
+
+# From Apache Iceberg Version: 1.7.1
+
+---
+paths:
+ # The /v1/oauth/tokens endpoint is copied from
iceberg-rest-catalog-open-api.yaml,
+ # ensuring that its deprecation and removal schedule is independent of the
Iceberg release cycle.
+ /v1/oauth/tokens:
+
+ post:
+ tags:
+ - OAuth2 API
+ summary: Get a token using an OAuth2 flow (DEPRECATED for REMOVAL)
+ deprecated: true
+ operationId: getToken
+ description:
+ The `oauth/tokens` endpoint is **DEPRECATED for REMOVAL**. It is _not_
recommended to
+ implement this endpoint, unless you are fully aware of the potential
security implications.
+
+ All clients are encouraged to explicitly set the configuration
property `oauth2-server-uri`
+ to the correct OAuth endpoint.
+
+ Deprecated since Iceberg (Java) 1.6.0. The endpoint and related types
will be removed from
+ this spec in Iceberg (Java) 2.0.
+
+ See [Security improvements in the Iceberg REST
specification](https://github.com/apache/iceberg/issues/10537)
+
+
+ Exchange credentials for a token using the OAuth2 client credentials
flow or token exchange.
+
+
+ This endpoint is used for three purposes -
+
+ 1. To exchange client credentials (client ID and secret) for an access
token
+ This uses the client credentials flow.
+
+ 2. To exchange a client token and an identity token for a more
specific access token
+ This uses the token exchange flow.
+
+ 3. To exchange an access token for one with the same claims and a
refreshed expiration period
+ This uses the token exchange flow.
+
+
+ For example, a catalog client may be configured with client
credentials from the OAuth2
+ Authorization flow. This client would exchange its client ID and
secret for an access token
+ using the client credentials request with this endpoint (1).
Subsequent requests would then
+ use that access token.
+
+
+ Some clients may also handle sessions that have additional user
context. These clients would
+ use the token exchange flow to exchange a user token (the "subject"
token) from the session
+ for a more specific access token for that user, using the catalog's
access token as the
+ "actor" token (2). The user ID token is the "subject" token and can be
any token type
+ allowed by the OAuth2 token exchange flow, including a unsecured JWT
token with a sub claim.
+ This request should use the catalog's bearer token in the
"Authorization" header.
+
+
+ Clients may also use the token exchange flow to refresh a token that
is about to expire by
+ sending a token exchange request (3). The request's "subject" token
should be the expiring
+ token. This request should use the subject token in the
"Authorization" header.
+ parameters:
+ - name: Authorization
+ in: header
+ schema:
+ type: string
+ required: false
+ requestBody:
+ required: true
+ content:
+ application/x-www-form-urlencoded:
+ schema:
+ $ref: '#/components/schemas/OAuthTokenRequest'
+ responses:
+ 200:
+ $ref: '#/components/responses/OAuthTokenResponse'
+ 400:
+ $ref: '#/components/responses/OAuthErrorResponse'
+ 401:
+ $ref: '#/components/responses/OAuthErrorResponse'
+ 5XX:
+ $ref: '#/components/responses/OAuthErrorResponse'
+ security:
+ - BearerAuth: []
+
+components:
+ schemas:
+
+ TokenType:
+ type: string
+ enum:
+ - urn:ietf:params:oauth:token-type:access_token
+ - urn:ietf:params:oauth:token-type:refresh_token
+ - urn:ietf:params:oauth:token-type:id_token
+ - urn:ietf:params:oauth:token-type:saml1
+ - urn:ietf:params:oauth:token-type:saml2
+ - urn:ietf:params:oauth:token-type:jwt
+ description:
+ Token type identifier, from RFC 8693 Section 3
+
+
+ See https://datatracker.ietf.org/doc/html/rfc8693#section-3
+
+ OAuthClientCredentialsRequest:
+ deprecated: true
+ description:
+ The `oauth/tokens` endpoint and related schemas are **DEPRECATED for
REMOVAL** from this
+ spec, see description of the endpoint.
+
+
+ OAuth2 client credentials request
+
+
+ See https://datatracker.ietf.org/doc/html/rfc6749#section-4.4
+ type: object
+ required:
+ - grant_type
+ - client_id
+ - client_secret
+ properties:
+ grant_type:
+ type: string
+ enum:
+ - client_credentials
+ scope:
+ type: string
+ client_id:
+ type: string
+ description:
+ Client ID
+
+
+ This can be sent in the request body, but OAuth2 recommends
sending it in
+ a Basic Authorization header.
+ client_secret:
+ type: string
+ description:
+ Client secret
+
+
+ This can be sent in the request body, but OAuth2 recommends
sending it in
+ a Basic Authorization header.
+
+ OAuthTokenExchangeRequest:
+ deprecated: true
+ description:
+ The `oauth/tokens` endpoint and related schemas are **DEPRECATED for
REMOVAL** from this
+ spec, see description of the endpoint.
+
+
+ OAuth2 token exchange request
+
+
+ See https://datatracker.ietf.org/doc/html/rfc8693
+ type: object
+ required:
+ - grant_type
+ - subject_token
+ - subject_token_type
+ properties:
+ grant_type:
+ type: string
+ enum:
+ - urn:ietf:params:oauth:grant-type:token-exchange
+ scope:
+ type: string
+ requested_token_type:
+ $ref: '#/components/schemas/TokenType'
+ subject_token:
+ type: string
+ description: Subject token for token exchange request
+ subject_token_type:
+ $ref: '#/components/schemas/TokenType'
+ actor_token:
+ type: string
+ description: Actor token for token exchange request
+ actor_token_type:
+ $ref: '#/components/schemas/TokenType'
+
+ OAuthTokenRequest:
+ deprecated: true
+ description:
+ The `oauth/tokens` endpoint and related schemas are **DEPRECATED for
REMOVAL** from this
+ spec, see description of the endpoint.
+ anyOf:
+ - $ref: '#/components/schemas/OAuthClientCredentialsRequest'
+ - $ref: '#/components/schemas/OAuthTokenExchangeRequest'
+ OAuthError:
+ deprecated: true
+ description:
+ The `oauth/tokens` endpoint and related schemas are **DEPRECATED for
REMOVAL** from this
+ spec, see description of the endpoint.
+ type: object
+ required:
+ - error
+ properties:
+ error:
+ type: string
+ enum:
+ - invalid_request
+ - invalid_client
+ - invalid_grant
+ - unauthorized_client
+ - unsupported_grant_type
+ - invalid_scope
+ error_description:
+ type: string
+ error_uri:
+ type: string
+
+ OAuthTokenResponse:
+ deprecated: true
+ description:
+ The `oauth/tokens` endpoint and related schemas are **DEPRECATED for
REMOVAL** from this
+ spec, see description of the endpoint.
+ type: object
+ required:
+ - access_token
+ - token_type
+ properties:
+ access_token:
+ type: string
+ description:
+ The access token, for client credentials or token exchange
+ token_type:
+ type: string
+ enum:
+ - bearer
+ - mac
+ - N_A
+ description:
+ Access token type for client credentials or token exchange
+
+
+ See https://datatracker.ietf.org/doc/html/rfc6749#section-7.1
+ expires_in:
+ type: integer
+ description:
+ Lifetime of the access token in seconds for client credentials or
token exchange
+ issued_token_type:
+ $ref: '#/components/schemas/TokenType'
+ refresh_token:
+ type: string
+ description: Refresh token for client credentials or token exchange
+ scope:
+ type: string
+ description: Authorization scope for client credentials or token
exchange
+
+ responses:
+
+ OAuthTokenResponse:
+ description: OAuth2 token response for client credentials or token
exchange
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/OAuthTokenResponse'
+
+ OAuthErrorResponse:
+ description: OAuth2 error response
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/OAuthError'
diff --git a/spec/polaris-catalog-service.yaml
b/spec/polaris-catalog-service.yaml
index c5f7926f..cedcf0f7 100644
--- a/spec/polaris-catalog-service.yaml
+++ b/spec/polaris-catalog-service.yaml
@@ -29,7 +29,7 @@ info:
Defines the specification for the Polaris Catalog API, which encompasses
both the Iceberg REST Catalog API
and Polaris-native API.
-# The server configuration is sourced from rest-catalog-open-api.yaml
+# The server configuration is sourced from iceberg-rest-catalog-open-api.yaml
servers:
- url: "{scheme}://{host}/{basePath}"
description: Server URL when the port can be inferred from the scheme
@@ -59,7 +59,7 @@ servers:
description: Optional prefix to be appended to all routes
default: ""
-# The security configuration is sourced from rest-catalog-open-api.yaml
+# The security configuration is sourced from iceberg-rest-catalog-open-api.yaml
# All routes are currently configured using an Authorization header.
security:
- OAuth2: [catalog]
@@ -72,49 +72,60 @@ paths:
############################
/v1/config:
- $ref: './rest-catalog-open-api.yaml#/paths/~1v1~1config'
+ $ref: './iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1config'
+ # Deprecated, it should be removed or modified in the future according to
+ # https://github.com/apache/polaris/issues/12
/v1/oauth/tokens:
- $ref: './rest-catalog-open-api.yaml#/paths/~1v1~1oauth~1tokens'
+ $ref:
'./polaris-catalog-apis/oauth-tokens-api.yaml#/paths/~1v1~1oauth~1tokens'
/v1/{prefix}/namespaces:
- $ref: './rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces'
/v1/{prefix}/namespaces/{namespace}:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}'
/v1/{prefix}/namespaces/{namespace}/properties:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1properties'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1properties'
/v1/{prefix}/namespaces/{namespace}/tables:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables'
/v1/{prefix}/namespaces/{namespace}/register:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1register'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1register'
/v1/{prefix}/namespaces/{namespace}/tables/{table}:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables~1{table}'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables~1{table}'
/v1/{prefix}/namespaces/{namespace}/tables/{table}/credentials:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables~1{table}~1credentials'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables~1{table}~1credentials'
/v1/{prefix}/tables/rename:
- $ref: './rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1tables~1rename'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1tables~1rename'
/v1/{prefix}/namespaces/{namespace}/tables/{table}/metrics:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables~1{table}~1metrics'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1tables~1{table}~1metrics'
/v1/{prefix}/transactions/commit:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1transactions~1commit'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1transactions~1commit'
/v1/{prefix}/namespaces/{namespace}/views:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1views'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1views'
/v1/{prefix}/namespaces/{namespace}/views/{view}:
- $ref:
'./rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1views~1{view}'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1namespaces~1{namespace}~1views~1{view}'
/v1/{prefix}/views/rename:
- $ref: './rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1views~1rename'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/paths/~1v1~1{prefix}~1views~1rename'
+
+ # /v1/{prefix}/namespaces/{namespace}/tables/{table}/plan:
+ # Not implemented in Polaris
+
+ # /v1/{prefix}/namespaces/{namespace}/tables/{table}/plan/{plan-id}:
+ # Not implemented in Polaris
+
+ # /v1/{prefix}/namespaces/{namespace}/tables/{table}/tasks:
+ # Not implemented in Polaris
######################
# Polaris-native API #
@@ -127,7 +138,7 @@ paths:
components:
securitySchemes:
- # The OAuth2 scheme is sourced from rest-catalog-open-api.yaml
+ # The OAuth2 scheme is sourced from iceberg-rest-catalog-open-api.yaml
#
# If the /v1/oauth/tokens endpoint is removed or modified
# (see https://github.com/apache/polaris/issues/12),
@@ -152,4 +163,4 @@ components:
catalog: Allows interacting with the Config and Catalog APIs
BearerAuth:
- $ref:
'./rest-catalog-open-api.yaml#/components/securitySchemes/BearerAuth'
+ $ref:
'./iceberg-rest-catalog-open-api.yaml#/components/securitySchemes/BearerAuth'