Skip to content

Commit d8975c3

Browse files
committed
feat(Testing, Recursive Searching); Adds fixtures and basic testing for contacts, and begins work on recursive searching of information
1 parent 0a7782d commit d8975c3

21 files changed

+407
-70
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"typescript.tsdk": "node_modules/typescript/lib",
33
"yaml.schemas": {
4-
"/workspace/schemas/IPAM.json": ["ipam.yml", "ipam.yaml", "IPAM.yaml", "IPAM.yml"]
4+
"/workspace/schemas/IPAM.json": ["ipam.yml", "ipam.yaml", "IPAM.yaml", "IPAM.yml", "**/fixtures/*.yml", "**/fixtures/*.yaml"]
55
}
66
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"type": "module",
77
"private": true,
88
"scripts": {
9-
"test": "echo TODO",
9+
"test": "ts-estest ./src/",
1010
"prepublishOnly": "npm run build",
1111
"build": "tsc -p ./tsconfig.build.json",
1212
"start:debug": "node --loader @k-foss/ts-esnode --experimental-modules --experimental-specifier-resolution=node --harmony-top-level-await ./",

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"},"nsServers":{"type":"array","items":{"type":"string","description":"Reverse DNS NS Server","format":"hostname"}},"type":{"type":"string","description":"Network Type","enum":["UNALLOCATED","EXTERNAL"]},"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","format":"ipv4"},"hostname":{"type":"string","description":"Hostname for reverse DNS creation","format":"hostname"},"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"},"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"]}

src/Modules/IPAM/Community.ts renamed to src/Modules/Communities/Community.ts

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

77
export const CommunitiesToken = new Token<string>('communities');
88

99
@Service()
1010
export class Community {
1111
public name: string;
1212

13+
public id: string;
14+
15+
/**
16+
* Unique Contact Id Reference
17+
*/
1318
public contactId: string;
1419

1520
public sites: CommunitySite[];
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// src/Modules/Contacts/Contact.test.ts
2+
import { TestSuite } from '@k-foss/ts-estests';
3+
import { deepStrictEqual } from 'assert';
4+
import { resolve } from 'path';
5+
import { fileURLToPath } from 'url';
6+
import { ipamConfigController } from '../IPAM/IPAMConfigController';
7+
8+
export class ContactTestSuite extends TestSuite {
9+
public testName = 'Contact Test Suite';
10+
11+
public async test(): Promise<void> {
12+
const ipam = await ipamConfigController.loadFile(
13+
resolve(
14+
fileURLToPath(import.meta.url),
15+
'../fixtures/ContactSample1.yaml',
16+
),
17+
);
18+
19+
const contact1 = ipam.contacts[0];
20+
const contact2 = ipam.contacts[1];
21+
const contact3 = ipam.contacts[2];
22+
23+
deepStrictEqual(
24+
contact1.id,
25+
'lab1.kfj',
26+
'ipam.contacts[0].id === lab1.kfj',
27+
);
28+
29+
deepStrictEqual(
30+
contact2.id,
31+
'core1.hello',
32+
'ipam.contacts[1].id === core1.hello',
33+
);
34+
35+
deepStrictEqual(
36+
contact3.id,
37+
'net.test',
38+
'ipam.contacts[2].id === net.test',
39+
);
40+
41+
const community1 = ipam.communities[0];
42+
const community2 = ipam.communities[1];
43+
44+
deepStrictEqual(
45+
community1.contactId,
46+
'lab1.kfj',
47+
'ipam.communities[0].contactId === lab1.kfj',
48+
);
49+
deepStrictEqual(
50+
community1.contact.id,
51+
'lab1.kfj',
52+
'ipam.communities[0].contact.id === lab1.kfj',
53+
);
54+
55+
deepStrictEqual(
56+
community2.contactId,
57+
'core1.hello',
58+
'ipam.communities[1].contactId === core1.hello',
59+
);
60+
deepStrictEqual(
61+
community2.contact.id,
62+
'core1.hello',
63+
'ipam.communities[1].contact.id === core1.hello',
64+
);
65+
deepStrictEqual(
66+
community2.contact,
67+
contact2,
68+
'ipam.communities[1].contact === ipam.contacts[1]',
69+
);
70+
71+
const network1 = ipam.networks[0];
72+
73+
if (network1.networks) {
74+
const subnetwork1 = network1.networks[0];
75+
76+
console.log(subnetwork1.prefix, subnetwork1.contact, subnetwork1.circuit);
77+
78+
deepStrictEqual(subnetwork1.contact?.id, network1.contactId);
79+
}
80+
81+
deepStrictEqual(
82+
network1.contactId,
83+
'net.test',
84+
'ipam.networks[0].contactId === net.test',
85+
);
86+
87+
deepStrictEqual(
88+
network1.contact?.id,
89+
'net.test',
90+
'ipam.networks[0].contact?.id === net.test',
91+
);
92+
93+
deepStrictEqual(
94+
network1.contact,
95+
contact3,
96+
'ipam.networks[0].contact === ipam.contacts[2]',
97+
);
98+
}
99+
}

src/Modules/CommunityContacts/CommunityContact.ts renamed to src/Modules/Contacts/Contact.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// src/Modules/CommunityContacts/CommunityContact.ts
2+
import { Service } from 'typedi';
23
import { Contact as IPAMContact } from '../IPAM/IPAMConfig.gen';
34

5+
@Service()
46
export class Contact implements IPAMContact {
57
public id: string;
68

src/Modules/CommunityContacts/CommunityContactConfigSchema.ts renamed to src/Modules/Contacts/ContactSchema.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
// src/Modules/CommunityContacts/CommunityContactConfigSchema.ts
22
import jsonSchema from 'fluent-json-schema';
33

4-
export const communityContactConfigSchema = jsonSchema
4+
export const contactSchema = jsonSchema
55
.object()
66
.additionalProperties(false)
77
.id('#contact')
88
.description('Community Contact')
9-
.prop('id', jsonSchema.string().description('Unique contact ID').required())
9+
.prop('id', jsonSchema.ref('#/definitions/contactId').required())
1010
.prop(
1111
'name',
1212
jsonSchema.string().description('Contact Full Name').required(),
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
communities:
2+
- name: Lab 1
3+
id: lab1
4+
contact: lab1.kfj
5+
sites:
6+
- id: lab1.site1
7+
name: Lab Site 1
8+
9+
- name: Core 1
10+
id: core1
11+
contact: core1.hello
12+
sites:
13+
- id: core1.site1
14+
name: Core Site 1
15+
16+
networks:
17+
- prefix: 1.1.1.0/24
18+
description: HelloWorld
19+
contactId: net.test
20+
circuit:
21+
id: core.lab1
22+
networks:
23+
- prefix: 1.1.1.0/30
24+
description: HelloWorld2
25+
26+
circuits:
27+
- id: core.lab1
28+
sideA:
29+
id: circuit1
30+
sideZ:
31+
id: circuit2
32+
33+
circuitLocations:
34+
- id: circuit1
35+
address: lab1 street 1
36+
communuity: lab1
37+
provider: Core Provider
38+
demarcSpeed: 1G
39+
40+
- id: circuit2
41+
address: Core Site 1, Street 5859
42+
communuity: core1
43+
demarcSpeed: 10G
44+
provider: Core Provider
45+
46+
contacts:
47+
- id: lab1.kfj
48+
name: Kristian Jones
49+
- id: core1.hello
50+
name: Hello World
51+
- id: net.test
52+
name: HelloTest

src/Modules/IPAM/IPAM.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import { Service } from 'typedi';
44
import { Circuit } from '../Circuits/Circuit';
55
import { CircuitLocation } from '../Circuits/CircuitLocation';
6-
import { Contact } from '../CommunityContacts/CommunityContact';
6+
import { Contact } from '../Contacts/Contact';
77
import { Network } from '../Networks/Network';
8-
import { Community } from './Community';
8+
import { Community } from '../Communities/Community';
99

1010
@Service()
1111
export class IPAM {

src/Modules/IPAM/IPAMConfig.gen.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@
66
*/
77

88
export type NetworkDeviceType = "router" | "switch" | "access-point" | "server" | "modem" | "firewall" | "UPS";
9+
/**
10+
* Unique Identifier for referencing Contact
11+
*/
12+
export type ContactId = string;
913

1014
/**
1115
* IPAM Configuration File
@@ -116,10 +120,7 @@ export interface CircuitLocation {
116120
* Community Contact
117121
*/
118122
export interface Contact {
119-
/**
120-
* Unique contact ID
121-
*/
122-
id: string;
123+
id: ContactId;
123124
/**
124125
* Contact Full Name
125126
*/
@@ -140,10 +141,7 @@ export interface Network {
140141
* Network Type
141142
*/
142143
type?: "UNALLOCATED" | "EXTERNAL";
143-
/**
144-
* Contact ID
145-
*/
146-
contactId?: string;
144+
contactId?: ContactId;
147145
hosts?: NetworkHost[];
148146
ranges?: NetworkRange[];
149147
/**
@@ -176,6 +174,7 @@ export interface NetworkHost {
176174
* Hostname for reverse DNS creation
177175
*/
178176
hostname?: string;
177+
contactId?: ContactId;
179178
description?: string;
180179
device?: NetworkDeviceLink;
181180
}

0 commit comments

Comments
 (0)