Files
floci-ui/packages/api/src/cloud-spi/containersSchema.ts
T
2026-09-22 16:13:21 -04:00

70 lines
2.9 KiB
TypeScript

import type {CloudProvider, FieldSchema, ServiceSchema, TableColumnSchema} from './types'
const containerColumns: TableColumnSchema[] = [
{name: 'name', label: 'Service'},
{name: 'status', label: 'State', format: 'badge'},
{name: 'image', label: 'Image', path: 'metadata.image', format: 'code', emptyText: '—'},
{name: 'uri', label: 'URL', path: 'metadata.uri', emptyText: '—'},
{name: 'createdAt', label: 'Created', format: 'datetime'},
]
const containerFilters: FieldSchema[] = [{name: 'search', label: 'Search', type: 'text', required: false}]
/** Cloud Run service names: lowercase letters, digits and hyphens, max 49 chars. */
export const CLOUD_RUN_NAME_PATTERN = '^[a-z]([-a-z0-9]*[a-z0-9])?$'
export const CLOUD_RUN_NAME_MAX_LENGTH = 49
export function gcpContainersSchema(): ServiceSchema {
return {
cloud: 'gcp',
service: 'containers',
displayName: 'Cloud Run',
fields: [
{
name: 'name',
label: 'Service Name',
type: 'text',
required: true,
validation: {
pattern: CLOUD_RUN_NAME_PATTERN,
minLength: 1,
maxLength: CLOUD_RUN_NAME_MAX_LENGTH,
message: 'Start with a letter; lowercase letters, digits and hyphens only.',
},
},
{
name: 'image',
label: 'Container Image',
type: 'text',
required: true,
span: true,
// The most common cause of a service that never becomes ready.
description:
'The container must listen on the port given by the PORT environment variable (8080 by default). An image that listens elsewhere will report a failed condition.',
},
{
name: 'port',
label: 'Container Port',
type: 'text',
required: false,
description: 'Overrides the port passed to the container. Defaults to 8080.',
},
],
actions: ['list', 'create', 'delete', 'inspect'],
capabilities: {
resourceActions: [
{name: 'list', label: 'List services', enabled: true, status: 'available', runtimeRequired: true},
{name: 'create', label: 'Deploy service', enabled: true, status: 'available', runtimeRequired: true},
{name: 'delete', label: 'Delete service', enabled: true, status: 'available', runtimeRequired: true},
{name: 'inspect', label: 'Inspect service', enabled: true, status: 'available', runtimeRequired: true},
],
},
filters: containerFilters,
columns: containerColumns,
}
}
export function containersSchemaFor(cloud: CloudProvider): ServiceSchema | null {
return cloud === 'gcp' ? gcpContainersSchema() : null
}