87 lines
3.8 KiB
TypeScript
87 lines
3.8 KiB
TypeScript
import type {FieldSchema, ServiceSchema, TableColumnSchema} from './types'
|
|
|
|
const loadBalancerColumns: TableColumnSchema[] = [
|
|
{name: 'name', label: 'Name'},
|
|
{name: 'status', label: 'State', format: 'badge'},
|
|
{name: 'lbType', label: 'Type', path: 'metadata.lbType'},
|
|
{name: 'scheme', label: 'Scheme', path: 'metadata.scheme'},
|
|
{name: 'dnsName', label: 'DNS Name', path: 'metadata.dnsName', format: 'code', emptyText: '—'},
|
|
{name: 'createdAt', label: 'Created', format: 'datetime'},
|
|
]
|
|
|
|
const loadBalancerFilters: FieldSchema[] = [{name: 'search', label: 'Search', type: 'text', required: false}]
|
|
|
|
export const ELB_SCHEMES = ['internet-facing', 'internal'] as const
|
|
|
|
/** ELBv2 names: up to 32 chars, alphanumerics and hyphens, no leading/trailing hyphen. */
|
|
export const ELB_NAME_PATTERN = '^[a-zA-Z0-9]([a-zA-Z0-9-]{0,30}[a-zA-Z0-9])?$'
|
|
|
|
export function awsLoadBalancingSchema(): ServiceSchema {
|
|
return {
|
|
cloud: 'aws',
|
|
service: 'loadbalancing',
|
|
displayName: 'AWS Elastic Load Balancing',
|
|
fields: [
|
|
{
|
|
name: 'name',
|
|
label: 'Load Balancer Name',
|
|
type: 'text',
|
|
required: true,
|
|
group: 'Required',
|
|
validation: {
|
|
pattern: ELB_NAME_PATTERN,
|
|
minLength: 1,
|
|
maxLength: 32,
|
|
message: 'Up to 32 characters: letters, digits and hyphens, not starting or ending with a hyphen.',
|
|
},
|
|
},
|
|
{
|
|
name: 'subnets',
|
|
label: 'Subnet IDs',
|
|
type: 'text',
|
|
required: true,
|
|
span: true,
|
|
group: 'Required',
|
|
// Follows the compute schema, which takes security group ids the
|
|
// same way rather than pushing create into a bespoke panel.
|
|
description:
|
|
'Two or more subnet ids, comma separated — e.g. subnet-aaa, subnet-bbb. ELB requires them to be in different availability zones.',
|
|
},
|
|
{
|
|
name: 'scheme',
|
|
label: 'Scheme',
|
|
type: 'select',
|
|
required: false,
|
|
description: 'Defaults to internet-facing.',
|
|
options: ELB_SCHEMES.map((value) => ({label: value, value})),
|
|
},
|
|
],
|
|
actions: ['list', 'create', 'update', 'delete', 'inspect'],
|
|
updateFields: [
|
|
{name: 'securityGroups', label: 'Security Groups', type: 'text', required: true, valuePath: 'metadata.securityGroups'},
|
|
],
|
|
capabilities: {
|
|
resourceActions: [
|
|
{name: 'list', label: 'List load balancers', enabled: true, status: 'available', runtimeRequired: true},
|
|
{name: 'inspect', label: 'Inspect', enabled: true, status: 'available', runtimeRequired: true},
|
|
{
|
|
name: 'create',
|
|
label: 'Create load balancer',
|
|
enabled: true,
|
|
status: 'available',
|
|
runtimeRequired: true,
|
|
},
|
|
{name: 'update', label: 'Set security groups', enabled: true, status: 'available', runtimeRequired: true},
|
|
{name: 'delete', label: 'Delete', enabled: true, status: 'available', runtimeRequired: true},
|
|
],
|
|
itemActions: [
|
|
{name: 'list', label: 'List listeners', enabled: true, status: 'available', runtimeRequired: true},
|
|
{name: 'put', label: 'Create listener', enabled: true, status: 'available', runtimeRequired: true},
|
|
{name: 'delete', label: 'Delete listener', enabled: true, status: 'available', runtimeRequired: true},
|
|
],
|
|
},
|
|
filters: loadBalancerFilters,
|
|
columns: loadBalancerColumns,
|
|
}
|
|
}
|