From a01f613f44689761e972287f5005d2863e41f56c Mon Sep 17 00:00:00 2001 From: KristianFJones Date: Sat, 23 Jan 2021 04:53:03 +0000 Subject: [PATCH] feat(Code): Begin work on TypeScript side of loading and dep injection --- nodemon.json | 2 +- schemas/IPAM.json | 2 +- .../CommunityCircuitConfigSchema.ts | 0 src/Modules/Communities/CommunitySchema.ts | 28 +++++ src/Modules/Communities/CommunitySite.ts | 17 +++ .../CommunitySiteSchema.ts} | 4 +- .../CommunityContacts/CommunityContact.ts | 12 ++ .../CommunitySites/CommunitySiteConfig.ts | 4 - src/Modules/IPAM/Community.ts | 13 +- src/Modules/IPAM/CommunityConfig.ts | 16 --- src/Modules/IPAM/CommunityConfigController.ts | 42 ------- src/Modules/IPAM/IPAM.ts | 16 +++ src/Modules/IPAM/IPAMConfig.gen.ts | 20 +-- src/Modules/IPAM/IPAMConfigController.ts | 114 ++++++++++++++++++ src/Modules/IPAM/IPAMConfigSchema.ts | 29 +---- src/Modules/NetworkDevices/NetworkDevice.ts | 19 +++ .../NetworkDevices/NetworkDeviceConfig.ts | 10 -- src/index.ts | 9 +- 18 files changed, 245 insertions(+), 112 deletions(-) rename src/Modules/{CommunityCircuits => Communities}/CommunityCircuitConfigSchema.ts (100%) create mode 100644 src/Modules/Communities/CommunitySchema.ts create mode 100644 src/Modules/Communities/CommunitySite.ts rename src/Modules/{CommunitySites/CommunitySiteConfigSchema.ts => Communities/CommunitySiteSchema.ts} (75%) create mode 100644 src/Modules/CommunityContacts/CommunityContact.ts delete mode 100644 src/Modules/CommunitySites/CommunitySiteConfig.ts delete mode 100644 src/Modules/IPAM/CommunityConfig.ts delete mode 100644 src/Modules/IPAM/CommunityConfigController.ts create mode 100644 src/Modules/IPAM/IPAM.ts create mode 100644 src/Modules/IPAM/IPAMConfigController.ts create mode 100644 src/Modules/NetworkDevices/NetworkDevice.ts delete mode 100644 src/Modules/NetworkDevices/NetworkDeviceConfig.ts diff --git a/nodemon.json b/nodemon.json index 3990f5c..ae27457 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,5 +1,5 @@ { - "watch": ["src"], + "watch": ["src", "IPAM.yaml"], "ext": "ts", "ignore": ["src/**/*.test.ts"], "exec": "npm run start:debug" diff --git a/schemas/IPAM.json b/schemas/IPAM.json index a983138..b5e2819 100644 --- a/schemas/IPAM.json +++ b/schemas/IPAM.json @@ -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":{"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"]}}},"required":["name","id","sites"]},"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","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","properties":{"id":{"type":"string","description":"Circuit ID"},"sideA":{"type":"object","properties":{"id":{"type":"string","description":"Circuit Location Id"}}},"sideZ":{"type":"object","properties":{"id":{"type":"string","description":"Circuit Location Id"}}},"speed":{"type":"string"}},"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":{"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"]}},"ranges":{"type":"array","items":{"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"]}},"networks":{"type":"array","items":{"$ref":"#/definitions/network"},"uniqueItems":true,"description":"Children Networks"}}},"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"]} \ No newline at end of file +{"$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","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","properties":{"id":{"type":"string","description":"Circuit ID"},"sideA":{"type":"object","properties":{"id":{"type":"string","description":"Circuit Location Id"}}},"sideZ":{"type":"object","properties":{"id":{"type":"string","description":"Circuit Location Id"}}},"speed":{"type":"string"}},"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":{"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"]}},"ranges":{"type":"array","items":{"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"]}},"networks":{"type":"array","items":{"$ref":"#/definitions/network"},"uniqueItems":true,"description":"Children Networks"}}},"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"]} \ No newline at end of file diff --git a/src/Modules/CommunityCircuits/CommunityCircuitConfigSchema.ts b/src/Modules/Communities/CommunityCircuitConfigSchema.ts similarity index 100% rename from src/Modules/CommunityCircuits/CommunityCircuitConfigSchema.ts rename to src/Modules/Communities/CommunityCircuitConfigSchema.ts diff --git a/src/Modules/Communities/CommunitySchema.ts b/src/Modules/Communities/CommunitySchema.ts new file mode 100644 index 0000000..37a0184 --- /dev/null +++ b/src/Modules/Communities/CommunitySchema.ts @@ -0,0 +1,28 @@ +// src/Modules/Communities/CommunitySchema.ts +import jsonSchema from 'fluent-json-schema'; + +export const communitySchema = jsonSchema + .object() + .additionalProperties(false) + .id('#community') + .description('Community') + .prop('contact', jsonSchema.string().description('Community Contact ID')) + .prop( + 'name', + jsonSchema.string().description('Community Friendly Name').required(), + ) + .prop( + 'id', + jsonSchema + .string() + .description('Short form community code') + .examples(['sxl']) + .required(), + ) + .prop( + 'sites', + jsonSchema + .array() + .items(jsonSchema.ref('#/definitions/communitySite')) + .required(), + ); diff --git a/src/Modules/Communities/CommunitySite.ts b/src/Modules/Communities/CommunitySite.ts new file mode 100644 index 0000000..2d35cc0 --- /dev/null +++ b/src/Modules/Communities/CommunitySite.ts @@ -0,0 +1,17 @@ +// src/Modules/Communities/CommunitySite.ts +import { Inject, InjectMany, Service } from 'typedi'; +import { CommunitySite as IPAMCommunitySite } from '../IPAM/IPAMConfig.gen'; +import { NetworkDevice } from '../NetworkDevices/NetworkDevice'; + +@Service() +export class CommunitySite implements IPAMCommunitySite { + public id: string; + + public name: string; + + public devices: NetworkDevice[]; + + public constructor(options: Partial) { + Object.assign(this, options); + } +} diff --git a/src/Modules/CommunitySites/CommunitySiteConfigSchema.ts b/src/Modules/Communities/CommunitySiteSchema.ts similarity index 75% rename from src/Modules/CommunitySites/CommunitySiteConfigSchema.ts rename to src/Modules/Communities/CommunitySiteSchema.ts index 9759ec1..2680460 100644 --- a/src/Modules/CommunitySites/CommunitySiteConfigSchema.ts +++ b/src/Modules/Communities/CommunitySiteSchema.ts @@ -1,7 +1,7 @@ -// src/Modules/CommunitySites/CommunitySiteConfigSchema.ts +// src/Modules/Communities/CommunitySiteSchema.ts import jsonSchema from 'fluent-json-schema'; -export const communitySiteConfigSchema = jsonSchema +export const communitySiteSchema = jsonSchema .object() .additionalProperties(false) .description('Community Site') diff --git a/src/Modules/CommunityContacts/CommunityContact.ts b/src/Modules/CommunityContacts/CommunityContact.ts new file mode 100644 index 0000000..2c03128 --- /dev/null +++ b/src/Modules/CommunityContacts/CommunityContact.ts @@ -0,0 +1,12 @@ +// src/Modules/CommunityContacts/CommunityContact.ts +import { Contact as IPAMContact } from '../IPAM/IPAMConfig.gen'; + +export class Contact implements IPAMContact { + public id: string; + + public name: string; + + public constructor(options: Partial) { + Object.assign(this, options); + } +} diff --git a/src/Modules/CommunitySites/CommunitySiteConfig.ts b/src/Modules/CommunitySites/CommunitySiteConfig.ts deleted file mode 100644 index a6e933e..0000000 --- a/src/Modules/CommunitySites/CommunitySiteConfig.ts +++ /dev/null @@ -1,4 +0,0 @@ -// src/Modules/CommunitySites/CommunitySiteConfig.ts -export interface CommunitySiteConfig { - id: string; -} diff --git a/src/Modules/IPAM/Community.ts b/src/Modules/IPAM/Community.ts index f60c20e..4d18a04 100644 --- a/src/Modules/IPAM/Community.ts +++ b/src/Modules/IPAM/Community.ts @@ -1,11 +1,22 @@ // src/Modules/Communities/Community.ts -import { Token } from 'typedi'; +import Container, { Service, Token } from 'typedi'; +import { CommunitySite } from '../Communities/CommunitySite'; +import { Contact } from '../CommunityContacts/CommunityContact'; export const CommunitiesToken = new Token('communities'); +@Service() export class Community { public name: string; + public contactId: string; + + public sites: CommunitySite[]; + + public get contact(): Contact { + return Container.get(`contact-${this.contactId}`); + } + public constructor(options: Partial) { Object.assign(this, options); } diff --git a/src/Modules/IPAM/CommunityConfig.ts b/src/Modules/IPAM/CommunityConfig.ts deleted file mode 100644 index b030bf1..0000000 --- a/src/Modules/IPAM/CommunityConfig.ts +++ /dev/null @@ -1,16 +0,0 @@ -// src/Modules/Communities/CommunityConfig.ts -export interface CommunityConfig { - /** - * Friendly Name - */ - name: string; - - /** - * Community ID/Keycode - */ - id: string; -} - -export interface CommunityYAMLConfig { - communities: CommunityConfig[]; -} diff --git a/src/Modules/IPAM/CommunityConfigController.ts b/src/Modules/IPAM/CommunityConfigController.ts deleted file mode 100644 index 07cb0a4..0000000 --- a/src/Modules/IPAM/CommunityConfigController.ts +++ /dev/null @@ -1,42 +0,0 @@ -// src/Modules/Communities/CommunityConfigController.ts -import { readFile } from 'fs/promises'; -import { load } from 'js-yaml'; -import Container, { Service } from 'typedi'; -import { logger, LogMode } from '../../Library/Logger'; -import { isObjectType } from '../../Utils/isTypes'; -import { CommunitiesToken, Community } from './Community'; -import { CommunityYAMLConfig } from './CommunityConfig'; - -@Service() -export class CommunityConfigController { - /** - * Load the configured firewalls configuration file from disk, parse the YAML and load into the class - */ - public async loadFile(): Promise { - const communitiesConfigFilePath = 'communities.yml'; - - const communitiesFile = await readFile(communitiesConfigFilePath); - - const communitiesConfigFile = load(communitiesFile.toString()); - - if ( - isObjectType(communitiesConfigFile, 'communities') - ) { - logger.log( - LogMode.INFO, - 'Loaded Communities Configuration File', - communitiesConfigFile, - ); - - const communities = communitiesConfigFile.communities.map((community) => { - return new Community(community); - }); - - Container.set(CommunitiesToken, communities); - - return; - } - - throw new Error('Invlaid Firewalls configuration file'); - } -} diff --git a/src/Modules/IPAM/IPAM.ts b/src/Modules/IPAM/IPAM.ts new file mode 100644 index 0000000..f4c4381 --- /dev/null +++ b/src/Modules/IPAM/IPAM.ts @@ -0,0 +1,16 @@ +// src/Modules/IPAM/IPAM.ts + +import { Service } from 'typedi'; +import { Contact } from '../CommunityContacts/CommunityContact'; +import { Community } from './Community'; + +@Service() +export class IPAM { + public contacts: Contact[]; + + public communities: Community[]; + + public constructor(options: Partial) { + Object.assign(this, options); + } +} diff --git a/src/Modules/IPAM/IPAMConfig.gen.ts b/src/Modules/IPAM/IPAMConfig.gen.ts index 68bc19b..b5c8863 100644 --- a/src/Modules/IPAM/IPAMConfig.gen.ts +++ b/src/Modules/IPAM/IPAMConfig.gen.ts @@ -45,14 +45,18 @@ export interface Community { * Short form community code */ id: string; - sites: { - /** - * Site short id - */ - id: string; - name: string; - devices?: Device[]; - }[]; + sites: CommunitySite[]; +} +/** + * Community Site + */ +export interface CommunitySite { + /** + * Site short id + */ + id: string; + name: string; + devices?: Device[]; } /** * Network Device diff --git a/src/Modules/IPAM/IPAMConfigController.ts b/src/Modules/IPAM/IPAMConfigController.ts new file mode 100644 index 0000000..981f939 --- /dev/null +++ b/src/Modules/IPAM/IPAMConfigController.ts @@ -0,0 +1,114 @@ +// src/Modules/Communities/CommunityConfigController.ts +import { PathLike } from 'fs'; +import { readFile } from 'fs/promises'; +import { load } from 'js-yaml'; +import Container, { Service } from 'typedi'; +import { logger, LogMode } from '../../Library/Logger'; +import { isObjectType } from '../../Utils/isTypes'; +import { CommunitySite } from '../Communities/CommunitySite'; +import { Contact } from '../CommunityContacts/CommunityContact'; +import { NetworkDevice } from '../NetworkDevices/NetworkDevice'; +import { Community } from './Community'; +import { + IPAM, + Community as IPAMCommunity, + Contact as IPAMContact, + CommunitySite as IPAMCommunitySite, + Device as IPAMDevice, +} from './IPAMConfig.gen'; + +@Service() +export class IPAMConfigController { + public processContacts(contacts: IPAMContact[]): Contact[] { + return contacts.map((contactValues) => { + const contact = new Contact(contactValues); + + Container.set(`contact-${contact.id}`, contact); + + return contact; + }); + } + + public processSiteDevices(devices: IPAMDevice[]): NetworkDevice[] { + return devices.map((deviceValues) => { + const device = new NetworkDevice(deviceValues); + + Container.set(`networkDevice-${device.id}`, device); + + return device; + }); + } + + public processSites(sites: IPAMCommunitySite[]): CommunitySite[] { + return sites.map((communitySiteValues) => { + const communitySite = new CommunitySite({ + ...communitySiteValues, + devices: + typeof communitySiteValues.devices !== 'undefined' + ? this.processSiteDevices(communitySiteValues.devices) + : [], + }); + + Container.set(`communitySite-${communitySite.id}`, communitySite); + + return communitySite; + }); + } + + public processCommunities(communities: IPAMCommunity[]): Community[] { + return communities.map((communityValue) => { + const community = new Community({ + contactId: communityValue.contact, + name: communityValue.name, + sites: this.processSites(communityValue.sites), + }); + + return community; + }); + } + + /** + * Load the configured firewalls configuration file from disk, parse the YAML and load into the class + */ + public async loadFile(filePath?: PathLike): Promise { + const ipamConfigFilePath = filePath || 'ipam.yml'; + + const ipamFile = await readFile(ipamConfigFilePath); + + const ipamConfigFile = load(ipamFile.toString()); + + if (isObjectType(ipamConfigFile, 'communities')) { + logger.log( + LogMode.INFO, + 'Loaded Communities Configuration File', + ipamConfigFilePath, + ); + + logger.log(LogMode.DEBUG, `IPAMConfig: `, ipamConfigFile); + + const contacts = this.processContacts(ipamConfigFile.contacts); + const communities = this.processCommunities(ipamConfigFile.communities); + + const torontoCommunity = communities.find( + ({ name }) => name === 'Toronto', + ); + + if (torontoCommunity) { + const device = torontoCommunity.sites[0].devices[0]; + + logger.log( + LogMode.DEBUG, + 'Toronto: ', + device, + Container.get(`networkDevice-${device.id}`), + ); + } + + return; + } + + throw new Error('Invlaid Firewalls configuration file'); + } +} + +export const ipamConfigController = new IPAMConfigController(); diff --git a/src/Modules/IPAM/IPAMConfigSchema.ts b/src/Modules/IPAM/IPAMConfigSchema.ts index f972c57..c6e5714 100644 --- a/src/Modules/IPAM/IPAMConfigSchema.ts +++ b/src/Modules/IPAM/IPAMConfigSchema.ts @@ -1,44 +1,23 @@ // src/Modules/Communities/CommunityConfigSchema.ts import jsonSchema from 'fluent-json-schema'; import { circuitLocationSchema } from '../CommunityCircuits/CircuitLocationSchema'; -import { communityCircuitConfigSchema } from '../CommunityCircuits/CommunityCircuitConfigSchema'; +import { communityCircuitConfigSchema } from '../Communities/CommunityCircuitConfigSchema'; import { communityContactConfigSchema } from '../CommunityContacts/CommunityContactConfigSchema'; -import { communitySiteConfigSchema } from '../CommunitySites/CommunitySiteConfigSchema'; +import { communitySiteSchema } from '../Communities/CommunitySiteSchema'; import { networkCircuitSchema } from '../Networks/NetworkCircuitSchema'; import { networkSchema } from '../Networks/NetworkSchema'; import { networkDeviceConfigSchema } from '../NetworkDevices/NetworkDeviceConfigSchema'; import { NetworkDeviceInterfaceType } from '../NetworkDevices/NetworkDeviceInterfaceType'; import { networkDeviceLinkSchema } from '../NetworkDevices/NetworkDeviceLinkSchema'; import { NetworkDeviceType } from '../NetworkDevices/NetworkDeviceType'; - -const communitySchema = jsonSchema - .object() - .additionalProperties(false) - .id('#community') - .description('Community') - .prop('contact', jsonSchema.string().description('Community Contact ID')) - .prop( - 'name', - jsonSchema.string().description('Community Friendly Name').required(), - ) - .prop( - 'id', - jsonSchema - .string() - .description('Short form community code') - .examples(['sxl']) - .required(), - ) - .prop( - 'sites', - jsonSchema.array().items(communitySiteConfigSchema).required(), - ); +import { communitySchema } from '../Communities/CommunitySchema'; export const communityConfigSchema = jsonSchema .object() .additionalProperties(false) .description('IPAM Configuration File') .definition('community', communitySchema) + .definition('communitySite', communitySiteSchema) .definition('contact', communityContactConfigSchema) .definition('device', networkDeviceConfigSchema) .definition('networkcircuit', networkCircuitSchema) diff --git a/src/Modules/NetworkDevices/NetworkDevice.ts b/src/Modules/NetworkDevices/NetworkDevice.ts new file mode 100644 index 0000000..463f1ca --- /dev/null +++ b/src/Modules/NetworkDevices/NetworkDevice.ts @@ -0,0 +1,19 @@ +// src/Modules/NetworkDevices/NetworkDevice.ts +import { Service } from 'typedi'; +import { + Device as IPAMDevice, + NetworkDeviceType, +} from '../IPAM/IPAMConfig.gen'; + +@Service() +export class NetworkDevice implements IPAMDevice { + public id: string; + + public name: string; + + public type: NetworkDeviceType; + + public constructor(options: Partial) { + Object.assign(this, options); + } +} diff --git a/src/Modules/NetworkDevices/NetworkDeviceConfig.ts b/src/Modules/NetworkDevices/NetworkDeviceConfig.ts deleted file mode 100644 index 2d2aa66..0000000 --- a/src/Modules/NetworkDevices/NetworkDeviceConfig.ts +++ /dev/null @@ -1,10 +0,0 @@ -// src/Modules/NetworkDevices/NetworkDeviceConfig.ts -import { NetworkDeviceType } from './NetworkDeviceType'; - -export interface NetworkDeviceConfig { - name: string; - - community: string; - - type: NetworkDeviceType; -} diff --git a/src/index.ts b/src/index.ts index 3c5f1be..4e8b45a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,8 +2,13 @@ import { timeout } from './Utils/timeout'; import { logger, LogMode } from './Library/Logger'; import Ajv, { JSONSchemaType } from 'ajv/dist/2019'; +import { ipamConfigController } from './Modules/IPAM/IPAMConfigController'; -interface Country { +const config = ipamConfigController.loadFile('IPAM.yaml'); + +console.log(config); + +/* interface Country { name: string; } @@ -44,7 +49,7 @@ const ajv = new Ajv({ const validate = ajv.compile(schema); -console.log(validate(validData)); +console.log(validate(validData)); */ /* const jsonSchema = ajv.getSchema('countries')?.schema; if (typeof jsonSchema !== 'undefined' && typeof jsonSchema !== 'boolean') {