import type {CloudProvider, FieldSchema, ServiceSchema, TableColumnSchema} from './types' /** CreateAutoScalingGroup's name rule: 1 to 255 characters, no colon. */ export const AUTO_SCALING_GROUP_NAME_PATTERN = '^[^:]{1,255}$' /** A capacity the console accepts; AWS's own ceiling is far above what a laptop can run. */ export const AUTO_SCALING_MAX_INSTANCES = 20 const groupColumns: TableColumnSchema[] = [ {name: 'name', label: 'Name'}, {name: 'capacity', label: 'Instances', path: 'metadata.capacity'}, {name: 'desired', label: 'Desired', path: 'metadata.desiredCapacity'}, {name: 'min', label: 'Min', path: 'metadata.minSize'}, {name: 'max', label: 'Max', path: 'metadata.maxSize'}, {name: 'launchTemplate', label: 'Launch template', path: 'metadata.launchTemplateName', emptyText: '—'}, {name: 'createdAt', label: 'Created', format: 'datetime'}, ] const groupFilters: FieldSchema[] = [{name: 'search', label: 'Search', type: 'text', required: false}] const capacity = {pattern: '^\\d{1,2}$', message: `Use a whole number from 0 to ${AUTO_SCALING_MAX_INSTANCES}`} export function awsAutoScalingSchema(): ServiceSchema { return { cloud: 'aws', service: 'autoscaling', displayName: 'EC2 Auto Scaling groups', fields: [ { name: 'name', label: 'Name', type: 'text', required: true, validation: {pattern: AUTO_SCALING_GROUP_NAME_PATTERN, message: 'Use up to 255 characters, without a colon'}, }, { name: 'launchTemplate', label: 'Launch template', type: 'text', required: true, description: 'The name or ID (lt-…) of an EC2 launch template. New instances use its image and instance type.', }, { name: 'launchTemplateVersion', label: 'Template version', type: 'text', required: false, defaultValue: '$Latest', description: 'A version number, $Latest or $Default.', validation: {pattern: '^(\\d+|\\$Latest|\\$Default)$', message: 'Use a version number, $Latest or $Default'}, }, {name: 'minSize', label: 'Minimum', type: 'text', required: true, defaultValue: '1', validation: capacity}, {name: 'desiredCapacity', label: 'Desired', type: 'text', required: false, defaultValue: '1', validation: capacity, description: 'How many instances to run now. Between the minimum and the maximum.'}, {name: 'maxSize', label: 'Maximum', type: 'text', required: true, defaultValue: '2', validation: capacity}, { name: 'subnets', label: 'Subnets', type: 'text', required: false, span: true, description: 'Subnet IDs to launch into, separated by commas. Leave empty for the default subnets.', validation: {pattern: '^\\s*subnet-[\\w-]+(\\s*,\\s*subnet-[\\w-]+)*\\s*$', message: 'Use subnet IDs separated by commas'}, }, { name: 'targetGroupArns', label: 'Target groups', type: 'textarea', required: false, span: true, description: 'Optional load balancer target group ARNs, one per line. Instances are registered with them as they launch.', }, { name: 'healthCheckType', label: 'Health check', type: 'select', required: false, defaultValue: 'EC2', options: [ {label: 'EC2 instance status', value: 'EC2'}, {label: 'Load balancer health checks', value: 'ELB'}, ], }, ], actions: ['list', 'create', 'delete', 'inspect'], capabilities: { resourceActions: [ {name: 'list', label: 'List Auto Scaling groups', enabled: true, status: 'available', runtimeRequired: true}, {name: 'create', label: 'Create Auto Scaling group', enabled: true, status: 'available', runtimeRequired: true}, {name: 'delete', label: 'Delete group and its instances', enabled: true, status: 'available', runtimeRequired: true}, {name: 'inspect', label: 'Inspect Auto Scaling group', enabled: true, status: 'available', runtimeRequired: true}, ], autoScalingActions: [ {name: 'setCapacity', label: 'Change minimum, desired and maximum', enabled: true, status: 'available', runtimeRequired: true}, {name: 'terminateInstance', label: 'Terminate an instance', enabled: true, status: 'available', runtimeRequired: true}, ], }, filters: groupFilters, columns: groupColumns, } } export function autoScalingSchemaFor(cloud: CloudProvider): ServiceSchema | null { return cloud === 'aws' ? awsAutoScalingSchema() : null }