Migrated all simplex entities to simplexdb

This commit is contained in:
Roger Garcia 2020-04-08 12:58:34 +02:00
parent c13f0a2905
commit 1a36b51266
24 changed files with 376 additions and 196 deletions

View file

@ -1,6 +1,6 @@
version: "3"
services:
database:
radiusdb:
image: "mariadb:latest"
volumes:
- ./db:/var/lib/mysql
@ -12,3 +12,14 @@ services:
MYSQL_PASSWORD: radius
ports:
- 3306:3306
simplexdb:
image: postgres:latest
volumes:
- ./simplexdb:/var/lib/postgresql/data
- ./dumpsimplex:/docker-entrypoint-initdb.d
environment:
POSTGRES_DB: simplex
POSTGRES_USER: simplex
POSTGRES_PASSWORD: simplex
ports:
- 5432:5432

File diff suppressed because one or more lines are too long

0
dumpsimplex/dump.sql Normal file
View file

1
dumpsimplex/simplex.sql Normal file
View file

@ -0,0 +1 @@
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

250
package-lock.json generated
View file

@ -1332,6 +1332,11 @@
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"buffer-writer": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
"integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw=="
},
"bytes": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
@ -3299,6 +3304,145 @@
}
}
},
"loopback-connector-postgresql": {
"version": "3.9.1",
"resolved": "https://registry.npmjs.org/loopback-connector-postgresql/-/loopback-connector-postgresql-3.9.1.tgz",
"integrity": "sha512-shLmcZvbjKCuGNkF3i0xoycIe1VnvcPL4lh9VLc0r8c/7EpeSEmudtyauxOKCtgspbhtlJgAULE9ugUwykDMKQ==",
"requires": {
"async": "^0.9.0",
"bluebird": "^3.4.6",
"chalk": "^3.0.0",
"debug": "^4.1.1",
"loopback-connector": "^4.10.2",
"pg": "^7.0.0",
"strong-globalize": "^4.0.0",
"uuid": "^3.0.1"
},
"dependencies": {
"ansi-styles": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
"integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
"requires": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
"async": {
"version": "0.9.2",
"resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
"integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0="
},
"chalk": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"invert-kv": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.0.tgz",
"integrity": "sha512-JzF8q2BeZA1ZkE3XROwRpoMQ9ObMgTtp0JH8EXewlbkikuOj2GPLIpUipdO+VL8QsTr2teAJD02EFGGL5cO7uw=="
},
"lcid": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
"integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
"requires": {
"invert-kv": "^3.0.0"
}
},
"loopback-connector": {
"version": "4.10.2",
"resolved": "https://registry.npmjs.org/loopback-connector/-/loopback-connector-4.10.2.tgz",
"integrity": "sha512-3aG0X6FtA9qAkD0FjPYYxt1HgBBezKHG7WMvl3cAt3KmvFAvEALsOZNZLoR1q49pUyc/W1VEJyQXEeHiWWTMuA==",
"requires": {
"async": "^3.1.0",
"bluebird": "^3.4.6",
"debug": "^4.1.1",
"msgpack5": "^4.2.0",
"strong-globalize": "^5.0.0",
"uuid": "^3.0.1"
},
"dependencies": {
"async": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
"integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw=="
},
"strong-globalize": {
"version": "5.0.5",
"resolved": "https://registry.npmjs.org/strong-globalize/-/strong-globalize-5.0.5.tgz",
"integrity": "sha512-zv9jFoe2zAzJE/UyCvrQm1/FVfAARlR6pfDWvU0LEIpK1ri2E0Sco1ggALIhmzyPY/k0VWkdlx74DK/yq79h2Q==",
"requires": {
"accept-language": "^3.0.18",
"debug": "^4.1.1",
"globalize": "^1.4.2",
"lodash": "^4.17.15",
"md5": "^2.2.1",
"mkdirp": "^1.0.3",
"os-locale": "^4.0.0",
"yamljs": "^0.3.0"
}
}
}
},
"mem": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz",
"integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
"requires": {
"map-age-cleaner": "^0.1.3",
"mimic-fn": "^2.1.0",
"p-is-promise": "^2.1.0"
}
},
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
},
"os-locale": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-4.0.0.tgz",
"integrity": "sha512-HsSR1+2l6as4Wp2SGZxqLnuFHxVvh1Ir9pvZxyujsC13egZVe7P0YeBLN0ijQzM/twrO5To3ia3jzBXAvpMTEA==",
"requires": {
"execa": "^1.0.0",
"lcid": "^3.0.0",
"mem": "^5.0.0"
}
},
"supports-color": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
"integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"loopback-datasource-juggler": {
"version": "4.19.2",
"resolved": "https://registry.npmjs.org/loopback-datasource-juggler/-/loopback-datasource-juggler-4.19.2.tgz",
@ -4310,6 +4454,11 @@
"release-zalgo": "^1.0.0"
}
},
"packet-reader": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
"integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
},
"param-case": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz",
@ -4412,6 +4561,68 @@
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
},
"pg": {
"version": "7.18.2",
"resolved": "https://registry.npmjs.org/pg/-/pg-7.18.2.tgz",
"integrity": "sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==",
"requires": {
"buffer-writer": "2.0.0",
"packet-reader": "1.0.0",
"pg-connection-string": "0.1.3",
"pg-packet-stream": "^1.1.0",
"pg-pool": "^2.0.10",
"pg-types": "^2.1.0",
"pgpass": "1.x",
"semver": "4.3.2"
},
"dependencies": {
"semver": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
"integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c="
}
}
},
"pg-connection-string": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz",
"integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc="
},
"pg-int8": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
"integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="
},
"pg-packet-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz",
"integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg=="
},
"pg-pool": {
"version": "2.0.10",
"resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.10.tgz",
"integrity": "sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg=="
},
"pg-types": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
"integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
"requires": {
"pg-int8": "1.0.1",
"postgres-array": "~2.0.0",
"postgres-bytea": "~1.0.0",
"postgres-date": "~1.0.4",
"postgres-interval": "^1.1.0"
}
},
"pgpass": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz",
"integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=",
"requires": {
"split": "^1.0.0"
}
},
"picomatch": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
@ -4466,6 +4677,29 @@
"semver-compare": "^1.0.0"
}
},
"postgres-array": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
"integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="
},
"postgres-bytea": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
"integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU="
},
"postgres-date": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.4.tgz",
"integrity": "sha512-bESRvKVuTrjoBluEcpv2346+6kgB7UlnqWZsnbnCccTNq/pqfj1j6oBaN5+b/NrDXepYUT/HKadqv3iS9lJuVA=="
},
"postgres-interval": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
"integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
"requires": {
"xtend": "^4.0.0"
}
},
"prelude-ls": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
@ -5063,6 +5297,14 @@
}
}
},
"split": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
"integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
"requires": {
"through": "2"
}
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@ -5373,8 +5615,7 @@
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
},
"tmp": {
"version": "0.0.33",
@ -5669,6 +5910,11 @@
"resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.3.tgz",
"integrity": "sha512-HgS+X6zAztGa9zIK3Y3LXuJes33Lz9x+YyTxgrkIdabu2vqcGOWwdfCpf1hWLRrd553wd4QCDf6BBO6FfdsRiQ=="
},
"xtend": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
"integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
},
"y18n": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",

View file

@ -58,6 +58,7 @@
"@types/minimist": "^1.2.0",
"ip-cidr": "^2.0.8",
"loopback-connector-mysql": "^5.4.2",
"loopback-connector-postgresql": "^3.9.1",
"minimist": "^1.2.5",
"password-generator": "^2.2.3",
"radius": "^1.1.4"

View file

@ -0,0 +1,4 @@
import { SimplexDataSource } from "../../datasources";
export const testSimplexDb: SimplexDataSource = new SimplexDataSource();

View file

@ -12,18 +12,20 @@ import {
UserinfoRepository
} from '../../repositories';
import { testdb } from '../datasources/radius.datasource';
import { testSimplexDb } from '../datasources/simplex.datasource';
import { SubscriptionIds, Circuit, Userinfo, Radcheck, Radusergroup, Radreply } from '../../models';
export async function givenEmptyDatabase() {
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
const subscriptonIdsRepository = new SubscriptionIdsRepository(testdb);
const ipv4PoolRepository = new IPv4PoolRepository(testdb);
const ipv6PoolRepository = new IPv6PoolRepository(testdb);
const subscriptonIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
const ipv4PoolRepository = new IPv4PoolRepository(testSimplexDb);
const ipv6PoolRepository = new IPv6PoolRepository(testSimplexDb);
const radCheckRepository = new RadcheckRepository(testdb);
const radGroupCheckRepository = new RadgroupcheckRepository(testdb);
const radGroupReplyRepository = new RadgroupreplyRepository(testdb);
@ -50,10 +52,10 @@ export async function givenEmptyDatabase() {
export async function givenSubscription(id: number, firstname: string, lastname: string) {
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
const subscriptionIdsRepository = new SubscriptionIdsRepository(testdb);
const subscriptionIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
await subscriptionIdsRepository.create(new SubscriptionIds({
id,
@ -70,8 +72,8 @@ export async function givenSubscription(id: number, firstname: string, lastname:
export async function givenCircuit(circuit: Partial<Circuit>) {
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
return circuitRepository.create(circuit);
}
@ -79,20 +81,20 @@ export async function givenCircuit(circuit: Partial<Circuit>) {
export async function getSubscriptions() {
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
return subscriptionRepository.find();
}
export async function givenSubscriptionIdsPool(pool: any) {
const subscriptonIdsRepository = new SubscriptionIdsRepository(testdb);
const subscriptonIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
await subscriptonIdsRepository.createAll(pool);
}
export async function getSubscriptionIdsPool() {
const subscriptonIdsRepository = new SubscriptionIdsRepository(testdb);
const subscriptonIdsRepository = new SubscriptionIdsRepository(testSimplexDb);
return subscriptonIdsRepository.find();
}
@ -100,20 +102,20 @@ export async function getSubscriptionIdsPool() {
export async function getSubscriptionFromId(id: number) {
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
subscriptionRepository = new SubscriptionRepository(testdb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testdb, async () => subscriptionRepository);
subscriptionRepository = new SubscriptionRepository(testSimplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(testSimplexDb, async () => subscriptionRepository);
return subscriptionRepository.findById(id);
}
export async function givenIPv4Pool(pool: any) {
const ipv4PoolRepository = new IPv4PoolRepository(testdb);
const ipv4PoolRepository = new IPv4PoolRepository(testSimplexDb);
await ipv4PoolRepository.createAll(pool);
}
export async function givenIPv6Pool(pool: any) {
const ipv6PoolRepository = new IPv6PoolRepository(testdb);
const ipv6PoolRepository = new IPv6PoolRepository(testSimplexDb);
await ipv6PoolRepository.createAll(pool);
}

View file

@ -1 +1,2 @@
export * from './radius.datasource';
export * from './simplex.datasource';

View file

@ -1,7 +1,7 @@
{
"name": "radius",
"connector": "mysql",
"host": "192.168.95.145",
"host": "localhost",
"port": 3306,
"user": "radius",
"password": "radius",

View file

@ -0,0 +1,10 @@
{
"name": "simplex",
"connector": "postgresql",
"url": "",
"host": "localhost",
"port": 5432,
"user": "simplex",
"password": "simplex",
"database": "simplex"
}

View file

@ -0,0 +1,36 @@
import {
inject,
lifeCycleObserver,
LifeCycleObserver,
ValueOrPromise,
} from '@loopback/core';
import {juggler} from '@loopback/repository';
import config from './simplex.datasource.config.json';
@lifeCycleObserver('datasource')
export class SimplexDataSource extends juggler.DataSource
implements LifeCycleObserver {
static dataSourceName = 'simplex';
constructor(
@inject('datasources.config.simplex', {optional: true})
dsConfig: object = config,
) {
super(dsConfig);
}
/**
* Start the datasource when application is started
*/
start(): ValueOrPromise<void> {
// Add your logic here to be invoked when the application is started
}
/**
* Disconnect the datasource when application is stopped. This allows the
* application to be shut down gracefully.
*/
stop(): ValueOrPromise<void> {
return super.disconnect();
}
}

View file

@ -7,7 +7,7 @@ export async function migrate(args: string[]) {
const app = new ExoApiApplication();
await app.boot();
// We only add custom eXO models
await app.migrateSchema({ existingSchema, models: ['SubscriptionIds', 'Circuit', 'Subscription', 'IPv4Pool', 'IPv6Pool'] });
await app.migrateSchema({ existingSchema /*, models: ['SubscriptionIds', 'Circuit', 'Subscription', 'IPv4Pool', 'IPv6Pool']*/ });
// Connectors usually keep a pool of opened connections,
// this keeps the process running even after all work is done.

View file

@ -3,13 +3,13 @@ import { Subscription, SubscriptionWithRelations } from './subscription.model';
@model({
settings: {
idInjection: false, mysql: { schema: 'radius', table: 'circuit' },
idInjection: false, postgresql: { table: 'circuit' },
foreignKeys: {
fk_circuit_subscriptionId: {
name: 'fk_circuit_subscriptionId',
entity: 'Subscription',
entityKey: 'id',
foreignKey: 'subscriptionId',
foreignKey: 'subscriptionid',
},
},
}
@ -20,20 +20,14 @@ export class Circuit extends Entity {
type: Number,
generated: true,
require: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@property({
type: Number,
generated: true,
generated: false,
require: true,
precision: 10,
scale: 0,
mysql: { "columnName": "circuitNum", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
circuitNum: Number;
@ -41,7 +35,7 @@ export class Circuit extends Entity {
type: String,
required: false,
length: 128,
mysql: { "columnName": "username", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
postgresql: { "columnName": "username", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
username: String;
@ -49,7 +43,7 @@ export class Circuit extends Entity {
type: String,
required: false,
length: 128,
mysql: { "columnName": "password", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
postgresql: { "columnName": "password", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
password: String;
@ -57,7 +51,7 @@ export class Circuit extends Entity {
type: String,
required: false,
length: 15,
mysql: { "columnName": "ipv4", "dataType": "varchar", "dataLength": 15, "dataPrecision": null, "dataScale": null, "nullable": "N" },
postgresql: { "columnName": "ipv4", "dataType": "varchar", "dataLength": 15, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
ipv4: String;
@ -65,7 +59,7 @@ export class Circuit extends Entity {
type: String,
required: false,
length: 15,
mysql: { "columnName": "ipv6", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
postgresql: { "columnName": "ipv6", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
ipv6: String;
@ -73,14 +67,14 @@ export class Circuit extends Entity {
type: String,
required: false,
length: 128,
mysql: { "columnName": "nasId", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
postgresql: { "columnName": "nasId", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "N" },
})
nasId: String;
@property({
type: Boolean,
required: true,
mysql: { "columnName": "hasManagement", "nullable": "N" },
postgresql: { "columnName": "hasManagement", "nullable": "N" },
default: false
})
hasManagement: boolean;
@ -88,7 +82,7 @@ export class Circuit extends Entity {
@property({
type: Boolean,
required: true,
mysql: { "columnName": "isDisabled", "nullable": "N" },
postgresql: { "columnName": "isDisabled", "nullable": "N" },
default: false
})
isDisabled: boolean;

View file

@ -14,7 +14,7 @@ export class IPv4Pool extends Entity {
type: Boolean,
required: false,
length: 1,
mysql: { "columnName": "isAvailable", "nullable": "N" },
postgresql: { "columnName": "isAvailable", "nullable": "N" },
})
isAvailable: boolean;

View file

@ -1,6 +1,6 @@
import { Entity, model, property } from '@loopback/repository';
@model({ settings: { idInjection: false, mysql: { schema: 'radius', table: 'subscriptionids' } } })
@model({ settings: { idInjection: false, postgresql: { table: 'subscriptionids' } } })
export class SubscriptionIds extends Entity {
@property({
type: Number,
@ -8,8 +8,7 @@ export class SubscriptionIds extends Entity {
require: true,
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
id: 1
})
id: Number;
@ -17,7 +16,7 @@ export class SubscriptionIds extends Entity {
type: Boolean,
required: false,
length: 200,
mysql: { "columnName": "isAvailable", "nullable": "N" },
postgresql: { "columnName": "isAvailable", "nullable": "N" },
})
isAvailable: boolean;

View file

@ -2,7 +2,7 @@ import { Entity, model, property, hasMany } from '@loopback/repository';
import { Circuit } from './circuit.model';
@model({
settings: { idInjection: false, mysql: { schema: 'radius', table: 'subscription' } }
settings: { idInjection: false, postgresql: { table: 'subscription' } }
})
export class Subscription extends Entity {
@ -13,7 +13,6 @@ export class Subscription extends Entity {
precision: 10,
scale: 0,
id: 1,
mysql: { "columnName": "id", "dataType": "int", "dataLength": null, "dataPrecision": 10, "dataScale": 0, "nullable": "N" },
})
id: Number;
@ -21,7 +20,7 @@ export class Subscription extends Entity {
type: String,
required: true,
length: 128,
mysql: { "columnName": "firstname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
postgresql: { "columnName": "firstname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
firstname: String;
@ -29,7 +28,7 @@ export class Subscription extends Entity {
type: String,
required: false,
length: 128,
mysql: { "columnName": "lastname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
postgresql: { "columnName": "lastname", "dataType": "varchar", "dataLength": 128, "dataPrecision": null, "dataScale": null, "nullable": "Y" },
})
lastname?: String;

View file

@ -1,6 +1,6 @@
import { DefaultTransactionalRepository, BelongsToAccessor, repository } from '@loopback/repository';
import { Circuit, CircuitRelations, Subscription } from '../models';
import { RadiusDataSource } from '../datasources';
import { SimplexDataSource } from '../datasources';
import { inject, Getter } from '@loopback/core';
import { SubscriptionRepository } from '.';
@ -14,7 +14,7 @@ export class CircuitRepository extends DefaultTransactionalRepository<
typeof Circuit.prototype.id
>;
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
@inject('datasources.simplex') dataSource: SimplexDataSource,
@repository.getter('SubscriptionRepository')
subscriptionRepositoryGetter: Getter<SubscriptionRepository>,
) {

View file

@ -1,6 +1,6 @@
import { DefaultTransactionalRepository } from '@loopback/repository';
import { IPv4Pool, IPv4PoolRelations } from '../models';
import { RadiusDataSource } from '../datasources';
import { SimplexDataSource } from '../datasources';
import { inject } from '@loopback/core';
export class IPv4PoolRepository extends DefaultTransactionalRepository<
@ -9,7 +9,7 @@ export class IPv4PoolRepository extends DefaultTransactionalRepository<
IPv4PoolRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
@inject('datasources.simplex') dataSource: SimplexDataSource,
) {
super(IPv4Pool, dataSource);
}

View file

@ -1,6 +1,6 @@
import { DefaultTransactionalRepository } from '@loopback/repository';
import { IPv6Pool, IPv6PoolRelations } from '../models';
import { RadiusDataSource } from '../datasources';
import { SimplexDataSource } from '../datasources';
import { inject } from '@loopback/core';
export class IPv6PoolRepository extends DefaultTransactionalRepository<
@ -9,7 +9,7 @@ export class IPv6PoolRepository extends DefaultTransactionalRepository<
IPv6PoolRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
@inject('datasources.simplex') dataSource: SimplexDataSource,
) {
super(IPv6Pool, dataSource);
}

View file

@ -1,6 +1,6 @@
import { DefaultTransactionalRepository } from '@loopback/repository';
import { SubscriptionIds, SubscriptionIdsRelations } from '../models';
import { RadiusDataSource } from '../datasources';
import { SimplexDataSource } from '../datasources';
import { inject } from '@loopback/core';
export class SubscriptionIdsRepository extends DefaultTransactionalRepository<
@ -9,7 +9,7 @@ export class SubscriptionIdsRepository extends DefaultTransactionalRepository<
SubscriptionIdsRelations
> {
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
@inject('datasources.simplex') dataSource: SimplexDataSource,
) {
super(SubscriptionIds, dataSource);
}

View file

@ -1,6 +1,6 @@
import { DefaultTransactionalRepository, HasManyRepositoryFactory, repository } from '@loopback/repository';
import { Subscription, SubscriptionRelations, Circuit } from '../models';
import { RadiusDataSource } from '../datasources';
import { SimplexDataSource } from '../datasources';
import { inject, Getter } from '@loopback/core';
import { CircuitRepository } from './circuit.repository';
@ -14,7 +14,7 @@ export class SubscriptionRepository extends DefaultTransactionalRepository<
typeof Subscription.prototype.id
>;
constructor(
@inject('datasources.radius') dataSource: RadiusDataSource,
@inject('datasources.simplex') dataSource: SimplexDataSource,
@repository.getter('CircuitRepository')
getCircuitRepository: Getter<CircuitRepository>,
) {

View file

@ -20,10 +20,11 @@ import {
import { RadiusDataSource } from "../datasources/radius.datasource";
const db: RadiusDataSource = new RadiusDataSource();
const simplexDb: SimplexDataSource = new SimplexDataSource();
const subscriptonIdsRepository = new SubscriptionIdsRepository(db);
const ipv4PoolRepository = new IPv4PoolRepository(db);
const ipv6PoolRepository = new IPv6PoolRepository(db);
const subscriptonIdsRepository = new SubscriptionIdsRepository(simplexDb);
const ipv4PoolRepository = new IPv4PoolRepository(simplexDb);
const ipv6PoolRepository = new IPv6PoolRepository(simplexDb);
const radCheckRepository = new RadcheckRepository(db);
const radGroupCheckRepository = new RadgroupcheckRepository(db);
const radGroupReplyRepository = new RadgroupreplyRepository(db);
@ -34,8 +35,8 @@ const userInfoRepository = new UserinfoRepository(db);
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
subscriptionRepository = new SubscriptionRepository(db, async () => circuitRepository);
circuitRepository = new CircuitRepository(db, async () => subscriptionRepository);
subscriptionRepository = new SubscriptionRepository(simplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(simplexDb, async () => subscriptionRepository);
// We attach simplex configuration file
const simplexConfig: SimplexConfig = JSON.parse(
@ -55,6 +56,7 @@ import {
} from '../models';
import minimist from 'minimist';
import { SimplexConfig } from '../application';
import { SimplexDataSource } from '../datasources';
async function checkAvailableIPsFromCircuit(fix?: boolean) {
// Check for IPv4Pool

View file

@ -21,10 +21,11 @@ import {
import { RadiusDataSource } from "../datasources/radius.datasource";
const db: RadiusDataSource = new RadiusDataSource();
const simplexDb: SimplexDataSource = new SimplexDataSource();
const subscriptonIdsRepository = new SubscriptionIdsRepository(db);
const ipv4PoolRepository = new IPv4PoolRepository(db);
const ipv6PoolRepository = new IPv6PoolRepository(db);
const subscriptonIdsRepository = new SubscriptionIdsRepository(simplexDb);
const ipv4PoolRepository = new IPv4PoolRepository(simplexDb);
const ipv6PoolRepository = new IPv6PoolRepository(simplexDb);
const radCheckRepository = new RadcheckRepository(db);
const radGroupCheckRepository = new RadgroupcheckRepository(db);
const radGroupReplyRepository = new RadgroupreplyRepository(db);
@ -35,8 +36,8 @@ const userInfoRepository = new UserinfoRepository(db);
let subscriptionRepository: SubscriptionRepository;
let circuitRepository: CircuitRepository;
subscriptionRepository = new SubscriptionRepository(db, async () => circuitRepository);
circuitRepository = new CircuitRepository(db, async () => subscriptionRepository);
subscriptionRepository = new SubscriptionRepository(simplexDb, async () => circuitRepository);
circuitRepository = new CircuitRepository(simplexDb, async () => subscriptionRepository);
// We attach simplex configuration file
const simplexConfig: SimplexConfig = JSON.parse(
@ -57,6 +58,7 @@ import {
import minimist from 'minimist';
import { SimplexConfig } from '../application';
import { IsolationLevel } from '@loopback/repository';
import { SimplexDataSource } from '../datasources';
interface InitialSubsConf {
min: number;