@itentialopensource/adapter-meraki 1.0.3 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|