import type {CloudProvider, FieldSchema, ServiceSchema, TableColumnSchema} from './types' /** * Glue's rule for database and table names. Glue lowercases them, and Athena * needs them to start with a letter or underscore to query them unquoted. */ export const CATALOG_NAME_PATTERN = '^[a-z_][a-z0-9_]{0,254}$' /** The data formats TheCloud's Athena engine reads from a table's S3 location. */ export const CATALOG_TABLE_FORMATS = ['csv', 'json', 'parquet'] as const /** Hive column types Athena understands and the console offers. */ export const CATALOG_COLUMN_TYPES = ['string', 'int', 'bigint', 'double', 'float', 'boolean', 'date', 'timestamp', 'decimal(10,2)'] as const const databaseColumns: TableColumnSchema[] = [ {name: 'name', label: 'Name'}, {name: 'tables', label: 'Tables', path: 'metadata.tableCount', emptyText: '—'}, {name: 'description', label: 'Description', path: 'metadata.description', emptyText: '—'}, {name: 'location', label: 'Location', path: 'metadata.locationUri', emptyText: '—'}, {name: 'createdAt', label: 'Created', format: 'datetime'}, ] const databaseFilters: FieldSchema[] = [{name: 'search', label: 'Search', type: 'text', required: false}] export function awsDataCatalogSchema(): ServiceSchema { return { cloud: 'aws', service: 'datacatalog', displayName: 'Glue Data Catalog databases', fields: [ { name: 'name', label: 'Name', type: 'text', required: true, description: 'Lowercase letters, numbers and underscores, starting with a letter or underscore, so Athena can query it.', validation: {pattern: CATALOG_NAME_PATTERN, message: 'Use lowercase letters, numbers and underscores, starting with a letter or underscore'}, }, {name: 'description', label: 'Description', type: 'text', required: false, validation: {maxLength: 2048}}, { name: 'locationUri', label: 'Location', type: 'text', required: false, span: true, description: 'Optional S3 location for the database, such as s3://my-bucket/warehouse/.', validation: {pattern: '^s3://[a-z0-9.-]{3,63}(/.*)?$', message: 'Use an S3 URI such as s3://my-bucket/warehouse/'}, }, ], actions: ['list', 'create', 'delete', 'inspect'], capabilities: { resourceActions: [ {name: 'list', label: 'List databases', enabled: true, status: 'available', runtimeRequired: true}, {name: 'create', label: 'Create database', enabled: true, status: 'available', runtimeRequired: true}, {name: 'delete', label: 'Delete database', enabled: true, status: 'available', runtimeRequired: true}, {name: 'inspect', label: 'Inspect database', enabled: true, status: 'available', runtimeRequired: true}, ], dataCatalogActions: [ {name: 'createTable', label: 'Create table', enabled: true, status: 'available', runtimeRequired: true}, {name: 'deleteTable', label: 'Delete table', enabled: true, status: 'available', runtimeRequired: true}, ], }, filters: databaseFilters, columns: databaseColumns, } } export function dataCatalogSchemaFor(cloud: CloudProvider): ServiceSchema | null { return cloud === 'aws' ? awsDataCatalogSchema() : null }