Skip to content

Commit 32440ac

Browse files
committed
feat(Containers): Centralize the Container Keys/Names
1 parent 53bce87 commit 32440ac

File tree

9 files changed

+82
-16
lines changed

9 files changed

+82
-16
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","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"]}
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"},"contactId":{"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: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// src/Modules/Circuits/Circuit.ts
22
import Container, { Service } from 'typedi';
3+
import { createContainerName } from '../../Utils/Containers';
34
import {
45
Circuit as IPAMCircuit,
56
CircuitSide as IPAMCircuitSide,
@@ -14,11 +15,15 @@ export class Circuit implements IPAMCircuit {
1415
public sideZ: IPAMCircuitSide;
1516

1617
public get sideACircuitLocation(): Circuit {
17-
return Container.get(`circuitLocation-${this.sideA.id}`);
18+
return Container.get(
19+
createContainerName('CIRCUIT_LOCATION', this.sideA.id),
20+
);
1821
}
1922

2023
public get sideZCircuitLocation(): Circuit {
21-
return Container.get(`circuitLocation-${this.sideZ.id}`);
24+
return Container.get(
25+
createContainerName('CIRCUIT_LOCATION', this.sideZ.id),
26+
);
2227
}
2328

2429
public constructor(options: Partial<Circuit>) {

src/Modules/IPAM/Community.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// src/Modules/Communities/Community.ts
22
import Container, { Service, Token } from 'typedi';
3+
import { createContainerName } from '../../Utils/Containers';
34
import { CommunitySite } from '../Communities/CommunitySite';
45
import { Contact } from '../CommunityContacts/CommunityContact';
56

@@ -14,7 +15,7 @@ export class Community {
1415
public sites: CommunitySite[];
1516

1617
public get contact(): Contact {
17-
return Container.get(`contact-${this.contactId}`);
18+
return Container.get(createContainerName('CONTACT', this.contactId));
1819
}
1920

2021
public constructor(options: Partial<Community>) {

src/Modules/IPAM/IPAMConfig.gen.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ export interface Network {
138138
/**
139139
* Contact ID
140140
*/
141-
contact?: string;
141+
contactId?: string;
142142
hosts?: NetworkHost[];
143143
ranges?: NetworkRange[];
144144
/**

src/Modules/IPAM/IPAMConfigController.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { readFile } from 'fs/promises';
44
import { load } from 'js-yaml';
55
import Container, { Service } from 'typedi';
66
import { logger, LogMode } from '../../Library/Logger';
7+
import { setContainer } from '../../Utils/Containers';
78
import { isObjectType } from '../../Utils/isTypes';
89
import { Circuit } from '../Circuits/Circuit';
910
import { CircuitLocation } from '../Circuits/CircuitLocation';
@@ -32,7 +33,7 @@ export class IPAMConfigController {
3233
return contacts.map((contactValues) => {
3334
const contact = new Contact(contactValues);
3435

35-
Container.set(`contact-${contact.id}`, contact);
36+
setContainer('CONTACT', contact.id, contact);
3637

3738
return contact;
3839
});
@@ -42,7 +43,7 @@ export class IPAMConfigController {
4243
return devices.map((deviceValues) => {
4344
const device = new NetworkDevice(deviceValues);
4445

45-
Container.set(`networkDevice-${device.id}`, device);
46+
setContainer('SITE_DEVICE', device.id, device);
4647

4748
return device;
4849
});
@@ -58,7 +59,7 @@ export class IPAMConfigController {
5859
: [],
5960
});
6061

61-
Container.set(`communitySite-${communitySite.id}`, communitySite);
62+
setContainer('SITE', communitySite.id, communitySite);
6263

6364
return communitySite;
6465
});
@@ -82,7 +83,7 @@ export class IPAMConfigController {
8283
return circuitLocations.map((circuitLocationValues) => {
8384
const circuitLocation = new CircuitLocation(circuitLocationValues);
8485

85-
Container.set(`circuitLocation-${circuitLocation.id}`, circuitLocation);
86+
setContainer('CIRCUIT_LOCATION', circuitLocation.id, circuitLocation);
8687

8788
return circuitLocation;
8889
});
@@ -92,7 +93,7 @@ export class IPAMConfigController {
9293
return circuits.map((circuitValues) => {
9394
const circuit = new Circuit(circuitValues);
9495

95-
Container.set(`circuit-${circuit.id}`, circuit);
96+
setContainer('CIRCUIT', circuit.id, circuit);
9697

9798
return circuit;
9899
});
@@ -102,7 +103,7 @@ export class IPAMConfigController {
102103
return networkHosts.map((networkHostValue) => {
103104
const networkHost = new NetworkHost(networkHostValue);
104105

105-
Container.set(`networkHost-${networkHost.ip}`, networkHost);
106+
setContainer('NETWORK_HOST', networkHost.ip, networkHost);
106107

107108
return networkHost;
108109
});
@@ -129,7 +130,7 @@ export class IPAMConfigController {
129130
...networkValues,
130131
});
131132

132-
Container.set(`network-${network.prefix}`, network);
133+
setContainer('NETWORK', network.prefix, network);
133134

134135
return [network, ...subNetworks];
135136
},
@@ -180,7 +181,7 @@ export class IPAMConfigController {
180181
return;
181182
}
182183

183-
throw new Error('Invlaid Firewalls configuration file');
184+
throw new Error('Invalid IPAM configuration file');
184185
}
185186
}
186187

src/Modules/Networks/Network.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// src/Modules/Networks/Network.ts
22
import Container, { Service } from 'typedi';
3+
import { createContainerName } from '../../Utils/Containers';
34
import { Circuit } from '../Circuits/Circuit';
5+
import { Contact } from '../CommunityContacts/CommunityContact';
46
import { Network as IPAMNetwork } from '../IPAM/IPAMConfig.gen';
57
import { NetworkHost } from './NetworkHost';
68

@@ -16,12 +18,20 @@ export class Network implements IPAMNetwork {
1618

1719
public hosts: NetworkHost[];
1820

21+
public contactId?: string;
22+
23+
public get contact(): Contact | undefined {
24+
if (this.contactId) {
25+
return Container.get(createContainerName('CONTACT', this.contactId));
26+
}
27+
}
28+
1929
public get circuit(): Circuit | undefined {
2030
if (!this.circuitId) {
2131
return undefined;
2232
}
2333

24-
return Container.get(`circuit-${this.circuitId}`);
34+
return Container.get(createContainerName('CIRCUIT', this.circuitId));
2535
}
2636

2737
public constructor(options: Partial<Network>) {

src/Modules/Networks/NetworkHost.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// src/Modules/Networks/NetworkHost.ts
22
import Container, { Service } from 'typedi';
3+
import { createContainerName } from '../../Utils/Containers';
34
import {
45
NetworkDeviceLink,
56
NetworkHost as IPAMNetworkHost,
@@ -14,9 +15,11 @@ export class NetworkHost implements IPAMNetworkHost {
1415

1516
public device?: NetworkDeviceLink;
1617

18+
public hostname?: string;
19+
1720
public get coreDevice(): NetworkDevice | undefined {
1821
if (this.device?.id) {
19-
return Container.get(`networkDevice-${this.device.id}`);
22+
return Container.get(createContainerName('SITE_DEVICE', this.device.id));
2023
}
2124
}
2225

src/Modules/Networks/NetworkSchema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const networkSchema = jsonSchema
88
.prop('prefix', jsonSchema.string().description('Network Prefix'))
99
.prop('description', jsonSchema.string())
1010
.prop('circuit', jsonSchema.ref('#/definitions/networkcircuit'))
11-
.prop('contact', jsonSchema.string().description('Contact ID'))
11+
.prop('contactId', jsonSchema.string().description('Contact ID'))
1212
.prop(
1313
'hosts',
1414
jsonSchema.array().items(jsonSchema.ref('#/definitions/networkHost')),

src/Utils/Containers.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// src/Utils/Containers.ts
2+
3+
import Container from 'typedi';
4+
import { Circuit } from '../Modules/Circuits/Circuit';
5+
import { CircuitLocation } from '../Modules/Circuits/CircuitLocation';
6+
import { CommunitySite } from '../Modules/Communities/CommunitySite';
7+
import { Contact } from '../Modules/CommunityContacts/CommunityContact';
8+
import { NetworkDevice } from '../Modules/NetworkDevices/NetworkDevice';
9+
import { Network } from '../Modules/Networks/Network';
10+
import { NetworkHost } from '../Modules/Networks/NetworkHost';
11+
12+
enum ContainerKeys {
13+
CONTACT = 'contact-',
14+
SITE_DEVICE = 'networkDevice-',
15+
SITE = 'communitySite-',
16+
CIRCUIT_LOCATION = 'circuitLocation-',
17+
CIRCUIT = 'circuit-',
18+
NETWORK_HOST = 'networkHost-',
19+
NETWORK = 'network-',
20+
}
21+
22+
type ValueTypes = {
23+
CONTACT: Contact;
24+
SITE_DEVICE: NetworkDevice;
25+
SITE: CommunitySite;
26+
CIRCUIT_LOCATION: CircuitLocation;
27+
CIRCUIT: Circuit;
28+
NETWORK_HOST: NetworkHost;
29+
NETWORK: Network;
30+
};
31+
32+
export function createContainerName<
33+
T extends keyof typeof ContainerKeys,
34+
S extends string
35+
>(key: T, id: S): `${typeof ContainerKeys[T]}${S}` {
36+
return `${ContainerKeys[key]}${id}` as const;
37+
}
38+
39+
export function setContainer<T extends keyof typeof ContainerKeys>(
40+
key: T,
41+
id: string,
42+
value: ValueTypes[T],
43+
container = Container,
44+
): void {
45+
container.set(createContainerName(key, id), value);
46+
}

0 commit comments

Comments
 (0)