Skip to content

Commit

Permalink
feat(Testing, Recursive Searching); Adds fixtures and basic testing f…
Browse files Browse the repository at this point in the history
…or contacts, and begins work on recursive searching of information
  • Loading branch information
EntraptaJ committed Jan 24, 2021
1 parent 0a7782d commit d8975c3
Show file tree
Hide file tree
Showing 21 changed files with 407 additions and 70 deletions.
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"typescript.tsdk": "node_modules/typescript/lib",
"yaml.schemas": {
"/workspace/schemas/IPAM.json": ["ipam.yml", "ipam.yaml", "IPAM.yaml", "IPAM.yml"]
"/workspace/schemas/IPAM.json": ["ipam.yml", "ipam.yaml", "IPAM.yaml", "IPAM.yml", "**/fixtures/*.yml", "**/fixtures/*.yaml"]
}
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"type": "module",
"private": true,
"scripts": {
"test": "echo TODO",
"test": "ts-estest ./src/",
"prepublishOnly": "npm run build",
"build": "tsc -p ./tsconfig.build.json",
"start:debug": "node --loader @k-foss/ts-esnode --experimental-modules --experimental-specifier-resolution=node --harmony-top-level-await ./",
Expand Down
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"},"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"]}
{"$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"]}
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
// 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';
import { CommunitySite } from './CommunitySite';
import { Contact } from '../Contacts/Contact';

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

@Service()
export class Community {
public name: string;

public id: string;

/**
* Unique Contact Id Reference
*/
public contactId: string;

public sites: CommunitySite[];
Expand Down
99 changes: 99 additions & 0 deletions src/Modules/Contacts/Contact.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
// src/Modules/Contacts/Contact.test.ts
import { TestSuite } from '@k-foss/ts-estests';
import { deepStrictEqual } from 'assert';
import { resolve } from 'path';
import { fileURLToPath } from 'url';
import { ipamConfigController } from '../IPAM/IPAMConfigController';

export class ContactTestSuite extends TestSuite {
public testName = 'Contact Test Suite';

public async test(): Promise<void> {
const ipam = await ipamConfigController.loadFile(
resolve(
fileURLToPath(import.meta.url),
'../fixtures/ContactSample1.yaml',
),
);

const contact1 = ipam.contacts[0];
const contact2 = ipam.contacts[1];
const contact3 = ipam.contacts[2];

deepStrictEqual(
contact1.id,
'lab1.kfj',
'ipam.contacts[0].id === lab1.kfj',
);

deepStrictEqual(
contact2.id,
'core1.hello',
'ipam.contacts[1].id === core1.hello',
);

deepStrictEqual(
contact3.id,
'net.test',
'ipam.contacts[2].id === net.test',
);

const community1 = ipam.communities[0];
const community2 = ipam.communities[1];

deepStrictEqual(
community1.contactId,
'lab1.kfj',
'ipam.communities[0].contactId === lab1.kfj',
);
deepStrictEqual(
community1.contact.id,
'lab1.kfj',
'ipam.communities[0].contact.id === lab1.kfj',
);

deepStrictEqual(
community2.contactId,
'core1.hello',
'ipam.communities[1].contactId === core1.hello',
);
deepStrictEqual(
community2.contact.id,
'core1.hello',
'ipam.communities[1].contact.id === core1.hello',
);
deepStrictEqual(
community2.contact,
contact2,
'ipam.communities[1].contact === ipam.contacts[1]',
);

const network1 = ipam.networks[0];

if (network1.networks) {
const subnetwork1 = network1.networks[0];

console.log(subnetwork1.prefix, subnetwork1.contact, subnetwork1.circuit);

deepStrictEqual(subnetwork1.contact?.id, network1.contactId);
}

deepStrictEqual(
network1.contactId,
'net.test',
'ipam.networks[0].contactId === net.test',
);

deepStrictEqual(
network1.contact?.id,
'net.test',
'ipam.networks[0].contact?.id === net.test',
);

deepStrictEqual(
network1.contact,
contact3,
'ipam.networks[0].contact === ipam.contacts[2]',
);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// src/Modules/CommunityContacts/CommunityContact.ts
import { Service } from 'typedi';
import { Contact as IPAMContact } from '../IPAM/IPAMConfig.gen';

@Service()
export class Contact implements IPAMContact {
public id: string;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
// src/Modules/CommunityContacts/CommunityContactConfigSchema.ts
import jsonSchema from 'fluent-json-schema';

export const communityContactConfigSchema = jsonSchema
export const contactSchema = jsonSchema
.object()
.additionalProperties(false)
.id('#contact')
.description('Community Contact')
.prop('id', jsonSchema.string().description('Unique contact ID').required())
.prop('id', jsonSchema.ref('#/definitions/contactId').required())
.prop(
'name',
jsonSchema.string().description('Contact Full Name').required(),
Expand Down
52 changes: 52 additions & 0 deletions src/Modules/Contacts/fixtures/ContactSample1.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
communities:
- name: Lab 1
id: lab1
contact: lab1.kfj
sites:
- id: lab1.site1
name: Lab Site 1

- name: Core 1
id: core1
contact: core1.hello
sites:
- id: core1.site1
name: Core Site 1

networks:
- prefix: 1.1.1.0/24
description: HelloWorld
contactId: net.test
circuit:
id: core.lab1
networks:
- prefix: 1.1.1.0/30
description: HelloWorld2

circuits:
- id: core.lab1
sideA:
id: circuit1
sideZ:
id: circuit2

circuitLocations:
- id: circuit1
address: lab1 street 1
communuity: lab1
provider: Core Provider
demarcSpeed: 1G

- id: circuit2
address: Core Site 1, Street 5859
communuity: core1
demarcSpeed: 10G
provider: Core Provider

contacts:
- id: lab1.kfj
name: Kristian Jones
- id: core1.hello
name: Hello World
- id: net.test
name: HelloTest
4 changes: 2 additions & 2 deletions src/Modules/IPAM/IPAM.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import { Service } from 'typedi';
import { Circuit } from '../Circuits/Circuit';
import { CircuitLocation } from '../Circuits/CircuitLocation';
import { Contact } from '../CommunityContacts/CommunityContact';
import { Contact } from '../Contacts/Contact';
import { Network } from '../Networks/Network';
import { Community } from './Community';
import { Community } from '../Communities/Community';

@Service()
export class IPAM {
Expand Down
15 changes: 7 additions & 8 deletions src/Modules/IPAM/IPAMConfig.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
*/

export type NetworkDeviceType = "router" | "switch" | "access-point" | "server" | "modem" | "firewall" | "UPS";
/**
* Unique Identifier for referencing Contact
*/
export type ContactId = string;

/**
* IPAM Configuration File
Expand Down Expand Up @@ -116,10 +120,7 @@ export interface CircuitLocation {
* Community Contact
*/
export interface Contact {
/**
* Unique contact ID
*/
id: string;
id: ContactId;
/**
* Contact Full Name
*/
Expand All @@ -140,10 +141,7 @@ export interface Network {
* Network Type
*/
type?: "UNALLOCATED" | "EXTERNAL";
/**
* Contact ID
*/
contactId?: string;
contactId?: ContactId;
hosts?: NetworkHost[];
ranges?: NetworkRange[];
/**
Expand Down Expand Up @@ -176,6 +174,7 @@ export interface NetworkHost {
* Hostname for reverse DNS creation
*/
hostname?: string;
contactId?: ContactId;
description?: string;
device?: NetworkDeviceLink;
}
Expand Down
Loading

0 comments on commit d8975c3

Please sign in to comment.