70cfd4bc96
CI / checks (pull_request) Successful in 26m54s
Create groups from a launch template (in the default subnets unless given), change their minimum, desired and maximum capacity, replace or remove an instance, and follow the launches and terminations TheCloud's reconciler makes. Deleting a group terminates its instances. Scaling policies are not offered: the runtime stores them but its alarms only drive ECS scaling.
104 lines
5.0 KiB
TypeScript
104 lines
5.0 KiB
TypeScript
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
|
|
}
|