Skip to content

Commit c1639b5

Browse files
committed
feat: Minor Changes, Site Types
1 parent 3df3885 commit c1639b5

File tree

15 files changed

+184
-34
lines changed

15 files changed

+184
-34
lines changed

package-lock.json

Lines changed: 15 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"js-yaml": "^3.14.1",
5252
"reflect-metadata": "^0.1.13",
5353
"typedi": "^0.10.0",
54-
"typescript": "^4.1.3"
54+
"typescript": "^4.1.3",
55+
"xbytes": "^1.7.0"
5556
}
5657
}

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":{"$ref":"#/definitions/contactId"},"name":{"type":"string","description":"Contact Full Name"}},"required":["id","name"]},"contactId":{"type":"string","description":"Unique Identifier for referencing Contact"},"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"},"nsServers":{"type":"array","items":{"type":"string","description":"Reverse DNS NS Server","format":"hostname"}},"type":{"type":"string","description":"Network Type","enum":["UNALLOCATED","EXTERNAL"]},"contactId":{"$ref":"#/definitions/contactId"},"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","format":"ipv4"},"hostname":{"type":"string","description":"Hostname for reverse DNS creation","format":"hostname"},"contactId":{"$ref":"#/definitions/contactId"},"description":{"type":"string"},"device":{"$ref":"#/definitions/networkDeviceLink"}},"required":["ip"]},"networkRange":{"type":"object","additionalProperties":false,"description":"Network Range","properties":{"start":{"type":"string","description":"Start IP for the range","format":"ipv4"},"end":{"type":"string","description":"End IP for the range","format":"ipv4"},"description":{"type":"string"},"type":{"type":"string","enum":["DHCP","RESERVED","STATIC","FREE","unallocated"]}},"required":["start","end"]},"networkDeviceType":{"type":"string","enum":["router","switch","access-point","server","modem","firewall","UPS"]},"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"},"type":{"type":"string","enum":["Network Headend","Community Center","Health Center","Cell Tower","Colocation","Band Office","School","Lake HeadU","KO Office","Tower"]},"devices":{"type":"array","items":{"$ref":"#/definitions/device"}}},"required":["id","name"]},"contact":{"type":"object","additionalProperties":false,"$id":"#contact","description":"Community Contact","properties":{"id":{"$ref":"#/definitions/contactId"},"name":{"type":"string","description":"Contact Full Name"}},"required":["id","name"]},"contactId":{"type":"string","description":"Unique Identifier for referencing Contact"},"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"},"nsServers":{"type":"array","items":{"type":"string","description":"Reverse DNS NS Server","format":"hostname"}},"type":{"type":"string","description":"Network Type","enum":["UNALLOCATED","EXTERNAL"]},"contactId":{"$ref":"#/definitions/contactId"},"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","format":"ipv4"},"hostname":{"type":"string","description":"Hostname for reverse DNS creation","format":"hostname"},"contactId":{"$ref":"#/definitions/contactId"},"description":{"type":"string"},"device":{"$ref":"#/definitions/networkDeviceLink"}},"required":["ip"]},"networkRange":{"type":"object","additionalProperties":false,"description":"Network Range","properties":{"start":{"type":"string","description":"Start IP for the range","format":"ipv4"},"end":{"type":"string","description":"End IP for the range","format":"ipv4"},"description":{"type":"string"},"type":{"type":"string","enum":["DHCP","RESERVED","STATIC","FREE","unallocated"]}},"required":["start","end"]},"networkDeviceType":{"type":"string","enum":["router","switch","access-point","server","modem","firewall","UPS","cell-vpn"]},"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: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import {
55
Circuit as IPAMCircuit,
66
CircuitSide as IPAMCircuitSide,
77
} from '../IPAM/IPAMConfig.gen';
8+
import xbytes from 'xbytes';
9+
import { Network } from '../Networks/Network';
10+
import { CircuitLocation } from './CircuitLocation';
811

912
@Service()
1013
export class Circuit implements IPAMCircuit {
@@ -14,7 +17,32 @@ export class Circuit implements IPAMCircuit {
1417

1518
public sideZ: IPAMCircuitSide;
1619

17-
public get sideACircuitLocation(): Circuit {
20+
public speed: string;
21+
22+
public get networks(): Network[] {
23+
const networks = Container.getMany<() => Network>(
24+
`circuitNetworks-${this.id}`,
25+
);
26+
27+
return networks.map((getNetwork) => getNetwork());
28+
}
29+
30+
public get formattedCircuitSpeed(): string {
31+
return this.speed.endsWith('b') || this.speed.endsWith('B')
32+
? this.speed
33+
: `${this.speed}b`;
34+
}
35+
36+
public parsedCircuitSpeed(): xbytes.ByteUnitObject {
37+
return xbytes.parse(this.formattedCircuitSpeed);
38+
}
39+
40+
public get speedBits(): number {
41+
return xbytes.relative(this.parsedCircuitSpeed().convertTo('b')).parsed
42+
.value;
43+
}
44+
45+
public get sideACircuitLocation(): CircuitLocation {
1846
return Container.get(
1947
createContainerName('CIRCUIT_LOCATION', this.sideA.id),
2048
);

src/Modules/Circuits/CircuitLocation.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
// src/Modules/Circuits/CircuitLocation.ts
2-
import { Service } from 'typedi';
2+
import Container, { Service } from 'typedi';
3+
import { createContainerName } from '../../Utils/Containers';
4+
import { Community } from '../Communities/Community';
35
import { CircuitLocation as IPAMCircuitLocation } from '../IPAM/IPAMConfig.gen';
46

57
@Service()
6-
export class CircuitLocation implements IPAMCircuitLocation {
8+
export class CircuitLocation
9+
implements Omit<IPAMCircuitLocation, 'communuity'> {
710
public id: string;
811

912
public address: string;
1013

1114
public provider: string;
1215

16+
public communuityId: string;
17+
18+
public get communuity(): Community {
19+
return Container.get(createContainerName('COMMUNITY', this.communuityId));
20+
}
21+
1322
public constructor(options: Partial<CircuitLocation>) {
1423
Object.assign(this, options);
1524
}

src/Modules/Communities/Community.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// src/Modules/Communities/Community.ts
22
import Container, { Service, Token } from 'typedi';
33
import { createContainerName } from '../../Utils/Containers';
4-
import { CommunitySite } from './CommunitySite';
4+
import { Site } from '../Sites/Site';
55
import { Contact } from '../Contacts/Contact';
66

77
export const CommunitiesToken = new Token<string>('communities');
@@ -17,7 +17,7 @@ export class Community {
1717
*/
1818
public contactId: string;
1919

20-
public sites: CommunitySite[];
20+
public sites: Site[];
2121

2222
public get contact(): Contact {
2323
return Container.get(createContainerName('CONTACT', this.contactId));

src/Modules/IPAM/IPAMConfig.gen.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,15 @@
55
* and run json-schema-to-typescript to regenerate this file.
66
*/
77

8-
export type NetworkDeviceType = "router" | "switch" | "access-point" | "server" | "modem" | "firewall" | "UPS";
8+
export type NetworkDeviceType =
9+
| "router"
10+
| "switch"
11+
| "access-point"
12+
| "server"
13+
| "modem"
14+
| "firewall"
15+
| "UPS"
16+
| "cell-vpn";
917
/**
1018
* Unique Identifier for referencing Contact
1119
*/
@@ -60,6 +68,17 @@ export interface CommunitySite {
6068
*/
6169
id: string;
6270
name: string;
71+
type?:
72+
| "Network Headend"
73+
| "Community Center"
74+
| "Health Center"
75+
| "Cell Tower"
76+
| "Colocation"
77+
| "Band Office"
78+
| "School"
79+
| "Lake HeadU"
80+
| "KO Office"
81+
| "Tower";
6382
devices?: Device[];
6483
}
6584
/**

src/Modules/IPAM/IPAMConfigController.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ 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';
7+
import { createContainerName, setContainer } from '../../Utils/Containers';
88
import { isObjectType } from '../../Utils/isTypes';
99
import { Circuit } from '../Circuits/Circuit';
1010
import { CircuitLocation } from '../Circuits/CircuitLocation';
11-
import { CommunitySite } from '../Communities/CommunitySite';
11+
import { Site } from '../Sites/Site';
1212
import { Contact } from '../Contacts/Contact';
1313
import { NetworkDevice } from '../NetworkDevices/NetworkDevice';
1414
import { Network } from '../Networks/Network';
@@ -49,9 +49,9 @@ export class IPAMConfigController {
4949
});
5050
}
5151

52-
public processSites(sites: IPAMCommunitySite[]): CommunitySite[] {
52+
public processSites(sites: IPAMCommunitySite[]): Site[] {
5353
return sites.map((communitySiteValues) => {
54-
const communitySite = new CommunitySite({
54+
const communitySite = new Site({
5555
...communitySiteValues,
5656
devices:
5757
typeof communitySiteValues.devices !== 'undefined'
@@ -74,6 +74,8 @@ export class IPAMConfigController {
7474
sites: this.processSites(sites),
7575
});
7676

77+
setContainer('COMMUNITY', community.id, community);
78+
7779
return community;
7880
},
7981
);
@@ -82,13 +84,18 @@ export class IPAMConfigController {
8284
public processCircuitLocations(
8385
circuitLocations: IPAMCircuitLocation[],
8486
): CircuitLocation[] {
85-
return circuitLocations.map((circuitLocationValues) => {
86-
const circuitLocation = new CircuitLocation(circuitLocationValues);
87+
return circuitLocations.map(
88+
({ communuity, ...communityLocationValues }) => {
89+
const circuitLocation = new CircuitLocation({
90+
communuityId: communuity,
91+
...communityLocationValues,
92+
});
8793

88-
setContainer('CIRCUIT_LOCATION', circuitLocation.id, circuitLocation);
94+
setContainer('CIRCUIT_LOCATION', circuitLocation.id, circuitLocation);
8995

90-
return circuitLocation;
91-
});
96+
return circuitLocation;
97+
},
98+
);
9299
}
93100

94101
public processCircuits(circuits: IPAMCircuit[]): Circuit[] {
@@ -140,6 +147,15 @@ export class IPAMConfigController {
140147
...networkValues,
141148
});
142149

150+
if (network.circuitId) {
151+
Container.set({
152+
id: `circuitNetworks-${network.circuitId}`,
153+
multiple: true,
154+
value: () =>
155+
Container.get(createContainerName('NETWORK', network.prefix)),
156+
});
157+
}
158+
143159
const subNetworks = subNetworksValues
144160
? this.processNetworks(subNetworksValues, network)
145161
: [];
@@ -152,10 +168,9 @@ export class IPAMConfigController {
152168
});
153169
}
154170

155-
const hosts = hostsValue
156-
? this.processNetworkHosts(hostsValue, network)
157-
: [];
158-
logger.log(LogMode.DEBUG, 'hosts', hosts);
171+
if (hostsValue) {
172+
this.processNetworkHosts(hostsValue, network);
173+
}
159174

160175
setContainer('NETWORK', network.prefix, network);
161176

src/Modules/IPAM/IPAMConfigSchema.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import jsonSchema from 'fluent-json-schema';
33
import { circuitLocationSchema } from '../CommunityCircuits/CircuitLocationSchema';
44
import { circuitSchema } from '../Circuits/CircuitSchema';
55
import { contactSchema } from '../Contacts/ContactSchema';
6-
import { communitySiteSchema } from '../Communities/CommunitySiteSchema';
6+
import { siteSchema } from '../Sites/SiteSchema';
77
import { networkCircuitSchema } from '../Networks/NetworkCircuitSchema';
88
import { networkSchema } from '../Networks/NetworkSchema';
99
import { networkDeviceConfigSchema } from '../NetworkDevices/NetworkDeviceConfigSchema';
@@ -20,7 +20,7 @@ export const communityConfigSchema = jsonSchema
2020
.additionalProperties(false)
2121
.description('IPAM Configuration File')
2222
.definition('community', communitySchema)
23-
.definition('communitySite', communitySiteSchema)
23+
.definition('communitySite', siteSchema)
2424
.definition('contact', contactSchema)
2525
.definition(
2626
'contactId',

src/Modules/NetworkDevices/NetworkDeviceType.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ export enum NetworkDeviceType {
77
MODEM = 'modem',
88
FIREWALL = 'firewall',
99
UPS = 'UPS',
10+
CELLULAR_VPN = 'cell-vpn',
1011
}

0 commit comments

Comments
 (0)