Skip to content

Commit ad29df8

Browse files
committed
patch(feat): octo-aws-cdk security-group overlay.
1 parent a202ed4 commit ad29df8

File tree

5 files changed

+152
-0
lines changed

5 files changed

+152
-0
lines changed

packages/octo-aws-cdk/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ import './models/subnet/actions/update-subnet-association.model.action.js';
5353
export { AwsRegionSharedEfsModule } from './modules/aws-region-shared-efs.module.js';
5454
export { S3WebsiteSaveManifestModule } from './modules/s3-website-save-manifest.module.js';
5555

56+
import './overlays/security-group/actions/add-security-group.overlay.action.js';
57+
import './overlays/security-group/actions/update-security-group.overlay.action.js';
58+
5659
import './resources/ecr/actions/add-ecr-image.resource.action.js';
5760
import './resources/ecr/actions/delete-ecr-image.resource.action.js';
5861

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { Action, ActionInputs, ActionOutputs, Diff, DiffAction, Factory, IModelAction, ModelType } from '@quadnix/octo';
2+
import { SecurityGroupAnchor } from '../../../anchors/security-group.anchor.js';
3+
import { SecurityGroup } from '../../../resources/security-group/security-group.resource.js';
4+
import { Vpc } from '../../../resources/vpc/vpc.resource.js';
5+
import { ISecurityGroupOverlayProperties } from '../security-group.overlay.interface.js';
6+
import { SecurityGroupOverlay } from '../security-group.overlay.js';
7+
8+
@Action(ModelType.OVERLAY)
9+
export class AddSecurityGroupOverlayAction implements IModelAction {
10+
readonly ACTION_NAME: string = 'AddSecurityGroupOverlayAction';
11+
12+
collectInput(diff: Diff): string[] {
13+
const securityGroupOverlay = diff.model as SecurityGroupOverlay;
14+
const properties = securityGroupOverlay.properties as unknown as ISecurityGroupOverlayProperties;
15+
16+
return [`resource.vpc-${properties.regionId}`];
17+
}
18+
19+
filter(diff: Diff): boolean {
20+
return (
21+
diff.action === DiffAction.ADD && diff.model.MODEL_NAME === 'security-group-overlay' && diff.field === 'overlayId'
22+
);
23+
}
24+
25+
async handle(diff: Diff, actionInputs: ActionInputs): Promise<ActionOutputs> {
26+
const securityGroupOverlay = diff.model as SecurityGroupOverlay;
27+
const properties = securityGroupOverlay.properties as unknown as ISecurityGroupOverlayProperties;
28+
const anchor = diff.value as SecurityGroupAnchor;
29+
30+
const vpc = actionInputs[`resource.vpc-${properties.regionId}`] as Vpc;
31+
32+
const securityGroup = new SecurityGroup(
33+
`sec-grp-${properties.regionId}-${anchor.anchorId}`,
34+
{
35+
awsRegionId: properties.awsRegionId,
36+
rules: anchor.rules,
37+
},
38+
[vpc],
39+
);
40+
41+
const output: ActionOutputs = {};
42+
output[securityGroup.resourceId] = securityGroup;
43+
44+
return output;
45+
}
46+
47+
async revert(): Promise<ActionOutputs> {
48+
return {};
49+
}
50+
}
51+
52+
@Factory<AddSecurityGroupOverlayAction>(AddSecurityGroupOverlayAction)
53+
export class AddSecurityGroupOverlayActionFactory {
54+
static async create(): Promise<AddSecurityGroupOverlayAction> {
55+
return new AddSecurityGroupOverlayAction();
56+
}
57+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { Action, ActionInputs, ActionOutputs, Diff, DiffAction, Factory, IModelAction, ModelType } from '@quadnix/octo';
2+
import { SecurityGroupAnchor } from '../../../anchors/security-group.anchor.js';
3+
import { SecurityGroup } from '../../../resources/security-group/security-group.resource.js';
4+
import { ISecurityGroupOverlayProperties } from '../security-group.overlay.interface.js';
5+
import { SecurityGroupOverlay } from '../security-group.overlay.js';
6+
7+
@Action(ModelType.OVERLAY)
8+
export class UpdateSecurityGroupOverlayAction implements IModelAction {
9+
readonly ACTION_NAME: string = 'UpdateSecurityGroupOverlayAction';
10+
11+
collectInput(diff: Diff): string[] {
12+
const securityGroupOverlay = diff.model as SecurityGroupOverlay;
13+
const properties = securityGroupOverlay.properties as unknown as ISecurityGroupOverlayProperties;
14+
const anchor = diff.value as SecurityGroupAnchor;
15+
16+
return [`resource.sec-grp-${properties.regionId}-${anchor.anchorId}`];
17+
}
18+
19+
filter(diff: Diff): boolean {
20+
return (
21+
diff.action === DiffAction.UPDATE &&
22+
diff.model.MODEL_NAME === 'security-group-overlay' &&
23+
diff.field === 'overlayId'
24+
);
25+
}
26+
27+
async handle(diff: Diff, actionInputs: ActionInputs): Promise<ActionOutputs> {
28+
const securityGroupOverlay = diff.model as SecurityGroupOverlay;
29+
const properties = securityGroupOverlay.properties as unknown as ISecurityGroupOverlayProperties;
30+
const anchor = diff.value as SecurityGroupAnchor;
31+
32+
const securityGroup = actionInputs[`resource.sec-grp-${properties.regionId}-${anchor.anchorId}`] as SecurityGroup;
33+
securityGroup.properties.rules = anchor.rules;
34+
35+
const output: ActionOutputs = {};
36+
output[securityGroup.resourceId] = securityGroup;
37+
38+
return output;
39+
}
40+
41+
async revert(): Promise<ActionOutputs> {
42+
return {};
43+
}
44+
}
45+
46+
@Factory<UpdateSecurityGroupOverlayAction>(UpdateSecurityGroupOverlayAction)
47+
export class UpdateSecurityGroupOverlayActionFactory {
48+
static async create(): Promise<UpdateSecurityGroupOverlayAction> {
49+
return new UpdateSecurityGroupOverlayAction();
50+
}
51+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export interface ISecurityGroupOverlayProperties {
2+
awsRegionId: string;
3+
regionId: string;
4+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { AOverlay, Diff, DiffAction, DiffUtility, IOverlay, IResource, Overlay } from '@quadnix/octo';
2+
import { SecurityGroupAnchor } from '../../anchors/security-group.anchor.js';
3+
import { ISecurityGroupOverlayProperties } from './security-group.overlay.interface.js';
4+
5+
@Overlay()
6+
export class SecurityGroupOverlay extends AOverlay<SecurityGroupOverlay> {
7+
override readonly MODEL_NAME: string = 'security-group-overlay';
8+
9+
constructor(
10+
overlayId: IOverlay['overlayId'],
11+
properties: ISecurityGroupOverlayProperties,
12+
anchors: [SecurityGroupAnchor, SecurityGroupAnchor] | [SecurityGroupAnchor],
13+
) {
14+
super(overlayId, properties as unknown as IResource['properties'], anchors);
15+
}
16+
17+
override async diff(previous?: SecurityGroupOverlay): Promise<Diff[]> {
18+
const diffs: Diff[] = [];
19+
20+
// Include diff of each anchor rules.
21+
if (previous) {
22+
for (let i = 0; i < this.anchors.length; i++) {
23+
const anchor = this.anchors[i] as SecurityGroupAnchor;
24+
25+
if (!DiffUtility.isObjectDeepEquals((previous.anchors[i] as SecurityGroupAnchor).rules, anchor.rules)) {
26+
diffs.push(new Diff(this, DiffAction.UPDATE, 'overlayId', anchor));
27+
}
28+
}
29+
} else {
30+
for (const anchor of this.anchors) {
31+
diffs.push(new Diff(this, DiffAction.ADD, 'overlayId', anchor));
32+
}
33+
}
34+
35+
return diffs;
36+
}
37+
}

0 commit comments

Comments
 (0)