@itentialopensource/adapter-selector_ai 0.1.1

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.
Files changed (117) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.js +19 -0
  3. package/.jshintrc +3 -0
  4. package/AUTH.md +39 -0
  5. package/BROKER.md +211 -0
  6. package/CALLS.md +405 -0
  7. package/CODE_OF_CONDUCT.md +43 -0
  8. package/CONTRIBUTING.md +13 -0
  9. package/ENHANCE.md +69 -0
  10. package/LICENSE +201 -0
  11. package/PROPERTIES.md +661 -0
  12. package/README.md +344 -0
  13. package/SUMMARY.md +9 -0
  14. package/SYSTEMINFO.md +14 -0
  15. package/TAB1.md +8 -0
  16. package/TAB2.md +314 -0
  17. package/TROUBLESHOOT.md +56 -0
  18. package/UTILITIES.md +473 -0
  19. package/adapter.js +4039 -0
  20. package/adapterBase.js +1488 -0
  21. package/entities/.generic/action.json +214 -0
  22. package/entities/.generic/schema.json +28 -0
  23. package/entities/.system/action.json +50 -0
  24. package/entities/.system/mockdatafiles/getToken-default.json +3 -0
  25. package/entities/.system/mockdatafiles/healthcheck-default.json +3 -0
  26. package/entities/.system/schema.json +19 -0
  27. package/entities/.system/schemaTokenReq.json +53 -0
  28. package/entities/.system/schemaTokenResp.json +53 -0
  29. package/entities/InventorySchemaCreation/action.json +24 -0
  30. package/entities/InventorySchemaCreation/schema.json +19 -0
  31. package/entities/InventorySchemaDelete/action.json +24 -0
  32. package/entities/InventorySchemaDelete/schema.json +19 -0
  33. package/entities/InventorySchemaDeleteType/action.json +24 -0
  34. package/entities/InventorySchemaDeleteType/schema.json +19 -0
  35. package/entities/InventorySchemaFileDownload/action.json +24 -0
  36. package/entities/InventorySchemaFileDownload/schema.json +19 -0
  37. package/entities/InventorySchemaFileUpload/action.json +24 -0
  38. package/entities/InventorySchemaFileUpload/schema.json +19 -0
  39. package/entities/InventorySchemaUpdate/action.json +24 -0
  40. package/entities/InventorySchemaUpdate/schema.json +19 -0
  41. package/entities/InventoryV2SchemaDeleteAll/action.json +24 -0
  42. package/entities/InventoryV2SchemaDeleteAll/schema.json +19 -0
  43. package/entities/InventoryV2SchemaDeleteType/action.json +24 -0
  44. package/entities/InventoryV2SchemaDeleteType/schema.json +19 -0
  45. package/entities/InventoryV2SchemaUpdate/action.json +24 -0
  46. package/entities/InventoryV2SchemaUpdate/schema.json +19 -0
  47. package/entities/InventoryV2SchemaUpload/action.json +24 -0
  48. package/entities/InventoryV2SchemaUpload/schema.json +19 -0
  49. package/entities/MetastoreInventoryBulkDataUpload/action.json +24 -0
  50. package/entities/MetastoreInventoryBulkDataUpload/schema.json +19 -0
  51. package/entities/MetastoreInventoryCSVDataUpload/action.json +24 -0
  52. package/entities/MetastoreInventoryCSVDataUpload/schema.json +19 -0
  53. package/entities/MetastoreInventoryCsvFileExport/action.json +25 -0
  54. package/entities/MetastoreInventoryCsvFileExport/schema.json +19 -0
  55. package/entities/MetastoreInventoryDataDelete/action.json +24 -0
  56. package/entities/MetastoreInventoryDataDelete/schema.json +19 -0
  57. package/entities/MetastoreInventoryDataDownload/action.json +46 -0
  58. package/entities/MetastoreInventoryDataDownload/schema.json +20 -0
  59. package/entities/MetastoreInventoryDataEdit/action.json +24 -0
  60. package/entities/MetastoreInventoryDataEdit/schema.json +19 -0
  61. package/entities/MetastoreInventoryDataUpload/action.json +24 -0
  62. package/entities/MetastoreInventoryDataUpload/schema.json +19 -0
  63. package/entities/MetastoreInventoryFilesExport/action.json +24 -0
  64. package/entities/MetastoreInventoryFilesExport/schema.json +19 -0
  65. package/entities/MetastoreInventoryFilesImport/action.json +24 -0
  66. package/entities/MetastoreInventoryFilesImport/schema.json +30 -0
  67. package/entities/MetastoreInventoryItems/action.json +25 -0
  68. package/entities/MetastoreInventoryItems/schema.json +19 -0
  69. package/entities/MetastoreInventoryNameDelete/action.json +24 -0
  70. package/entities/MetastoreInventoryNameDelete/schema.json +19 -0
  71. package/entities/MetastoreInventoryNameUpdate/action.json +24 -0
  72. package/entities/MetastoreInventoryNameUpdate/schema.json +19 -0
  73. package/entities/MetastoreInventoryNameUpload/action.json +24 -0
  74. package/entities/MetastoreInventoryNameUpload/schema.json +19 -0
  75. package/entities/MetastoreInventoryNamesDownload/action.json +25 -0
  76. package/entities/MetastoreInventoryNamesDownload/schema.json +19 -0
  77. package/entities/MetastoreInventorySchemaGet/action.json +25 -0
  78. package/entities/MetastoreInventorySchemaGet/schema.json +19 -0
  79. package/entities/MetastoreInventorySystem/action.json +130 -0
  80. package/entities/MetastoreInventorySystem/schema.json +24 -0
  81. package/entities/MetastoreV2InventorySchemaGet/action.json +25 -0
  82. package/entities/MetastoreV2InventorySchemaGet/schema.json +19 -0
  83. package/error.json +190 -0
  84. package/metadata.json +58 -0
  85. package/package.json +77 -0
  86. package/pronghorn.json +2508 -0
  87. package/propertiesDecorators.json +14 -0
  88. package/propertiesSchema.json +1635 -0
  89. package/report/adapterInfo.json +10 -0
  90. package/report/auto-adapter-openapi.json +1330 -0
  91. package/report/creationReport.json +765 -0
  92. package/report/metastore-inventory-manager.yaml-OpenApi3Json.json +2366 -0
  93. package/sampleProperties.json +260 -0
  94. package/test/integration/adapterTestBasicGet.js +117 -0
  95. package/test/integration/adapterTestConnectivity.js +117 -0
  96. package/test/integration/adapterTestIntegration.js +1295 -0
  97. package/test/unit/adapterBaseTestUnit.js +1626 -0
  98. package/test/unit/adapterTestUnit.js +2288 -0
  99. package/utils/adapterInfo.js +156 -0
  100. package/utils/argParser.js +44 -0
  101. package/utils/checkMigrate.js +102 -0
  102. package/utils/entitiesToDB.js +190 -0
  103. package/utils/findPath.js +74 -0
  104. package/utils/logger.js +26 -0
  105. package/utils/methodDocumentor.js +273 -0
  106. package/utils/modify.js +153 -0
  107. package/utils/mongoDbConnection.js +79 -0
  108. package/utils/mongoUtils.js +162 -0
  109. package/utils/pre-commit.sh +32 -0
  110. package/utils/removeHooks.js +20 -0
  111. package/utils/setup.js +33 -0
  112. package/utils/taskMover.js +308 -0
  113. package/utils/tbScript.js +103 -0
  114. package/utils/tbUtils.js +347 -0
  115. package/utils/testRunner.js +298 -0
  116. package/utils/troubleshootingAdapter.js +177 -0
  117. package/utils/updateAdapterConfig.js +158 -0
@@ -0,0 +1,260 @@
1
+ {
2
+ "id": "Adapter-selector_ai",
3
+ "type": "SelectorAi",
4
+ "properties": {
5
+ "host": "localhost",
6
+ "port": 443,
7
+ "choosepath": "",
8
+ "base_path": "/api",
9
+ "version": "",
10
+ "cache_location": "none",
11
+ "encode_pathvars": true,
12
+ "encode_queryvars": true,
13
+ "save_metric": false,
14
+ "stub": true,
15
+ "protocol": "https",
16
+ "authentication": {
17
+ "auth_method": "request_token",
18
+ "username": "username",
19
+ "password": "password",
20
+ "token": "token",
21
+ "token_timeout": 1800000,
22
+ "token_cache": "local",
23
+ "invalid_token_error": 401,
24
+ "auth_field": "header.headers.Authorization",
25
+ "auth_field_format": "Bearer {token}",
26
+ "auth_logging": false,
27
+ "client_id": "",
28
+ "client_secret": "",
29
+ "grant_type": "",
30
+ "sensitive": [],
31
+ "multiStepAuthCalls": [
32
+ {
33
+ "name": "",
34
+ "requestFields": {},
35
+ "responseFields": {},
36
+ "successfullResponseCode": 200
37
+ }
38
+ ],
39
+ "sso": {
40
+ "protocol": "",
41
+ "host": "",
42
+ "port": 0
43
+ }
44
+ },
45
+ "healthcheck": {
46
+ "type": "startup",
47
+ "frequency": 60000,
48
+ "query_object": {},
49
+ "addlHeaders": {}
50
+ },
51
+ "throttle": {
52
+ "throttle_enabled": false,
53
+ "number_pronghorns": 1,
54
+ "sync_async": "sync",
55
+ "max_in_queue": 1000,
56
+ "concurrent_max": 1,
57
+ "expire_timeout": 0,
58
+ "avg_runtime": 200,
59
+ "priorities": [
60
+ {
61
+ "value": 0,
62
+ "percent": 100
63
+ }
64
+ ]
65
+ },
66
+ "request": {
67
+ "number_redirects": 0,
68
+ "number_retries": 3,
69
+ "limit_retry_error": [
70
+ 0
71
+ ],
72
+ "failover_codes": [],
73
+ "attempt_timeout": 5000,
74
+ "global_request": {
75
+ "payload": {},
76
+ "uriOptions": {},
77
+ "addlHeaders": {},
78
+ "authData": {}
79
+ },
80
+ "healthcheck_on_timeout": true,
81
+ "return_raw": false,
82
+ "archiving": false,
83
+ "return_request": false
84
+ },
85
+ "proxy": {
86
+ "enabled": false,
87
+ "host": "",
88
+ "port": 1,
89
+ "protocol": "http",
90
+ "username": "",
91
+ "password": ""
92
+ },
93
+ "ssl": {
94
+ "ecdhCurve": "",
95
+ "enabled": false,
96
+ "accept_invalid_cert": false,
97
+ "ca_file": "",
98
+ "key_file": "",
99
+ "cert_file": "",
100
+ "secure_protocol": "",
101
+ "ciphers": ""
102
+ },
103
+ "mongo": {
104
+ "url": "",
105
+ "host": "",
106
+ "port": 0,
107
+ "database": "",
108
+ "dbAuth": false,
109
+ "username": "",
110
+ "password": "",
111
+ "replSet": "",
112
+ "addSrv": false,
113
+ "db_ssl": {
114
+ "enabled": false,
115
+ "accept_invalid_cert": false,
116
+ "ca_file": "",
117
+ "key_file": "",
118
+ "cert_file": ""
119
+ }
120
+ },
121
+ "devicebroker": {
122
+ "enabled": false,
123
+ "getDevice": [
124
+ {
125
+ "path": "/get/devices/{id}",
126
+ "method": "GET",
127
+ "query": {},
128
+ "body": {},
129
+ "headers": {},
130
+ "handleFailure": "fail",
131
+ "requestFields": {
132
+ "id": "name"
133
+ },
134
+ "responseDatakey": "",
135
+ "responseFields": {
136
+ "name": "host",
137
+ "ostype": "os",
138
+ "ostypePrefix": "system-",
139
+ "ipaddress": "attributes.ipaddr",
140
+ "port": "443"
141
+ }
142
+ }
143
+ ],
144
+ "getDevicesFiltered": [
145
+ {
146
+ "path": "/get/devices",
147
+ "method": "GET",
148
+ "pagination": {
149
+ "offsetVar": "",
150
+ "limitVar": "",
151
+ "incrementBy": "limit",
152
+ "requestLocation": "query"
153
+ },
154
+ "query": {},
155
+ "body": {},
156
+ "headers": {},
157
+ "handleFailure": "fail",
158
+ "requestFields": {},
159
+ "responseDatakey": "",
160
+ "responseFields": {
161
+ "name": "host",
162
+ "ostype": "os",
163
+ "ostypePrefix": "system-",
164
+ "ipaddress": "attributes.ipaddr",
165
+ "port": "443"
166
+ }
167
+ }
168
+ ],
169
+ "isAlive": [
170
+ {
171
+ "path": "/get/devices/{id}/status",
172
+ "method": "GET",
173
+ "query": {},
174
+ "body": {},
175
+ "headers": {},
176
+ "handleFailure": "fail",
177
+ "requestFields": {
178
+ "id": "name"
179
+ },
180
+ "responseDatakey": "",
181
+ "responseFields": {
182
+ "status": "status",
183
+ "statusValue": "online"
184
+ }
185
+ }
186
+ ],
187
+ "getConfig": [
188
+ {
189
+ "path": "/get/devices/{id}/configPart1",
190
+ "method": "GET",
191
+ "query": {},
192
+ "body": {},
193
+ "headers": {},
194
+ "handleFailure": "fail",
195
+ "requestFields": {
196
+ "id": "name"
197
+ },
198
+ "responseDatakey": "",
199
+ "responseFields": {}
200
+ }
201
+ ],
202
+ "getCount": [
203
+ {
204
+ "path": "/get/devices",
205
+ "method": "GET",
206
+ "query": {},
207
+ "body": {},
208
+ "headers": {},
209
+ "handleFailure": "fail",
210
+ "requestFields": {},
211
+ "responseDatakey": "",
212
+ "responseFields": {}
213
+ }
214
+ ]
215
+ },
216
+ "cache": {
217
+ "enabled": false,
218
+ "entities": [
219
+ {
220
+ "entityType": "",
221
+ "frequency": 1440,
222
+ "flushOnFail": false,
223
+ "limit": 1000,
224
+ "retryAttempts": 5,
225
+ "sort": true,
226
+ "populate": [
227
+ {
228
+ "path": "",
229
+ "method": "GET",
230
+ "pagination": {
231
+ "offsetVar": "",
232
+ "limitVar": "",
233
+ "incrementBy": "limit",
234
+ "requestLocation": "query"
235
+ },
236
+ "query": {},
237
+ "body": {},
238
+ "headers": {},
239
+ "handleFailure": "ignore",
240
+ "requestFields": {},
241
+ "responseDatakey": "",
242
+ "responseFields": {}
243
+ }
244
+ ],
245
+ "cachedTasks": [
246
+ {
247
+ "name": "",
248
+ "filterField": "",
249
+ "filterLoc": ""
250
+ }
251
+ ]
252
+ }
253
+ ]
254
+ }
255
+ },
256
+ "groups": [],
257
+ "brokers": [],
258
+ "logLevel": "none",
259
+ "timeout": 120000
260
+ }
@@ -0,0 +1,117 @@
1
+ /* @copyright Itential, LLC 2020 */
2
+
3
+ /* global describe it log before after */
4
+ /* eslint global-require: warn */
5
+ /* eslint no-unused-vars: warn */
6
+ /* eslint import/no-extraneous-dependencies: warn */
7
+ /* eslint import/no-dynamic-require: warn */
8
+ /* eslint import/no-unresolved: warn */
9
+ /* eslint no-loop-func: warn */
10
+
11
+ /* This performs a number of GET calls (defaults to 5 calls) which do not reuire an input, to test connectivity and functionality.
12
+ The number of calls can be modified if running from CLI. */
13
+
14
+ const assert = require('assert');
15
+
16
+ const log = require('../../utils/logger');
17
+ const { id } = require('../../package.json');
18
+ const { methods } = require('../../pronghorn.json');
19
+ const { parseArgs } = require('../../utils/argParser');
20
+
21
+ const {
22
+ properties, maxCalls
23
+ } = parseArgs();
24
+
25
+ // require the adapter that we are going to be using
26
+ const TestAdapter = require('../../adapter');
27
+
28
+ if (!properties) {
29
+ log.warn('No properties provided. Exiting process.');
30
+ process.exit(1);
31
+ }
32
+
33
+ let successCount = 0;
34
+ let calls = 0;
35
+ let attemptTimeout = 60000;
36
+ if (properties.request && properties.request.attempt_timeout) {
37
+ attemptTimeout = properties.request.attempt_timeout;
38
+ }
39
+
40
+ // turn off stub mode - basic get should not be run in stub mode
41
+ properties.stub = false;
42
+
43
+ describe('[integration] Adapter BasicGET Test', () => {
44
+ describe('Class Tests', () => {
45
+ const testAdapter = new TestAdapter(
46
+ id,
47
+ properties
48
+ );
49
+
50
+ after((done) => {
51
+ if (successCount === calls) {
52
+ log.info('\x1b[32m%s\x1b[0m', `\n\nSUCCESS: ${successCount} test(s) passed of ${calls} executed!`);
53
+ } else if (successCount > 0) {
54
+ log.error('\x1b[32m%s\x1b[0m', `\n\nPARTIAL SUCCESS: ${successCount} test(s) passed of ${calls} executed!`);
55
+ } else {
56
+ log.error('\x1b[31m%s\x1b[0m', '\n\nFAILURE: All tests failed.');
57
+ }
58
+ done();
59
+ });
60
+
61
+ const basicGets = methods.filter((method) => {
62
+ // ignore iapMetadata as the input since its optional and all functions will have it
63
+ const inputKeys = (method.input || [])
64
+ .map((param) => param.name)
65
+ .filter((name) => name !== 'iapMetadata');
66
+ return method.route.verb === 'GET' && inputKeys.length === 0 && !method.name.startsWith('iap');
67
+ });
68
+
69
+ if (basicGets.length === 0) {
70
+ log.warn('No non-parameter GET calls found.');
71
+ process.exitCode = 0;
72
+ return;
73
+ }
74
+
75
+ const functionNames = basicGets.map((g) => g.name);
76
+ calls = functionNames.length;
77
+ if (calls > maxCalls) {
78
+ calls = maxCalls;
79
+ }
80
+
81
+ // test up to the first 5 get calls without parameters
82
+ for (let f = 0; f < calls; f += 1) {
83
+ const fnName = functionNames[f];
84
+ const method = basicGets.find((m) => m.name === fnName);
85
+ const hasIapMetadata = Array.isArray(method.input) && method.input.some((param) => param.name === 'iapMetadata');
86
+ describe(`#${functionNames[f]}`, () => {
87
+ it('should return valid response without error', (done) => {
88
+ const callback = (data, error) => {
89
+ try {
90
+ assert.equal(undefined, error);
91
+ assert.notEqual(undefined, data);
92
+ assert.notEqual(null, data);
93
+ assert.notEqual(undefined, data.response);
94
+ assert.notEqual(null, data.response);
95
+ successCount += 1;
96
+ done();
97
+ } catch (err) {
98
+ log.error(`Test Failure in ${fnName}: ${err}`);
99
+ done(err);
100
+ }
101
+ };
102
+
103
+ try {
104
+ if (hasIapMetadata) {
105
+ testAdapter[fnName](null, callback);
106
+ } else {
107
+ testAdapter[fnName](callback);
108
+ }
109
+ } catch (err) {
110
+ log.error(`Unexpected error in test for ${fnName}: ${err}`);
111
+ done(err);
112
+ }
113
+ }).timeout(attemptTimeout);
114
+ });
115
+ }
116
+ });
117
+ });
@@ -0,0 +1,117 @@
1
+ /* @copyright Itential, LLC 2020 */
2
+
3
+ /* global describe it context before after */
4
+ /* eslint no-unused-vars: warn */
5
+
6
+ const assert = require('assert');
7
+ const https = require('https');
8
+ const mocha = require('mocha');
9
+ const ping = require('ping');
10
+ const dns = require('dns');
11
+ const { parseArgs } = require('../../utils/argParser');
12
+
13
+ const dnsPromises = dns.promises;
14
+ const { host } = parseArgs();
15
+
16
+ describe('[integration] Adapter Test', () => {
17
+ context(`Testing network connection on ${host}`, () => {
18
+ after((done) => {
19
+ done();
20
+ });
21
+
22
+ it('DNS resolve', (done) => {
23
+ dnsPromises.lookup(host, { all: true })
24
+ .then((result) => {
25
+ try {
26
+ assert.ok(result.length > 0);
27
+ done();
28
+ } catch (error) {
29
+ done(error);
30
+ }
31
+ })
32
+ .catch((err) => {
33
+ done(err);
34
+ });
35
+ });
36
+
37
+ it('Responds to ping', (done) => {
38
+ ping.promise.probe(host)
39
+ .then((result) => {
40
+ try {
41
+ assert.ok(result.alive);
42
+ done();
43
+ } catch (error) {
44
+ done(error);
45
+ }
46
+ })
47
+ .catch((err) => {
48
+ done(err);
49
+ });
50
+ });
51
+
52
+ it('Support HTTPS on port 443', (done) => {
53
+ const requestOptions = {
54
+ host,
55
+ port: 443,
56
+ method: 'HEAD'
57
+ };
58
+
59
+ const req = https.request(requestOptions, (res) => {
60
+ try {
61
+ assert.ok(res.statusCode >= 200 && res.statusCode < 400);
62
+ done();
63
+ } catch (error) {
64
+ done(error);
65
+ }
66
+ });
67
+
68
+ req.on('error', (err) => {
69
+ done(err);
70
+ });
71
+
72
+ req.end();
73
+ });
74
+
75
+ it('Support IPv4', (done) => {
76
+ const options = {
77
+ family: 4,
78
+ hints: dns.ADDRCONFIG
79
+ };
80
+
81
+ dnsPromises.lookup(host, options)
82
+ .then((result) => {
83
+ try {
84
+ const { address, family } = result;
85
+ assert.ok(address !== null && family === 4);
86
+ done();
87
+ } catch (error) {
88
+ done(error);
89
+ }
90
+ })
91
+ .catch((err) => {
92
+ done(err);
93
+ });
94
+ });
95
+
96
+ it('Support IPv6', (done) => {
97
+ const options = {
98
+ family: 6,
99
+ hints: dns.ADDRCONFIG
100
+ };
101
+
102
+ dnsPromises.lookup(host, options)
103
+ .then((result) => {
104
+ try {
105
+ const { address, family } = result;
106
+ assert.ok(address !== null && family === 6);
107
+ done();
108
+ } catch (error) {
109
+ done(error);
110
+ }
111
+ })
112
+ .catch((err) => {
113
+ done(err);
114
+ });
115
+ });
116
+ });
117
+ });