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);
+ }
+});
+