@itentialopensource/adapter-microsoft_graph 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. package/.eslintignore +0 -1
  2. package/.jshintrc +3 -0
  3. package/AUTH.md +20 -16
  4. package/CALLS.md +63 -28
  5. package/CHANGELOG.md +8 -0
  6. package/CONTRIBUTING.md +1 -160
  7. package/ENHANCE.md +2 -2
  8. package/README.md +31 -22
  9. package/SUMMARY.md +2 -2
  10. package/SYSTEMINFO.md +15 -5
  11. package/adapter.js +159 -330
  12. package/adapterBase.js +538 -873
  13. package/changelogs/changelog.md +6 -0
  14. package/metadata.json +52 -0
  15. package/package.json +22 -25
  16. package/pronghorn.json +475 -143
  17. package/propertiesSchema.json +444 -40
  18. package/refs?service=git-upload-pack +0 -0
  19. package/report/adapter-openapi.json +14709 -0
  20. package/report/adapter-openapi.yaml +9744 -0
  21. package/report/adapterInfo.json +8 -8
  22. package/report/updateReport1691507370664.json +120 -0
  23. package/report/updateReport1692202407231.json +120 -0
  24. package/report/updateReport1694460353234.json +120 -0
  25. package/report/updateReport1695667793473.json +120 -0
  26. package/sampleProperties.json +63 -2
  27. package/test/integration/adapterTestBasicGet.js +1 -1
  28. package/test/integration/adapterTestConnectivity.js +91 -42
  29. package/test/integration/adapterTestIntegration.js +130 -2
  30. package/test/unit/adapterBaseTestUnit.js +395 -292
  31. package/test/unit/adapterTestUnit.js +306 -109
  32. package/utils/adapterInfo.js +1 -1
  33. package/utils/addAuth.js +1 -1
  34. package/utils/artifactize.js +1 -1
  35. package/utils/checkMigrate.js +1 -1
  36. package/utils/entitiesToDB.js +1 -0
  37. package/utils/findPath.js +1 -1
  38. package/utils/methodDocumentor.js +57 -22
  39. package/utils/modify.js +13 -15
  40. package/utils/packModificationScript.js +1 -1
  41. package/utils/taskMover.js +309 -0
  42. package/utils/tbScript.js +3 -10
  43. package/utils/tbUtils.js +2 -3
  44. package/utils/testRunner.js +1 -1
  45. package/utils/troubleshootingAdapter.js +1 -3
  46. package/workflows/README.md +0 -3
@@ -3,7 +3,7 @@
3
3
  /* eslint no-param-reassign:warn */
4
4
 
5
5
  const fs = require('fs-extra');
6
- const esprima = require('esprima');
6
+ const acorn = require('acorn');
7
7
 
8
8
  // Getting the base directory:
9
9
  let adaptdir = __dirname;
@@ -44,18 +44,38 @@ function getPathFromEntity(entity, funcName) {
44
44
  const actionJSON = require(entityPath);
45
45
  actionJSON.actions.forEach((action) => {
46
46
  if (action.name === funcName) {
47
- epath = action.entitypath;
47
+ if (typeof action.entitypath === 'object') {
48
+ epath = '';
49
+ const keys = Object.keys(action.entitypath);
50
+ for (let k = 0; k < keys.length; k += 1) {
51
+ epath += `${keys[k]}:${action.entitypath[keys[k]]} <br /> `;
52
+ }
53
+ epath = epath.substring(0, epath.length - 8);
54
+ } else {
55
+ epath = action.entitypath;
56
+ }
48
57
  }
49
58
  });
50
59
  }
51
60
  return epath;
52
61
  }
53
62
 
63
+ function recurseCallExpressions(statement, callList) {
64
+ // Recursively finds all CallExpressions in the syntax tree
65
+ if (statement.type === 'CallExpression') callList.push(statement);
66
+ const keys = Object.keys(statement);
67
+ for (let k = 0; k < keys.length; k += 1) {
68
+ if (typeof statement[keys[k]] === 'object' && statement[keys[k]] !== null) {
69
+ recurseCallExpressions(statement[keys[k]], callList);
70
+ }
71
+ }
72
+ }
73
+
54
74
  function readFileUsingLib(filename, descriptionObj, workflowObj, functionList) {
55
75
  // read the file
56
76
  const aFile = fs.readFileSync(filename, 'utf8');
57
77
  // parsing the file to get the function and class declarations.
58
- const aFileFuncArgs = esprima.parseScript(aFile);
78
+ const aFileFuncArgs = acorn.parse(aFile, { ecmaVersion: 2020 });
59
79
 
60
80
  // Looping through all the declarations parsed:
61
81
  aFileFuncArgs.body.forEach((e) => {
@@ -76,25 +96,40 @@ function readFileUsingLib(filename, descriptionObj, workflowObj, functionList) {
76
96
  });
77
97
 
78
98
  // Getting the entity for the method:
79
- let entity;
80
- method.value.body.body.forEach((statementType) => {
81
- if (statementType.type === 'TryStatement') {
82
- entity = statementType.block.body[0].argument.arguments[0].value;
83
- }
99
+ const callList = [];
100
+ method.value.body.body.forEach((statement) => {
101
+ recurseCallExpressions(statement, callList);
84
102
  });
85
- const entityPath = getPathFromEntity(entity, funcName);
86
-
87
- // Creating and storing the object for the method.
88
- if (entityPath !== undefined) {
89
- functionList.push(
90
- createObjectForFunction(
91
- funcName,
92
- funcArgs,
93
- entityPath,
94
- descriptionObj[funcName],
95
- workflowObj[funcName]
96
- )
97
- );
103
+ const requests = [];
104
+ for (let i = 0; i < callList.length; i += 1) {
105
+ if (callList[i].callee.property && callList[i].callee.property.name === 'identifyRequest') {
106
+ requests.push(callList[i]);
107
+ }
108
+ }
109
+ if (requests.length > 0) {
110
+ const expr = requests[0];
111
+ if (expr.arguments.length < 2) {
112
+ throw new Error(`Bad inputs in method ${funcName}`);
113
+ }
114
+ const entity = expr.arguments[0].value;
115
+ const actionName = expr.arguments[1].value;
116
+ if (expr !== undefined && (expr.arguments[0].type !== 'Literal' || expr.arguments[1].type !== 'Literal')) {
117
+ throw new Error(`Bad inputs in method ${funcName}`);
118
+ }
119
+ const entityPath = getPathFromEntity(entity, actionName);
120
+
121
+ // Creating and storing the object for the method.
122
+ if (entityPath !== undefined) {
123
+ functionList.push(
124
+ createObjectForFunction(
125
+ funcName,
126
+ funcArgs,
127
+ entityPath,
128
+ descriptionObj[funcName],
129
+ workflowObj[funcName]
130
+ )
131
+ );
132
+ }
98
133
  }
99
134
  });
100
135
  }
@@ -109,7 +144,7 @@ function readJSONFile(filename, descriptionObj, workflowObj) {
109
144
  methodArray.forEach((methodName) => {
110
145
  // Getting the method description and workflow:
111
146
  const funcName = methodName.name;
112
- descriptionObj[funcName] = methodName.description;
147
+ descriptionObj[funcName] = methodName.summary ? methodName.summary : methodName.description;
113
148
  workflowObj[funcName] = methodName.task ? 'Yes' : 'No';
114
149
  });
115
150
  }
package/utils/modify.js CHANGED
@@ -1,7 +1,7 @@
1
+ const { execSync } = require('child_process');
1
2
  const fs = require('fs-extra');
2
3
  const Ajv = require('ajv');
3
4
  const rls = require('readline-sync');
4
- const { execSync } = require('child_process');
5
5
  const { existsSync } = require('fs-extra');
6
6
  const { getAdapterConfig } = require('./tbUtils');
7
7
  const { name } = require('../package.json');
@@ -21,9 +21,7 @@ async function updateServiceItem() {
21
21
  const validate = ajv.compile(propertiesSchema);
22
22
  validate(currentProps);
23
23
  console.log('Updating Properties...');
24
- await database.collection('service_configs').updateOne(
25
- { model: name }, { $set: serviceItem }
26
- );
24
+ await database.collection('service_configs').updateOne({ model: name }, { $set: serviceItem });
27
25
  console.log('Properties Updated');
28
26
  }
29
27
 
@@ -35,7 +33,7 @@ async function updateServiceItem() {
35
33
  function backup() {
36
34
  // zip all files except node_modules and package-lock
37
35
  const backupCmd = 'zip -r previousVersion.zip .';
38
- execSync(backupCmd, { encoding: 'utf-8' });
36
+ execSync(backupCmd, { encoding: 'utf-8', maxBuffer: 1024 * 1024 * 2 });
39
37
  }
40
38
 
41
39
  /**
@@ -53,9 +51,9 @@ function archiveMod(modType) {
53
51
  const archiveName = `${modType}-${now.toISOString()}`;
54
52
  execSync(`mkdir adapter_modifications/archive/${archiveName}`);
55
53
  const archiveCmd = 'mv adapter_modifications/archive .'
56
- + ` && mv adapter_modifications/* archive/${archiveName}`
57
- + ' && mv archive adapter_modifications'
58
- + ` && rm ${zipFile}`;
54
+ + ` && mv adapter_modifications/* archive/${archiveName}`
55
+ + ' && mv archive adapter_modifications'
56
+ + ` && rm ${zipFile}`;
59
57
  execSync(archiveCmd, { encoding: 'utf-8' });
60
58
  }
61
59
 
@@ -73,7 +71,7 @@ function revertMod() {
73
71
  }
74
72
  });
75
73
  // // unzip previousVersion, reinstall dependencies and delete zipfile
76
- execSync('unzip -o previousVersion.zip && rm -rf node_modules && rm package-lock.json && npm install');
74
+ execSync('unzip -o previousVersion.zip && rm -rf node_modules && rm package-lock.json && npm install', { maxBuffer: 1024 * 1024 * 2 });
77
75
  execSync('rm previousVersion.zip');
78
76
  console.log('Changes have been reverted');
79
77
  }
@@ -90,12 +88,12 @@ if (flags === '-m') {
90
88
  backup();
91
89
  console.log('Migrating adapter and running tests...');
92
90
  const migrateCmd = 'unzip -o migrationPackage.zip'
93
- + ' && cd adapter_modifications'
94
- + ' && node migrate';
91
+ + ' && cd adapter_modifications'
92
+ + ' && node migrate';
95
93
  const migrateOutput = execSync(migrateCmd, { encoding: 'utf-8' });
96
94
  console.log(migrateOutput);
97
95
  if (migrateOutput.indexOf('Lint exited with code 1') >= 0
98
- || migrateOutput.indexOf('Tests exited with code 1') >= 0) {
96
+ || migrateOutput.indexOf('Tests exited with code 1') >= 0) {
99
97
  if (rls.keyInYN('Adapter failed tests or lint after migrating. Would you like to revert the changes?')) {
100
98
  console.log('Reverting changes...');
101
99
  revertMod();
@@ -125,12 +123,12 @@ if (flags === '-u') {
125
123
  // Backup current adapter
126
124
  backup();
127
125
  const updateCmd = 'unzip -o updatePackage.zip'
128
- + ' && cd adapter_modifications'
129
- + ' && node update.js updateFiles';
126
+ + ' && cd adapter_modifications'
127
+ + ' && node update.js updateFiles';
130
128
  execSync(updateCmd, { encoding: 'utf-8' });
131
129
  const updateOutput = execSync(updateCmd, { encoding: 'utf-8' });
132
130
  if (updateOutput.indexOf('Lint exited with code 1') >= 0
133
- || updateOutput.indexOf('Tests exited with code 1') >= 0) {
131
+ || updateOutput.indexOf('Tests exited with code 1') >= 0) {
134
132
  if (rls.keyInYN('Adapter failed tests or lint after updating. Would you like to revert the changes?')) {
135
133
  console.log('Reverting changes...');
136
134
  revertMod();
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  /* @copyright Itential, LLC 2019 */
3
3
 
4
- const fs = require('fs-extra');
5
4
  const path = require('path');
6
5
  const { spawnSync } = require('child_process');
6
+ const fs = require('fs-extra');
7
7
  const { createBundle } = require('./artifactize');
8
8
 
9
9
  const nodeEntryPath = path.resolve('.');
@@ -0,0 +1,309 @@
1
+ /* eslint-disable */
2
+ const fs = require('fs');
3
+
4
+ const blacklistTasks = [
5
+ 'genericAdapterRequest',
6
+ 'genericAdapterRequestNoBasePath',
7
+ 'hasEntities',
8
+ 'healthcheck'
9
+ ];
10
+
11
+ const adapterBaseTasks = [
12
+ 'getDevicesFiltered',
13
+ 'isAlive',
14
+ 'getConfig',
15
+ 'getDevice',
16
+ 'iapUpdateAdapterConfiguration',
17
+ 'iapFindAdapterPath',
18
+ 'iapSuspendAdapter',
19
+ 'iapUnsuspendAdapter',
20
+ 'iapGetAdapterQueue',
21
+ 'iapTroubleshootAdapter',
22
+ 'iapRunAdapterHealthcheck',
23
+ 'iapRunAdapterConnectivity',
24
+ 'iapRunAdapterBasicGet',
25
+ 'iapMoveAdapterEntitiesToDB',
26
+ 'getDevice',
27
+ 'getDevicesFiltered',
28
+ 'isAlive',
29
+ 'getConfig',
30
+ 'iapGetDeviceCount',
31
+ 'iapRunAdapterLint',
32
+ 'iapRunAdapterTests',
33
+ 'iapGetAdapterInventory'
34
+ ];
35
+
36
+ function updatePronghorn(tasks, original, updated) {
37
+ const originalFile = require(original);
38
+ const unusedMethods = [];
39
+ const usedMethods = originalFile.methods.filter((method) => {
40
+ if (tasks.includes(method.name)) {
41
+ unusedMethods.push(method);
42
+ return false;
43
+ }
44
+ return true;
45
+ });
46
+ //write used and unused to new files
47
+ let updatedFile;
48
+ if (!fs.existsSync(updated)) {
49
+ updatedFile = { ...originalFile, methods: [], src: 'adapter-inactive.js' };
50
+ } else {
51
+ updatedFile = require(updated);
52
+ }
53
+ updatedFile.methods = updatedFile.methods.concat(unusedMethods);
54
+ originalFile.methods = usedMethods;
55
+ fs.writeFileSync(updated, JSON.stringify(updatedFile, null, 2));
56
+ fs.writeFileSync(original, JSON.stringify(originalFile, null, 2));
57
+ return 'Done';
58
+ }
59
+
60
+ function flipTaskFlag(task, pronghornPath, value)
61
+ {
62
+ const pronghorn = require(pronghornPath);
63
+ const index = pronghorn.methods.findIndex((method) => method.name === task);
64
+ pronghorn.methods[index] = { ...pronghorn.methods[index], task: value };
65
+ fs.writeFileSync(pronghornPath, JSON.stringify(pronghorn, null, 2));
66
+ }
67
+
68
+ //Return array of relevant paths given adapter directory
69
+ function createPaths(currentAdapter) {
70
+ const paths = [];
71
+ const filePaths = [
72
+ 'adapter.js',
73
+ 'pronghorn.json',
74
+ 'test/integration/adapterTestIntegration.js',
75
+ 'test/unit/adapterTestUnit.js',
76
+ 'adapter-inactive.js',
77
+ 'pronghorn-inactive.json',
78
+ ];
79
+ filePaths.forEach((file) => {
80
+ paths.push(`${currentAdapter}/${file}`);
81
+ });
82
+ return paths;
83
+ }
84
+
85
+ function insert(str, index, value) {
86
+ return str.substr(0, index) + value + str.substr(index);
87
+ }
88
+
89
+ //modify adapter js
90
+ //original - path to file containing tasks we want to remove
91
+ // updated - path to file we want to move the tasks to
92
+ function updateAdapterJs(tasks, original, updated, adapterDir) {
93
+ if (!fs.existsSync(original)) {
94
+ //could do this or just let the error ocurr lower down and catch in warpper
95
+ throw new Error(`Original file ${original} does not exist.`);
96
+ }
97
+ let originalFile = fs.readFileSync(original, 'utf8');
98
+ let updatedFile;
99
+ if (!fs.existsSync(updated)) {
100
+ const adapterExport = require(`${adapterDir}/pronghorn.json`).export;
101
+ updatedFile = `/* @copyright Itential, LLC 2019 */\n\n/* eslint import/no-dynamic-require: warn */\n/* eslint no-unused-vars: warn */\n/* global log */\n\nconst path = require('path');\n\nconst AdapterBaseCl = require(path.join(__dirname, 'adapterBase.js'));\n\nclass ${adapterExport}Inactive extends AdapterBaseCl {}\n`;
102
+ //To do handles backup files where og doesn't exist
103
+ } else {
104
+ updatedFile = fs.readFileSync(updated, 'utf8');
105
+ }
106
+
107
+ tasks.forEach((method) => {
108
+ //accounting for different js docs format
109
+ const comment = originalFile.indexOf(`* @function ${method}`);
110
+ const start = originalFile.slice(0, comment).lastIndexOf('/**');
111
+ if (start !== -1) {
112
+ //next comment block
113
+ const end = originalFile.indexOf('/**\n', start + 1);
114
+ let func = end === -1
115
+ ? originalFile.substring(start - 3, originalFile.lastIndexOf('}'))
116
+ : originalFile.substring(start, end);
117
+ originalFile = originalFile.replace(func, '');
118
+ func = '\n ' + func.trim() + '\n';
119
+ updatedFile = insert(updatedFile, updatedFile.lastIndexOf('}'), func);
120
+ } else {
121
+ console.log(`Task ${method} wasn't found in original file. Skipping.`);
122
+ }
123
+ });
124
+ fs.writeFileSync(original, originalFile, 'utf8');
125
+ fs.writeFileSync(updated, updatedFile, 'utf8');
126
+ return 'done';
127
+ }
128
+
129
+ //Update test file for when we deactivate a task
130
+ function deactivateTest(adapterPath, testPath, tasks) {
131
+ let unitTest = fs.readFileSync(`${adapterPath}/${testPath}`, 'utf8');
132
+ tasks.forEach((task) => {
133
+ const searchStr = `describe('#${task}`;
134
+ unitTest = unitTest.replace(searchStr, `describe.skip('#${task}`);
135
+ });
136
+ fs.writeFileSync(`${adapterPath}/${testPath}`, unitTest, 'utf8');
137
+ }
138
+
139
+ //Update test file when we activate tasks
140
+ function activateTest(adapterPath, testPath, tasks) {
141
+ let unitTest = fs.readFileSync(`${adapterPath}/${testPath}`, 'utf8');
142
+ //tasks ==> toMove
143
+ tasks.forEach((task) => {
144
+ const searchStr = `describe.skip('#${task}`;
145
+ unitTest = unitTest.replace(searchStr, `describe('#${task}`);
146
+ });
147
+ fs.writeFileSync(`${adapterPath}/${testPath}`, unitTest, 'utf8');
148
+ }
149
+
150
+ //backups are not actually being written back
151
+ function rollbackChanges(adapterPath) {
152
+ const backups = fs.readdirSync(`${adapterPath}/temp`); //this is an array of file names not the full path
153
+ const filePaths = createPaths(adapterPath);
154
+ for (let i = 0; i < backups.length; i++) {
155
+ const file = fs.readFileSync(`${adapterPath}/temp/${backups[i]}`, 'utf8'); //make sure this is getting the file
156
+ const currentFile = filePaths.find((path) => {
157
+ const index = path.split('/').length - 1;
158
+ const fileName = path.split('/')[index];
159
+ return fileName === backups[i].replace('temp-', '');
160
+ }); //returns undefined if no match
161
+
162
+ if (currentFile) {
163
+ fs.writeFileSync(currentFile, file, 'utf8');
164
+ }
165
+ }
166
+ //inactive didn't exist before script
167
+ if (!backups.includes('temp-adapter-inactive.js')) {
168
+ fs.unlinkSync(`${adapterPath}/pronghorn-inactive.json`);
169
+ fs.unlinkSync(`${adapterPath}/adapter-inactive.js`);
170
+ }
171
+ deleteBackups(adapterPath);
172
+ }
173
+
174
+ function deleteBackups(adapterPath) {
175
+ fs.rmSync(`${adapterPath}/temp`, { recursive: true });
176
+ }
177
+
178
+ function activateTasks(adapterDir, tasks) {
179
+ const toDelete = [];
180
+ const backupFiles = [];
181
+ const filePaths = createPaths(adapterDir);
182
+ try {
183
+ //take backup of each file here
184
+ if (!fs.existsSync(`${adapterDir}/temp`)) {
185
+ fs.mkdirSync(`${adapterDir}/temp`);
186
+ }
187
+ filePaths.forEach((filePath) => {
188
+ if (fs.existsSync(filePath)) {
189
+ const index = filePath.split('/').length - 1;
190
+ const backupName = `temp-${filePath.split('/')[index]}`;
191
+ backupFiles.push(`${adapterDir}/temp/${backupName}`);
192
+ fs.copyFileSync(filePath, `${adapterDir}/temp/${backupName}`);
193
+ } else {
194
+ //File doesn't exist before script
195
+ toDelete.push(filePath);
196
+ }
197
+ });
198
+ tasks = tasks.filter((task) => {
199
+ if (adapterBaseTasks.includes(task)) {
200
+ flipTaskFlag(task, `${adapterDir}/pronghorn.json`, true);
201
+ return false;
202
+ } else {
203
+ return true;
204
+ }
205
+ });
206
+ updateAdapterJs(
207
+ tasks,
208
+ `${adapterDir}/adapter-inactive.js`,
209
+ `${adapterDir}/adapter.js`,
210
+ adapterDir
211
+ );
212
+ updatePronghorn(
213
+ tasks,
214
+ `${adapterDir}/pronghorn-inactive.json`,
215
+ `${adapterDir}/pronghorn.json`
216
+ );
217
+ activateTest(
218
+ adapterDir,
219
+ '/test/integration/adapterTestIntegration.js',
220
+ tasks
221
+ );
222
+ activateTest(adapterDir, '/test/unit/adapterTestUnit.js', tasks);
223
+ return 'success';
224
+ } catch (e) {
225
+ console.log(`Error: ${e} ocurred during execution. Rolling back changes.`);
226
+ for (let i = 0; i < backupFiles.length; i++) {
227
+ const file = fs.readFileSync(backupFiles[i], 'utf8');
228
+ fs.writeFileSync(filePaths[i], file, 'utf8');
229
+ }
230
+ toDelete.forEach((filePath) => {
231
+ if (fs.existsSync(filePath)) {
232
+ fs.unlinkSync(filePath);
233
+ }
234
+ });
235
+ deleteBackups(adapterDir);
236
+ process.exit(1);
237
+ }
238
+ }
239
+
240
+ //moving from adapter.js to adapter-inactive.js
241
+ function deactivateTasks(adapterDir, tasks) {
242
+ const toDelete = [];
243
+ const backupFiles = [];
244
+ const filePaths = createPaths(adapterDir);
245
+ try {
246
+ //take backup of each file here
247
+ if (!fs.existsSync(`${adapterDir}/temp`)) {
248
+ fs.mkdirSync(`${adapterDir}/temp`);
249
+ }
250
+ filePaths.forEach((filePath) => {
251
+ if (fs.existsSync(filePath)) {
252
+ const index = filePath.split('/').length - 1;
253
+ const backupName = `temp-${filePath.split('/')[index]}`;
254
+ backupFiles.push(`${adapterDir}/temp/${backupName}`);
255
+ fs.copyFileSync(filePath, `${adapterDir}/temp/${backupName}`);
256
+ } else {
257
+ //File doesn't exist before script
258
+ toDelete.push(filePath);
259
+ }
260
+ });
261
+ //filter tasks for blacklisted tasks or IAP tasks
262
+ tasks = tasks.filter((task) => {
263
+ if (blacklistTasks.includes(task)) {
264
+ console.log(`${task} cannot be deactivated.`);
265
+ return false;
266
+ } else if (adapterBaseTasks.includes(task)) {
267
+ flipTaskFlag(task, `${adapterDir}/pronghorn.json`, false);
268
+ return false;
269
+ } else {
270
+ return true;
271
+ }
272
+ });
273
+ updateAdapterJs(
274
+ tasks,
275
+ `${adapterDir}/adapter.js`,
276
+ `${adapterDir}/adapter-inactive.js`,
277
+ adapterDir
278
+ );
279
+ updatePronghorn(
280
+ tasks,
281
+ `${adapterDir}/pronghorn.json`,
282
+ `${adapterDir}/pronghorn-inactive.json`
283
+ );
284
+ deactivateTest(
285
+ adapterDir,
286
+ '/test/integration/adapterTestIntegration.js',
287
+ tasks
288
+ );
289
+ deactivateTest(adapterDir, '/test/unit/adapterTestUnit.js', tasks);
290
+ return 'success';
291
+ } catch (e) {
292
+ console.log(`Error: ${e} ocurred during execution. Rolling back changes.`);
293
+ for (let i = 0; i < backupFiles.length; i++) {
294
+ const file = fs.readFileSync(backupFiles[i], 'utf8');
295
+ fs.writeFileSync(filePaths[i], file, 'utf8');
296
+ }
297
+ toDelete.forEach((filePath) => {
298
+ if (fs.existsSync(filePath)) {
299
+ fs.unlinkSync(filePath);
300
+ }
301
+ });
302
+ deleteBackups(adapterDir);
303
+ process.exit(1);
304
+ }
305
+ }
306
+
307
+ module.exports = {
308
+ activateTasks, deactivateTasks, rollbackChanges, deleteBackups
309
+ };
package/utils/tbScript.js CHANGED
@@ -143,9 +143,7 @@ const executeUnderIAPInstallationDirectory = async (command) => {
143
143
  const serviceIndex = profileItem.services.indexOf(serviceItem.name);
144
144
  profileItem.services.splice(serviceIndex, 1);
145
145
  const update = { $set: { services: profileItem.services } };
146
- await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne(
147
- { id: pronghornProps.id }, update
148
- );
146
+ await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne({ id: pronghornProps.id }, update);
149
147
  console.log(`${serviceItem.name} removed from profileItem.services.`);
150
148
  console.log(`Rerun the script to reinstall ${serviceItem.name}.`);
151
149
  process.exit(0);
@@ -162,18 +160,13 @@ const executeUnderIAPInstallationDirectory = async (command) => {
162
160
  utils.runTest();
163
161
  if (rls.keyInYN(`Do you want to install ${name} to IAP?`)) {
164
162
  console.log('Creating database entries...');
165
- const adapter = utils.createAdapter(
166
- pronghornProps, profileItem, sampleProperties, adapterPronghorn
167
- );
168
-
163
+ const adapter = utils.createAdapter(pronghornProps, profileItem, sampleProperties, adapterPronghorn);
169
164
  adapter.properties.properties = await addAuthInfo(adapter.properties.properties);
170
165
 
171
166
  await database.collection(utils.SERVICE_CONFIGS_COLLECTION).insertOne(adapter);
172
167
  profileItem.services.push(adapter.name);
173
168
  const update = { $set: { services: profileItem.services } };
174
- await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne(
175
- { id: pronghornProps.id }, update
176
- );
169
+ await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne({ id: pronghornProps.id }, update);
177
170
  console.log('Database entry creation complete.');
178
171
  }
179
172
  console.log('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',
@@ -158,8 +158,7 @@ module.exports = {
158
158
  * @param {Object} healthcheck - {Object} healthcheck - ./entities/.system/action.json object
159
159
  */
160
160
  getHealthCheckEndpoint: (healthcheck) => {
161
- const endpoint = healthcheck.actions[1].entitypath.slice(21,
162
- healthcheck.actions[1].entitypath.length - 8);
161
+ const endpoint = healthcheck.actions[1].entitypath.slice(21, healthcheck.actions[1].entitypath.length - 8);
163
162
  return { healthCheckEndpoint: endpoint };
164
163
  },
165
164
 
@@ -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
@@ -160,9 +160,7 @@ const troubleshoot = async (props, scriptFlag, persistFlag, adapter) => {
160
160
  if (persistFlag && healthRes) {
161
161
  const { database } = await utils.getIAPDatabaseConnection();
162
162
  const update = { $set: { properties: updatedAdapter.properties } };
163
- await database.collection(utils.SERVICE_CONFIGS_COLLECTION).updateOne(
164
- { model: name }, update
165
- );
163
+ await database.collection(utils.SERVICE_CONFIGS_COLLECTION).updateOne({ model: name }, update);
166
164
  if (scriptFlag) {
167
165
  console.log(`${name} updated.`);
168
166
  }
@@ -1,3 +0,0 @@
1
- # Adapter Workflows
2
-
3
- This directory contains workflows that support the adapter use cases. These workflows can be imported into IAP. If the adapter is installed using App-Artifact the workflows should be automatically imported.