@webex/webex-core 3.8.1 → 3.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -27
- package/dist/index.js +9 -33
- package/dist/index.js.map +1 -1
- package/dist/lib/batcher.js +1 -1
- package/dist/lib/constants.js +10 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/credentials/credentials.js +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/{services-v2/interceptors → interceptors}/server-error.js +1 -1
- package/dist/lib/interceptors/server-error.js.map +1 -0
- package/dist/lib/services/index.js +2 -29
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/service-host.js +1 -1
- package/dist/lib/services/service-host.js.map +1 -1
- package/dist/lib/services/service-registry.js +1 -1
- package/dist/lib/services/service-registry.js.map +1 -1
- package/dist/lib/services/service-state.js +1 -1
- package/dist/lib/services/service-state.js.map +1 -1
- package/dist/lib/services/services.js +3 -3
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/services-v2/index.js +0 -29
- package/dist/lib/services-v2/index.js.map +1 -1
- package/dist/lib/services-v2/metrics.js.map +1 -1
- package/dist/lib/services-v2/service-catalog.js +11 -10
- package/dist/lib/services-v2/service-catalog.js.map +1 -1
- package/dist/lib/services-v2/services-v2.js +56 -67
- package/dist/lib/services-v2/services-v2.js.map +1 -1
- package/dist/lib/services-v2/types.js.map +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +3 -3
- package/dist/webex-core.js.map +1 -1
- package/package.json +13 -13
- package/src/index.js +5 -14
- package/src/lib/constants.js +29 -1
- package/src/lib/{services/interceptors → interceptors}/server-error.js +1 -1
- package/src/lib/services/index.js +2 -7
- package/src/lib/services/service-host.js +1 -1
- package/src/lib/services/service-registry.js +1 -1
- package/src/lib/services/service-state.js +1 -1
- package/src/lib/services/services.js +2 -2
- package/src/lib/services-v2/index.ts +0 -16
- package/src/lib/services-v2/service-catalog.ts +20 -19
- package/src/lib/services-v2/{services-v2.js → services-v2.ts} +116 -94
- package/src/lib/services-v2/types.ts +62 -2
- package/src/webex-core.js +1 -1
- package/test/fixtures/host-catalog-v2.ts +30 -122
- package/test/integration/spec/services/services.js +11 -0
- package/test/integration/spec/services-v2/service-catalog.js +664 -0
- package/test/integration/spec/services-v2/services-v2.js +1061 -0
- package/test/unit/spec/services-v2/service-detail.ts +1 -1
- package/test/unit/spec/services-v2/services-v2.ts +390 -436
- package/dist/lib/services/constants.js +0 -17
- package/dist/lib/services/constants.js.map +0 -1
- package/dist/lib/services/interceptors/hostmap.js +0 -64
- package/dist/lib/services/interceptors/hostmap.js.map +0 -1
- package/dist/lib/services/interceptors/server-error.js +0 -77
- package/dist/lib/services/interceptors/server-error.js.map +0 -1
- package/dist/lib/services/interceptors/service.js +0 -137
- package/dist/lib/services/interceptors/service.js.map +0 -1
- package/dist/lib/services-v2/constants.js +0 -17
- package/dist/lib/services-v2/constants.js.map +0 -1
- package/dist/lib/services-v2/interceptors/server-error.js.map +0 -1
- package/dist/lib/services-v2/service-host.js +0 -300
- package/dist/lib/services-v2/service-host.js.map +0 -1
- package/dist/lib/services-v2/service-registry.js +0 -534
- package/dist/lib/services-v2/service-registry.js.map +0 -1
- package/dist/lib/services-v2/service-state.js +0 -97
- package/dist/lib/services-v2/service-state.js.map +0 -1
- package/dist/lib/services-v2/service-url.js +0 -119
- package/dist/lib/services-v2/service-url.js.map +0 -1
- package/src/lib/services/constants.js +0 -21
- package/src/lib/services/interceptors/hostmap.js +0 -36
- package/src/lib/services/interceptors/service.js +0 -101
- package/src/lib/services-v2/constants.ts +0 -21
- package/src/lib/services-v2/interceptors/server-error.js +0 -48
- /package/dist/lib/{services-v2/interceptors → interceptors}/hostmap.js +0 -0
- /package/dist/lib/{services-v2/interceptors → interceptors}/hostmap.js.map +0 -0
- /package/dist/lib/{services-v2/interceptors → interceptors}/service.js +0 -0
- /package/dist/lib/{services-v2/interceptors → interceptors}/service.js.map +0 -0
- /package/dist/lib/{services/metrics.js → metrics.js} +0 -0
- /package/dist/lib/{services/metrics.js.map → metrics.js.map} +0 -0
- /package/src/lib/{services-v2/interceptors → interceptors}/hostmap.js +0 -0
- /package/src/lib/{services-v2/interceptors → interceptors}/service.js +0 -0
- /package/src/lib/{services-v2/metrics.js → metrics.js} +0 -0
- /package/src/lib/{services/metrics.js → services-v2/metrics.ts} +0 -0
|
@@ -0,0 +1,664 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import '@webex/internal-plugin-device';
|
|
6
|
+
|
|
7
|
+
import {assert} from '@webex/test-helper-chai';
|
|
8
|
+
import sinon from 'sinon';
|
|
9
|
+
import WebexCore, {
|
|
10
|
+
ServiceDetail,
|
|
11
|
+
registerInternalPlugin,
|
|
12
|
+
ServicesV2,
|
|
13
|
+
ServiceInterceptor,
|
|
14
|
+
ServerErrorInterceptor,
|
|
15
|
+
Services,
|
|
16
|
+
} from '@webex/webex-core';
|
|
17
|
+
import testUsers from '@webex/test-helper-test-users';
|
|
18
|
+
import {
|
|
19
|
+
formattedServiceHostmapEntryConv,
|
|
20
|
+
serviceHostmapV2,
|
|
21
|
+
} from '../../../fixtures/host-catalog-v2';
|
|
22
|
+
|
|
23
|
+
describe('webex-core', () => {
|
|
24
|
+
describe('ServiceCatalogV2', () => {
|
|
25
|
+
let webexUser;
|
|
26
|
+
let webex;
|
|
27
|
+
let services;
|
|
28
|
+
let catalog;
|
|
29
|
+
|
|
30
|
+
before('create users', () =>
|
|
31
|
+
testUsers.create({count: 1}).then(
|
|
32
|
+
([user]) =>
|
|
33
|
+
new Promise((resolve) => {
|
|
34
|
+
setTimeout(() => {
|
|
35
|
+
webexUser = user;
|
|
36
|
+
resolve();
|
|
37
|
+
}, 1000);
|
|
38
|
+
})
|
|
39
|
+
)
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
registerInternalPlugin('services', ServicesV2, {
|
|
44
|
+
interceptors: {
|
|
45
|
+
ServiceInterceptor: ServiceInterceptor.create,
|
|
46
|
+
ServerErrorInterceptor: ServerErrorInterceptor.create,
|
|
47
|
+
},
|
|
48
|
+
replace: true,
|
|
49
|
+
});
|
|
50
|
+
webex = new WebexCore({credentials: {supertoken: webexUser.token}});
|
|
51
|
+
services = webex.internal.services;
|
|
52
|
+
catalog = services._getCatalog();
|
|
53
|
+
|
|
54
|
+
return services.waitForCatalog('postauth', 10).then(() =>
|
|
55
|
+
services.updateServices({
|
|
56
|
+
from: 'limited',
|
|
57
|
+
query: {userId: webexUser.id},
|
|
58
|
+
})
|
|
59
|
+
);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
afterEach(() => {
|
|
63
|
+
registerInternalPlugin('services', Services, {
|
|
64
|
+
interceptors: {
|
|
65
|
+
ServiceInterceptor: ServiceInterceptor.create,
|
|
66
|
+
ServerErrorInterceptor: ServerErrorInterceptor.create,
|
|
67
|
+
},
|
|
68
|
+
replace: true,
|
|
69
|
+
});
|
|
70
|
+
services = webex.internal.services;
|
|
71
|
+
catalog = services._getCatalog();
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe('#status()', () => {
|
|
75
|
+
it('updates ready when services ready', () => {
|
|
76
|
+
assert.equal(catalog.status.postauth.ready, true);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('#_getServiceDetail()', () => {
|
|
81
|
+
let testDetailTemplate;
|
|
82
|
+
let testDetail;
|
|
83
|
+
|
|
84
|
+
beforeEach(() => {
|
|
85
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
86
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
87
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
afterEach(() => {
|
|
91
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('returns a ServiceUrl from a specific serviceGroup', () => {
|
|
95
|
+
const serviceDetail = catalog._getServiceDetail(testDetailTemplate.id, 'preauth');
|
|
96
|
+
|
|
97
|
+
assert.equal(serviceDetail.serviceUrls, testDetailTemplate.serviceUrls);
|
|
98
|
+
assert.equal(serviceDetail.id, testDetailTemplate.id);
|
|
99
|
+
assert.equal(serviceDetail.serviceName, testDetailTemplate.serviceName);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("returns undefined if url doesn't exist", () => {
|
|
103
|
+
const serviceDetail = catalog._getServiceDetail('invalidUrl');
|
|
104
|
+
|
|
105
|
+
assert.typeOf(serviceDetail, 'undefined');
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("returns undefined if url doesn't exist in serviceGroup", () => {
|
|
109
|
+
const serviceDetail = catalog._getServiceDetail(testDetailTemplate.id, 'Discovery');
|
|
110
|
+
|
|
111
|
+
assert.typeOf(serviceDetail, 'undefined');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
describe('#findClusterId()', () => {
|
|
116
|
+
let testDetailTemplate;
|
|
117
|
+
let testDetail;
|
|
118
|
+
|
|
119
|
+
beforeEach(() => {
|
|
120
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
121
|
+
|
|
122
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
123
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
afterEach(() => {
|
|
127
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('returns a home cluster clusterId when found with default url', () => {
|
|
131
|
+
assert.equal(
|
|
132
|
+
catalog.findClusterId(testDetailTemplate.serviceUrls[0].baseUrl),
|
|
133
|
+
testDetailTemplate.id
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('returns a clusterId when found with priority host url', () => {
|
|
138
|
+
assert.equal(catalog.findClusterId(testDetail.get()), testDetailTemplate.id);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('returns a clusterId when found with resource-appended url', () => {
|
|
142
|
+
assert.equal(
|
|
143
|
+
catalog.findClusterId(`${testDetail.get()}example/resource/value`),
|
|
144
|
+
testDetailTemplate.id
|
|
145
|
+
);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("returns undefined when the url doesn't exist in catalog", () => {
|
|
149
|
+
assert.isUndefined(catalog.findClusterId('http://not-a-known-url.com/'));
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("returns undefined when the string isn't a url", () => {
|
|
153
|
+
assert.isUndefined(catalog.findClusterId('not a url'));
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
describe('#findServiceFromClusterId()', () => {
|
|
158
|
+
let testDetailTemplate;
|
|
159
|
+
let testDetail;
|
|
160
|
+
|
|
161
|
+
beforeEach(() => {
|
|
162
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
163
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
164
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
afterEach(() => {
|
|
168
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('finds a valid service url from only a clusterId', () => {
|
|
172
|
+
const serviceFound = catalog.findServiceFromClusterId({
|
|
173
|
+
clusterId: testDetailTemplate.id,
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
assert.equal(serviceFound.name, testDetail.serviceName);
|
|
177
|
+
assert.equal(serviceFound.url, testDetail.get());
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it('finds a valid service when a service group is defined', () => {
|
|
181
|
+
const serviceFound = catalog.findServiceFromClusterId({
|
|
182
|
+
clusterId: testDetailTemplate.id,
|
|
183
|
+
serviceGroup: 'preauth',
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
assert.equal(serviceFound.name, testDetail.serviceName);
|
|
187
|
+
assert.equal(serviceFound.url, testDetail.get());
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
it("fails to find a valid service when it's not in a group", () => {
|
|
191
|
+
assert.isUndefined(
|
|
192
|
+
catalog.findServiceFromClusterId({
|
|
193
|
+
clusterId: testDetailTemplate.id,
|
|
194
|
+
serviceGroup: 'signin',
|
|
195
|
+
})
|
|
196
|
+
);
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
it("returns undefined when service doesn't exist", () => {
|
|
200
|
+
assert.isUndefined(catalog.findServiceFromClusterId({clusterId: 'not a clusterId'}));
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
describe('#findServiceDetailFromUrl()', () => {
|
|
204
|
+
let testDetailTemplate;
|
|
205
|
+
let testDetail;
|
|
206
|
+
|
|
207
|
+
beforeEach(() => {
|
|
208
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
209
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
210
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
afterEach(() => {
|
|
214
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('finds a service if it exists', () => {
|
|
218
|
+
assert.equal(
|
|
219
|
+
catalog.findServiceDetailFromUrl(testDetailTemplate.serviceUrls[1].baseUrl).get(),
|
|
220
|
+
testDetail.get()
|
|
221
|
+
);
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
it('finds a service if its a priority host url', () => {
|
|
225
|
+
assert.equal(catalog.findServiceDetailFromUrl(testDetail.get()).get(), testDetail.get());
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it("returns undefined if the url doesn't exist", () => {
|
|
229
|
+
assert.isUndefined(catalog.findServiceDetailFromUrl('https://na.com/'));
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
it('returns undefined if the param is not a url', () => {
|
|
233
|
+
assert.isUndefined(catalog.findServiceDetailFromUrl('not a url'));
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
describe('#get()', () => {
|
|
238
|
+
let testDetailTemplate;
|
|
239
|
+
let testDetail;
|
|
240
|
+
|
|
241
|
+
beforeEach(() => {
|
|
242
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
243
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
244
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
afterEach(() => {
|
|
248
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('returns a valid string when name is specified', () => {
|
|
252
|
+
const url = catalog.get(testDetailTemplate.id);
|
|
253
|
+
|
|
254
|
+
assert.typeOf(url, 'string');
|
|
255
|
+
assert.equal(url, testDetailTemplate.serviceUrls[0].baseUrl);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
it("returns undefined if url doesn't exist", () => {
|
|
259
|
+
const s = catalog.get('invalidUrl');
|
|
260
|
+
|
|
261
|
+
assert.typeOf(s, 'undefined');
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('calls _getServiceDetail', () => {
|
|
265
|
+
sinon.spy(catalog, '_getServiceDetail');
|
|
266
|
+
|
|
267
|
+
catalog.get();
|
|
268
|
+
|
|
269
|
+
assert.called(catalog._getServiceDetail);
|
|
270
|
+
catalog._getServiceDetail.restore();
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it('gets a service from a specific serviceGroup', () => {
|
|
274
|
+
assert.isDefined(catalog.get(testDetailTemplate.id, 'preauth'));
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
it("fails to get a service if serviceGroup isn't accurate", () => {
|
|
278
|
+
assert.isUndefined(catalog.get(testDetailTemplate.id, 'discovery'));
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
describe('#markFailedServiceUrl()', () => {
|
|
283
|
+
let testDetailTemplate;
|
|
284
|
+
let testDetail;
|
|
285
|
+
|
|
286
|
+
beforeEach(() => {
|
|
287
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
288
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
289
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
afterEach(() => {
|
|
293
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it('marks a host as failed', () => {
|
|
297
|
+
const priorityUrl = catalog.get(testDetailTemplate.id, true);
|
|
298
|
+
|
|
299
|
+
catalog.markFailedServiceUrl(priorityUrl);
|
|
300
|
+
|
|
301
|
+
const failedHost = testDetail.serviceUrls.find((serviceUrl) => serviceUrl.failed);
|
|
302
|
+
|
|
303
|
+
assert.isDefined(failedHost);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it('returns the next priority url', () => {
|
|
307
|
+
const priorityUrl = catalog.get(testDetailTemplate.id, true);
|
|
308
|
+
const nextPriorityUrl = catalog.markFailedServiceUrl(priorityUrl);
|
|
309
|
+
|
|
310
|
+
assert.notEqual(priorityUrl, nextPriorityUrl);
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
describe('#_loadServiceDetails()', () => {
|
|
315
|
+
let testDetailTemplate;
|
|
316
|
+
let testDetail;
|
|
317
|
+
|
|
318
|
+
beforeEach(() => {
|
|
319
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
320
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('appends services to different service groups', () => {
|
|
324
|
+
catalog._loadServiceDetails('postauth', [testDetail]);
|
|
325
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
326
|
+
catalog._loadServiceDetails('discovery', [testDetail]);
|
|
327
|
+
|
|
328
|
+
assert.isTrue(
|
|
329
|
+
!!catalog.serviceGroups.postauth.find(
|
|
330
|
+
(serviceDetail) => serviceDetail.id === testDetail.id
|
|
331
|
+
)
|
|
332
|
+
);
|
|
333
|
+
assert.isTrue(
|
|
334
|
+
!!catalog.serviceGroups.preauth.find(
|
|
335
|
+
(serviceDetail) => serviceDetail.id === testDetail.id
|
|
336
|
+
)
|
|
337
|
+
);
|
|
338
|
+
assert.isTrue(
|
|
339
|
+
!!catalog.serviceGroups.discovery.find(
|
|
340
|
+
(serviceDetail) => serviceDetail.id === testDetail.id
|
|
341
|
+
)
|
|
342
|
+
);
|
|
343
|
+
catalog._unloadServiceDetails('postauth', [testDetail]);
|
|
344
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
345
|
+
catalog._unloadServiceDetails('discovery', [testDetail]);
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
describe('#_unloadServiceDetails()', () => {
|
|
350
|
+
let testDetailTemplate;
|
|
351
|
+
let testDetail;
|
|
352
|
+
|
|
353
|
+
beforeEach(() => {
|
|
354
|
+
testDetailTemplate = formattedServiceHostmapEntryConv;
|
|
355
|
+
testDetail = new ServiceDetail(testDetailTemplate);
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
it('appends services to different service groups', () => {
|
|
359
|
+
catalog._loadServiceDetails('postauth', [testDetail]);
|
|
360
|
+
catalog._loadServiceDetails('preauth', [testDetail]);
|
|
361
|
+
catalog._loadServiceDetails('discovery', [testDetail]);
|
|
362
|
+
|
|
363
|
+
const oBaseLength = catalog.serviceGroups.postauth.length;
|
|
364
|
+
const oLimitedLength = catalog.serviceGroups.preauth.length;
|
|
365
|
+
const oDiscoveryLength = catalog.serviceGroups.discovery.length;
|
|
366
|
+
|
|
367
|
+
catalog._unloadServiceDetails('postauth', [testDetail]);
|
|
368
|
+
catalog._unloadServiceDetails('preauth', [testDetail]);
|
|
369
|
+
catalog._unloadServiceDetails('discovery', [testDetail]);
|
|
370
|
+
|
|
371
|
+
assert.isAbove(oBaseLength, catalog.serviceGroups.postauth.length);
|
|
372
|
+
assert.isAbove(oLimitedLength, catalog.serviceGroups.preauth.length);
|
|
373
|
+
assert.isAbove(oDiscoveryLength, catalog.serviceGroups.discovery.length);
|
|
374
|
+
});
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
describe('#_fetchNewServiceHostmap()', () => {
|
|
378
|
+
let fullRemoteHM;
|
|
379
|
+
let limitedRemoteHM;
|
|
380
|
+
|
|
381
|
+
beforeEach(() =>
|
|
382
|
+
Promise.all([
|
|
383
|
+
services._fetchNewServiceHostmap(),
|
|
384
|
+
services._fetchNewServiceHostmap({
|
|
385
|
+
from: 'limited',
|
|
386
|
+
query: {userId: webexUser.id},
|
|
387
|
+
}),
|
|
388
|
+
]).then(([fRHM, lRHM]) => {
|
|
389
|
+
fullRemoteHM = fRHM;
|
|
390
|
+
limitedRemoteHM = lRHM;
|
|
391
|
+
|
|
392
|
+
return Promise.resolve();
|
|
393
|
+
})
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
it('resolves to an authed u2c hostmap when no params specified', () => {
|
|
397
|
+
assert.typeOf(fullRemoteHM, 'array');
|
|
398
|
+
assert.isAbove(fullRemoteHM.length, 0);
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
it('resolves to a limited u2c hostmap when params specified', () => {
|
|
402
|
+
assert.typeOf(limitedRemoteHM, 'array');
|
|
403
|
+
assert.isAbove(limitedRemoteHM.length, 0);
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
it('rejects if the params provided are invalid', () =>
|
|
407
|
+
services
|
|
408
|
+
._fetchNewServiceHostmap({
|
|
409
|
+
from: 'limited',
|
|
410
|
+
query: {userId: 'notValid'},
|
|
411
|
+
})
|
|
412
|
+
.then(() => {
|
|
413
|
+
assert.isTrue(false, 'should have rejected');
|
|
414
|
+
|
|
415
|
+
return Promise.reject();
|
|
416
|
+
})
|
|
417
|
+
.catch((e) => {
|
|
418
|
+
assert.typeOf(e, 'Error');
|
|
419
|
+
|
|
420
|
+
return Promise.resolve();
|
|
421
|
+
}));
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
describe('#waitForCatalog()', () => {
|
|
426
|
+
let promise;
|
|
427
|
+
let serviceHostmap;
|
|
428
|
+
let formattedHM;
|
|
429
|
+
|
|
430
|
+
beforeEach(() => {
|
|
431
|
+
serviceHostmap = serviceHostmapV2;
|
|
432
|
+
formattedHM = services._formatReceivedHostmap(serviceHostmap);
|
|
433
|
+
|
|
434
|
+
promise = catalog.waitForCatalog('preauth', 1);
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
it('returns a promise', () => {
|
|
438
|
+
assert.typeOf(promise, 'promise');
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
it('returns a rejected promise if timeout is reached', () =>
|
|
442
|
+
promise.catch(() => {
|
|
443
|
+
assert(true, 'promise rejected');
|
|
444
|
+
|
|
445
|
+
return Promise.resolve();
|
|
446
|
+
}));
|
|
447
|
+
|
|
448
|
+
it('returns a resolved promise once ready', () => {
|
|
449
|
+
catalog
|
|
450
|
+
.waitForCatalog('postauth', 1)
|
|
451
|
+
.then(() => assert(true, 'promise resolved'))
|
|
452
|
+
.finally(() => catalog.updateServiceGroups('postauth', formattedHM));
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
describe('#updateServiceGroups()', () => {
|
|
457
|
+
let serviceHostmap;
|
|
458
|
+
let formattedHM;
|
|
459
|
+
|
|
460
|
+
beforeEach(() => {
|
|
461
|
+
serviceHostmap = serviceHostmapV2;
|
|
462
|
+
formattedHM = services._formatReceivedHostmap(serviceHostmap);
|
|
463
|
+
});
|
|
464
|
+
|
|
465
|
+
it('removes any unused urls from current services', () => {
|
|
466
|
+
catalog.updateServiceGroups('preauth', formattedHM);
|
|
467
|
+
|
|
468
|
+
const originalLength = catalog.serviceGroups.preauth.length;
|
|
469
|
+
|
|
470
|
+
catalog.updateServiceGroups('preauth', []);
|
|
471
|
+
|
|
472
|
+
assert.isBelow(catalog.serviceGroups.preauth.length, originalLength);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
it('updates the target catalog to contain the provided hosts', () => {
|
|
476
|
+
catalog.updateServiceGroups('preauth', formattedHM);
|
|
477
|
+
|
|
478
|
+
assert.equal(catalog.serviceGroups.preauth.length, formattedHM.length);
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
it('updates any existing ServiceUrls', () => {
|
|
482
|
+
const newServiceHM = {
|
|
483
|
+
activeServices: {
|
|
484
|
+
conversation: 'urn:TEAM:us-east-2_a:conversation',
|
|
485
|
+
idbroker: 'urn:TEAM:us-east-2_a:idbroker',
|
|
486
|
+
locus: 'urn:TEAM:us-east-2_a:locus',
|
|
487
|
+
mercury: 'urn:TEAM:us-east-2_a:mercury',
|
|
488
|
+
},
|
|
489
|
+
services: [
|
|
490
|
+
{
|
|
491
|
+
id: 'urn:TEAM:us-east-2_a:conversation',
|
|
492
|
+
serviceName: 'conversation',
|
|
493
|
+
serviceUrls: [
|
|
494
|
+
{
|
|
495
|
+
baseUrl: 'https://example-1.svc.webex.com/conversation/api/v1',
|
|
496
|
+
priority: 1,
|
|
497
|
+
},
|
|
498
|
+
{
|
|
499
|
+
baseUrl: 'https://conv-a.wbx2.com/conversation/api/v1',
|
|
500
|
+
priority: 2,
|
|
501
|
+
},
|
|
502
|
+
],
|
|
503
|
+
},
|
|
504
|
+
{
|
|
505
|
+
id: 'urn:TEAM:me-central-1_d:conversation',
|
|
506
|
+
serviceName: 'conversation',
|
|
507
|
+
serviceUrls: [
|
|
508
|
+
{
|
|
509
|
+
baseUrl: 'https://example-2.svc.webex.com/conversation/api/v1',
|
|
510
|
+
priority: 1,
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
baseUrl: 'https://conv-d.wbx2.com/conversation/api/v1',
|
|
514
|
+
priority: 2,
|
|
515
|
+
},
|
|
516
|
+
],
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
id: 'urn:TEAM:us-east-2_a:idbroker',
|
|
520
|
+
serviceName: 'idbroker',
|
|
521
|
+
serviceUrls: [
|
|
522
|
+
{
|
|
523
|
+
baseUrl: 'https://example-3.svc.webex.com/idbroker/api/v1',
|
|
524
|
+
priority: 1,
|
|
525
|
+
},
|
|
526
|
+
{
|
|
527
|
+
baseUrl: 'https://idbroker.webex.com/idb/api/v1',
|
|
528
|
+
priority: 2,
|
|
529
|
+
},
|
|
530
|
+
],
|
|
531
|
+
},
|
|
532
|
+
{
|
|
533
|
+
id: 'urn:TEAM:me-central-1_d:idbroker',
|
|
534
|
+
serviceName: 'idbroker',
|
|
535
|
+
serviceUrls: [
|
|
536
|
+
{
|
|
537
|
+
baseUrl: 'https://example-4.svc.webex.com/idbroker/api/v1',
|
|
538
|
+
priority: 1,
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
baseUrl: 'https://conv-d.wbx2.com/idbroker/api/v1',
|
|
542
|
+
priority: 2,
|
|
543
|
+
},
|
|
544
|
+
],
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
id: 'urn:TEAM:us-east-2_a:locus',
|
|
548
|
+
serviceName: 'locus',
|
|
549
|
+
serviceUrls: [
|
|
550
|
+
{
|
|
551
|
+
baseUrl: 'https://example-5.svc.webex.com/locus/api/v1',
|
|
552
|
+
priority: 1,
|
|
553
|
+
},
|
|
554
|
+
{
|
|
555
|
+
baseUrl: 'https://locus-a.wbx2.com/locus/api/v1',
|
|
556
|
+
priority: 2,
|
|
557
|
+
},
|
|
558
|
+
],
|
|
559
|
+
},
|
|
560
|
+
{
|
|
561
|
+
id: 'urn:TEAM:me-central-1_d:locus',
|
|
562
|
+
serviceName: 'locus',
|
|
563
|
+
serviceUrls: [
|
|
564
|
+
{
|
|
565
|
+
baseUrl: 'https://example-6.svc.webex.com/locus/api/v1',
|
|
566
|
+
priority: 1,
|
|
567
|
+
},
|
|
568
|
+
{
|
|
569
|
+
baseUrl: 'https://conv-d.wbx2.com/locus/api/v1',
|
|
570
|
+
priority: 2,
|
|
571
|
+
},
|
|
572
|
+
],
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
id: 'urn:TEAM:us-east-2_a:mercury',
|
|
576
|
+
serviceName: 'mercury',
|
|
577
|
+
serviceUrls: [
|
|
578
|
+
{
|
|
579
|
+
baseUrl: 'https://example-7.wbx2.com/mercury/api/v1',
|
|
580
|
+
priority: 1,
|
|
581
|
+
},
|
|
582
|
+
],
|
|
583
|
+
},
|
|
584
|
+
{
|
|
585
|
+
id: 'urn:TEAM:me-central-1_d:mercury',
|
|
586
|
+
serviceName: 'mercury',
|
|
587
|
+
serviceUrls: [
|
|
588
|
+
{
|
|
589
|
+
baseUrl: 'https://example-8.svc.webex.com/mercury/api/v1',
|
|
590
|
+
priority: 1,
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
baseUrl: 'https://conv-d.wbx2.com/mercury/api/v1',
|
|
594
|
+
priority: 2,
|
|
595
|
+
},
|
|
596
|
+
],
|
|
597
|
+
},
|
|
598
|
+
],
|
|
599
|
+
orgId: '3e0e410f-f83f-4ee4-ac32-12692e99355c',
|
|
600
|
+
timestamp: '1745533341',
|
|
601
|
+
format: 'U2Cv2',
|
|
602
|
+
};
|
|
603
|
+
|
|
604
|
+
catalog.updateServiceGroups('preauth', formattedHM);
|
|
605
|
+
|
|
606
|
+
const oldServiceDetails = catalog._getAllServiceDetails('preauth');
|
|
607
|
+
|
|
608
|
+
const newFormattedHM = services._formatReceivedHostmap(newServiceHM);
|
|
609
|
+
|
|
610
|
+
catalog.updateServiceGroups('preauth', newFormattedHM);
|
|
611
|
+
|
|
612
|
+
oldServiceDetails.forEach((serviceDetail) =>
|
|
613
|
+
assert.isTrue(!!formattedHM.find((service) => service.id === serviceDetail.id))
|
|
614
|
+
);
|
|
615
|
+
|
|
616
|
+
const newServiceDetails = catalog._getAllServiceDetails('preauth');
|
|
617
|
+
|
|
618
|
+
formattedHM.forEach((oldServiceDetail) =>
|
|
619
|
+
assert.notEqual(
|
|
620
|
+
oldServiceDetail.serviceUrls[0].baseUrl,
|
|
621
|
+
newServiceDetails.find((service) => service.id === oldServiceDetail.id).get()
|
|
622
|
+
)
|
|
623
|
+
);
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
it('creates an array of equal length of active services', () => {
|
|
627
|
+
assert.equal(serviceHostmap.services.length, formattedHM.length);
|
|
628
|
+
});
|
|
629
|
+
|
|
630
|
+
it('creates an array with matching host data', () => {
|
|
631
|
+
Object.values(serviceHostmap.activeServices).forEach((activeServiceVal) => {
|
|
632
|
+
const hostGroup = !!serviceHostmap.services.find(
|
|
633
|
+
(service) => service.id === activeServiceVal
|
|
634
|
+
);
|
|
635
|
+
|
|
636
|
+
assert.isTrue(
|
|
637
|
+
hostGroup,
|
|
638
|
+
`did not find matching host data for the \`${activeServiceVal}\` active service.`
|
|
639
|
+
);
|
|
640
|
+
});
|
|
641
|
+
});
|
|
642
|
+
|
|
643
|
+
it('triggers authorization events', (done) => {
|
|
644
|
+
catalog.once('preauth', () => {
|
|
645
|
+
assert(true, 'triggered once');
|
|
646
|
+
done();
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
catalog.updateServiceGroups('preauth', formattedHM);
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
it('updates the services list', (done) => {
|
|
653
|
+
catalog.serviceGroups.preauth = [];
|
|
654
|
+
|
|
655
|
+
catalog.once('preauth', () => {
|
|
656
|
+
assert.isAbove(catalog.serviceGroups.preauth.length, 0);
|
|
657
|
+
done();
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
catalog.updateServiceGroups('preauth', formattedHM);
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
});
|
|
664
|
+
});
|