import type { IInstance, IInstanceCounts, ILoadBalancer, ILoadBalancerDeleteCommand, ILoadBalancerUpsertCommand, ISubnet } from '@spinnaker/core'; import type { IAmazonLoadBalancerSourceData } from './IAmazonLoadBalancerSourceData'; import type { IAmazonServerGroup } from './IAmazonServerGroup'; import type { IAuthenticateOidcActionConfig } from '../loadBalancer/OidcConfigReader'; export type ClassicListenerProtocol = 'HTTP' | 'HTTPS' | 'TCP' | 'SSL'; export type ALBListenerProtocol = 'HTTP' | 'HTTPS'; export type IListenerActionType = 'forward' | 'authenticate-oidc' | 'redirect'; export type NLBListenerProtocol = 'TCP' | 'TLS' | 'UDP'; export interface IAmazonLoadBalancer extends ILoadBalancer { availabilityZones?: string[]; credentials?: string; detachedInstances?: IInstance[]; elb?: IAmazonLoadBalancerSourceData; isInternal?: boolean; regionZones: string[]; serverGroups: IAmazonServerGroup[]; subnets?: string[]; subnetDetails?: ISubnet[]; subnetType?: string; } export interface IClassicListener { internalProtocol: ClassicListenerProtocol; internalPort: number; externalProtocol: ClassicListenerProtocol; externalPort: number; sslCertificateType?: string; } export interface IAmazonClassicLoadBalancer extends IAmazonLoadBalancer { healthCheckPath: string; healthCheckPort: number; healthCheckProtocol: string; healthTimeout: number; healthInterval: number; healthyThreshold: number; listeners: IClassicListener[]; unhealthyThreshold: number; idleTimeout?: number; } export interface IAmazonApplicationLoadBalancer extends IAmazonLoadBalancer { listeners: IALBListener[]; targetGroups: ITargetGroup[]; ipAddressType?: string; deletionProtection: boolean; idleTimeout: number; loadBalancingCrossZone: boolean; } export interface IAmazonNetworkLoadBalancer extends IAmazonLoadBalancer { listeners: INLBListener[]; targetGroups: ITargetGroup[]; ipAddressType?: string; deletionProtection: boolean; idleTimeout: number; loadBalancingCrossZone: boolean; } export interface IRedirectActionConfig { host?: string; path?: string; port?: string; protocol?: 'HTTP' | 'HTTPS' | '#{protocol}'; query?: string; statusCode: 'HTTP_301' | 'HTTP_302'; } export interface IListenerAction { authenticateOidcConfig?: IAuthenticateOidcActionConfig; order?: number; redirectActionConfig?: IRedirectActionConfig; redirectConfig?: IRedirectActionConfig; targetGroupName?: string; type: IListenerActionType; } export interface IALBListenerCertificate { certificateArn: string; type: string; name: string; } export interface IALBListener { certificates: IALBListenerCertificate[]; defaultActions: IListenerAction[]; port: number; protocol: string; rules: IListenerRule[]; sslPolicy?: string; } export interface INLBListener { certificates: IALBListenerCertificate[]; defaultActions: IListenerAction[]; port: number; protocol: string; rules: IListenerRule[]; sslPolicy?: string; } export interface IListenerRule { actions: IListenerAction[]; default?: boolean; conditions: IListenerRuleCondition[]; priority: number | 'default'; } export type ListenerRuleConditionField = 'path-pattern' | 'host-header' | 'http-request-method'; export interface IListenerRuleCondition { field: ListenerRuleConditionField; httpRequestMethodConfig?: { values: string[]; }; values: string[]; } export interface ITargetGroupAttributes { deregistrationDelay: number; stickinessEnabled: boolean; stickinessType: string; stickinessDuration: number; } export interface ITargetGroup { account: string; attributes?: ITargetGroupAttributes; cloudProvider: string; detachedInstances?: IInstance[]; healthCheckProtocol: string; healthCheckPort: number | 'traffic-port'; healthCheckPath: string; healthTimeout: number; healthInterval: number; healthyThreshold: number; unhealthyThreshold: number; instanceCounts?: IInstanceCounts; instances?: IInstance[]; loadBalancerNames: string[]; name: string; port: number; protocol: string; provider?: string; region: string; serverGroups?: IAmazonServerGroup[]; targetType?: string; type: string; vpcId?: string; vpcName?: string; } export interface IListenerDescription { certificates?: IALBListenerCertificate[]; protocol: ALBListenerProtocol | NLBListenerProtocol; port: number; sslPolicy?: string; defaultActions: IListenerAction[]; rules?: IListenerRule[]; } export interface IALBTargetGroupDescription { name: string; protocol: 'HTTP' | 'HTTPS' | 'TCP' | 'TLS'; port: number; targetType: 'instance' | 'ip' | 'lambda'; attributes: { deregistrationDelay?: number; stickinessEnabled?: boolean; stickinessType?: 'lb_cookie'; stickinessDuration?: number; multiValueHeadersEnabled?: boolean; }; healthCheckInterval?: number; healthCheckMatcher?: string; healthCheckPath: string; healthCheckPort: string; healthCheckProtocol: 'HTTP' | 'HTTPS' | 'TCP'; healthyThreshold?: number; healthCheckTimeout?: number; unhealthyThreshold?: number; } export interface INLBTargetGroupDescription { name: string; protocol: 'TCP'; port: number; targetType: 'instance' | 'ip'; attributes: { deregistrationDelay?: number; deregistrationDelayConnectionTermination?: boolean; preserveClientIp?: boolean; }; healthCheckInterval?: number; healthCheckPort: string; healthCheckProtocol: 'TCP' | 'HTTP' | 'HTTPS'; healthCheckPath: string; healthyThreshold?: number; healthCheckTimeout?: number; unhealthyThreshold?: number; } export interface IAmazonLoadBalancerUpsertCommand extends ILoadBalancerUpsertCommand { availabilityZones: { [region: string]: string[]; }; isInternal: boolean; listeners: any[]; loadBalancerType?: 'classic' | 'application' | 'network'; regionZones: string[]; securityGroups: string[]; subnetType: string; usePreferredZones?: boolean; vpcId: string; } export interface IAmazonLoadBalancerDeleteCommand extends ILoadBalancerDeleteCommand { loadBalancerType: string; } export interface IClassicListenerDescription extends IClassicListener { sslCertificateId?: string; sslCertificateName?: string; policyNames?: string[]; } export interface IAmazonClassicLoadBalancerUpsertCommand extends IAmazonLoadBalancerUpsertCommand { healthCheck: string; healthCheckPath: string; healthCheckProtocol: string; healthCheckPort: number; healthInterval?: number; healthTimeout?: number; healthyThreshold?: number; listeners: IClassicListenerDescription[]; unhealthyThreshold?: number; idleTimeout?: number; } export interface IAmazonApplicationLoadBalancerUpsertCommand extends IAmazonLoadBalancerUpsertCommand { deletionProtection: boolean; ipAddressType?: string; idleTimeout: number; listeners: IListenerDescription[]; targetGroups: IALBTargetGroupDescription[]; } export interface IAmazonNetworkLoadBalancerUpsertCommand extends IAmazonLoadBalancerUpsertCommand { deletionProtection: boolean; loadBalancingCrossZone: boolean; listeners: IListenerDescription[]; targetGroups: INLBTargetGroupDescription[]; }