Skip to content

Commit

Permalink
feat(Containers): Centralize the Container Keys/Names
Browse files Browse the repository at this point in the history
  • Loading branch information
EntraptaJ committed Jan 23, 2021
1 parent 53bce87 commit 32440ac
Show file tree
Hide file tree
Showing 9 changed files with 82 additions and 16 deletions.
2 changes: 1 addition & 1 deletion schemas/IPAM.json
Original file line number Diff line number Diff line change
@@ -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"]}
{"$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"]}
9 changes: 7 additions & 2 deletions src/Modules/Circuits/Circuit.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// src/Modules/Circuits/Circuit.ts
import Container, { Service } from 'typedi';
import { createContainerName } from '../../Utils/Containers';
import {
Circuit as IPAMCircuit,
CircuitSide as IPAMCircuitSide,
Expand All @@ -14,11 +15,15 @@ export class Circuit implements IPAMCircuit {
public sideZ: IPAMCircuitSide;

public get sideACircuitLocation(): Circuit {
return Container.get(`circuitLocation-${this.sideA.id}`);
return Container.get(
createContainerName('CIRCUIT_LOCATION', this.sideA.id),
);
}

public get sideZCircuitLocation(): Circuit {
return Container.get(`circuitLocation-${this.sideZ.id}`);
return Container.get(
createContainerName('CIRCUIT_LOCATION', this.sideZ.id),
);
}

public constructor(options: Partial<Circuit>) {
Expand Down
3 changes: 2 additions & 1 deletion src/Modules/IPAM/Community.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// src/Modules/Communities/Community.ts
import Container, { Service, Token } from 'typedi';
import { createContainerName } from '../../Utils/Containers';
import { CommunitySite } from '../Communities/CommunitySite';
import { Contact } from '../CommunityContacts/CommunityContact';

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

public get contact(): Contact {
return Container.get(`contact-${this.contactId}`);
return Container.get(createContainerName('CONTACT', this.contactId));
}

public constructor(options: Partial<Community>) {
Expand Down
2 changes: 1 addition & 1 deletion src/Modules/IPAM/IPAMConfig.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export interface Network {
/**
* Contact ID
*/
contact?: string;
contactId?: string;
hosts?: NetworkHost[];
ranges?: NetworkRange[];
/**
Expand Down
17 changes: 9 additions & 8 deletions src/Modules/IPAM/IPAMConfigController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { readFile } from 'fs/promises';
import { load } from 'js-yaml';
import Container, { Service } from 'typedi';
import { logger, LogMode } from '../../Library/Logger';
import { setContainer } from '../../Utils/Containers';
import { isObjectType } from '../../Utils/isTypes';
import { Circuit } from '../Circuits/Circuit';
import { CircuitLocation } from '../Circuits/CircuitLocation';
Expand Down Expand Up @@ -32,7 +33,7 @@ export class IPAMConfigController {
return contacts.map((contactValues) => {
const contact = new Contact(contactValues);

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

return contact;
});
Expand All @@ -42,7 +43,7 @@ export class IPAMConfigController {
return devices.map((deviceValues) => {
const device = new NetworkDevice(deviceValues);

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

return device;
});
Expand All @@ -58,7 +59,7 @@ export class IPAMConfigController {
: [],
});

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

return communitySite;
});
Expand All @@ -82,7 +83,7 @@ export class IPAMConfigController {
return circuitLocations.map((circuitLocationValues) => {
const circuitLocation = new CircuitLocation(circuitLocationValues);

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

return circuitLocation;
});
Expand All @@ -92,7 +93,7 @@ export class IPAMConfigController {
return circuits.map((circuitValues) => {
const circuit = new Circuit(circuitValues);

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

return circuit;
});
Expand All @@ -102,7 +103,7 @@ export class IPAMConfigController {
return networkHosts.map((networkHostValue) => {
const networkHost = new NetworkHost(networkHostValue);

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

return networkHost;
});
Expand All @@ -129,7 +130,7 @@ export class IPAMConfigController {
...networkValues,
});

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

return [network, ...subNetworks];
},
Expand Down Expand Up @@ -180,7 +181,7 @@ export class IPAMConfigController {
return;
}

throw new Error('Invlaid Firewalls configuration file');
throw new Error('Invalid IPAM configuration file');
}
}

Expand Down
12 changes: 11 additions & 1 deletion src/Modules/Networks/Network.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// src/Modules/Networks/Network.ts
import Container, { Service } from 'typedi';
import { createContainerName } from '../../Utils/Containers';
import { Circuit } from '../Circuits/Circuit';
import { Contact } from '../CommunityContacts/CommunityContact';
import { Network as IPAMNetwork } from '../IPAM/IPAMConfig.gen';
import { NetworkHost } from './NetworkHost';

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

public hosts: NetworkHost[];

public contactId?: string;

public get contact(): Contact | undefined {
if (this.contactId) {
return Container.get(createContainerName('CONTACT', this.contactId));
}
}

public get circuit(): Circuit | undefined {
if (!this.circuitId) {
return undefined;
}

return Container.get(`circuit-${this.circuitId}`);
return Container.get(createContainerName('CIRCUIT', this.circuitId));
}

public constructor(options: Partial<Network>) {
Expand Down
5 changes: 4 additions & 1 deletion src/Modules/Networks/NetworkHost.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// src/Modules/Networks/NetworkHost.ts
import Container, { Service } from 'typedi';
import { createContainerName } from '../../Utils/Containers';
import {
NetworkDeviceLink,
NetworkHost as IPAMNetworkHost,
Expand All @@ -14,9 +15,11 @@ export class NetworkHost implements IPAMNetworkHost {

public device?: NetworkDeviceLink;

public hostname?: string;

public get coreDevice(): NetworkDevice | undefined {
if (this.device?.id) {
return Container.get(`networkDevice-${this.device.id}`);
return Container.get(createContainerName('SITE_DEVICE', this.device.id));
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/Modules/Networks/NetworkSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export const networkSchema = jsonSchema
.prop('prefix', jsonSchema.string().description('Network Prefix'))
.prop('description', jsonSchema.string())
.prop('circuit', jsonSchema.ref('#/definitions/networkcircuit'))
.prop('contact', jsonSchema.string().description('Contact ID'))
.prop('contactId', jsonSchema.string().description('Contact ID'))
.prop(
'hosts',
jsonSchema.array().items(jsonSchema.ref('#/definitions/networkHost')),
Expand Down
46 changes: 46 additions & 0 deletions src/Utils/Containers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// src/Utils/Containers.ts

import Container from 'typedi';
import { Circuit } from '../Modules/Circuits/Circuit';
import { CircuitLocation } from '../Modules/Circuits/CircuitLocation';
import { CommunitySite } from '../Modules/Communities/CommunitySite';
import { Contact } from '../Modules/CommunityContacts/CommunityContact';
import { NetworkDevice } from '../Modules/NetworkDevices/NetworkDevice';
import { Network } from '../Modules/Networks/Network';
import { NetworkHost } from '../Modules/Networks/NetworkHost';

enum ContainerKeys {
CONTACT = 'contact-',
SITE_DEVICE = 'networkDevice-',
SITE = 'communitySite-',
CIRCUIT_LOCATION = 'circuitLocation-',
CIRCUIT = 'circuit-',
NETWORK_HOST = 'networkHost-',
NETWORK = 'network-',
}

type ValueTypes = {
CONTACT: Contact;
SITE_DEVICE: NetworkDevice;
SITE: CommunitySite;
CIRCUIT_LOCATION: CircuitLocation;
CIRCUIT: Circuit;
NETWORK_HOST: NetworkHost;
NETWORK: Network;
};

export function createContainerName<
T extends keyof typeof ContainerKeys,
S extends string
>(key: T, id: S): `${typeof ContainerKeys[T]}${S}` {
return `${ContainerKeys[key]}${id}` as const;
}

export function setContainer<T extends keyof typeof ContainerKeys>(
key: T,
id: string,
value: ValueTypes[T],
container = Container,
): void {
container.set(createContainerName(key, id), value);
}

0 comments on commit 32440ac

Please sign in to comment.