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

63 lines
3.0 KiB
TypeScript

import type {ServiceSchema} from './types'
export function awsLogsSchema(): ServiceSchema {
return {
cloud: 'aws',
service: 'logs',
displayName: 'CloudWatch Logs',
fields: [
{
name: 'name',
label: 'Log group name',
type: 'text',
required: true,
validation: {
minLength: 1,
maxLength: 512,
pattern: '^[A-Za-z0-9_./#-]+$',
message: 'Use letters, numbers, underscore, dot, slash, hash, or dash.',
},
},
],
actions: ['list', 'create', 'delete', 'inspect'],
capabilities: {
resourceActions: [
{name: 'list', label: 'List log groups', enabled: true, status: 'available', runtimeRequired: true},
{name: 'create', label: 'Create log group', enabled: true, status: 'available', runtimeRequired: true},
{name: 'delete', label: 'Delete log group', enabled: true, status: 'available', runtimeRequired: true},
{name: 'inspect', label: 'Inspect metadata', enabled: true, status: 'available', runtimeRequired: true},
],
collectionActions: [
{name: 'list', label: 'List log streams', enabled: true, status: 'available', runtimeRequired: true},
{name: 'create', label: 'Create log stream', enabled: true, status: 'available', runtimeRequired: true},
{name: 'delete', label: 'Delete log stream', enabled: true, status: 'available', runtimeRequired: true},
],
// Read-only leaf, and that is the provider's shape rather than a gap:
// AWS has no DeleteLogEvent, and writing events from a resource
// browser is not something a console should offer.
itemActions: [
{name: 'list', label: 'Read log events', enabled: true, status: 'available', runtimeRequired: true},
],
},
filters: [
{
name: 'search',
label: 'Name starts with',
type: 'text',
required: false,
description: 'CloudWatch filters log groups by prefix, not by substring.',
},
],
columns: [
{name: 'name', label: 'Log group'},
// No 'Stored' column here, deliberately: the runtime's DescribeLogGroups
// always reports storedBytes as 0 at the group level (only the stream
// level is accurate), so a table cell showing "0 B" would tell the user
// a populated group is empty. The field still travels in
// metadata.storedBytes for anyone reading the resource directly.
{name: 'retentionInDays', label: 'Retention', path: 'metadata.retentionInDays', emptyText: 'Never expires'},
{name: 'createdAt', label: 'Created', format: 'datetime'},
],
}
}