diff --git a/db/create-default-service-provider-and-account.sql b/db/create-default-service-provider-and-account.sql new file mode 100644 index 0000000..0cc6903 --- /dev/null +++ b/db/create-default-service-provider-and-account.sql @@ -0,0 +1,4 @@ +insert into service_providers (service_provider_sid, name) +values ('2708b1b3-2736-40ea-b502-c53d8396247f', 'default service provider'); +insert into accounts (account_sid, service_provider_sid, name) +values ('9351f46a-678c-43f5-b8a6-d4eb58d131af','2708b1b3-2736-40ea-b502-c53d8396247f', 'default account'); \ No newline at end of file diff --git a/db/jambones-sql.sql b/db/jambones-sql.sql index 0fa99bc..b4a3c61 100644 --- a/db/jambones-sql.sql +++ b/db/jambones-sql.sql @@ -7,8 +7,12 @@ DROP TABLE IF EXISTS lcr_carrier_set_entry; DROP TABLE IF EXISTS lcr_routes; +DROP TABLE IF EXISTS ms_teams_tenants; + DROP TABLE IF EXISTS api_keys; +DROP TABLE IF EXISTS sbc_addresses; + DROP TABLE IF EXISTS users; DROP TABLE IF EXISTS phone_numbers; @@ -44,6 +48,16 @@ priority INTEGER NOT NULL UNIQUE COMMENT 'lower priority routes are attempted f PRIMARY KEY (lcr_route_sid) ) COMMENT='Least cost routing table'; +CREATE TABLE ms_teams_tenants +( +ms_teams_tenant_sid CHAR(36) NOT NULL UNIQUE , +service_provider_sid CHAR(36) NOT NULL, +account_sid CHAR(36), +application_sid CHAR(36), +tenant_fqdn VARCHAR(255) NOT NULL UNIQUE , +PRIMARY KEY (ms_teams_tenant_sid) +) COMMENT='A Microsoft Teams customer tenant'; + CREATE TABLE api_keys ( api_key_sid CHAR(36) NOT NULL UNIQUE , @@ -54,6 +68,15 @@ expires_at TIMESTAMP, PRIMARY KEY (api_key_sid) ) ENGINE=InnoDB COMMENT='An authorization token that is used to access the REST api'; +CREATE TABLE sbc_addresses +( +sbc_address_sid CHAR(36) NOT NULL UNIQUE , +ipv4 VARCHAR(255) NOT NULL, +port INTEGER NOT NULL DEFAULT 5060, +service_provider_sid CHAR(36), +PRIMARY KEY (sbc_address_sid) +); + CREATE TABLE users ( user_sid CHAR(36) NOT NULL UNIQUE , @@ -138,6 +161,7 @@ name VARCHAR(64) NOT NULL UNIQUE , description VARCHAR(255), root_domain VARCHAR(128) UNIQUE , registration_hook_sid CHAR(36), +ms_teams_fqdn VARCHAR(255), PRIMARY KEY (service_provider_sid) ) ENGINE=InnoDB COMMENT='A partition of the platform used by one service provider'; @@ -158,28 +182,42 @@ ALTER TABLE call_routes ADD FOREIGN KEY account_sid_idxfk (account_sid) REFERENC ALTER TABLE call_routes ADD FOREIGN KEY application_sid_idxfk (application_sid) REFERENCES applications (application_sid); +CREATE INDEX ms_teams_tenant_sid_idx ON ms_teams_tenants (ms_teams_tenant_sid); +ALTER TABLE ms_teams_tenants ADD FOREIGN KEY service_provider_sid_idxfk (service_provider_sid) REFERENCES service_providers (service_provider_sid); + +ALTER TABLE ms_teams_tenants ADD FOREIGN KEY account_sid_idxfk_1 (account_sid) REFERENCES accounts (account_sid); + +ALTER TABLE ms_teams_tenants ADD FOREIGN KEY application_sid_idxfk_1 (application_sid) REFERENCES applications (application_sid); + +CREATE INDEX tenant_fqdn_idx ON ms_teams_tenants (tenant_fqdn); CREATE INDEX api_key_sid_idx ON api_keys (api_key_sid); CREATE INDEX account_sid_idx ON api_keys (account_sid); -ALTER TABLE api_keys ADD FOREIGN KEY account_sid_idxfk_1 (account_sid) REFERENCES accounts (account_sid); +ALTER TABLE api_keys ADD FOREIGN KEY account_sid_idxfk_2 (account_sid) REFERENCES accounts (account_sid); CREATE INDEX service_provider_sid_idx ON api_keys (service_provider_sid); -ALTER TABLE api_keys ADD FOREIGN KEY service_provider_sid_idxfk (service_provider_sid) REFERENCES service_providers (service_provider_sid); +ALTER TABLE api_keys ADD FOREIGN KEY service_provider_sid_idxfk_1 (service_provider_sid) REFERENCES service_providers (service_provider_sid); + +CREATE INDEX sbc_addresses_idx_host_port ON sbc_addresses (ipv4,port); + +CREATE INDEX sbc_address_sid_idx ON sbc_addresses (sbc_address_sid); +CREATE INDEX service_provider_sid_idx ON sbc_addresses (service_provider_sid); +ALTER TABLE sbc_addresses ADD FOREIGN KEY service_provider_sid_idxfk_2 (service_provider_sid) REFERENCES service_providers (service_provider_sid); CREATE INDEX user_sid_idx ON users (user_sid); CREATE INDEX name_idx ON users (name); CREATE INDEX voip_carrier_sid_idx ON voip_carriers (voip_carrier_sid); CREATE INDEX name_idx ON voip_carriers (name); -ALTER TABLE voip_carriers ADD FOREIGN KEY account_sid_idxfk_2 (account_sid) REFERENCES accounts (account_sid); +ALTER TABLE voip_carriers ADD FOREIGN KEY account_sid_idxfk_3 (account_sid) REFERENCES accounts (account_sid); -ALTER TABLE voip_carriers ADD FOREIGN KEY application_sid_idxfk_1 (application_sid) REFERENCES applications (application_sid); +ALTER TABLE voip_carriers ADD FOREIGN KEY application_sid_idxfk_2 (application_sid) REFERENCES applications (application_sid); CREATE INDEX phone_number_sid_idx ON phone_numbers (phone_number_sid); CREATE INDEX voip_carrier_sid_idx ON phone_numbers (voip_carrier_sid); ALTER TABLE phone_numbers ADD FOREIGN KEY voip_carrier_sid_idxfk (voip_carrier_sid) REFERENCES voip_carriers (voip_carrier_sid); -ALTER TABLE phone_numbers ADD FOREIGN KEY account_sid_idxfk_3 (account_sid) REFERENCES accounts (account_sid); +ALTER TABLE phone_numbers ADD FOREIGN KEY account_sid_idxfk_4 (account_sid) REFERENCES accounts (account_sid); -ALTER TABLE phone_numbers ADD FOREIGN KEY application_sid_idxfk_2 (application_sid) REFERENCES applications (application_sid); +ALTER TABLE phone_numbers ADD FOREIGN KEY application_sid_idxfk_3 (application_sid) REFERENCES applications (application_sid); CREATE INDEX webhook_sid_idx ON webhooks (webhook_sid); CREATE UNIQUE INDEX sip_gateway_idx_hostport ON sip_gateways (ipv4,port); @@ -193,9 +231,8 @@ ALTER TABLE lcr_carrier_set_entry ADD FOREIGN KEY voip_carrier_sid_idxfk_2 (voip CREATE UNIQUE INDEX applications_idx_name ON applications (account_sid,name); CREATE INDEX application_sid_idx ON applications (application_sid); -CREATE INDEX name_idx ON applications (name); CREATE INDEX account_sid_idx ON applications (account_sid); -ALTER TABLE applications ADD FOREIGN KEY account_sid_idxfk_4 (account_sid) REFERENCES accounts (account_sid); +ALTER TABLE applications ADD FOREIGN KEY account_sid_idxfk_5 (account_sid) REFERENCES accounts (account_sid); ALTER TABLE applications ADD FOREIGN KEY call_hook_sid_idxfk (call_hook_sid) REFERENCES webhooks (webhook_sid); @@ -207,10 +244,9 @@ CREATE INDEX root_domain_idx ON service_providers (root_domain); ALTER TABLE service_providers ADD FOREIGN KEY registration_hook_sid_idxfk (registration_hook_sid) REFERENCES webhooks (webhook_sid); CREATE INDEX account_sid_idx ON accounts (account_sid); -CREATE INDEX name_idx ON accounts (name); CREATE INDEX sip_realm_idx ON accounts (sip_realm); CREATE INDEX service_provider_sid_idx ON accounts (service_provider_sid); -ALTER TABLE accounts ADD FOREIGN KEY service_provider_sid_idxfk_1 (service_provider_sid) REFERENCES service_providers (service_provider_sid); +ALTER TABLE accounts ADD FOREIGN KEY service_provider_sid_idxfk_3 (service_provider_sid) REFERENCES service_providers (service_provider_sid); ALTER TABLE accounts ADD FOREIGN KEY registration_hook_sid_idxfk_1 (registration_hook_sid) REFERENCES webhooks (webhook_sid); diff --git a/db/jambones.sqs b/db/jambones.sqs index 1257cdb..af1f601 100644 --- a/db/jambones.sqs +++ b/db/jambones.sqs @@ -4,8 +4,8 @@ - 1632.00 - 86.00 + 1599.00 + 37.00 250.00 @@ -130,7 +130,7 @@ - 1279.00 + 1302.00 61.00 @@ -199,8 +199,8 @@ - 1383.00 - 365.00 + 1315.00 + 376.00 254.00 @@ -316,6 +316,81 @@ + + + + + + 1309.00 + 219.00 + + + 298.00 + 120.00 + + 12 + + + + 1 + + + + + + + + + service_provider_sid + service_providers + + + 4 + 1 + + + + + + + + + + account_sid + accounts + + + 4 + 2 + + + + + + + + application_sid + applications + + + 4 + 2 + + + + + + + + + + + + + + + + @@ -413,7 +488,7 @@ - + @@ -684,7 +759,7 @@ - + @@ -790,6 +865,73 @@ + + + + + 1305.00 + 564.00 + + + 281.00 + 120.00 + + 13 + + + + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + service_provider_sid + service_providers + + + 4 + 1 + + + + + + + @@ -842,12 +984,12 @@ - 813.00 - 99.00 + 838.00 + 96.00 293.00 - 120.00 + 140.00 3 @@ -894,6 +1036,11 @@ + + + + + @@ -913,17 +1060,17 @@ - + - - - - - + + + + + diff --git a/lib/models/sbc.js b/lib/models/sbc.js new file mode 100644 index 0000000..5305c9c --- /dev/null +++ b/lib/models/sbc.js @@ -0,0 +1,55 @@ +const Model = require('./model'); +const {getMysqlConnection} = require('../db'); + +class Sbc extends Model { + constructor() { + super(); + } + + /** + * list all SBCs either for a given service provider, or those not associated with a + * service provider (i.e. community SBCs) + */ + static retrieveAll(service_provider_sid) { + const sql = service_provider_sid ? + 'SELECT * from sbc_addresses WHERE service_provider_sid = ?' : + 'SELECT * from sbc_addresses WHERE service_provider_sid IS NULL'; + const args = service_provider_sid ? [service_provider_sid] : []; + + return new Promise((resolve, reject) => { + getMysqlConnection((err, conn) => { + if (err) return reject(err); + conn.query(sql, args, (err, results) => { + conn.release(); + if (err) return reject(err); + resolve(results); + }); + }); + }); + } + +} + +Sbc.table = 'sbc_addresses'; +Sbc.fields = [ + { + name: 'sbc_address_sid', + type: 'string', + primaryKey: true + }, + { + name: 'ipv4', + type: 'string', + required: true + }, + { + name: 'port', + type: 'number' + }, + { + name: 'service_provider_sid', + type: 'string' + } +]; + +module.exports = Sbc; diff --git a/lib/models/tenant.js b/lib/models/tenant.js new file mode 100644 index 0000000..f855e91 --- /dev/null +++ b/lib/models/tenant.js @@ -0,0 +1,36 @@ +const Model = require('./model'); + +class MsTeamsTenant extends Model { + constructor() { + super(); + } +} + +MsTeamsTenant.table = 'ms_teams_tenants'; +MsTeamsTenant.fields = [ + { + name: 'ms_teams_tenant_sid', + type: 'string', + primaryKey: true + }, + { + name: 'service_provider_sid', + type: 'string', + required: true + }, + { + name: 'account_sid', + type: 'string' + }, + { + name: 'application_sid', + type: 'string' + }, + { + name: 'tenant_fqdn', + type: 'string', + required: true + } +]; + +module.exports = MsTeamsTenant; diff --git a/lib/routes/api/decorate.js b/lib/routes/api/decorate.js index 0181901..470f576 100644 --- a/lib/routes/api/decorate.js +++ b/lib/routes/api/decorate.js @@ -11,7 +11,7 @@ const decorators = { 'delete': remove }; -function decorate(router, klass, methods, preconditions) { +function decorate(router, klass, methods, preconditions = {}) { const decs = methods && Array.isArray(methods) && methods[0] !== '*' ? methods : Object.keys(decorators); decs.forEach((m) => { assert(m in decorators); diff --git a/lib/routes/api/index.js b/lib/routes/api/index.js index 5b7468a..eadf3aa 100644 --- a/lib/routes/api/index.js +++ b/lib/routes/api/index.js @@ -15,6 +15,8 @@ api.use('/PhoneNumbers', isAdminScope, require('./phone-numbers')); api.use('/ApiKeys', require('./api-keys')); api.use('/Accounts', require('./accounts')); api.use('/Applications', require('./applications')); +api.use('/MicrosoftTeamsTenants', require('./tenants')); +api.use('/Sbcs', isAdminScope, require('./sbcs')); api.use('/Users', require('./users')); api.use('/login', require('./login')); diff --git a/lib/routes/api/sbcs.js b/lib/routes/api/sbcs.js new file mode 100644 index 0000000..dfc153d --- /dev/null +++ b/lib/routes/api/sbcs.js @@ -0,0 +1,19 @@ +const router = require('express').Router(); +const Sbc = require('../../models/sbc'); +const decorate = require('./decorate'); +const sysError = require('./error'); + +decorate(router, Sbc, ['add', 'delete']); + +/* list */ +router.get('/', async(req, res) => { + const logger = req.app.locals.logger; + try { + const results = await Sbc.retrieveAll(req.query.service_provider_sid); + res.status(200).json(results); + } catch (err) { + sysError(logger, res, err); + } +}); + +module.exports = router; diff --git a/lib/routes/api/tenants.js b/lib/routes/api/tenants.js new file mode 100644 index 0000000..17e4095 --- /dev/null +++ b/lib/routes/api/tenants.js @@ -0,0 +1,8 @@ +const router = require('express').Router(); +const Tenant = require('../../models/tenant'); +const decorate = require('./decorate'); +const preconditions = {}; + +decorate(router, Tenant, ['*'], preconditions); + +module.exports = router; diff --git a/lib/swagger/swagger.yaml b/lib/swagger/swagger.yaml index 2b2c3b3..b36a27b 100644 --- a/lib/swagger/swagger.yaml +++ b/lib/swagger/swagger.yaml @@ -13,12 +13,57 @@ servers: description: development server paths: /Sbcs: + post: + summary: add an SBC address + operationId: createSbc + requestBody: + content: + application/json: + schema: + type: object + properties: + ipv4: + type: string + port: + type: number + service_provider_sid: + type: string + description: service provider scope for the generated api key + required: + - ipv4 + responses: + 201: + description: sbc address successfully created + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessfulApiKeyAdd' + 400: + description: bad request + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + + 500: + description: bad request + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' get: - summary: retrieve public IP addresses of the jambonz /Sbcs + summary: retrieve public IP addresses of the jambonz Sbcs operationId: listSbcs + parameters: + - in: query + name: service_provider_sid + required: false + schema: + type: string + description: return only the SBCs operated for the sole use of this service provider responses: 200: - description: list of IP addresses + description: list of SBC addresses content: application/json: schema: @@ -27,7 +72,7 @@ paths: properties: ipv4: type: string - description: ip address of one of our /Sbcs + description: ip address of one of our Sbcs required: - ipv4 500: @@ -36,6 +81,22 @@ paths: application/json: schema: $ref: '#/components/schemas/GeneralError' + /Sbcs/{SbcSid}: + parameters: + - name: SbcSid + in: path + required: true + schema: + type: string + delete: + summary: delete sbc address + operationId: deleteSbcAddress + responses: + 200: + description: sbc address deleted + 404: + description: sbc address not found + /ApiKeys: post: @@ -116,7 +177,7 @@ paths: description: login succeeded content: application/json: - schema: '#/components/schemas/SuccessfulLogin' + schema: '#/components/schemas/Login' 403: description: login failed content: @@ -161,7 +222,7 @@ paths: description: password successfully changed content: application/json: - schema: '#/components/schemas/SuccessfulLogin' + schema: '#/components/schemas/Login' 403: description: password change failed content: @@ -746,6 +807,140 @@ paths: schema: $ref: '#/components/schemas/GeneralError' + /MicrosoftTeamsTenants: + post: + summary: provision a customer tenant for MS Teams + operationId: createMsTeamsTenant + requestBody: + content: + application/json: + schema: + type: object + properties: + service_provider_sid: + type: string + format: uuid + example: 85f9c036-ba61-4f28-b2f5-617c23fa68ff + account_sid: + type: string + format: uuid + example: 85f9c036-ba61-4f28-b2f5-617c23fa68ff + application_sid: + type: string + format: uuid + example: 85f9c036-ba61-4f28-b2f5-617c23fa68ff + tenant_fqdn: + type: string + example: customer.contoso.com + required: + - service_provider_sid + - account + - tenant_fqdn + responses: + 201: + description: tenant successfully created + content: + application/json: + schema: + $ref: '#/components/schemas/SuccessfulAdd' + 400: + description: bad request + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + 500: + description: system error + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + get: + summary: list MS Teams tenants + operationId: listMsTeamsTenants + responses: + 200: + description: list of tenants + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MsTeamsTenant' + 500: + description: system error + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + /MicrosoftTeamsTenants/{TenantSid}: + parameters: + - name: TenantSid + in: path + required: true + schema: + type: string + format: uuid + delete: + summary: delete an MS Teams tenant + operationId: deleteTenant + responses: + 204: + description: tenant successfully deleted + 404: + description: tenant not found + 500: + description: system error + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + get: + summary: retrieve an MS Teams tenant + operationId: getTenant + responses: + 200: + description: tenant found + content: + application/json: + schema: + $ref: '#/components/schemas/MsTeamsTenant' + 404: + description: account not found + 500: + description: system error + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + + put: + summary: update tenant + operationId: updateAccount + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Tenant' + responses: + 204: + description: tenant updated + 404: + description: tenant not found + 422: + description: unprocessable entity + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + 500: + description: system error + content: + application/json: + schema: + $ref: '#/components/schemas/GeneralError' + + /Accounts: post: summary: create an account @@ -1350,7 +1545,7 @@ components: scheme: bearer bearerFormat: token schemas: - SuccessfulLogin: + Login: type: object properties: user_sid: @@ -1410,6 +1605,8 @@ components: hook_basic_auth_password: type: string format: url + ms_teams_fqdn: + type: string required: - service_provider_sid - name @@ -1565,6 +1762,23 @@ components: required: - url example: {"url": "https://acme.com", "method": "POST"} + MsTeamsTenant: + type: object + properties: + service_provider_sid: + type: string + format: uuid + account_sid: + type: string + format: uuid + application_sid: + type: string + format: uuid + tenant_fqdn: + type: string + required: + - service_provider_sid + - tenant_fqdn Call: type: object properties: diff --git a/package.json b/package.json index 61b9eaa..0662d5f 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "cors": "^2.8.5", "express": "^4.17.1", "jambonz-db-helpers": "^0.3.2", - "jambonz-realtimedb-helpers": "0.1.7", + "jambonz-realtimedb-helpers": "0.2.4", "mysql2": "^2.0.2", "passport": "^0.4.0", "passport-http-bearer": "^1.0.1", @@ -26,17 +26,16 @@ "request": "^2.88.0", "request-debug": "^0.2.0", "swagger-ui-express": "^4.1.2", - "tape": "^4.11.0", "uuid": "^3.3.3", "yamljs": "^0.3.0" }, "devDependencies": { - "eslint": "^6.7.2", + "eslint": "^6.8.0", "eslint-plugin-promise": "^4.2.1", - "nyc": "^14.1.1", + "nyc": "^15.0.1", "request-promise-native": "^1.0.8", - "tap": "^14.10.2", "tap-dot": "^2.0.0", - "tap-spec": "^5.0.0" + "tap-spec": "^5.0.0", + "tape": "^4.13.2" } } diff --git a/test/index.js b/test/index.js index def6bab..686244a 100644 --- a/test/index.js +++ b/test/index.js @@ -6,4 +6,6 @@ require('./accounts'); require('./phone-numbers'); require('./applications'); require('./auth'); +require('./sbcs'); +require('./ms-teams'); require('./remove-test-db'); diff --git a/test/ms-teams.js b/test/ms-teams.js new file mode 100644 index 0000000..fafba00 --- /dev/null +++ b/test/ms-teams.js @@ -0,0 +1,64 @@ +const test = require('tape').test ; +const ADMIN_TOKEN = '38700987-c7a4-4685-a5bb-af378f9734de'; +const authAdmin = {bearer: ADMIN_TOKEN}; +const request = require('request-promise-native').defaults({ + baseUrl: 'http://127.0.0.1:3000/v1' +}); +const {createServiceProvider, deleteObjectBySid} = require('./utils'); + +process.on('unhandledRejection', (reason, p) => { + console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); +}); + +test('sbc_addresses tests', async(t) => { + const app = require('../app'); + let sid; + try { + let result; + const service_provider_sid = await createServiceProvider(request); + + /* add a tenant */ + result = await request.post('/MicrosoftTeamsTenants', { + resolveWithFullResponse: true, + auth: authAdmin, + json: true, + body: { + service_provider_sid, + tenant_fqdn: 'foo.bar.baz' + } + }); + t.ok(result.statusCode === 201, 'successfully added ms teams tenant'); + const sid1 = result.body.sid; + + /* add a second tenant */ + result = await request.post('/MicrosoftTeamsTenants', { + resolveWithFullResponse: true, + auth: authAdmin, + json: true, + body: { + service_provider_sid, + tenant_fqdn: 'junk.bar.baz' + } + }); + t.ok(result.statusCode === 201, 'successfully added ms teams tenant'); + const sid2 = result.body.sid; + + result = await request.get('/MicrosoftTeamsTenants', { + resolveWithFullResponse: true, + auth: authAdmin, + json: true + }); + t.ok(result.body.length === 2, 'successfully retrieved tenants'); + + await deleteObjectBySid(request, '/MicrosoftTeamsTenants', sid1); + await deleteObjectBySid(request, '/MicrosoftTeamsTenants', sid2); + await deleteObjectBySid(request, '/ServiceProviders', service_provider_sid); + + t.end(); + } + catch (err) { + console.error(err); + t.end(err); + } +}); + diff --git a/test/sbcs.js b/test/sbcs.js new file mode 100644 index 0000000..ef74ebf --- /dev/null +++ b/test/sbcs.js @@ -0,0 +1,70 @@ +const test = require('tape').test ; +const ADMIN_TOKEN = '38700987-c7a4-4685-a5bb-af378f9734de'; +const authAdmin = {bearer: ADMIN_TOKEN}; +const request = require('request-promise-native').defaults({ + baseUrl: 'http://127.0.0.1:3000/v1' +}); +const {createServiceProvider, deleteObjectBySid} = require('./utils'); + +process.on('unhandledRejection', (reason, p) => { + console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); +}); + +test('sbc_addresses tests', async(t) => { + const app = require('../app'); + let sid; + try { + let result; + const service_provider_sid = await createServiceProvider(request); + + /* add a community sbc */ + result = await request.post('/Sbcs', { + resolveWithFullResponse: true, + auth: authAdmin, + json: true, + body: { + ipv4: '192.168.1.1' + } + }); + t.ok(result.statusCode === 201, 'successfully created community sbc '); + const sid1 = result.body.sid; + + /* add a service provider sbc */ + result = await request.post('/Sbcs', { + resolveWithFullResponse: true, + auth: authAdmin, + json: true, + body: { + ipv4: '192.168.1.4', + service_provider_sid + } + }); + t.ok(result.statusCode === 201, 'successfully created service provider sbc '); + const sid2 = result.body.sid; + + result = await request.get('/Sbcs', { + resolveWithFullResponse: true, + auth: authAdmin, + json: true + }); + t.ok(result.body.length === 1 && result.body[0].ipv4 === '192.168.1.1', 'successfully retrieved community sbc'); + + result = await request.get(`/Sbcs?service_provider_sid=${service_provider_sid}`, { + resolveWithFullResponse: true, + auth: authAdmin, + json: true + }); + t.ok(result.body.length === 1 && result.body[0].ipv4 === '192.168.1.4', 'successfully retrieved service provider sbc'); + + await deleteObjectBySid(request, '/Sbcs', sid1); + await deleteObjectBySid(request, '/Sbcs', sid2); + await deleteObjectBySid(request, '/ServiceProviders', service_provider_sid); + + t.end(); + } + catch (err) { + console.error(err); + t.end(err); + } +}); +