Skip to content

Commit

Permalink
feat: Minor Changes, Site Types
Browse files Browse the repository at this point in the history
  • Loading branch information
EntraptaJ committed Jan 26, 2021
1 parent 3df3885 commit c1639b5
Show file tree
Hide file tree
Showing 15 changed files with 184 additions and 34 deletions.
16 changes: 15 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
"js-yaml": "^3.14.1",
"reflect-metadata": "^0.1.13",
"typedi": "^0.10.0",
"typescript": "^4.1.3"
"typescript": "^4.1.3",
"xbytes": "^1.7.0"
}
}
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":{"$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"]}
{"$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"]}
30 changes: 29 additions & 1 deletion src/Modules/Circuits/Circuit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ import {
Circuit as IPAMCircuit,
CircuitSide as IPAMCircuitSide,
} from '../IPAM/IPAMConfig.gen';
import xbytes from 'xbytes';
import { Network } from '../Networks/Network';
import { CircuitLocation } from './CircuitLocation';

@Service()
export class Circuit implements IPAMCircuit {
Expand All @@ -14,7 +17,32 @@ export class Circuit implements IPAMCircuit {

public sideZ: IPAMCircuitSide;

public get sideACircuitLocation(): Circuit {
public speed: string;

public get networks(): Network[] {
const networks = Container.getMany<() => Network>(
`circuitNetworks-${this.id}`,
);

return networks.map((getNetwork) => getNetwork());
}

public get formattedCircuitSpeed(): string {
return this.speed.endsWith('b') || this.speed.endsWith('B')
? this.speed
: `${this.speed}b`;
}

public parsedCircuitSpeed(): xbytes.ByteUnitObject {
return xbytes.parse(this.formattedCircuitSpeed);
}

public get speedBits(): number {
return xbytes.relative(this.parsedCircuitSpeed().convertTo('b')).parsed
.value;
}

public get sideACircuitLocation(): CircuitLocation {
return Container.get(
createContainerName('CIRCUIT_LOCATION', this.sideA.id),
);
Expand Down
13 changes: 11 additions & 2 deletions src/Modules/Circuits/CircuitLocation.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
// src/Modules/Circuits/CircuitLocation.ts
import { Service } from 'typedi';
import Container, { Service } from 'typedi';
import { createContainerName } from '../../Utils/Containers';
import { Community } from '../Communities/Community';
import { CircuitLocation as IPAMCircuitLocation } from '../IPAM/IPAMConfig.gen';

@Service()
export class CircuitLocation implements IPAMCircuitLocation {
export class CircuitLocation
implements Omit<IPAMCircuitLocation, 'communuity'> {
public id: string;

public address: string;

public provider: string;

public communuityId: string;

public get communuity(): Community {
return Container.get(createContainerName('COMMUNITY', this.communuityId));
}

public constructor(options: Partial<CircuitLocation>) {
Object.assign(this, options);
}
Expand Down
4 changes: 2 additions & 2 deletions src/Modules/Communities/Community.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// src/Modules/Communities/Community.ts
import Container, { Service, Token } from 'typedi';
import { createContainerName } from '../../Utils/Containers';
import { CommunitySite } from './CommunitySite';
import { Site } from '../Sites/Site';
import { Contact } from '../Contacts/Contact';

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

public sites: CommunitySite[];
public sites: Site[];

public get contact(): Contact {
return Container.get(createContainerName('CONTACT', this.contactId));
Expand Down
21 changes: 20 additions & 1 deletion src/Modules/IPAM/IPAMConfig.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,15 @@
* and run json-schema-to-typescript to regenerate this file.
*/

export type NetworkDeviceType = "router" | "switch" | "access-point" | "server" | "modem" | "firewall" | "UPS";
export type NetworkDeviceType =
| "router"
| "switch"
| "access-point"
| "server"
| "modem"
| "firewall"
| "UPS"
| "cell-vpn";
/**
* Unique Identifier for referencing Contact
*/
Expand Down Expand Up @@ -60,6 +68,17 @@ export interface CommunitySite {
*/
id: string;
name: string;
type?:
| "Network Headend"
| "Community Center"
| "Health Center"
| "Cell Tower"
| "Colocation"
| "Band Office"
| "School"
| "Lake HeadU"
| "KO Office"
| "Tower";
devices?: Device[];
}
/**
Expand Down
41 changes: 28 additions & 13 deletions src/Modules/IPAM/IPAMConfigController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ 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 { createContainerName, setContainer } from '../../Utils/Containers';
import { isObjectType } from '../../Utils/isTypes';
import { Circuit } from '../Circuits/Circuit';
import { CircuitLocation } from '../Circuits/CircuitLocation';
import { CommunitySite } from '../Communities/CommunitySite';
import { Site } from '../Sites/Site';
import { Contact } from '../Contacts/Contact';
import { NetworkDevice } from '../NetworkDevices/NetworkDevice';
import { Network } from '../Networks/Network';
Expand Down Expand Up @@ -49,9 +49,9 @@ export class IPAMConfigController {
});
}

public processSites(sites: IPAMCommunitySite[]): CommunitySite[] {
public processSites(sites: IPAMCommunitySite[]): Site[] {
return sites.map((communitySiteValues) => {
const communitySite = new CommunitySite({
const communitySite = new Site({
...communitySiteValues,
devices:
typeof communitySiteValues.devices !== 'undefined'
Expand All @@ -74,6 +74,8 @@ export class IPAMConfigController {
sites: this.processSites(sites),
});

setContainer('COMMUNITY', community.id, community);

return community;
},
);
Expand All @@ -82,13 +84,18 @@ export class IPAMConfigController {
public processCircuitLocations(
circuitLocations: IPAMCircuitLocation[],
): CircuitLocation[] {
return circuitLocations.map((circuitLocationValues) => {
const circuitLocation = new CircuitLocation(circuitLocationValues);
return circuitLocations.map(
({ communuity, ...communityLocationValues }) => {
const circuitLocation = new CircuitLocation({
communuityId: communuity,
...communityLocationValues,
});

setContainer('CIRCUIT_LOCATION', circuitLocation.id, circuitLocation);
setContainer('CIRCUIT_LOCATION', circuitLocation.id, circuitLocation);

return circuitLocation;
});
return circuitLocation;
},
);
}

public processCircuits(circuits: IPAMCircuit[]): Circuit[] {
Expand Down Expand Up @@ -140,6 +147,15 @@ export class IPAMConfigController {
...networkValues,
});

if (network.circuitId) {
Container.set({
id: `circuitNetworks-${network.circuitId}`,
multiple: true,
value: () =>
Container.get(createContainerName('NETWORK', network.prefix)),
});
}

const subNetworks = subNetworksValues
? this.processNetworks(subNetworksValues, network)
: [];
Expand All @@ -152,10 +168,9 @@ export class IPAMConfigController {
});
}

const hosts = hostsValue
? this.processNetworkHosts(hostsValue, network)
: [];
logger.log(LogMode.DEBUG, 'hosts', hosts);
if (hostsValue) {
this.processNetworkHosts(hostsValue, network);
}

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

Expand Down
4 changes: 2 additions & 2 deletions src/Modules/IPAM/IPAMConfigSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import jsonSchema from 'fluent-json-schema';
import { circuitLocationSchema } from '../CommunityCircuits/CircuitLocationSchema';
import { circuitSchema } from '../Circuits/CircuitSchema';
import { contactSchema } from '../Contacts/ContactSchema';
import { communitySiteSchema } from '../Communities/CommunitySiteSchema';
import { siteSchema } from '../Sites/SiteSchema';
import { networkCircuitSchema } from '../Networks/NetworkCircuitSchema';
import { networkSchema } from '../Networks/NetworkSchema';
import { networkDeviceConfigSchema } from '../NetworkDevices/NetworkDeviceConfigSchema';
Expand All @@ -20,7 +20,7 @@ export const communityConfigSchema = jsonSchema
.additionalProperties(false)
.description('IPAM Configuration File')
.definition('community', communitySchema)
.definition('communitySite', communitySiteSchema)
.definition('communitySite', siteSchema)
.definition('contact', contactSchema)
.definition(
'contactId',
Expand Down
1 change: 1 addition & 0 deletions src/Modules/NetworkDevices/NetworkDeviceType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ export enum NetworkDeviceType {
MODEM = 'modem',
FIREWALL = 'firewall',
UPS = 'UPS',
CELLULAR_VPN = 'cell-vpn',
}
Loading

0 comments on commit c1639b5

Please sign in to comment.