@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.
Files changed (40) hide show
  1. package/AUTH.md +14 -18
  2. package/CALLS.md +4264 -0
  3. package/CHANGELOG.md +16 -0
  4. package/CONTRIBUTING.md +1 -160
  5. package/ENHANCE.md +2 -2
  6. package/README.md +23 -18
  7. package/SYSTEMINFO.md +15 -2
  8. package/adapter.js +164 -335
  9. package/adapterBase.js +411 -920
  10. package/changelogs/changelog.md +198 -0
  11. package/metadata.json +61 -0
  12. package/package.json +24 -24
  13. package/pronghorn.json +470 -138
  14. package/propertiesSchema.json +358 -31
  15. package/refs?service=git-upload-pack +0 -0
  16. package/report/adapterInfo.json +8 -8
  17. package/report/updateReport1690417926405.json +119 -0
  18. package/sampleProperties.json +74 -27
  19. package/test/integration/adapterTestBasicGet.js +2 -4
  20. package/test/integration/adapterTestConnectivity.js +91 -42
  21. package/test/integration/adapterTestIntegration.js +130 -2
  22. package/test/unit/adapterBaseTestUnit.js +388 -313
  23. package/test/unit/adapterTestUnit.js +332 -112
  24. package/utils/adapterInfo.js +1 -1
  25. package/utils/addAuth.js +1 -1
  26. package/utils/artifactize.js +1 -1
  27. package/utils/checkMigrate.js +1 -1
  28. package/utils/entitiesToDB.js +2 -2
  29. package/utils/findPath.js +1 -1
  30. package/utils/methodDocumentor.js +225 -0
  31. package/utils/modify.js +13 -15
  32. package/utils/packModificationScript.js +1 -1
  33. package/utils/pre-commit.sh +2 -0
  34. package/utils/taskMover.js +309 -0
  35. package/utils/tbScript.js +89 -34
  36. package/utils/tbUtils.js +41 -21
  37. package/utils/testRunner.js +1 -1
  38. package/utils/troubleshootingAdapter.js +9 -6
  39. package/versions.json +0 -542
  40. 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 === undefined) {
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
- const { serviceItem } = await utils.getAdapterConfig();
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, discovery) => {
105
- const propertyEncryptionClassPath = path.join(iapDir, 'node_modules/@itential/pronghorn-core/core/PropertyEncryption.js');
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(`mocha ${testPath} --HOST=${host} --timeout 10000 --exit`, !scriptFlag);
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(iapDir) {
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 { Discovery } = require(path.join(iapDir, 'node_modules/@itential/itential-utils'));
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 iapDir = this.getIAPHome();
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
- { model: name }
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(iapDir, properties) {
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);
@@ -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
- // get database connection and existing adapter config
138
- const { database, serviceItem } = await utils.getAdapterConfig();
139
- // where troubleshoot should start
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
  }