@itentialopensource/adapter-meraki 1.0.3 → 1.1.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/AUTH.md +14 -18
- package/CALLS.md +4264 -0
- package/CHANGELOG.md +16 -0
- package/CONTRIBUTING.md +1 -160
- package/ENHANCE.md +2 -2
- package/README.md +23 -18
- package/SYSTEMINFO.md +15 -2
- package/adapter.js +164 -335
- package/adapterBase.js +411 -920
- package/changelogs/changelog.md +198 -0
- package/metadata.json +61 -0
- package/package.json +24 -24
- package/pronghorn.json +470 -138
- package/propertiesSchema.json +358 -31
- package/refs?service=git-upload-pack +0 -0
- package/report/adapterInfo.json +8 -8
- package/report/updateReport1690417926405.json +119 -0
- package/sampleProperties.json +74 -27
- package/test/integration/adapterTestBasicGet.js +2 -4
- package/test/integration/adapterTestConnectivity.js +91 -42
- package/test/integration/adapterTestIntegration.js +130 -2
- package/test/unit/adapterBaseTestUnit.js +388 -313
- package/test/unit/adapterTestUnit.js +332 -112
- package/utils/adapterInfo.js +1 -1
- package/utils/addAuth.js +1 -1
- package/utils/artifactize.js +1 -1
- package/utils/checkMigrate.js +1 -1
- package/utils/entitiesToDB.js +2 -2
- package/utils/findPath.js +1 -1
- package/utils/methodDocumentor.js +225 -0
- package/utils/modify.js +13 -15
- package/utils/packModificationScript.js +1 -1
- package/utils/pre-commit.sh +2 -0
- package/utils/taskMover.js +309 -0
- package/utils/tbScript.js +89 -34
- package/utils/tbUtils.js +41 -21
- package/utils/testRunner.js +1 -1
- package/utils/troubleshootingAdapter.js +9 -6
- package/versions.json +0 -542
- package/workflows/README.md +0 -3
package/utils/tbScript.js
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
|
10
10
|
const program = require('commander');
|
11
11
|
const rls = require('readline-sync');
|
12
|
+
const prompts = require('prompts');
|
12
13
|
const utils = require('./tbUtils');
|
13
14
|
const basicGet = require('./basicGet');
|
14
15
|
const { name } = require('../package.json');
|
@@ -50,10 +51,81 @@ const executeInStandaloneMode = async (command) => {
|
|
50
51
|
process.exit(0);
|
51
52
|
};
|
52
53
|
|
54
|
+
const getAdapterInstanceConfig = async (command) => {
|
55
|
+
const instances = await utils.getAllAdapterInstances();
|
56
|
+
if (!instances || instances.length === 0) {
|
57
|
+
return console.log('None adapter instances found!');
|
58
|
+
}
|
59
|
+
|
60
|
+
let instance;
|
61
|
+
if (instances.length === 1) {
|
62
|
+
[instance] = instances;
|
63
|
+
} else {
|
64
|
+
const choices = instances.map((item) => ({ title: item.name }));
|
65
|
+
const menu = {
|
66
|
+
type: 'select',
|
67
|
+
name: 'index',
|
68
|
+
message: `Pick an adapter for ${command} check`,
|
69
|
+
choices
|
70
|
+
};
|
71
|
+
|
72
|
+
console.log('\n');
|
73
|
+
const selected = await prompts(menu);
|
74
|
+
console.log('\n');
|
75
|
+
instance = instances[selected.index];
|
76
|
+
}
|
77
|
+
|
78
|
+
if (!instance) {
|
79
|
+
console.error('No adapter instance selected');
|
80
|
+
return null;
|
81
|
+
}
|
82
|
+
|
83
|
+
const { serviceItem: adapterConfig } = await utils.getAdapterConfig(instance._id); /* eslint-disable-line no-underscore-dangle */
|
84
|
+
|
85
|
+
console.log('\nAdapter instance configuration =>');
|
86
|
+
console.log('======================================');
|
87
|
+
console.log(adapterConfig);
|
88
|
+
console.log('======================================');
|
89
|
+
|
90
|
+
return adapterConfig;
|
91
|
+
};
|
92
|
+
|
93
|
+
const executeCommandOnInstance = async (command) => {
|
94
|
+
const adapterConfig = await getAdapterInstanceConfig(command);
|
95
|
+
if (!adapterConfig) {
|
96
|
+
process.exit(0);
|
97
|
+
}
|
98
|
+
|
99
|
+
switch (command) {
|
100
|
+
case 'connectivity': {
|
101
|
+
const { host } = adapterConfig.properties.properties;
|
102
|
+
console.log(`perform networking diagnositics to ${host}`);
|
103
|
+
utils.runConnectivity(host, true);
|
104
|
+
break;
|
105
|
+
}
|
106
|
+
case 'healthcheck': {
|
107
|
+
const adapterInstance = basicGet.getAdapterInstance(adapterConfig);
|
108
|
+
await utils.healthCheck(adapterInstance);
|
109
|
+
break;
|
110
|
+
}
|
111
|
+
case 'basicget': {
|
112
|
+
utils.runBasicGet(true);
|
113
|
+
break;
|
114
|
+
}
|
115
|
+
case 'troubleshoot': {
|
116
|
+
const adapter = { properties: adapterConfig };
|
117
|
+
await troubleshoot({}, true, true, adapter);
|
118
|
+
break;
|
119
|
+
}
|
120
|
+
default: {
|
121
|
+
console.error(`Unknown command: ${command}`);
|
122
|
+
}
|
123
|
+
}
|
124
|
+
return process.exit(0);
|
125
|
+
};
|
126
|
+
|
53
127
|
const executeUnderIAPInstallationDirectory = async (command) => {
|
54
|
-
if (command ===
|
55
|
-
await troubleshoot({}, true, true);
|
56
|
-
} else if (command === 'install') {
|
128
|
+
if (command === 'install') {
|
57
129
|
const { database, serviceItem, pronghornProps } = await utils.getAdapterConfig();
|
58
130
|
const filter = { id: pronghornProps.id };
|
59
131
|
const profileItem = await database.collection(utils.IAP_PROFILES_COLLECTION).findOne(filter);
|
@@ -71,9 +143,7 @@ const executeUnderIAPInstallationDirectory = async (command) => {
|
|
71
143
|
const serviceIndex = profileItem.services.indexOf(serviceItem.name);
|
72
144
|
profileItem.services.splice(serviceIndex, 1);
|
73
145
|
const update = { $set: { services: profileItem.services } };
|
74
|
-
await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne(
|
75
|
-
{ id: pronghornProps.id }, update
|
76
|
-
);
|
146
|
+
await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne({ id: pronghornProps.id }, update);
|
77
147
|
console.log(`${serviceItem.name} removed from profileItem.services.`);
|
78
148
|
console.log(`Rerun the script to reinstall ${serviceItem.name}.`);
|
79
149
|
process.exit(0);
|
@@ -90,43 +160,20 @@ const executeUnderIAPInstallationDirectory = async (command) => {
|
|
90
160
|
utils.runTest();
|
91
161
|
if (rls.keyInYN(`Do you want to install ${name} to IAP?`)) {
|
92
162
|
console.log('Creating database entries...');
|
93
|
-
const adapter = utils.createAdapter(
|
94
|
-
pronghornProps, profileItem, sampleProperties, adapterPronghorn
|
95
|
-
);
|
96
|
-
|
163
|
+
const adapter = utils.createAdapter(pronghornProps, profileItem, sampleProperties, adapterPronghorn);
|
97
164
|
adapter.properties.properties = await addAuthInfo(adapter.properties.properties);
|
98
165
|
|
99
166
|
await database.collection(utils.SERVICE_CONFIGS_COLLECTION).insertOne(adapter);
|
100
167
|
profileItem.services.push(adapter.name);
|
101
168
|
const update = { $set: { services: profileItem.services } };
|
102
|
-
await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne(
|
103
|
-
{ id: pronghornProps.id }, update
|
104
|
-
);
|
169
|
+
await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne({ id: pronghornProps.id }, update);
|
105
170
|
console.log('Database entry creation complete.');
|
106
171
|
}
|
107
172
|
console.log('Exiting...');
|
108
173
|
process.exit(0);
|
109
174
|
}
|
110
|
-
} else if (['healthcheck', 'basicget', 'connectivity'].includes(command)) {
|
111
|
-
|
112
|
-
if (serviceItem) {
|
113
|
-
const adapter = serviceItem;
|
114
|
-
const a = basicGet.getAdapterInstance(adapter);
|
115
|
-
if (command === 'healthcheck') {
|
116
|
-
await utils.healthCheck(a);
|
117
|
-
process.exit(0);
|
118
|
-
} else if (command === 'basicget') {
|
119
|
-
await utils.runBasicGet(true);
|
120
|
-
} else if (command === 'connectivity') {
|
121
|
-
const { host } = adapter.properties.properties;
|
122
|
-
console.log(`perform networking diagnositics to ${host}`);
|
123
|
-
await utils.runConnectivity(host, true);
|
124
|
-
process.exit(0);
|
125
|
-
}
|
126
|
-
} else {
|
127
|
-
console.log(`${name} not installed. Run npm \`run install:adapter\` to install.`);
|
128
|
-
process.exit(0);
|
129
|
-
}
|
175
|
+
} else if (['healthcheck', 'basicget', 'connectivity', 'troubleshoot'].includes(command)) {
|
176
|
+
await executeCommandOnInstance(command);
|
130
177
|
}
|
131
178
|
};
|
132
179
|
|
@@ -170,13 +217,21 @@ program
|
|
170
217
|
main('basicget');
|
171
218
|
});
|
172
219
|
|
220
|
+
program
|
221
|
+
.command('troubleshoot')
|
222
|
+
.alias('tb')
|
223
|
+
.description('perfom troubleshooting')
|
224
|
+
.action(() => {
|
225
|
+
main('troubleshoot');
|
226
|
+
});
|
227
|
+
|
173
228
|
// Allow commander to parse `process.argv`
|
174
229
|
program.parse(process.argv);
|
175
230
|
|
176
231
|
if (process.argv.length < 3) {
|
177
232
|
main();
|
178
233
|
}
|
179
|
-
const allowedParams = ['install', 'healthcheck', 'basicget', 'connectivity'];
|
234
|
+
const allowedParams = ['install', 'healthcheck', 'basicget', 'connectivity', 'troubleshoot'];
|
180
235
|
if (process.argv.length === 3 && !allowedParams.includes(process.argv[2])) {
|
181
236
|
console.log(`unknown parameter ${process.argv[2]}`);
|
182
237
|
console.log('try `node troubleshootingAdapter.js -h` to see allowed parameters. Exiting...');
|
package/utils/tbUtils.js
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
/* eslint-disable no-console */
|
7
7
|
|
8
8
|
const path = require('path');
|
9
|
-
const fs = require('fs-extra');
|
10
9
|
const cp = require('child_process');
|
10
|
+
const fs = require('fs-extra');
|
11
11
|
|
12
12
|
module.exports = {
|
13
13
|
SERVICE_CONFIGS_COLLECTION: 'service_configs',
|
@@ -101,10 +101,8 @@ module.exports = {
|
|
101
101
|
*
|
102
102
|
* @function decryptProperties
|
103
103
|
*/
|
104
|
-
decryptProperties: (props, iapDir
|
105
|
-
const
|
106
|
-
const isEncrypted = props.pathProps.encrypted;
|
107
|
-
const PropertyEncryption = discovery.require(propertyEncryptionClassPath, isEncrypted);
|
104
|
+
decryptProperties: (props, iapDir) => {
|
105
|
+
const { PropertyEncryption } = require(path.join(iapDir, 'node_modules/@itential/itential-utils'));
|
108
106
|
const propertyEncryption = new PropertyEncryption({
|
109
107
|
algorithm: 'aes-256-ctr',
|
110
108
|
key: 'TG9uZ0Rpc3RhbmNlUnVubmVyUHJvbmdob3JuCg==',
|
@@ -160,8 +158,7 @@ module.exports = {
|
|
160
158
|
* @param {Object} healthcheck - {Object} healthcheck - ./entities/.system/action.json object
|
161
159
|
*/
|
162
160
|
getHealthCheckEndpoint: (healthcheck) => {
|
163
|
-
const endpoint = healthcheck.actions[1].entitypath.slice(21,
|
164
|
-
healthcheck.actions[1].entitypath.length - 8);
|
161
|
+
const endpoint = healthcheck.actions[1].entitypath.slice(21, healthcheck.actions[1].entitypath.length - 8);
|
165
162
|
return { healthCheckEndpoint: endpoint };
|
166
163
|
},
|
167
164
|
|
@@ -203,6 +200,7 @@ module.exports = {
|
|
203
200
|
try {
|
204
201
|
stdout = cp.execSync(cmd).toString();
|
205
202
|
} catch (error) {
|
203
|
+
console.log('execute command error', error.stdout.toString(), error.stderr.toString());
|
206
204
|
stdout = error.stdout.toString();
|
207
205
|
}
|
208
206
|
const output = this.getTestCount(stdout);
|
@@ -290,10 +288,12 @@ module.exports = {
|
|
290
288
|
*/
|
291
289
|
runConnectivity: function runConnectivity(host, scriptFlag) {
|
292
290
|
let testPath = 'test/integration/adapterTestConnectivity.js';
|
291
|
+
let executable = 'mocha';
|
293
292
|
if (!scriptFlag) {
|
294
293
|
testPath = path.resolve(__dirname, '..', testPath);
|
294
|
+
executable = path.join(__dirname, '..', 'node_modules/mocha/bin/mocha');
|
295
295
|
}
|
296
|
-
return this.systemSync(
|
296
|
+
return this.systemSync(`${executable} ${testPath} --HOST=${host} --timeout 10000 --exit`, !scriptFlag);
|
297
297
|
},
|
298
298
|
|
299
299
|
/**
|
@@ -340,28 +340,42 @@ module.exports = {
|
|
340
340
|
return adapter;
|
341
341
|
},
|
342
342
|
|
343
|
-
getPronghornProps: function getPronghornProps(
|
343
|
+
getPronghornProps: function getPronghornProps() {
|
344
|
+
const iapDir = this.getIAPHome();
|
344
345
|
console.log('Retrieving properties.json file...');
|
345
346
|
const rawProps = require(path.join(iapDir, 'properties.json'));
|
346
347
|
console.log('Decrypting properties...');
|
347
|
-
const
|
348
|
-
const discovery = new Discovery();
|
349
|
-
const pronghornProps = this.decryptProperties(rawProps, iapDir, discovery);
|
348
|
+
const pronghornProps = this.decryptProperties(rawProps, iapDir);
|
350
349
|
console.log('Found properties.\n');
|
351
350
|
return pronghornProps;
|
352
351
|
},
|
353
352
|
|
353
|
+
getAllAdapterInstances: async function getAllAdapterInstances() {
|
354
|
+
const database = await this.getIAPDatabaseConnection();
|
355
|
+
const { name } = require(path.join(__dirname, '..', 'package.json'));
|
356
|
+
const query = { model: name };
|
357
|
+
const options = { projection: { name: 1 } };
|
358
|
+
const adapterInstancesNames = await database.collection(this.SERVICE_CONFIGS_COLLECTION).find(
|
359
|
+
query,
|
360
|
+
options
|
361
|
+
).toArray();
|
362
|
+
return adapterInstancesNames;
|
363
|
+
},
|
364
|
+
|
354
365
|
// get database connection and existing adapter config
|
355
|
-
getAdapterConfig: async function getAdapterConfig() {
|
356
|
-
const
|
357
|
-
const pronghornProps = this.getPronghornProps(iapDir);
|
358
|
-
console.log('Connecting to Database...');
|
359
|
-
const database = await this.connect(iapDir, pronghornProps);
|
360
|
-
console.log('Connection established.');
|
366
|
+
getAdapterConfig: async function getAdapterConfig(adapterId) {
|
367
|
+
const database = await this.getIAPDatabaseConnection();
|
361
368
|
const { name } = require(path.join(__dirname, '..', 'package.json'));
|
369
|
+
let query = {};
|
370
|
+
if (!adapterId) {
|
371
|
+
query = { model: name };
|
372
|
+
} else {
|
373
|
+
query = { _id: adapterId };
|
374
|
+
}
|
362
375
|
const serviceItem = await database.collection(this.SERVICE_CONFIGS_COLLECTION).findOne(
|
363
|
-
|
376
|
+
query
|
364
377
|
);
|
378
|
+
const pronghornProps = await this.getPronghornProps();
|
365
379
|
return { database, serviceItem, pronghornProps };
|
366
380
|
},
|
367
381
|
|
@@ -438,13 +452,19 @@ module.exports = {
|
|
438
452
|
return path.join(this.getCurrentExecutionPath(), '../../..') === this.getIAPHome();
|
439
453
|
},
|
440
454
|
|
455
|
+
getIAPDatabaseConnection: async function getIAPDatabaseConnection() {
|
456
|
+
const pronghornProps = await this.getPronghornProps();
|
457
|
+
const database = await this.connect(pronghornProps);
|
458
|
+
return database;
|
459
|
+
},
|
460
|
+
|
441
461
|
/**
|
442
462
|
* @summary connect to mongodb
|
443
463
|
*
|
444
464
|
* @function connect
|
445
465
|
* @param {Object} properties - pronghornProps
|
446
466
|
*/
|
447
|
-
connect: async function connect(
|
467
|
+
connect: async function connect(properties) {
|
448
468
|
let dbConnectionProperties = {};
|
449
469
|
if (properties.mongoProps) {
|
450
470
|
dbConnectionProperties = properties.mongoProps;
|
@@ -459,7 +479,7 @@ module.exports = {
|
|
459
479
|
if (!dbConnectionProperties.url || !dbConnectionProperties.db) {
|
460
480
|
throw new Error('Mongo properties are not specified in IAP configuration!');
|
461
481
|
}
|
462
|
-
|
482
|
+
const iapDir = this.getIAPHome();
|
463
483
|
const { MongoDBConnection } = require(path.join(iapDir, 'node_modules/@itential/database'));
|
464
484
|
const connection = new MongoDBConnection(dbConnectionProperties);
|
465
485
|
const database = await connection.connect(true);
|
package/utils/testRunner.js
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env node
|
2
2
|
/* @copyright Itential, LLC 2019 */
|
3
3
|
|
4
|
+
const execute = require('child_process').exec;
|
4
5
|
const fs = require('fs-extra');
|
5
6
|
const rl = require('readline-sync');
|
6
|
-
const execute = require('child_process').exec;
|
7
7
|
|
8
8
|
/**
|
9
9
|
* This script will determine the type of integration test to run
|
@@ -134,9 +134,13 @@ const offline = async () => {
|
|
134
134
|
};
|
135
135
|
|
136
136
|
const troubleshoot = async (props, scriptFlag, persistFlag, adapter) => {
|
137
|
-
|
138
|
-
|
139
|
-
|
137
|
+
let serviceItem;
|
138
|
+
if (adapter && adapter.allProps) {
|
139
|
+
serviceItem = { properties: { properties: adapter.allProps } };
|
140
|
+
}
|
141
|
+
if (adapter && adapter.properties && adapter.properties.properties) {
|
142
|
+
serviceItem = adapter.properties;
|
143
|
+
}
|
140
144
|
if (serviceItem) {
|
141
145
|
if (!scriptFlag || rls.keyInYN(`Start verifying the connection and authentication properties for ${name}?`)) {
|
142
146
|
const { result, updatedAdapter } = VerifyHealthCheckEndpoint(serviceItem, props, scriptFlag);
|
@@ -154,10 +158,9 @@ const troubleshoot = async (props, scriptFlag, persistFlag, adapter) => {
|
|
154
158
|
}
|
155
159
|
|
156
160
|
if (persistFlag && healthRes) {
|
161
|
+
const { database } = await utils.getIAPDatabaseConnection();
|
157
162
|
const update = { $set: { properties: updatedAdapter.properties } };
|
158
|
-
await database.collection(utils.SERVICE_CONFIGS_COLLECTION).updateOne(
|
159
|
-
{ model: name }, update
|
160
|
-
);
|
163
|
+
await database.collection(utils.SERVICE_CONFIGS_COLLECTION).updateOne({ model: name }, update);
|
161
164
|
if (scriptFlag) {
|
162
165
|
console.log(`${name} updated.`);
|
163
166
|
}
|