spec/polaris-catalog-apis/notifications-api.yaml (118 lines of code) (raw):
#
# 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.
#
---
paths:
/v1/{prefix}/namespaces/{namespace}/tables/{table}/notifications:
parameters:
- $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:
- 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: '../iceberg-rest-catalog-open-api.yaml#/components/responses/BadRequestErrorResponse'
401:
$ref: '../iceberg-rest-catalog-open-api.yaml#/components/responses/UnauthorizedResponse'
403:
$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: '../iceberg-rest-catalog-open-api.yaml#/components/schemas/IcebergErrorResponse'
examples:
TableToLoadDoesNotExist:
$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
most recent timestamp Polaris has already processed for the specified table.
content:
application/json:
schema:
$ref: '../iceberg-rest-catalog-open-api.yaml#/components/schemas/IcebergErrorResponse'
example:
$ref: '#/components/examples/OutOfOrderNotificationError'
419:
$ref: '../iceberg-rest-catalog-open-api.yaml#/components/responses/AuthenticationTimeoutResponse'
503:
$ref: '../iceberg-rest-catalog-open-api.yaml#/components/responses/ServiceUnavailableResponse'
5XX:
$ref: '../iceberg-rest-catalog-open-api.yaml#/components/responses/ServerErrorResponse'
components:
schemas:
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: '../iceberg-rest-catalog-open-api.yaml#/components/schemas/TableMetadata'
examples:
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
}
}