Skip to content

Commit 736b3c3

Browse files
committed
patch(feat): octo has a new model - Subnet.
1 parent 644fd8a commit 736b3c3

File tree

7 files changed

+129
-11
lines changed

7 files changed

+129
-11
lines changed

packages/octo/src/index.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
export { Anchor } from './decorators/anchor.decorator.js';
21
export { Action } from './decorators/action.decorator.js';
2+
export { Anchor } from './decorators/anchor.decorator.js';
33
export { Container } from './decorators/container.js';
44
export { EnableHook } from './decorators/enable-hook.decorator.js';
55
export { Factory } from './decorators/factory.decorator.js';
@@ -13,26 +13,28 @@ export { Diff, DiffAction } from './functions/diff/diff.js';
1313
export { DiffUtility } from './functions/diff/diff.utility.js';
1414
export { DiffMetadata } from './functions/diff/diff-metadata.js';
1515

16-
export { App } from './models/app/app.model.js';
1716
export { IApp } from './models/app/app.interface.js';
18-
export { Deployment } from './models/deployment/deployment.model.js';
17+
export { App } from './models/app/app.model.js';
1918
export { IDeployment } from './models/deployment/deployment.interface.js';
20-
export { Environment } from './models/environment/environment.model.js';
19+
export { Deployment } from './models/deployment/deployment.model.js';
2120
export { IEnvironment } from './models/environment/environment.interface.js';
22-
export { Execution } from './models/execution/execution.model.js';
21+
export { Environment } from './models/environment/environment.model.js';
2322
export { IExecution } from './models/execution/execution.interface.js';
24-
export { IImageDockerOptions, Image } from './models/image/image.model.js';
23+
export { Execution } from './models/execution/execution.model.js';
2524
export { IImage } from './models/image/image.interface.js';
26-
export { Pipeline } from './models/pipeline/pipeline.model.js';
25+
export { IImageDockerOptions, Image } from './models/image/image.model.js';
2726
export { IPipeline } from './models/pipeline/pipeline.interface.js';
28-
export { Region } from './models/region/region.model.js';
27+
export { Pipeline } from './models/pipeline/pipeline.model.js';
2928
export { IRegion } from './models/region/region.interface.js';
30-
export { Server } from './models/server/server.model.js';
29+
export { Region } from './models/region/region.model.js';
3130
export { IServer } from './models/server/server.interface.js';
32-
export { Service } from './models/service/service.model.js';
31+
export { Server } from './models/server/server.model.js';
3332
export { IService } from './models/service/service.interface.js';
34-
export { Support } from './models/support/support.model.js';
33+
export { Service } from './models/service/service.model.js';
34+
export { ISubnet } from './models/subnet/subnet.interface.js';
35+
export { Subnet } from './models/subnet/subnet.model.js';
3536
export { ISupport } from './models/support/support.interface.js';
37+
export { Support } from './models/support/support.model.js';
3638

3739
export { AModel } from './models/model.abstract.js';
3840
export { IModel, IModelReference } from './models/model.interface.js';

packages/octo/src/models/region/region.model.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { UnknownModel } from '../../app.type.js';
44
import { Model } from '../../decorators/model.decorator.js';
55
import { Environment } from '../environment/environment.model.js';
66
import { AModel } from '../model.abstract.js';
7+
import { Subnet } from '../subnet/subnet.model.js';
78
import { IRegion } from './region.interface.js';
89

910
@Model()
@@ -14,6 +15,7 @@ export class Region extends AModel<IRegion, Region> {
1415

1516
constructor(regionId: string) {
1617
super();
18+
1719
this.regionId = regionId;
1820
}
1921

@@ -29,6 +31,18 @@ export class Region extends AModel<IRegion, Region> {
2931
this.addChild('regionId', environment, 'environmentName');
3032
}
3133

34+
addSubnet(subnet: Subnet): void {
35+
const childrenDependencies = this.getChildren('subnet');
36+
if (!childrenDependencies['subnet']) childrenDependencies['subnet'] = [];
37+
38+
// Check for duplicates.
39+
const subnets = childrenDependencies['subnet'].map((d) => d.to);
40+
if (subnets.find((z: Subnet) => z.subnetId === subnet.subnetId)) {
41+
throw new Error('Subnet already exists!');
42+
}
43+
this.addChild('regionId', subnet, 'subnetId');
44+
}
45+
3246
getContext(): string {
3347
const parents = this.getParents();
3448
const app = parents['app'][0].to;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { IModelReference } from '../model.interface.js';
2+
import { Subnet } from './subnet.model.js';
3+
4+
export interface ISubnet {
5+
region: IModelReference;
6+
subnetId: Subnet['subnetId'];
7+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { UnknownModel } from '../../app.type.js';
2+
import { Model } from '../../decorators/model.decorator.js';
3+
import { AModel } from '../model.abstract.js';
4+
import { Region } from '../region/region.model.js';
5+
import { ISubnet } from './subnet.interface.js';
6+
7+
@Model()
8+
export class Subnet extends AModel<ISubnet, Subnet> {
9+
readonly MODEL_NAME: string = 'subnet';
10+
11+
readonly subnetId: string;
12+
13+
constructor(region: Region, name: string) {
14+
super();
15+
16+
this.subnetId = region.regionId + '-' + name;
17+
}
18+
19+
getContext(): string {
20+
const parents = this.getParents();
21+
const region = parents['region'][0].to;
22+
return [`${this.MODEL_NAME}=${this.subnetId}`, region.getContext()].join(',');
23+
}
24+
25+
synth(): ISubnet {
26+
const parents = this.getParents();
27+
const region = parents['region'][0].to as Region;
28+
29+
return {
30+
region: { context: region.getContext() },
31+
subnetId: this.subnetId,
32+
};
33+
}
34+
35+
static override async unSynth(
36+
subnet: ISubnet,
37+
deReferenceContext: (context: string) => Promise<UnknownModel>,
38+
): Promise<Subnet> {
39+
const region = (await deReferenceContext(subnet.region.context)) as Region;
40+
return new Subnet(region, subnet.subnetId);
41+
}
42+
}

packages/octo/test/app.e2e-spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
ModelSerializationService,
88
Region,
99
Server,
10+
Subnet,
1011
Support,
1112
} from '../src/index.js';
1213

@@ -34,6 +35,9 @@ describe('App E2E Test', () => {
3435
const qaEnvironment1 = region1.getChild('environment', [{ key: 'environmentName', value: 'qa' }]) as Environment;
3536
// Add a deployment to backend server.
3637
backendServer1.addDeployment(new Deployment('backend@v0.0.1'));
38+
// Add a new subnet.
39+
const publicSubnet1 = new Subnet(region1, 'public');
40+
region1.addSubnet(publicSubnet1);
3741
// Add a new staging environment.
3842
const stagingEnvironment1 = new Environment('staging');
3943
stagingEnvironment1.environmentVariables.set('env', 'staging');
@@ -73,6 +77,11 @@ describe('App E2E Test', () => {
7377
"value": "staging",
7478
},
7579
},
80+
{
81+
"action": "add",
82+
"field": "subnetId",
83+
"value": "region-1-public",
84+
},
7685
{
7786
"action": "add",
7887
"field": "deploymentTag",

packages/octo/test/models/__snapshots__/model.e2e-spec.ts.snap

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ exports[`Model E2E Test common functions Test app getBoundaryMembers() 1`] = `
1717
"region=region-1,app=test",
1818
"service=testService,app=test",
1919
"server=backend,app=test",
20+
"subnet=region-1-public,region=region-1,app=test",
2021
"pipeline=testPipeline,app=test",
2122
]
2223
`;
@@ -258,6 +259,7 @@ exports[`Model E2E Test common functions Test region getBoundaryMembers() 1`] =
258259
[
259260
"region=region-1,app=test",
260261
"app=test",
262+
"subnet=region-1-public,region=region-1,app=test",
261263
"environment=qa,region=region-1,app=test",
262264
"execution=nginx@v1_qa,deployment=nginx@v1,support=nginx,app=test,environment=qa,region=region-1,app=test",
263265
"image=image:0.0.1,app=test",
@@ -269,6 +271,7 @@ exports[`Model E2E Test common functions Test region getBoundaryMembers() 1`] =
269271
exports[`Model E2E Test common functions Test region getChildren() 1`] = `
270272
[
271273
"environment",
274+
"subnet",
272275
]
273276
`;
274277

@@ -347,6 +350,41 @@ exports[`Model E2E Test common functions Test service getParents() 1`] = `
347350

348351
exports[`Model E2E Test common functions Test service synth() 1`] = `"Method not implemented! Use subclass"`;
349352

353+
exports[`Model E2E Test common functions Test subnet getAncestors() 1`] = `
354+
[
355+
"subnet=region-1-public,region=region-1,app=test",
356+
"region=region-1,app=test",
357+
"app=test",
358+
]
359+
`;
360+
361+
exports[`Model E2E Test common functions Test subnet getBoundaryMembers() 1`] = `
362+
[
363+
"subnet=region-1-public,region=region-1,app=test",
364+
"region=region-1,app=test",
365+
"app=test",
366+
]
367+
`;
368+
369+
exports[`Model E2E Test common functions Test subnet getChildren() 1`] = `[]`;
370+
371+
exports[`Model E2E Test common functions Test subnet getContext() 1`] = `"subnet=region-1-public,region=region-1,app=test"`;
372+
373+
exports[`Model E2E Test common functions Test subnet getParents() 1`] = `
374+
[
375+
"region",
376+
]
377+
`;
378+
379+
exports[`Model E2E Test common functions Test subnet synth() 1`] = `
380+
{
381+
"region": {
382+
"context": "region=region-1,app=test",
383+
},
384+
"subnetId": "region-1-public",
385+
}
386+
`;
387+
350388
exports[`Model E2E Test common functions Test support getAncestors() 1`] = `
351389
[
352390
"support=nginx,app=test",

packages/octo/test/models/model.e2e-spec.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
Region,
99
Server,
1010
Service,
11+
Subnet,
1112
Support,
1213
UnknownModel,
1314
} from '../../src/index.js';
@@ -23,6 +24,7 @@ describe('Model E2E Test', () => {
2324
const region = new Region('region-1');
2425
const server = new Server('backend', image);
2526
const service = new Service('testService');
27+
const subnet = new Subnet(region, 'public');
2628
const support = new Support('nginx', 'nginx');
2729
const deployment = new Deployment('nginx@v1');
2830
const environment = new Environment('qa');
@@ -36,6 +38,7 @@ describe('Model E2E Test', () => {
3638
app.addSupport(support);
3739
support.addDeployment(deployment);
3840
region.addEnvironment(environment);
41+
region.addSubnet(subnet);
3942

4043
const testCases: {
4144
model: UnknownModel;
@@ -68,6 +71,9 @@ describe('Model E2E Test', () => {
6871
{
6972
model: service,
7073
},
74+
{
75+
model: subnet,
76+
},
7177
{
7278
model: support,
7379
},

0 commit comments

Comments
 (0)