@itentialopensource/adapter-meraki 0.8.1 → 0.8.4
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/AUTH.md +14 -15
- package/BROKER.md +199 -0
- package/CALLS.md +158 -89
- package/CHANGELOG.md +68 -26
- package/CODE_OF_CONDUCT.md +12 -17
- package/CONTRIBUTING.md +88 -74
- package/ENHANCE.md +14 -14
- package/PROPERTIES.md +483 -89
- package/README.md +131 -51
- package/SUMMARY.md +2 -2
- package/TROUBLESHOOT.md +4 -3
- package/adapter.js +174 -732
- package/adapterBase.js +841 -88
- package/entities/.generic/action.json +105 -0
- package/entities/.generic/schema.json +6 -1
- package/package.json +5 -3
- package/pronghorn.json +642 -563
- package/propertiesDecorators.json +14 -0
- package/propertiesSchema.json +393 -195
- package/refs?service=git-upload-pack +0 -0
- package/report/adapterInfo.json +10 -0
- package/report/updateReport1651511176919.json +115 -0
- package/report/updateReport1652488414759.json +120 -0
- package/sampleProperties.json +132 -3
- package/test/integration/adapterTestBasicGet.js +1 -1
- package/test/integration/adapterTestIntegration.js +24 -107
- package/test/unit/adapterBaseTestUnit.js +10 -3
- package/test/unit/adapterTestUnit.js +38 -131
- package/utils/adapterInfo.js +206 -0
- package/utils/entitiesToDB.js +12 -57
- package/utils/pre-commit.sh +3 -0
- package/utils/tbScript.js +35 -20
- package/utils/tbUtils.js +49 -31
- package/utils/testRunner.js +16 -16
@@ -4,6 +4,7 @@
|
|
4
4
|
/* global describe it log pronghornProps */
|
5
5
|
/* eslint global-require: warn */
|
6
6
|
/* eslint no-unused-vars: warn */
|
7
|
+
/* eslint import/no-dynamic-require:warn */
|
7
8
|
|
8
9
|
// include required items for testing & logging
|
9
10
|
const assert = require('assert');
|
@@ -18,22 +19,31 @@ const { use } = require('chai');
|
|
18
19
|
const td = require('testdouble');
|
19
20
|
|
20
21
|
const anything = td.matchers.anything();
|
21
|
-
|
22
|
-
// stub and attemptTimeout are used throughout the code so set them here
|
23
22
|
let logLevel = 'none';
|
24
|
-
const stub = true;
|
25
23
|
const isRapidFail = false;
|
26
|
-
|
24
|
+
|
25
|
+
// read in the properties from the sampleProperties files
|
26
|
+
let adaptdir = __dirname;
|
27
|
+
if (adaptdir.endsWith('/test/integration')) {
|
28
|
+
adaptdir = adaptdir.substring(0, adaptdir.length - 17);
|
29
|
+
} else if (adaptdir.endsWith('/test/unit')) {
|
30
|
+
adaptdir = adaptdir.substring(0, adaptdir.length - 10);
|
31
|
+
}
|
32
|
+
const samProps = require(`${adaptdir}/sampleProperties.json`).properties;
|
27
33
|
|
28
34
|
// these variables can be changed to run in integrated mode so easier to set them here
|
29
35
|
// always check these in with bogus data!!!
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
36
|
+
samProps.stub = true;
|
37
|
+
samProps.host = 'replace.hostorip.here';
|
38
|
+
samProps.authentication.username = 'username';
|
39
|
+
samProps.authentication.password = 'password';
|
40
|
+
samProps.protocol = 'http';
|
41
|
+
samProps.port = 80;
|
42
|
+
samProps.ssl.enabled = false;
|
43
|
+
samProps.ssl.accept_invalid_cert = false;
|
44
|
+
samProps.request.attempt_timeout = 60000;
|
45
|
+
const attemptTimeout = samProps.request.attempt_timeout;
|
46
|
+
const { stub } = samProps;
|
37
47
|
|
38
48
|
// these are the adapter properties. You generally should not need to alter
|
39
49
|
// any of these after they are initially set up
|
@@ -45,102 +55,7 @@ global.pronghornProps = {
|
|
45
55
|
adapters: [{
|
46
56
|
id: 'Test-meraki',
|
47
57
|
type: 'Meraki',
|
48
|
-
properties:
|
49
|
-
host,
|
50
|
-
port,
|
51
|
-
base_path: '//api',
|
52
|
-
version: 'v0',
|
53
|
-
cache_location: 'none',
|
54
|
-
encode_pathvars: true,
|
55
|
-
save_metric: false,
|
56
|
-
protocol,
|
57
|
-
stub,
|
58
|
-
authentication: {
|
59
|
-
auth_method: 'basic user_password',
|
60
|
-
username,
|
61
|
-
password,
|
62
|
-
token: '',
|
63
|
-
token_timeout: -1,
|
64
|
-
token_cache: 'local',
|
65
|
-
invalid_token_error: 401,
|
66
|
-
auth_field: 'header.headers.Authorization',
|
67
|
-
auth_field_format: 'Basic {b64}{username}:{password}{/b64}',
|
68
|
-
auth_logging: false,
|
69
|
-
client_id: '',
|
70
|
-
client_secret: '',
|
71
|
-
grant_type: ''
|
72
|
-
},
|
73
|
-
healthcheck: {
|
74
|
-
type: 'none',
|
75
|
-
frequency: 60000,
|
76
|
-
query_object: {}
|
77
|
-
},
|
78
|
-
throttle: {
|
79
|
-
throttle_enabled: false,
|
80
|
-
number_pronghorns: 1,
|
81
|
-
sync_async: 'sync',
|
82
|
-
max_in_queue: 1000,
|
83
|
-
concurrent_max: 1,
|
84
|
-
expire_timeout: 0,
|
85
|
-
avg_runtime: 200,
|
86
|
-
priorities: [
|
87
|
-
{
|
88
|
-
value: 0,
|
89
|
-
percent: 100
|
90
|
-
}
|
91
|
-
]
|
92
|
-
},
|
93
|
-
request: {
|
94
|
-
number_redirects: 0,
|
95
|
-
number_retries: 3,
|
96
|
-
limit_retry_error: 0,
|
97
|
-
failover_codes: [],
|
98
|
-
attempt_timeout: attemptTimeout,
|
99
|
-
global_request: {
|
100
|
-
payload: {},
|
101
|
-
uriOptions: {},
|
102
|
-
addlHeaders: {},
|
103
|
-
authData: {}
|
104
|
-
},
|
105
|
-
healthcheck_on_timeout: true,
|
106
|
-
return_raw: true,
|
107
|
-
archiving: false,
|
108
|
-
return_request: false
|
109
|
-
},
|
110
|
-
proxy: {
|
111
|
-
enabled: false,
|
112
|
-
host: '',
|
113
|
-
port: 1,
|
114
|
-
protocol: 'http',
|
115
|
-
username: '',
|
116
|
-
password: ''
|
117
|
-
},
|
118
|
-
ssl: {
|
119
|
-
ecdhCurve: '',
|
120
|
-
enabled: sslenable,
|
121
|
-
accept_invalid_cert: sslinvalid,
|
122
|
-
ca_file: '',
|
123
|
-
key_file: '',
|
124
|
-
cert_file: '',
|
125
|
-
secure_protocol: '',
|
126
|
-
ciphers: ''
|
127
|
-
},
|
128
|
-
mongo: {
|
129
|
-
host: '',
|
130
|
-
port: 0,
|
131
|
-
database: '',
|
132
|
-
username,
|
133
|
-
password: '',
|
134
|
-
replSet: '',
|
135
|
-
db_ssl: {
|
136
|
-
enabled: false,
|
137
|
-
accept_invalid_cert: false,
|
138
|
-
ca_file: '',
|
139
|
-
key_file: '',
|
140
|
-
cert_file: ''
|
141
|
-
}
|
142
|
-
}
|
143
|
-
}
|
58
|
+
properties: samProps
|
144
59
|
}]
|
145
60
|
}
|
146
61
|
};
|
@@ -475,6 +390,7 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
475
390
|
assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapUnsuspendAdapter'));
|
476
391
|
assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'iapGetAdapterQueue'));
|
477
392
|
assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'genericAdapterRequest'));
|
393
|
+
assert.notEqual(undefined, pronghornDotJson.methods.find((e) => e.name === 'genericAdapterRequestNoBasePath'));
|
478
394
|
done();
|
479
395
|
} catch (error) {
|
480
396
|
log.error(`Test Failure: ${error}`);
|
@@ -646,6 +562,8 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
646
562
|
assert.equal('string', propertiesDotJson.definitions.authentication.properties.client_id.type);
|
647
563
|
assert.equal('string', propertiesDotJson.definitions.authentication.properties.client_secret.type);
|
648
564
|
assert.equal('string', propertiesDotJson.definitions.authentication.properties.grant_type.type);
|
565
|
+
assert.notEqual(undefined, propertiesDotJson.definitions.ssl);
|
566
|
+
assert.notEqual(null, propertiesDotJson.definitions.ssl);
|
649
567
|
assert.notEqual('', propertiesDotJson.definitions.ssl);
|
650
568
|
assert.equal('string', propertiesDotJson.definitions.ssl.properties.ecdhCurve.type);
|
651
569
|
assert.equal('boolean', propertiesDotJson.definitions.ssl.properties.enabled.type);
|
@@ -659,6 +577,7 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
659
577
|
assert.equal('string', propertiesDotJson.properties.version.type);
|
660
578
|
assert.equal('string', propertiesDotJson.properties.cache_location.type);
|
661
579
|
assert.equal('boolean', propertiesDotJson.properties.encode_pathvars.type);
|
580
|
+
assert.equal('boolean', propertiesDotJson.properties.encode_queryvars.type);
|
662
581
|
assert.equal(true, Array.isArray(propertiesDotJson.properties.save_metric.type));
|
663
582
|
assert.equal('string', propertiesDotJson.properties.protocol.type);
|
664
583
|
assert.notEqual(undefined, propertiesDotJson.definitions);
|
@@ -707,8 +626,6 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
707
626
|
assert.equal('string', propertiesDotJson.definitions.proxy.properties.protocol.type);
|
708
627
|
assert.equal('string', propertiesDotJson.definitions.proxy.properties.username.type);
|
709
628
|
assert.equal('string', propertiesDotJson.definitions.proxy.properties.password.type);
|
710
|
-
assert.notEqual(undefined, propertiesDotJson.definitions.ssl);
|
711
|
-
assert.notEqual(null, propertiesDotJson.definitions.ssl);
|
712
629
|
assert.notEqual(undefined, propertiesDotJson.definitions.mongo);
|
713
630
|
assert.notEqual(null, propertiesDotJson.definitions.mongo);
|
714
631
|
assert.notEqual('', propertiesDotJson.definitions.mongo);
|
@@ -725,11 +642,11 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
725
642
|
assert.equal('string', propertiesDotJson.definitions.mongo.properties.db_ssl.properties.key_file.type);
|
726
643
|
assert.equal('string', propertiesDotJson.definitions.mongo.properties.db_ssl.properties.cert_file.type);
|
727
644
|
assert.notEqual('', propertiesDotJson.definitions.devicebroker);
|
728
|
-
assert.equal('
|
729
|
-
assert.equal('
|
730
|
-
assert.equal('
|
731
|
-
assert.equal('
|
732
|
-
assert.equal('
|
645
|
+
assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getDevice.type);
|
646
|
+
assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getDevicesFiltered.type);
|
647
|
+
assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.isAlive.type);
|
648
|
+
assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getConfig.type);
|
649
|
+
assert.equal('array', propertiesDotJson.definitions.devicebroker.properties.getCount.type);
|
733
650
|
done();
|
734
651
|
} catch (error) {
|
735
652
|
log.error(`Test Failure: ${error}`);
|
@@ -846,17 +763,13 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
846
763
|
assert.notEqual(undefined, sampleDotJson.properties.ssl.cert_file);
|
847
764
|
assert.notEqual(undefined, sampleDotJson.properties.ssl.secure_protocol);
|
848
765
|
assert.notEqual(undefined, sampleDotJson.properties.ssl.ciphers);
|
849
|
-
|
850
766
|
assert.notEqual(undefined, sampleDotJson.properties.base_path);
|
851
767
|
assert.notEqual(undefined, sampleDotJson.properties.version);
|
852
768
|
assert.notEqual(undefined, sampleDotJson.properties.cache_location);
|
853
769
|
assert.notEqual(undefined, sampleDotJson.properties.encode_pathvars);
|
770
|
+
assert.notEqual(undefined, sampleDotJson.properties.encode_queryvars);
|
854
771
|
assert.notEqual(undefined, sampleDotJson.properties.save_metric);
|
855
772
|
assert.notEqual(undefined, sampleDotJson.properties.protocol);
|
856
|
-
assert.notEqual(undefined, sampleDotJson.properties.stub);
|
857
|
-
assert.notEqual(undefined, sampleDotJson.properties.stub);
|
858
|
-
assert.notEqual(undefined, sampleDotJson.properties.stub);
|
859
|
-
assert.notEqual(undefined, sampleDotJson.properties.stub);
|
860
773
|
assert.notEqual(undefined, sampleDotJson.properties.healthcheck);
|
861
774
|
assert.notEqual(null, sampleDotJson.properties.healthcheck);
|
862
775
|
assert.notEqual('', sampleDotJson.properties.healthcheck);
|
@@ -915,6 +828,12 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
915
828
|
assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.ca_file);
|
916
829
|
assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.key_file);
|
917
830
|
assert.notEqual(undefined, sampleDotJson.properties.mongo.db_ssl.cert_file);
|
831
|
+
assert.notEqual(undefined, sampleDotJson.properties.devicebroker);
|
832
|
+
assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getDevice);
|
833
|
+
assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getDevicesFiltered);
|
834
|
+
assert.notEqual(undefined, sampleDotJson.properties.devicebroker.isAlive);
|
835
|
+
assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getConfig);
|
836
|
+
assert.notEqual(undefined, sampleDotJson.properties.devicebroker.getCount);
|
918
837
|
done();
|
919
838
|
} catch (error) {
|
920
839
|
log.error(`Test Failure: ${error}`);
|
@@ -1291,18 +1210,6 @@ describe('[unit] Meraki Adapter Test', () => {
|
|
1291
1210
|
});
|
1292
1211
|
});
|
1293
1212
|
|
1294
|
-
describe('#hasDevices', () => {
|
1295
|
-
it('should have a hasDevices function', (done) => {
|
1296
|
-
try {
|
1297
|
-
assert.equal(true, typeof a.hasDevices === 'function');
|
1298
|
-
done();
|
1299
|
-
} catch (error) {
|
1300
|
-
log.error(`Test Failure: ${error}`);
|
1301
|
-
done(error);
|
1302
|
-
}
|
1303
|
-
});
|
1304
|
-
});
|
1305
|
-
|
1306
1213
|
describe('#getDevice', () => {
|
1307
1214
|
it('should have a getDevice function', (done) => {
|
1308
1215
|
try {
|
@@ -0,0 +1,206 @@
|
|
1
|
+
#!/usr/bin/env node
|
2
|
+
/* @copyright Itential, LLC 2019 */
|
3
|
+
/* eslint global-require:warn */
|
4
|
+
/* eslint import/no-dynamic-require:warn */
|
5
|
+
/* eslint prefer-destructuring:warn */
|
6
|
+
|
7
|
+
const fs = require('fs-extra');
|
8
|
+
const path = require('path');
|
9
|
+
|
10
|
+
/**
|
11
|
+
* This script will determine the information about the adapter and store
|
12
|
+
* it into a file in the adapter.
|
13
|
+
*/
|
14
|
+
|
15
|
+
/**
|
16
|
+
* get adapter information
|
17
|
+
*/
|
18
|
+
function adapterInfo() {
|
19
|
+
// set the base pase of the adapter - tool shoud be one level up in utils
|
20
|
+
let adaptdir = __dirname;
|
21
|
+
const infoRes = {};
|
22
|
+
|
23
|
+
if (adaptdir.endsWith('/utils')) {
|
24
|
+
adaptdir = adaptdir.substring(0, adaptdir.length - 6);
|
25
|
+
}
|
26
|
+
const pack = require(`${adaptdir}/package.json`);
|
27
|
+
infoRes.version = pack.version;
|
28
|
+
|
29
|
+
let configCount = 0;
|
30
|
+
if (fs.existsSync(`${adaptdir}/pronghorn.json`)) {
|
31
|
+
const cFile = fs.readFileSync(`${adaptdir}/pronghorn.json`, 'utf8');
|
32
|
+
configCount += cFile.split('\n').length;
|
33
|
+
} else {
|
34
|
+
console.log('Missing - pronghorn.json');
|
35
|
+
}
|
36
|
+
if (fs.existsSync(`${adaptdir}/propertiesSchema.json`)) {
|
37
|
+
const cFile = fs.readFileSync(`${adaptdir}/propertiesSchema.json`, 'utf8');
|
38
|
+
configCount += cFile.split('\n').length;
|
39
|
+
} else {
|
40
|
+
console.log('Missing - propertiesSchema.json');
|
41
|
+
}
|
42
|
+
if (fs.existsSync(`${adaptdir}/error.json`)) {
|
43
|
+
const cFile = fs.readFileSync(`${adaptdir}/error.json`, 'utf8');
|
44
|
+
configCount += cFile.split('\n').length;
|
45
|
+
} else {
|
46
|
+
console.log('Missing - error.json');
|
47
|
+
}
|
48
|
+
const entitydir = path.join(adaptdir, '/entities');
|
49
|
+
if (fs.existsSync(entitydir) && fs.statSync(entitydir).isDirectory()) {
|
50
|
+
const entities = fs.readdirSync(entitydir);
|
51
|
+
// need to go through each entity in the entities directory
|
52
|
+
for (let e = 0; e < entities.length; e += 1) {
|
53
|
+
if (fs.statSync(`${entitydir}/${entities[e]}`).isDirectory()) {
|
54
|
+
const cfiles = fs.readdirSync(entitydir);
|
55
|
+
for (let c = 0; c < cfiles.length; c += 1) {
|
56
|
+
if (cfiles[c].endsWith('.json')) {
|
57
|
+
const ccFile = fs.readFileSync(`${entitydir}/${entities[e]}/${cfiles[c]}`, 'utf8');
|
58
|
+
configCount += ccFile.split('\n').length;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
} else {
|
64
|
+
console.log('Could not find the entities directory');
|
65
|
+
}
|
66
|
+
infoRes.configLines = configCount;
|
67
|
+
|
68
|
+
let scodeCount = 0;
|
69
|
+
if (fs.existsSync(`${adaptdir}/utils/artifactize.js`)) {
|
70
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/artifactize.js`, 'utf8');
|
71
|
+
scodeCount += sFile.split('\n').length;
|
72
|
+
} else {
|
73
|
+
console.log('Missing - utils/artifactize.js');
|
74
|
+
}
|
75
|
+
if (fs.existsSync(`${adaptdir}/utils/basicGet.js`)) {
|
76
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/basicGet.js`, 'utf8');
|
77
|
+
scodeCount += sFile.split('\n').length;
|
78
|
+
} else {
|
79
|
+
console.log('Missing - utils/basicGet.js');
|
80
|
+
}
|
81
|
+
if (fs.existsSync(`${adaptdir}/utils/checkMigrate.js`)) {
|
82
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/checkMigrate.js`, 'utf8');
|
83
|
+
scodeCount += sFile.split('\n').length;
|
84
|
+
} else {
|
85
|
+
console.log('Missing - utils/checkMigrate.js');
|
86
|
+
}
|
87
|
+
if (fs.existsSync(`${adaptdir}/utils/findPath.js`)) {
|
88
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/findPath.js`, 'utf8');
|
89
|
+
scodeCount += sFile.split('\n').length;
|
90
|
+
} else {
|
91
|
+
console.log('Missing - utils/findPath.js');
|
92
|
+
}
|
93
|
+
if (fs.existsSync(`${adaptdir}/utils/modify.js`)) {
|
94
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/modify.js`, 'utf8');
|
95
|
+
scodeCount += sFile.split('\n').length;
|
96
|
+
} else {
|
97
|
+
console.log('Missing - utils/modify.js');
|
98
|
+
}
|
99
|
+
if (fs.existsSync(`${adaptdir}/utils/packModificationScript.js`)) {
|
100
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/packModificationScript.js`, 'utf8');
|
101
|
+
scodeCount += sFile.split('\n').length;
|
102
|
+
} else {
|
103
|
+
console.log('Missing - utils/packModificationScript.js');
|
104
|
+
}
|
105
|
+
if (fs.existsSync(`${adaptdir}/utils/setup.js`)) {
|
106
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/setup.js`, 'utf8');
|
107
|
+
scodeCount += sFile.split('\n').length;
|
108
|
+
} else {
|
109
|
+
console.log('Missing - utils/setup.js');
|
110
|
+
}
|
111
|
+
if (fs.existsSync(`${adaptdir}/utils/tbScript.js`)) {
|
112
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/tbScript.js`, 'utf8');
|
113
|
+
scodeCount += sFile.split('\n').length;
|
114
|
+
} else {
|
115
|
+
console.log('Missing - utils/tbScript.js');
|
116
|
+
}
|
117
|
+
if (fs.existsSync(`${adaptdir}/utils/tbUtils.js`)) {
|
118
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/tbUtils.js`, 'utf8');
|
119
|
+
scodeCount += sFile.split('\n').length;
|
120
|
+
} else {
|
121
|
+
console.log('Missing - utils/tbUtils.js');
|
122
|
+
}
|
123
|
+
if (fs.existsSync(`${adaptdir}/utils/testRunner.js`)) {
|
124
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/testRunner.js`, 'utf8');
|
125
|
+
scodeCount += sFile.split('\n').length;
|
126
|
+
} else {
|
127
|
+
console.log('Missing - utils/testRunner.js');
|
128
|
+
}
|
129
|
+
if (fs.existsSync(`${adaptdir}/utils/troubleshootingAdapter.js`)) {
|
130
|
+
const sFile = fs.readFileSync(`${adaptdir}/utils/troubleshootingAdapter.js`, 'utf8');
|
131
|
+
scodeCount += sFile.split('\n').length;
|
132
|
+
} else {
|
133
|
+
console.log('Missing - utils/troubleshootingAdapter.js');
|
134
|
+
}
|
135
|
+
infoRes.scriptLines = scodeCount;
|
136
|
+
|
137
|
+
let codeCount = 0;
|
138
|
+
if (fs.existsSync(`${adaptdir}/adapter.js`)) {
|
139
|
+
const aFile = fs.readFileSync(`${adaptdir}/adapter.js`, 'utf8');
|
140
|
+
codeCount += aFile.split('\n').length;
|
141
|
+
} else {
|
142
|
+
console.log('Missing - utils/adapter.js');
|
143
|
+
}
|
144
|
+
if (fs.existsSync(`${adaptdir}/adapterBase.js`)) {
|
145
|
+
const aFile = fs.readFileSync(`${adaptdir}/adapterBase.js`, 'utf8');
|
146
|
+
codeCount += aFile.split('\n').length;
|
147
|
+
} else {
|
148
|
+
console.log('Missing - utils/adapterBase.js');
|
149
|
+
}
|
150
|
+
infoRes.codeLines = codeCount;
|
151
|
+
|
152
|
+
let tcodeCount = 0;
|
153
|
+
let ttestCount = 0;
|
154
|
+
if (fs.existsSync(`${adaptdir}/test/integration/adapterTestBasicGet.js`)) {
|
155
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/integration/adapterTestBasicGet.js`, 'utf8');
|
156
|
+
tcodeCount += tFile.split('\n').length;
|
157
|
+
ttestCount += tFile.split('it(\'').length;
|
158
|
+
} else {
|
159
|
+
console.log('Missing - test/integration/adapterTestBasicGet.js');
|
160
|
+
}
|
161
|
+
if (fs.existsSync(`${adaptdir}/test/integration/adapterTestConnectivity.js`)) {
|
162
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/integration/adapterTestConnectivity.js`, 'utf8');
|
163
|
+
tcodeCount += tFile.split('\n').length;
|
164
|
+
ttestCount += tFile.split('it(\'').length;
|
165
|
+
} else {
|
166
|
+
console.log('Missing - test/integration/adapterTestConnectivity.js');
|
167
|
+
}
|
168
|
+
if (fs.existsSync(`${adaptdir}/test/integration/adapterTestIntegration.js`)) {
|
169
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/integration/adapterTestIntegration.js`, 'utf8');
|
170
|
+
tcodeCount += tFile.split('\n').length;
|
171
|
+
ttestCount += tFile.split('it(\'').length;
|
172
|
+
} else {
|
173
|
+
console.log('Missing - test/integration/adapterTestIntegration.js');
|
174
|
+
}
|
175
|
+
if (fs.existsSync(`${adaptdir}/test/unit/adapterBaseTestUnit.js`)) {
|
176
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/unit/adapterBaseTestUnit.js`, 'utf8');
|
177
|
+
tcodeCount += tFile.split('\n').length;
|
178
|
+
ttestCount += tFile.split('it(\'').length;
|
179
|
+
} else {
|
180
|
+
console.log('Missing - test/unit/adapterBaseTestUnit.js');
|
181
|
+
}
|
182
|
+
if (fs.existsSync(`${adaptdir}/test/unit/adapterTestUnit.js`)) {
|
183
|
+
const tFile = fs.readFileSync(`${adaptdir}/test/unit/adapterTestUnit.js`, 'utf8');
|
184
|
+
tcodeCount += tFile.split('\n').length;
|
185
|
+
ttestCount += tFile.split('it(\'').length;
|
186
|
+
} else {
|
187
|
+
console.log('Missing - test/unit/adapterTestUnit.js');
|
188
|
+
}
|
189
|
+
infoRes.testLines = tcodeCount;
|
190
|
+
infoRes.testCases = ttestCount;
|
191
|
+
infoRes.totalCodeLines = scodeCount + codeCount + tcodeCount;
|
192
|
+
|
193
|
+
if (fs.existsSync(`${adaptdir}/pronghorn.json`)) {
|
194
|
+
// Read the entity schema from the file system
|
195
|
+
const phFile = path.join(adaptdir, '/pronghorn.json');
|
196
|
+
const prong = require(phFile);
|
197
|
+
infoRes.wfTasks = prong.methods.length;
|
198
|
+
} else {
|
199
|
+
console.log('Missing - pronghorn.json');
|
200
|
+
}
|
201
|
+
|
202
|
+
console.log(JSON.stringify(infoRes));
|
203
|
+
fs.writeFileSync(`${adaptdir}/report/adapterInfo.json`, JSON.stringify(infoRes, null, 2));
|
204
|
+
}
|
205
|
+
|
206
|
+
adapterInfo();
|
package/utils/entitiesToDB.js
CHANGED
@@ -14,10 +14,8 @@
|
|
14
14
|
*/
|
15
15
|
|
16
16
|
const fs = require('fs');
|
17
|
-
const { MongoClient } = require('mongodb');
|
18
17
|
const path = require('path');
|
19
|
-
|
20
|
-
// const { string } = require('yargs');
|
18
|
+
const utils = require('./tbUtils');
|
21
19
|
|
22
20
|
// get the pronghorn database information
|
23
21
|
const getPronghornProps = async (iapDir) => {
|
@@ -99,7 +97,7 @@ const optionsHandler = (options) => {
|
|
99
97
|
/**
|
100
98
|
* Function used to put the adapter configuration into the provided database
|
101
99
|
*/
|
102
|
-
const moveEntitiesToDB = (targetPath, options) => {
|
100
|
+
const moveEntitiesToDB = async (targetPath, options) => {
|
103
101
|
// set local variables
|
104
102
|
let myOpts = options;
|
105
103
|
let myPath = targetPath;
|
@@ -120,25 +118,7 @@ const moveEntitiesToDB = (targetPath, options) => {
|
|
120
118
|
}
|
121
119
|
|
122
120
|
// get the pronghorn database properties
|
123
|
-
optionsHandler(options).then((currentProps) => {
|
124
|
-
let mongoUrl;
|
125
|
-
let dbName;
|
126
|
-
|
127
|
-
// find the mongo properties so we can connect
|
128
|
-
if (currentProps.mongoProps) {
|
129
|
-
mongoUrl = currentProps.mongoProps.url;
|
130
|
-
dbName = currentProps.mongoProps.db;
|
131
|
-
} else if (currentProps.mongo) {
|
132
|
-
if (currentProps.mongo.url) {
|
133
|
-
mongoUrl = currentProps.mongo.url;
|
134
|
-
} else {
|
135
|
-
mongoUrl = `mongodb://${currentProps.mongo.host}:${currentProps.mongo.port}`;
|
136
|
-
}
|
137
|
-
dbName = currentProps.mongo.database;
|
138
|
-
} else {
|
139
|
-
throw new Error('Mongo properties are not specified in adapter preferences!');
|
140
|
-
}
|
141
|
-
|
121
|
+
return optionsHandler(options).then(async (currentProps) => {
|
142
122
|
// Check valid filepath provided
|
143
123
|
if (!myPath) {
|
144
124
|
// if no path use the current directory without the utils
|
@@ -184,41 +164,16 @@ const moveEntitiesToDB = (targetPath, options) => {
|
|
184
164
|
});
|
185
165
|
|
186
166
|
// Upload documents to db collection
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
collection.insertMany(docs, { checkKeys: false }, (error, res) => {
|
197
|
-
if (error) {
|
198
|
-
log.error(JSON.stringify(error));
|
199
|
-
throw error;
|
200
|
-
}
|
201
|
-
// log the insertion, close the database and return
|
202
|
-
log.debug(`Inserted ${docs.length} documents to ${dbName}.${myOpts.targetCollection} with response ${JSON.stringify(res)}`);
|
203
|
-
db.close();
|
204
|
-
return res;
|
205
|
-
});
|
206
|
-
});
|
167
|
+
const iapDir = utils.getIAPHome();
|
168
|
+
const db = await utils.connect(iapDir, currentProps).catch((err) => { console.error(err); throw err; });
|
169
|
+
if (!db) {
|
170
|
+
console.error('Error occured when connectiong to database', currentProps);
|
171
|
+
throw new Error('Database not found');
|
172
|
+
}
|
173
|
+
const collection = db.collection(myOpts.targetCollection);
|
174
|
+
const res = await collection.insertMany(docs, { checkKeys: false }).catch((err) => { console.error(err); throw err; });
|
175
|
+
return res;
|
207
176
|
});
|
208
177
|
};
|
209
178
|
|
210
|
-
// const args = process.argv.slice(2);
|
211
|
-
|
212
|
-
// throw new SyntaxError(args[0]);
|
213
|
-
|
214
|
-
// if (args.length === 0) {
|
215
|
-
// console.error('ERROR: target path not specified!');
|
216
|
-
// } else if (args[0] === 'help') {
|
217
|
-
// log.trace('node ./entitiesToDB <target path> <options object: {iapDir: string, pronghornProps: string, targetCollection: string}>');
|
218
|
-
// } else if (args.length === 1) {
|
219
|
-
// console.error('ERROR: IAP directory not specified');
|
220
|
-
// } else {
|
221
|
-
// moveEntitiesToDB(args[0], args[1]);
|
222
|
-
// }
|
223
|
-
|
224
179
|
module.exports = { moveEntitiesToDB };
|
package/utils/pre-commit.sh
CHANGED
@@ -17,6 +17,9 @@ printf "%b" "Running pre-commit hooks...\\n"
|
|
17
17
|
# verify testing script is stubbed and no credentials
|
18
18
|
node utils/testRunner.js -r
|
19
19
|
|
20
|
+
# update the adapter information file
|
21
|
+
node utils/adapterInfo.js
|
22
|
+
|
20
23
|
# security audit on the code
|
21
24
|
npm audit --registry=https://registry.npmjs.org --audit-level=moderate
|
22
25
|
|
package/utils/tbScript.js
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* eslint no-console
|
1
|
+
/* eslint-disable no-console */
|
2
2
|
/* eslint import/no-unresolved: warn */
|
3
3
|
/* eslint global-require: warn */
|
4
4
|
|
@@ -7,7 +7,6 @@
|
|
7
7
|
/* eslint import/no-extraneous-dependencies: warn */
|
8
8
|
/* eslint import/no-dynamic-require: warn */
|
9
9
|
|
10
|
-
const path = require('path');
|
11
10
|
const program = require('commander');
|
12
11
|
const rls = require('readline-sync');
|
13
12
|
const utils = require('./tbUtils');
|
@@ -19,32 +18,39 @@ const { addAuthInfo } = require('./addAuth');
|
|
19
18
|
|
20
19
|
const { troubleshoot, offline } = require('./troubleshootingAdapter');
|
21
20
|
|
22
|
-
const
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
console.
|
28
|
-
|
29
|
-
}
|
21
|
+
const executeInStandaloneMode = async (command) => {
|
22
|
+
console.info('\n> Executing the script outside of IAP installation directory');
|
23
|
+
console.info('> Using sampleProperties.json configuration');
|
24
|
+
switch (command) {
|
25
|
+
case 'install': {
|
26
|
+
console.error('Not currently in IAP directory - installation not possible');
|
27
|
+
break;
|
28
|
+
}
|
29
|
+
case 'connectivity': {
|
30
30
|
const { host } = sampleProperties.properties;
|
31
31
|
console.log(`perform networking diagnositics to ${host}`);
|
32
|
-
|
33
|
-
|
34
|
-
}
|
32
|
+
utils.runConnectivity(host);
|
33
|
+
break;
|
34
|
+
}
|
35
|
+
case 'healthcheck': {
|
35
36
|
const a = basicGet.getAdapterInstance({ properties: sampleProperties });
|
36
37
|
await utils.healthCheck(a);
|
37
|
-
|
38
|
-
} else if (command === 'basicget') {
|
39
|
-
await utils.runBasicGet();
|
40
|
-
process.exit(0);
|
38
|
+
break;
|
41
39
|
}
|
42
|
-
|
43
|
-
|
40
|
+
case 'basicget': {
|
41
|
+
utils.runBasicGet();
|
42
|
+
break;
|
43
|
+
}
|
44
|
+
default: {
|
45
|
+
if (rls.keyInYN('Troubleshooting without IAP?')) {
|
46
|
+
await offline();
|
47
|
+
}
|
44
48
|
}
|
45
|
-
process.exit(0);
|
46
49
|
}
|
50
|
+
process.exit(0);
|
51
|
+
};
|
47
52
|
|
53
|
+
const executeUnderIAPInstallationDirectory = async (command) => {
|
48
54
|
if (command === undefined) {
|
49
55
|
await troubleshoot({}, true, true);
|
50
56
|
} else if (command === 'install') {
|
@@ -79,6 +85,7 @@ const main = async (command) => {
|
|
79
85
|
process.exit(0);
|
80
86
|
}
|
81
87
|
} else {
|
88
|
+
const dirname = utils.getCurrentExecutionPath();
|
82
89
|
utils.verifyInstallationDir(dirname, name);
|
83
90
|
utils.runTest();
|
84
91
|
if (rls.keyInYN(`Do you want to install ${name} to IAP?`)) {
|
@@ -123,6 +130,14 @@ const main = async (command) => {
|
|
123
130
|
}
|
124
131
|
};
|
125
132
|
|
133
|
+
const main = async (command) => {
|
134
|
+
if (!utils.areWeUnderIAPinstallationDirectory()) {
|
135
|
+
executeInStandaloneMode(command); // configuration from sampleproperties.json
|
136
|
+
} else {
|
137
|
+
executeUnderIAPInstallationDirectory(command); // configuration from $IAP_HOME/properties.json
|
138
|
+
}
|
139
|
+
};
|
140
|
+
|
126
141
|
program
|
127
142
|
.command('connectivity')
|
128
143
|
.alias('c')
|