Skip to content

Commit 53bce87

Browse files
committed
feat(IPAM): More TypeScript Access to YAML
1 parent a01f613 commit 53bce87

File tree

15 files changed

+266
-75
lines changed

15 files changed

+266
-75
lines changed

schemas/IPAM.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"community":{"type":"object","additionalProperties":false,"$id":"#community","description":"Community","properties":{"contact":{"type":"string","description":"Community Contact ID"},"name":{"type":"string","description":"Community Friendly Name"},"id":{"type":"string","description":"Short form community code","examples":["sxl"]},"sites":{"type":"array","items":{"$ref":"#/definitions/communitySite"}}},"required":["name","id","sites"]},"communitySite":{"type":"object","additionalProperties":false,"description":"Community Site","properties":{"id":{"type":"string","description":"Site short id"},"name":{"type":"string"},"devices":{"type":"array","items":{"$ref":"#/definitions/device"}}},"required":["id","name"]},"contact":{"type":"object","additionalProperties":false,"$id":"#contact","description":"Community Contact","properties":{"id":{"type":"string","description":"Unique contact ID"},"name":{"type":"string","description":"Contact Full Name"}},"required":["id","name"]},"device":{"type":"object","additionalProperties":false,"$id":"#device","description":"Network Device","properties":{"id":{"type":"string","description":"Chained ID"},"name":{"type":"string","description":"Friendly name"},"type":{"$ref":"#/definitions/networkDeviceType"}},"required":["id","name"]},"networkcircuit":{"type":"object","additionalProperties":false,"description":"NetworkCircuit","properties":{"id":{"type":"string","description":"Circuit Id"},"speed":{"type":"string","description":"Circuit Speed"}},"required":["id"]},"networkDeviceLink":{"type":"object","additionalProperties":false,"description":"Link a Network to a device","properties":{"id":{"type":"string","description":"Device id"},"interface":{"type":"string","description":"Device interface"}},"required":["id"]},"circuitLocation":{"type":"object","description":"Traditional external circuits","properties":{"id":{"type":"string","description":"External circuit id"},"provider":{"type":"string","description":"External circuit provider"},"communuity":{"type":"string","description":"Community ID"},"address":{"type":"string","description":"Address provided to external provider"},"demarcSpeed":{"type":"string","enum":["10M","100M","200M","300M","500M","1G","5G","10G"]}}},"circuit":{"type":"object","description":"Community Circuit","properties":{"id":{"type":"string","description":"Circuit ID"},"sideA":{"type":"object","properties":{"id":{"type":"string","description":"Circuit Location Id"}}},"sideZ":{"type":"object","properties":{"id":{"type":"string","description":"Circuit Location Id"}}},"speed":{"type":"string"}},"required":["id"]},"network":{"type":"object","additionalProperties":false,"description":"Network","properties":{"prefix":{"type":"string","description":"Network Prefix"},"description":{"type":"string"},"circuit":{"$ref":"#/definitions/networkcircuit"},"contact":{"type":"string","description":"Contact ID"},"hosts":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"Indivual Network host","properties":{"ip":{"type":"string","description":"Host IP Address"},"hostname":{"type":"string","description":"Hostname for reverse DNS creation"},"description":{"type":"string"},"device":{"$ref":"#/definitions/networkDeviceLink"}},"required":["ip"]}},"ranges":{"type":"array","items":{"type":"object","additionalProperties":false,"description":"Network Range","properties":{"start":{"type":"string"},"end":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["DHCP","RESERVED","STATIC"]}},"required":["start","end"]}},"networks":{"type":"array","items":{"$ref":"#/definitions/network"},"uniqueItems":true,"description":"Children Networks"}}},"networkDeviceType":{"type":"string","enum":["router","switch","access-point","server","modem","firewall"]},"networkDeviceInterfaceType":{"type":"string","enum":["FastEthernet","GigabitEthernet","TenGigabitEthernet"]}},"type":"object","additionalProperties":false,"description":"IPAM Configuration File","properties":{"communities":{"type":"array","items":{"$ref":"#/definitions/community"}},"circuits":{"type":"array","items":{"$ref":"#/definitions/circuit"},"uniqueItems":true,"description":"Circuits"},"circuitLocations":{"type":"array","items":{"$ref":"#/definitions/circuitLocation"},"uniqueItems":true,"description":"External Circuits"},"contacts":{"type":"array","items":{"$ref":"#/definitions/contact"},"uniqueItems":true,"description":"Contact Information"},"networks":{"type":"array","items":{"$ref":"#/definitions/network"},"uniqueItems":true,"description":"Networks"}},"required":["communities","circuits","circuitLocations","contacts","networks"]}
1+
{"$schema":"http://json-schema.org/draft-07/schema#","definitions":{"community":{"type":"object","additionalProperties":false,"$id":"#community","description":"Community","properties":{"contact":{"type":"string","description":"Community Contact ID"},"name":{"type":"string","description":"Community Friendly Name"},"id":{"type":"string","description":"Short form community code","examples":["sxl"]},"sites":{"type":"array","items":{"$ref":"#/definitions/communitySite"}}},"required":["name","id","sites"]},"communitySite":{"type":"object","additionalProperties":false,"description":"Community Site","properties":{"id":{"type":"string","description":"Site short id"},"name":{"type":"string"},"devices":{"type":"array","items":{"$ref":"#/definitions/device"}}},"required":["id","name"]},"contact":{"type":"object","additionalProperties":false,"$id":"#contact","description":"Community Contact","properties":{"id":{"type":"string","description":"Unique contact ID"},"name":{"type":"string","description":"Contact Full Name"}},"required":["id","name"]},"device":{"type":"object","additionalProperties":false,"$id":"#device","description":"Network Device","properties":{"id":{"type":"string","description":"Chained ID"},"name":{"type":"string","description":"Friendly name"},"type":{"$ref":"#/definitions/networkDeviceType"}},"required":["id","name"]},"networkcircuit":{"type":"object","additionalProperties":false,"description":"NetworkCircuit","properties":{"id":{"type":"string","description":"Circuit Id"},"speed":{"type":"string","description":"Circuit Speed"}},"required":["id"]},"networkDeviceLink":{"type":"object","additionalProperties":false,"description":"Link a Network to a device","properties":{"id":{"type":"string","description":"Device id"},"interface":{"type":"string","description":"Device interface"}},"required":["id"]},"circuitLocation":{"type":"object","description":"Traditional external circuits","additionalProperties":false,"properties":{"id":{"type":"string","description":"External circuit id"},"provider":{"type":"string","description":"External circuit provider"},"communuity":{"type":"string","description":"Community ID"},"address":{"type":"string","description":"Address provided to external provider"},"demarcSpeed":{"type":"string","enum":["10M","100M","200M","300M","500M","1G","5G","10G"]}}},"circuit":{"type":"object","description":"Community Circuit","additionalProperties":false,"properties":{"id":{"type":"string","description":"Circuit ID"},"sideA":{"$ref":"#/definitions/circuitSide"},"sideZ":{"$ref":"#/definitions/circuitSide"},"speed":{"type":"string"}},"required":["id","sideA","sideZ"]},"circuitSide":{"type":"object","additionalProperties":false,"properties":{"id":{"type":"string","description":"Circuit Location Id"}},"required":["id"]},"network":{"type":"object","additionalProperties":false,"description":"Network","properties":{"prefix":{"type":"string","description":"Network Prefix"},"description":{"type":"string"},"circuit":{"$ref":"#/definitions/networkcircuit"},"contact":{"type":"string","description":"Contact ID"},"hosts":{"type":"array","items":{"$ref":"#/definitions/networkHost"}},"ranges":{"type":"array","items":{"$ref":"#/definitions/networkRange"}},"networks":{"type":"array","items":{"$ref":"#/definitions/network"},"uniqueItems":true,"description":"Children Networks"}}},"networkHost":{"type":"object","additionalProperties":false,"description":"Indivual Network host","properties":{"ip":{"type":"string","description":"Host IP Address"},"hostname":{"type":"string","description":"Hostname for reverse DNS creation"},"description":{"type":"string"},"device":{"$ref":"#/definitions/networkDeviceLink"}},"required":["ip"]},"networkRange":{"type":"object","additionalProperties":false,"description":"Network Range","properties":{"start":{"type":"string"},"end":{"type":"string"},"description":{"type":"string"},"type":{"type":"string","enum":["DHCP","RESERVED","STATIC"]}},"required":["start","end"]},"networkDeviceType":{"type":"string","enum":["router","switch","access-point","server","modem","firewall"]},"networkDeviceInterfaceType":{"type":"string","enum":["FastEthernet","GigabitEthernet","TenGigabitEthernet"]}},"type":"object","additionalProperties":false,"description":"IPAM Configuration File","properties":{"communities":{"type":"array","items":{"$ref":"#/definitions/community"}},"circuits":{"type":"array","items":{"$ref":"#/definitions/circuit"},"uniqueItems":true,"description":"Circuits"},"circuitLocations":{"type":"array","items":{"$ref":"#/definitions/circuitLocation"},"uniqueItems":true,"description":"External Circuits"},"contacts":{"type":"array","items":{"$ref":"#/definitions/contact"},"uniqueItems":true,"description":"Contact Information"},"networks":{"type":"array","items":{"$ref":"#/definitions/network"},"uniqueItems":true,"description":"Networks"}},"required":["communities","circuits","circuitLocations","contacts","networks"]}

src/Modules/Circuits/Circuit.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// src/Modules/Circuits/Circuit.ts
2+
import Container, { Service } from 'typedi';
3+
import {
4+
Circuit as IPAMCircuit,
5+
CircuitSide as IPAMCircuitSide,
6+
} from '../IPAM/IPAMConfig.gen';
7+
8+
@Service()
9+
export class Circuit implements IPAMCircuit {
10+
public id: string;
11+
12+
public sideA: IPAMCircuitSide;
13+
14+
public sideZ: IPAMCircuitSide;
15+
16+
public get sideACircuitLocation(): Circuit {
17+
return Container.get(`circuitLocation-${this.sideA.id}`);
18+
}
19+
20+
public get sideZCircuitLocation(): Circuit {
21+
return Container.get(`circuitLocation-${this.sideZ.id}`);
22+
}
23+
24+
public constructor(options: Partial<Circuit>) {
25+
Object.assign(this, options);
26+
}
27+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// src/Modules/Circuits/CircuitLocation.ts
2+
import { Service } from 'typedi';
3+
import { CircuitLocation as IPAMCircuitLocation } from '../IPAM/IPAMConfig.gen';
4+
5+
@Service()
6+
export class CircuitLocation implements IPAMCircuitLocation {
7+
public id: string;
8+
9+
public address: string;
10+
11+
public provider: string;
12+
13+
public constructor(options: Partial<CircuitLocation>) {
14+
Object.assign(this, options);
15+
}
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// src/Modules/CommunityCircuits/CommunityCircuitConfigSchema.ts
2+
import jsonSchema from 'fluent-json-schema';
3+
4+
export const circuitSchema = jsonSchema
5+
.object()
6+
.description('Community Circuit')
7+
.additionalProperties(false)
8+
.prop('id', jsonSchema.string().description('Circuit ID').required())
9+
.prop('sideA', jsonSchema.ref('#/definitions/circuitSide').required())
10+
.prop('sideZ', jsonSchema.ref('#/definitions/circuitSide').required())
11+
.prop('speed', jsonSchema.string());
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// src/Modules/Circuits/CircuitSideSchema.ts
2+
import jsonSchema from 'fluent-json-schema';
3+
4+
export const circuitSideSchema = jsonSchema
5+
.object()
6+
.additionalProperties(false)
7+
.prop(
8+
'id',
9+
jsonSchema.string().description('Circuit Location Id').required(),
10+
);

src/Modules/Communities/CommunityCircuitConfigSchema.ts

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/Modules/CommunityCircuits/CircuitLocationSchema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { CommunityCircuitSpeed } from './CommunityCircuitSpeed';
55
export const circuitLocationSchema = jsonSchema
66
.object()
77
.description('Traditional external circuits')
8+
.additionalProperties(false)
89
.prop('id', jsonSchema.string().description('External circuit id'))
910
.prop(
1011
'provider',

src/Modules/CommunityCircuits/CommunityCircuitConfig.ts

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/Modules/IPAM/IPAM.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
// src/Modules/IPAM/IPAM.ts
22

33
import { Service } from 'typedi';
4+
import { Circuit } from '../Circuits/Circuit';
5+
import { CircuitLocation } from '../Circuits/CircuitLocation';
46
import { Contact } from '../CommunityContacts/CommunityContact';
7+
import { Network } from '../Networks/Network';
58
import { Community } from './Community';
69

710
@Service()
@@ -10,6 +13,12 @@ export class IPAM {
1013

1114
public communities: Community[];
1215

16+
public circuitLocations: CircuitLocation[];
17+
18+
public circuits: Circuit[];
19+
20+
public networks: Network[];
21+
1322
public constructor(options: Partial<IPAM>) {
1423
Object.assign(this, options);
1524
}

src/Modules/IPAM/IPAMConfig.gen.ts

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -80,22 +80,15 @@ export interface Circuit {
8080
* Circuit ID
8181
*/
8282
id: string;
83-
sideA?: {
84-
/**
85-
* Circuit Location Id
86-
*/
87-
id?: string;
88-
[k: string]: unknown;
89-
};
90-
sideZ?: {
91-
/**
92-
* Circuit Location Id
93-
*/
94-
id?: string;
95-
[k: string]: unknown;
96-
};
83+
sideA: CircuitSide;
84+
sideZ: CircuitSide;
9785
speed?: string;
98-
[k: string]: unknown;
86+
}
87+
export interface CircuitSide {
88+
/**
89+
* Circuit Location Id
90+
*/
91+
id: string;
9992
}
10093
/**
10194
* Traditional external circuits
@@ -118,7 +111,6 @@ export interface CircuitLocation {
118111
*/
119112
address?: string;
120113
demarcSpeed?: "10M" | "100M" | "200M" | "300M" | "500M" | "1G" | "5G" | "10G";
121-
[k: string]: unknown;
122114
}
123115
/**
124116
* Community Contact
@@ -147,24 +139,8 @@ export interface Network {
147139
* Contact ID
148140
*/
149141
contact?: string;
150-
hosts?: {
151-
/**
152-
* Host IP Address
153-
*/
154-
ip: string;
155-
/**
156-
* Hostname for reverse DNS creation
157-
*/
158-
hostname?: string;
159-
description?: string;
160-
device?: NetworkDeviceLink;
161-
}[];
162-
ranges?: {
163-
start: string;
164-
end: string;
165-
description?: string;
166-
type?: "DHCP" | "RESERVED" | "STATIC";
167-
}[];
142+
hosts?: NetworkHost[];
143+
ranges?: NetworkRange[];
168144
/**
169145
* Children Networks
170146
*/
@@ -183,6 +159,21 @@ export interface Networkcircuit {
183159
*/
184160
speed?: string;
185161
}
162+
/**
163+
* Indivual Network host
164+
*/
165+
export interface NetworkHost {
166+
/**
167+
* Host IP Address
168+
*/
169+
ip: string;
170+
/**
171+
* Hostname for reverse DNS creation
172+
*/
173+
hostname?: string;
174+
description?: string;
175+
device?: NetworkDeviceLink;
176+
}
186177
/**
187178
* Link a Network to a device
188179
*/
@@ -196,3 +187,12 @@ export interface NetworkDeviceLink {
196187
*/
197188
interface?: string;
198189
}
190+
/**
191+
* Network Range
192+
*/
193+
export interface NetworkRange {
194+
start: string;
195+
end: string;
196+
description?: string;
197+
type?: "DHCP" | "RESERVED" | "STATIC";
198+
}

0 commit comments

Comments
 (0)