Files
floci-ui/packages/api/src/cloud-spi/databaseSchema.ts
T
Zakaria 91ce11274d
CI / checks (pull_request) Successful in 25m47s
chore: show TheCloud instead of Floci in console text and messages
Labels, empty states, error messages and defaults the console shows now name
TheCloud or its runtimes. Identifiers that must match the emulator (FLOCI_*
settings, the X-Floci-CSRF header, emulator-returned host names) are unchanged.
2026-10-24 14:30:44 -04:00

332 lines
13 KiB
TypeScript

import type {CloudProvider, FieldSchema, ServiceSchema, TableColumnSchema} from './types'
const databaseColumns: TableColumnSchema[] = [
{name: 'name', label: 'Name'},
{name: 'status', label: 'Status'},
{name: 'engine', label: 'Engine'},
{name: 'version', label: 'Version'},
{name: 'instanceClass', label: 'Class'},
]
/** Cloud SQL reports a connection endpoint, which RDS does not surface here. */
const cloudSqlColumns: TableColumnSchema[] = [
{name: 'name', label: 'Name'},
{name: 'status', label: 'Status', format: 'badge'},
{name: 'engine', label: 'Version'},
{name: 'region', label: 'Region'},
{name: 'instanceClass', label: 'Tier'},
{name: 'connectionName', label: 'Connection', path: 'metadata.connectionName', format: 'code'},
]
const databaseFilters: FieldSchema[] = [
{name: 'search', label: 'Search', type: 'text', required: false},
]
export function awsDatabaseSchema(): ServiceSchema {
return {
cloud: 'aws',
service: 'database',
displayName: 'AWS RDS',
fields: [
{
name: 'dbInstanceIdentifier',
label: 'DB Instance Identifier',
type: 'text',
required: true,
validation: {
pattern: '^(?!.*--)[a-z](?:[a-z0-9-]{0,61}[a-z0-9])?$',
minLength: 1,
maxLength: 63,
},
},
{
name: 'engine',
label: 'Engine',
type: 'select',
required: true,
defaultValue: 'postgres',
options: [
{label: 'PostgreSQL', value: 'postgres'},
{label: 'MySQL', value: 'mysql'},
{label: 'MariaDB', value: 'mariadb'},
],
},
{
name: 'masterUserPassword',
label: 'Master User Password',
type: 'password',
required: true,
span: true,
validation: {minLength: 8, maxLength: 128},
},
{
name: 'dbInstanceClass',
label: 'DB Instance Class',
type: 'text',
required: false,
defaultValue: 'db.t3.micro',
},
{
name: 'allocatedStorage',
label: 'Allocated Storage',
type: 'text',
required: false,
defaultValue: '20',
validation: {pattern: '^[1-9][0-9]*$'},
},
{
name: 'masterUsername',
label: 'Master Username',
type: 'text',
required: false,
defaultValue: 'root',
validation: {maxLength: 63},
},
{
name: 'dbName',
label: 'Database Name',
type: 'text',
required: false,
defaultValue: '',
validation: {maxLength: 64},
},
{
name: 'engineVersion',
label: 'Engine Version',
type: 'text',
required: false,
defaultValue: '',
},
{
name: 'securityGroupIds',
label: 'Security Group IDs',
type: 'text',
required: false,
span: true,
description: 'One or more SG IDs separated by commas — e.g. sg-111, sg-222',
},
],
actions: ['list', 'create', 'update', 'delete', 'inspect'],
capabilities: {
resourceActions: [
{name: 'list', label: 'List DB instances', enabled: true, status: 'available', runtimeRequired: true},
{name: 'create', label: 'Create DB instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'update', label: 'Update DB instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'delete', label: 'Delete DB instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'inspect', label: 'Inspect DB instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'start', label: 'Start DB instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'stop', label: 'Stop DB instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'reboot', label: 'Reboot DB instance', enabled: true, status: 'available', runtimeRequired: true},
],
databaseActions: [
{
name: 'listSnapshots',
label: 'List DB snapshots',
enabled: true,
status: 'available',
runtimeRequired: true,
},
{
name: 'createSnapshot',
label: 'Create DB snapshot',
enabled: true,
status: 'partial',
reason: 'The Cloud Proxy operation is available, but the current runtime does not implement CreateDBSnapshot.',
runtimeRequired: true,
},
],
},
filters: databaseFilters,
columns: databaseColumns,
updateFields: [
{
name: 'masterUserPassword',
label: 'Master Password',
type: 'password',
required: false,
span: true,
description: 'Leave blank to keep the current password. Class, storage, engine, and version are omitted because the current emulator does not support modifying them.',
validation: {minLength: 8, maxLength: 128},
},
{
name: 'enableIamDatabaseAuthentication',
label: 'IAM Database Authentication',
type: 'select',
required: false,
valuePath: 'metadata.iamDatabaseAuthenticationEnabled',
description: 'Leave unchanged to keep current setting.',
options: [
{label: 'True', value: 'true'},
{label: 'False', value: 'false'},
],
},
{
name: 'dbSubnetGroupName',
label: 'DB Subnet Group',
type: 'text',
required: false,
valuePath: 'metadata.subnetGroup.name',
description: 'Leave unchanged or blank to keep current DB subnet group.',
},
{
name: 'vpcSecurityGroupIds',
label: 'VPC Security Group IDs',
type: 'text',
required: false,
valuePath: 'metadata.vpcSecurityGroupIds',
description: 'Comma-separated security group IDs. Leave unchanged or blank to keep current security groups.',
},
{
name: 'optionGroupName',
label: 'Option Group',
type: 'text',
required: false,
valuePath: 'metadata.optionGroupName',
description: 'Leave unchanged or blank to keep current option group.',
},
{
name: 'autoMinorVersionUpgrade',
label: 'Auto Minor Version Upgrade',
type: 'select',
required: false,
valuePath: 'metadata.autoMinorVersionUpgrade',
description: 'Leave unchanged to keep current setting.',
options: [
{label: 'True', value: 'true'},
{label: 'False', value: 'false'},
],
},
],
}
}
export function azureDatabaseSchema(): ServiceSchema {
return {
cloud: 'azure',
service: 'database',
displayName: 'Azure Databases',
fields: [
{
name: 'engine',
label: 'Database Engine',
type: 'select',
required: true,
defaultValue: 'azure-sql',
options: [
{label: 'Azure SQL Database', value: 'azure-sql'},
{label: 'Azure Database for PostgreSQL', value: 'postgresql'},
],
},
{
name: 'serverName',
label: 'Server Name',
type: 'text',
required: true,
validation: {
minLength: 1,
maxLength: 63,
pattern: '^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$',
message: 'Use 1-63 lowercase letters, numbers, or hyphens.',
},
},
{
name: 'location',
label: 'Location',
type: 'text',
required: true,
defaultValue: 'eastus',
},
{
name: 'administratorLogin',
label: 'Administrator Login',
type: 'text',
required: true,
defaultValue: 'sa',
},
{
name: 'administratorLoginPassword',
label: 'Administrator Password',
type: 'password',
required: true,
span: true,
description: 'Required by the local database runtime. The value is not returned by the API.',
validation: {
minLength: 8,
message: 'Use at least 8 characters.',
},
},
],
actions: ['list', 'create', 'delete', 'inspect'],
capabilities: {
resourceActions: [
{name: 'list', label: 'List database servers', enabled: true, status: 'available', runtimeRequired: true},
{name: 'create', label: 'Create database server', enabled: true, status: 'available', runtimeRequired: true},
{name: 'delete', label: 'Delete database server', enabled: true, status: 'available', runtimeRequired: true},
{name: 'inspect', label: 'Inspect metadata', enabled: true, status: 'available', runtimeRequired: true},
],
},
filters: databaseFilters,
columns: [
{name: 'name', label: 'Name'},
{name: 'engine', label: 'Engine'},
{name: 'status', label: 'Status'},
{name: 'region', label: 'Region'},
],
}
}
export function gcpDatabaseSchema(): ServiceSchema {
return {
cloud: 'gcp',
service: 'database',
displayName: 'Cloud SQL',
fields: [
{
name: 'instanceName',
label: 'Instance Name',
type: 'text',
required: true,
description: 'Lowercase letters, numbers, and hyphens; must start with a letter.',
},
{
name: 'databaseVersion',
label: 'Database Version',
type: 'select',
required: false,
// The runtime backs instances with real Postgres containers and
// rejects every other engine, so this is not the full GCP list.
description: 'The local runtime supports PostgreSQL only.',
options: [
{label: 'PostgreSQL 15', value: 'POSTGRES_15'},
{label: 'PostgreSQL 16', value: 'POSTGRES_16'},
],
},
{
name: 'region',
label: 'Region',
type: 'text',
required: false,
description: 'Defaults to us-central1.',
},
{
name: 'tier',
label: 'Machine Tier',
type: 'text',
required: false,
description: 'Defaults to db-f1-micro.',
},
],
actions: ['list', 'create', 'inspect', 'delete'],
filters: databaseFilters,
columns: cloudSqlColumns,
capabilities: {
resourceActions: [
{name: 'list', label: 'List instances', enabled: true, status: 'available', runtimeRequired: true},
{name: 'create', label: 'Create instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'delete', label: 'Delete instance', enabled: true, status: 'available', runtimeRequired: true},
{name: 'inspect', label: 'Inspect instance', enabled: true, status: 'available', runtimeRequired: false},
],
},
}
}