@itentialopensource/adapter-meraki 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
package/adapter.js CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  /* eslint import/no-dynamic-require: warn */
4
4
  /* eslint object-curly-newline: warn */
5
- /* eslint no-underscore-dangle: warn */
6
- /* eslint camelcase: warn */
7
5
 
8
6
  // Set globals
9
7
  /* global log */
@@ -82,9 +80,9 @@ class Meraki extends AdapterBaseCl {
82
80
  }
83
81
 
84
82
  /**
85
- * @getWorkflowFunctions
83
+ * @iapGetAdapterWorkflowFunctions
86
84
  */
87
- getWorkflowFunctions(inIgnore) {
85
+ iapGetAdapterWorkflowFunctions(inIgnore) {
88
86
  let myIgnore = ['hasEntities', 'hasDevices'];
89
87
  if (!inIgnore && Array.isArray(inIgnore)) {
90
88
  myIgnore = inIgnore;
@@ -96,15 +94,15 @@ class Meraki extends AdapterBaseCl {
96
94
  // you can add specific methods that you do not want to be workflow functions to ignore like below
97
95
  // myIgnore.push('myMethodNotInWorkflow');
98
96
 
99
- return super.getWorkflowFunctions(myIgnore);
97
+ return super.iapGetAdapterWorkflowFunctions(myIgnore);
100
98
  }
101
99
 
102
100
  /**
103
- * updateAdapterConfiguration is used to update any of the adapter configuration files. This
101
+ * iapUpdateAdapterConfiguration is used to update any of the adapter configuration files. This
104
102
  * allows customers to make changes to adapter configuration without having to be on the
105
103
  * file system.
106
104
  *
107
- * @function updateAdapterConfiguration
105
+ * @function iapUpdateAdapterConfiguration
108
106
  * @param {string} configFile - the name of the file being updated (required)
109
107
  * @param {Object} changes - an object containing all of the changes = formatted like the configuration file (required)
110
108
  * @param {string} entity - the entity to be changed, if an action, schema or mock data file (optional)
@@ -112,36 +110,36 @@ class Meraki extends AdapterBaseCl {
112
110
  * @param {string} action - the action to be changed, if an action, schema or mock data file (optional)
113
111
  * @param {Callback} callback - The results of the call
114
112
  */
115
- updateAdapterConfiguration(configFile, changes, entity, type, action, callback) {
116
- const origin = `${this.id}-adapter-updateAdapterConfiguration`;
113
+ iapUpdateAdapterConfiguration(configFile, changes, entity, type, action, callback) {
114
+ const origin = `${this.id}-adapter-iapUpdateAdapterConfiguration`;
117
115
  log.trace(origin);
118
- super.updateAdapterConfiguration(configFile, changes, entity, type, action, callback);
116
+ super.iapUpdateAdapterConfiguration(configFile, changes, entity, type, action, callback);
119
117
  }
120
118
 
121
119
  /**
122
120
  * See if the API path provided is found in this adapter
123
121
  *
124
- * @function findPath
122
+ * @function iapFindAdapterPath
125
123
  * @param {string} apiPath - the api path to check on
126
124
  * @param {Callback} callback - The results of the call
127
125
  */
128
- findPath(apiPath, callback) {
129
- const origin = `${this.id}-adapter-findPath`;
126
+ iapFindAdapterPath(apiPath, callback) {
127
+ const origin = `${this.id}-adapter-iapFindAdapterPath`;
130
128
  log.trace(origin);
131
- super.findPath(apiPath, callback);
129
+ super.iapFindAdapterPath(apiPath, callback);
132
130
  }
133
131
 
134
132
  /**
135
133
  * @summary Suspends adapter
136
134
  *
137
- * @function suspend
135
+ * @function iapSuspendAdapter
138
136
  * @param {Callback} callback - callback function
139
137
  */
140
- suspend(mode, callback) {
141
- const origin = `${this.id}-adapter-suspend`;
138
+ iapSuspendAdapter(mode, callback) {
139
+ const origin = `${this.id}-adapter-iapSuspendAdapter`;
142
140
  log.trace(origin);
143
141
  try {
144
- return super.suspend(mode, callback);
142
+ return super.iapSuspendAdapter(mode, callback);
145
143
  } catch (error) {
146
144
  log.error(`${origin}: ${error}`);
147
145
  return callback(null, error);
@@ -151,14 +149,14 @@ class Meraki extends AdapterBaseCl {
151
149
  /**
152
150
  * @summary Unsuspends adapter
153
151
  *
154
- * @function unsuspend
152
+ * @function iapUnsuspendAdapter
155
153
  * @param {Callback} callback - callback function
156
154
  */
157
- unsuspend(callback) {
158
- const origin = `${this.id}-adapter-unsuspend`;
155
+ iapUnsuspendAdapter(callback) {
156
+ const origin = `${this.id}-adapter-iapUnsuspendAdapter`;
159
157
  log.trace(origin);
160
158
  try {
161
- return super.unsuspend(callback);
159
+ return super.iapUnsuspendAdapter(callback);
162
160
  } catch (error) {
163
161
  log.error(`${origin}: ${error}`);
164
162
  return callback(null, error);
@@ -168,29 +166,29 @@ class Meraki extends AdapterBaseCl {
168
166
  /**
169
167
  * @summary Get the Adaoter Queue
170
168
  *
171
- * @function getQueue
169
+ * @function iapGetAdapterQueue
172
170
  * @param {Callback} callback - callback function
173
171
  */
174
- getQueue(callback) {
175
- const origin = `${this.id}-adapter-getQueue`;
172
+ iapGetAdapterQueue(callback) {
173
+ const origin = `${this.id}-adapter-iapGetAdapterQueue`;
176
174
  log.trace(origin);
177
- return super.getQueue(callback);
175
+ return super.iapGetAdapterQueue(callback);
178
176
  }
179
177
 
180
178
  /**
181
179
  * @summary Runs troubleshoot scripts for adapter
182
180
  *
183
- * @function troubleshoot
181
+ * @function iapTroubleshootAdapter
184
182
  * @param {Object} props - the connection, healthcheck and authentication properties
185
183
  *
186
184
  * @param {boolean} persistFlag - whether the adapter properties should be updated
187
185
  * @param {Callback} callback - The results of the call
188
186
  */
189
- troubleshoot(props, persistFlag, callback) {
190
- const origin = `${this.id}-adapter-troubleshoot`;
187
+ iapTroubleshootAdapter(props, persistFlag, callback) {
188
+ const origin = `${this.id}-adapter-iapTroubleshootAdapter`;
191
189
  log.trace(origin);
192
190
  try {
193
- return super.troubleshoot(props, persistFlag, this, callback);
191
+ return super.iapTroubleshootAdapter(props, persistFlag, this, callback);
194
192
  } catch (error) {
195
193
  log.error(`${origin}: ${error}`);
196
194
  return callback(null, error);
@@ -200,15 +198,15 @@ class Meraki extends AdapterBaseCl {
200
198
  /**
201
199
  * @summary runs healthcheck script for adapter
202
200
  *
203
- * @function runHealthcheck
201
+ * @function iapRunAdapterHealthcheck
204
202
  * @param {Adapter} adapter - adapter instance to troubleshoot
205
203
  * @param {Callback} callback - callback function
206
204
  */
207
- runHealthcheck(callback) {
208
- const origin = `${this.id}-adapter-runHealthcheck`;
205
+ iapRunAdapterHealthcheck(callback) {
206
+ const origin = `${this.id}-adapter-iapRunAdapterHealthcheck`;
209
207
  log.trace(origin);
210
208
  try {
211
- return super.runHealthcheck(this, callback);
209
+ return super.iapRunAdapterHealthcheck(this, callback);
212
210
  } catch (error) {
213
211
  log.error(`${origin}: ${error}`);
214
212
  return callback(null, error);
@@ -218,14 +216,14 @@ class Meraki extends AdapterBaseCl {
218
216
  /**
219
217
  * @summary runs connectivity check script for adapter
220
218
  *
221
- * @function runConnectivity
219
+ * @function iapRunAdapterConnectivity
222
220
  * @param {Callback} callback - callback function
223
221
  */
224
- runConnectivity(callback) {
225
- const origin = `${this.id}-adapter-runConnectivity`;
222
+ iapRunAdapterConnectivity(callback) {
223
+ const origin = `${this.id}-adapter-iapRunAdapterConnectivity`;
226
224
  log.trace(origin);
227
225
  try {
228
- return super.runConnectivity(callback);
226
+ return super.iapRunAdapterConnectivity(callback);
229
227
  } catch (error) {
230
228
  log.error(`${origin}: ${error}`);
231
229
  return callback(null, error);
@@ -235,14 +233,14 @@ class Meraki extends AdapterBaseCl {
235
233
  /**
236
234
  * @summary runs basicGet script for adapter
237
235
  *
238
- * @function runBasicGet
236
+ * @function iapRunAdapterBasicGet
239
237
  * @param {Callback} callback - callback function
240
238
  */
241
- runBasicGet(callback) {
242
- const origin = `${this.id}-adapter-runBasicGet`;
239
+ iapRunAdapterBasicGet(callback) {
240
+ const origin = `${this.id}-adapter-iapRunAdapterBasicGet`;
243
241
  log.trace(origin);
244
242
  try {
245
- return super.runBasicGet(callback);
243
+ return super.iapRunAdapterBasicGet(callback);
246
244
  } catch (error) {
247
245
  log.error(`${origin}: ${error}`);
248
246
  return callback(null, error);
@@ -252,45 +250,46 @@ class Meraki extends AdapterBaseCl {
252
250
  /**
253
251
  * @summary moves entites into Mongo DB
254
252
  *
255
- * @function moveEntitiesToDB
253
+ * @function iapMoveAdapterEntitiesToDB
256
254
  * @param {getCallback} callback - a callback function to return the result (Generics)
257
255
  * or the error
258
256
  */
259
- moveEntitiesToDB(callback) {
260
- const origin = `${this.id}-adapter-moveEntitiesToDB`;
257
+ iapMoveAdapterEntitiesToDB(callback) {
258
+ const origin = `${this.id}-adapter-iapMoveAdapterEntitiesToDB`;
261
259
  log.trace(origin);
262
260
  try {
263
- return super.moveEntitiesToDB(callback);
261
+ return super.iapMoveAdapterEntitiesToDB(callback);
264
262
  } catch (err) {
265
263
  log.error(`${origin}: ${err}`);
266
264
  return callback(null, err);
267
265
  }
268
266
  }
269
267
 
268
+ /* BROKER CALLS */
270
269
  /**
271
270
  * @summary Determines if this adapter supports the specific entity
272
271
  *
273
- * @function hasEntity
272
+ * @function iapHasAdapterEntity
274
273
  * @param {String} entityType - the entity type to check for
275
274
  * @param {String/Array} entityId - the specific entity we are looking for
276
275
  *
277
276
  * @param {Callback} callback - An array of whether the adapter can has the
278
277
  * desired capability or an error
279
278
  */
280
- hasEntity(entityType, entityId, callback) {
281
- const origin = `${this.id}-adapter-hasEntity`;
279
+ iapHasAdapterEntity(entityType, entityId, callback) {
280
+ const origin = `${this.id}-adapter-iapHasAdapterEntity`;
282
281
  log.trace(origin);
283
282
 
284
283
  // Make the call -
285
- // verifyCapability(entityType, actionType, entityId, callback)
286
- return this.verifyCapability(entityType, null, entityId, callback);
284
+ // iapVerifyAdapterCapability(entityType, actionType, entityId, callback)
285
+ return this.iapVerifyAdapterCapability(entityType, null, entityId, callback);
287
286
  }
288
287
 
289
288
  /**
290
289
  * @summary Provides a way for the adapter to tell north bound integrations
291
290
  * whether the adapter supports type, action and specific entity
292
291
  *
293
- * @function verifyCapability
292
+ * @function iapVerifyAdapterCapability
294
293
  * @param {String} entityType - the entity type to check for
295
294
  * @param {String} actionType - the action type to check for
296
295
  * @param {String/Array} entityId - the specific entity we are looking for
@@ -298,15 +297,15 @@ class Meraki extends AdapterBaseCl {
298
297
  * @param {Callback} callback - An array of whether the adapter can has the
299
298
  * desired capability or an error
300
299
  */
301
- verifyCapability(entityType, actionType, entityId, callback) {
302
- const meth = 'adapterBase-verifyCapability';
300
+ iapVerifyAdapterCapability(entityType, actionType, entityId, callback) {
301
+ const meth = 'adapterBase-iapVerifyAdapterCapability';
303
302
  const origin = `${this.id}-${meth}`;
304
303
  log.trace(origin);
305
304
 
306
305
  // if caching
307
306
  if (this.caching) {
308
- // Make the call - verifyCapability(entityType, actionType, entityId, callback)
309
- return this.requestHandlerInst.verifyCapability(entityType, actionType, entityId, (results, error) => {
307
+ // Make the call - iapVerifyAdapterCapability(entityType, actionType, entityId, callback)
308
+ return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, entityId, (results, error) => {
310
309
  if (error) {
311
310
  return callback(null, error);
312
311
  }
@@ -324,7 +323,7 @@ class Meraki extends AdapterBaseCl {
324
323
  }
325
324
 
326
325
  // need to check the cache again since it has been updated
327
- return this.requestHandlerInst.verifyCapability(entityType, actionType, entityId, (vcapable, verror) => {
326
+ return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, entityId, (vcapable, verror) => {
328
327
  if (verror) {
329
328
  return callback(null, verror);
330
329
  }
@@ -357,7 +356,7 @@ class Meraki extends AdapterBaseCl {
357
356
  // if no entity id
358
357
  if (!entityId) {
359
358
  // need to check the cache again since it has been updated
360
- return this.requestHandlerInst.verifyCapability(entityType, actionType, null, (vcapable, verror) => {
359
+ return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, null, (vcapable, verror) => {
361
360
  if (verror) {
362
361
  return callback(null, verror);
363
362
  }
@@ -378,7 +377,7 @@ class Meraki extends AdapterBaseCl {
378
377
  }
379
378
 
380
379
  // need to check the cache again since it has been updated
381
- return this.requestHandlerInst.verifyCapability(entityType, actionType, null, (vcapable, verror) => {
380
+ return this.requestHandlerInst.iapVerifyAdapterCapability(entityType, actionType, null, (vcapable, verror) => {
382
381
  if (verror) {
383
382
  return callback(null, verror);
384
383
  }
@@ -419,11 +418,11 @@ class Meraki extends AdapterBaseCl {
419
418
  /**
420
419
  * @summary Updates the cache for all entities by call the get All entity method
421
420
  *
422
- * @function updateEntityCache
421
+ * @function iapUpdateAdapterEntityCache
423
422
  *
424
423
  */
425
- updateEntityCache() {
426
- const origin = `${this.id}-adapter-updateEntityCache`;
424
+ iapUpdateAdapterEntityCache() {
425
+ const origin = `${this.id}-adapter-iapUpdateAdapterEntityCache`;
427
426
  log.trace(origin);
428
427
 
429
428
  if (this.caching) {
@@ -436,117 +435,6 @@ class Meraki extends AdapterBaseCl {
436
435
  }
437
436
  }
438
437
 
439
- /**
440
- * Makes the requested generic call
441
- *
442
- * @function genericAdapterRequest
443
- * @param {String} uriPath - the path of the api call - do not include the host, port, base path or version (required)
444
- * @param {String} restMethod - the rest method (GET, POST, PUT, PATCH, DELETE) (required)
445
- * @param {Object} queryData - the parameters to be put on the url (optional).
446
- * Can be a stringified Object.
447
- * @param {Object} requestBody - the body to add to the request (optional).
448
- * Can be a stringified Object.
449
- * @param {Object} addlHeaders - additional headers to be put on the call (optional).
450
- * Can be a stringified Object.
451
- * @param {getCallback} callback - a callback function to return the result (Generics)
452
- * or the error
453
- */
454
- genericAdapterRequest(uriPath, restMethod, queryData, requestBody, addlHeaders, callback) {
455
- const meth = 'adapter-genericAdapterRequest';
456
- const origin = `${this.id}-${meth}`;
457
- log.trace(origin);
458
-
459
- if (this.suspended && this.suspendMode === 'error') {
460
- const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'AD.600', [], null, null, null);
461
- log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
462
- return callback(null, errorObj);
463
- }
464
-
465
- /* HERE IS WHERE YOU VALIDATE DATA */
466
- if (uriPath === undefined || uriPath === null || uriPath === '') {
467
- const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['uriPath'], null, null, null);
468
- log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
469
- return callback(null, errorObj);
470
- }
471
- if (restMethod === undefined || restMethod === null || restMethod === '') {
472
- const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['restMethod'], null, null, null);
473
- log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
474
- return callback(null, errorObj);
475
- }
476
-
477
- /* HERE IS WHERE YOU SET THE DATA TO PASS INTO REQUEST */
478
- // remove any leading / and split the uripath into path variables
479
- let myPath = uriPath;
480
- while (myPath.indexOf('/') === 0) {
481
- myPath = myPath.substring(1);
482
- }
483
- const pathVars = myPath.split('/');
484
- const queryParamsAvailable = queryData;
485
- const queryParams = {};
486
- const bodyVars = requestBody;
487
-
488
- // loop in template. long callback arg name to avoid identifier conflicts
489
- Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => {
490
- if (queryParamsAvailable[thisKeyInQueryParamsAvailable] !== undefined && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== null
491
- && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== '') {
492
- queryParams[thisKeyInQueryParamsAvailable] = queryParamsAvailable[thisKeyInQueryParamsAvailable];
493
- }
494
- });
495
-
496
- // set up the request object - payload, uriPathVars, uriQuery, uriOptions, addlHeaders
497
- const reqObj = {
498
- payload: bodyVars,
499
- uriPathVars: pathVars,
500
- uriQuery: queryParams,
501
- uriOptions: {}
502
- };
503
- // add headers if provided
504
- if (addlHeaders) {
505
- reqObj.addlHeaders = addlHeaders;
506
- }
507
-
508
- // determine the call and return flag
509
- let action = 'getGenerics';
510
- let returnF = true;
511
- if (restMethod.toUpperCase() === 'POST') {
512
- action = 'createGeneric';
513
- } else if (restMethod.toUpperCase() === 'PUT') {
514
- action = 'updateGeneric';
515
- } else if (restMethod.toUpperCase() === 'PATCH') {
516
- action = 'patchGeneric';
517
- } else if (restMethod.toUpperCase() === 'DELETE') {
518
- action = 'deleteGeneric';
519
- returnF = false;
520
- }
521
-
522
- try {
523
- // Make the call -
524
- // identifyRequest(entity, action, requestObj, returnDataFlag, callback)
525
- return this.requestHandlerInst.identifyRequest('.generic', action, reqObj, returnF, (irReturnData, irReturnError) => {
526
- // if we received an error or their is no response on the results
527
- // return an error
528
- if (irReturnError) {
529
- /* HERE IS WHERE YOU CAN ALTER THE ERROR MESSAGE */
530
- return callback(null, irReturnError);
531
- }
532
- if (!Object.hasOwnProperty.call(irReturnData, 'response')) {
533
- const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['genericAdapterRequest'], null, null, null);
534
- log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
535
- return callback(null, errorObj);
536
- }
537
-
538
- /* HERE IS WHERE YOU CAN ALTER THE RETURN DATA */
539
- // return the response
540
- return callback(irReturnData, null);
541
- });
542
- } catch (ex) {
543
- const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex);
544
- log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
545
- return callback(null, errorObj);
546
- }
547
- }
548
-
549
- /* BROKER CALLS */
550
438
  /**
551
439
  * @summary Determines if this adapter supports any in a list of entities
552
440
  *
@@ -622,8 +510,9 @@ class Meraki extends AdapterBaseCl {
622
510
  const origin = `${this.id}-${meth}`;
623
511
  log.trace(origin);
624
512
 
625
- if (this.suspended && this.suspendMode === 'error') {
626
- const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'AD.600', [], null, null, null);
513
+ // make sure we are set up for device broker getDevice
514
+ if (!this.props.devicebroker || !this.props.devicebroker.getDevice || !this.props.devicebroker.getDevice.path) {
515
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getDevice.path'], null, null, null);
627
516
  log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
628
517
  return callback(null, errorObj);
629
518
  }
@@ -658,13 +547,74 @@ class Meraki extends AdapterBaseCl {
658
547
 
659
548
  // !! using Generic makes it easier on the Adapter Builder (just need to change the path)
660
549
  // !! you can also replace with a specific call if that is easier
661
- const uriPath = `/call/toget/device/${uuid}`;
662
- return this.genericAdapterRequest(uriPath, 'GET', {}, {}, {}, (result, error) => {
550
+ let uriPath = '';
551
+ let uriMethod = 'GET';
552
+ let callQuery = {};
553
+ let callBody = {};
554
+ let callHeaders = {};
555
+ let nameField = 'name';
556
+ let nameArray = ['name'];
557
+ let ostypeField = 'ostype';
558
+ let ostypeArray = ['ostype'];
559
+ let ostypePrefix = '';
560
+ let portField = 'port';
561
+ let portArray = ['port'];
562
+ let ipField = 'ipaddress';
563
+ let ipArray = ['ipaddress'];
564
+ if (this.props.devicebroker.getDevice.path) {
565
+ uriPath = `${this.props.devicebroker.getDevice.path}`;
566
+ uriPath = uriPath.replace('{deviceid}', uuid);
567
+ }
568
+ if (this.props.devicebroker.getDevice.method) {
569
+ uriMethod = this.props.devicebroker.getDevice.method;
570
+ }
571
+ if (this.props.devicebroker.getDevice.query) {
572
+ try {
573
+ callQuery = JSON.parse(this.props.devicebroker.getDevice.query);
574
+ } catch (e) {
575
+ log.warn('Could not parse query parameter for getDevice call');
576
+ }
577
+ }
578
+ if (this.props.devicebroker.getDevice.body) {
579
+ try {
580
+ callBody = this.props.devicebroker.getDevice.body;
581
+ } catch (e) {
582
+ log.warn('Could not parse body for getDevice call');
583
+ }
584
+ }
585
+ if (this.props.devicebroker.getDevice.headers) {
586
+ try {
587
+ callHeaders = this.props.devicebroker.getDevice.headers;
588
+ } catch (e) {
589
+ log.warn('Could not parse headers for getDevice call');
590
+ }
591
+ }
592
+ if (this.props.devicebroker.getDevice.name_field) {
593
+ nameField = this.props.devicebroker.getDevice.name_field;
594
+ nameArray = nameField.split('.');
595
+ }
596
+ if (this.props.devicebroker.getDevice.ostype_field) {
597
+ ostypeField = this.props.devicebroker.getDevice.ostype_field;
598
+ ostypeArray = ostypeField.split('.');
599
+ }
600
+ if (this.props.devicebroker.getDevice.ostype_prefix) {
601
+ ostypePrefix = this.props.devicebroker.getDevice.ostype_prefix;
602
+ }
603
+ if (this.props.devicebroker.getDevice.port_field) {
604
+ portField = this.props.devicebroker.getDevice.port_field;
605
+ portArray = portField.split('.');
606
+ }
607
+ if (this.props.devicebroker.getDevice.ip_field) {
608
+ ipField = this.props.devicebroker.getDevice.ip_field;
609
+ ipArray = ipField.split('.');
610
+ }
611
+
612
+ return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
663
613
  // if we received an error or their is no response on the results return an error
664
614
  if (error) {
665
615
  return callback(null, error);
666
616
  }
667
- if (!result.response || !result.response.applianceMo) {
617
+ if (!result.response) {
668
618
  const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevice'], null, null, null);
669
619
  log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
670
620
  return callback(null, errorObj);
@@ -674,10 +624,46 @@ class Meraki extends AdapterBaseCl {
674
624
  // !! format the data we send back
675
625
  // !! these fields are config manager fields you need to map to the data we receive
676
626
  const thisDevice = result.response;
677
- thisDevice.name = thisDevice.systemName;
678
- thisDevice.ostype = `System-${thisDevice.systemType}`;
679
- thisDevice.port = thisDevice.systemPort;
680
- thisDevice.ipaddress = thisDevice.systemIP;
627
+ let thisName = thisDevice;
628
+ for (let i = 0; i < nameArray.length; i += 1) {
629
+ if (!Object.hasOwnProperty.call(thisName, nameArray[i])) {
630
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
631
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
632
+ return callback(null, errorObj);
633
+ }
634
+ thisName = thisName[nameArray[i]];
635
+ }
636
+ thisDevice.name = thisName;
637
+ let thisOstype = thisDevice;
638
+ for (let i = 0; i < ostypeArray.length; i += 1) {
639
+ if (!Object.hasOwnProperty.call(thisOstype, ostypeArray[i])) {
640
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
641
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
642
+ return callback(null, errorObj);
643
+ }
644
+ thisOstype = thisOstype[ostypeArray[i]];
645
+ }
646
+ thisDevice.ostype = ostypePrefix + thisOstype;
647
+ let thisPort = thisDevice;
648
+ for (let i = 0; i < portArray.length; i += 1) {
649
+ if (!Object.hasOwnProperty.call(thisPort, portArray[i])) {
650
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
651
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
652
+ return callback(null, errorObj);
653
+ }
654
+ thisPort = thisPort[portArray[i]];
655
+ }
656
+ thisDevice.port = thisPort;
657
+ let thisIp = thisDevice;
658
+ for (let i = 0; i < ipArray.length; i += 1) {
659
+ if (!Object.hasOwnProperty.call(thisIp, ipArray[i])) {
660
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
661
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
662
+ return callback(null, errorObj);
663
+ }
664
+ thisIp = thisIp[ipArray[i]];
665
+ }
666
+ thisDevice.ipaddress = thisIp;
681
667
  return callback(thisDevice);
682
668
  });
683
669
  });
@@ -702,6 +688,13 @@ class Meraki extends AdapterBaseCl {
702
688
  const origin = `${this.id}-${meth}`;
703
689
  log.trace(origin);
704
690
 
691
+ // make sure we are set up for device broker getDevicesFiltered
692
+ if (!this.props.devicebroker || !this.props.devicebroker.getDevicesFiltered || !this.props.devicebroker.getDevicesFiltered.path) {
693
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getDevicesFiltered.path'], null, null, null);
694
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
695
+ return callback(null, errorObj);
696
+ }
697
+
705
698
  // verify the required fields have been provided
706
699
  if (options === undefined || options === null || options === '' || options.length === 0) {
707
700
  const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['options'], null, null, null);
@@ -738,8 +731,68 @@ class Meraki extends AdapterBaseCl {
738
731
  try {
739
732
  // !! using Generic makes it easier on the Adapter Builder (just need to change the path)
740
733
  // !! you can also replace with a specific call if that is easier
741
- const uriPath = '/call/toget/devices';
742
- return this.genericAdapterRequest(uriPath, 'GET', {}, {}, {}, (result, error) => {
734
+ let uriPath = '';
735
+ let uriMethod = 'GET';
736
+ let callQuery = {};
737
+ let callBody = {};
738
+ let callHeaders = {};
739
+ let nameField = 'name';
740
+ let nameArray = ['name'];
741
+ let ostypeField = 'ostype';
742
+ let ostypeArray = ['ostype'];
743
+ let ostypePrefix = '';
744
+ let portField = 'port';
745
+ let portArray = ['port'];
746
+ let ipField = 'ipaddress';
747
+ let ipArray = ['ipaddress'];
748
+ if (this.props.devicebroker.getDevicesFiltered.path) {
749
+ uriPath = this.props.devicebroker.getDevicesFiltered.path;
750
+ }
751
+ if (this.props.devicebroker.getDevicesFiltered.method) {
752
+ uriMethod = this.props.devicebroker.getDevicesFiltered.method;
753
+ }
754
+ if (this.props.devicebroker.getDevicesFiltered.query) {
755
+ try {
756
+ callQuery = this.props.devicebroker.getDevicesFiltered.query;
757
+ } catch (e) {
758
+ log.warn('Could not parse query parameter for getDevicesFiltered call');
759
+ }
760
+ }
761
+ if (this.props.devicebroker.getDevicesFiltered.body) {
762
+ try {
763
+ callBody = this.props.devicebroker.getDevicesFiltered.body;
764
+ } catch (e) {
765
+ log.warn('Could not parse body for getDevicesFiltered call');
766
+ }
767
+ }
768
+ if (this.props.devicebroker.getDevicesFiltered.headers) {
769
+ try {
770
+ callHeaders = this.props.devicebroker.getDevicesFiltered.headers;
771
+ } catch (e) {
772
+ log.warn('Could not parse headers for getDevicesFiltered call');
773
+ }
774
+ }
775
+ if (this.props.devicebroker.getDevicesFiltered.name_field) {
776
+ nameField = this.props.devicebroker.getDevicesFiltered.name_field;
777
+ nameArray = nameField.split('.');
778
+ }
779
+ if (this.props.devicebroker.getDevicesFiltered.ostype_field) {
780
+ ostypeField = this.props.devicebroker.getDevicesFiltered.ostype_field;
781
+ ostypeArray = ostypeField.split('.');
782
+ }
783
+ if (this.props.devicebroker.getDevicesFiltered.ostype_prefix) {
784
+ ostypePrefix = this.props.devicebroker.getDevicesFiltered.ostype_prefix;
785
+ }
786
+ if (this.props.devicebroker.getDevicesFiltered.port_field) {
787
+ portField = this.props.devicebroker.getDevicesFiltered.port_field;
788
+ portArray = portField.split('.');
789
+ }
790
+ if (this.props.devicebroker.getDevicesFiltered.ip_field) {
791
+ ipField = this.props.devicebroker.getDevicesFiltered.ip_field;
792
+ ipArray = ipField.split('.');
793
+ }
794
+
795
+ return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
743
796
  // if we received an error or their is no response on the results return an error
744
797
  if (error) {
745
798
  return callback(null, error);
@@ -759,10 +812,46 @@ class Meraki extends AdapterBaseCl {
759
812
  // !! format the data we send back
760
813
  // !! these fields are config manager fields you need to map to the data we receive
761
814
  const thisDevice = result.response;
762
- thisDevice.name = thisDevice.systemName;
763
- thisDevice.ostype = `System-${thisDevice.systemType}`;
764
- thisDevice.port = thisDevice.systemPort;
765
- thisDevice.ipaddress = thisDevice.systemIP;
815
+ let thisName = thisDevice;
816
+ for (let i = 0; i < nameArray.length; i += 1) {
817
+ if (!Object.hasOwnProperty.call(thisName, nameArray[i])) {
818
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
819
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
820
+ return callback(null, errorObj);
821
+ }
822
+ thisName = thisName[nameArray[i]];
823
+ }
824
+ thisDevice.name = thisName;
825
+ let thisOstype = thisDevice;
826
+ for (let i = 0; i < ostypeArray.length; i += 1) {
827
+ if (!Object.hasOwnProperty.call(thisOstype, ostypeArray[i])) {
828
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
829
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
830
+ return callback(null, errorObj);
831
+ }
832
+ thisOstype = thisOstype[ostypeArray[i]];
833
+ }
834
+ thisDevice.ostype = ostypePrefix + thisOstype;
835
+ let thisPort = thisDevice;
836
+ for (let i = 0; i < portArray.length; i += 1) {
837
+ if (!Object.hasOwnProperty.call(thisPort, portArray[i])) {
838
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
839
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
840
+ return callback(null, errorObj);
841
+ }
842
+ thisPort = thisPort[portArray[i]];
843
+ }
844
+ thisDevice.port = thisPort;
845
+ let thisIp = thisDevice;
846
+ for (let i = 0; i < ipArray.length; i += 1) {
847
+ if (!Object.hasOwnProperty.call(thisIp, ipArray[i])) {
848
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
849
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
850
+ return callback(null, errorObj);
851
+ }
852
+ thisIp = thisIp[ipArray[i]];
853
+ }
854
+ thisDevice.ipaddress = thisIp;
766
855
 
767
856
  // if there is no filter - return the device
768
857
  if (filterName.length === 0) {
@@ -790,10 +879,46 @@ class Meraki extends AdapterBaseCl {
790
879
  // !! format the data we send back
791
880
  // !! these fields are config manager fields you need to map to the data we receive
792
881
  const thisDevice = result.response;
793
- thisDevice.name = thisDevice.systemName;
794
- thisDevice.ostype = `System-${thisDevice.systemType}`;
795
- thisDevice.port = thisDevice.systemPort;
796
- thisDevice.ipaddress = thisDevice.systemIP;
882
+ let thisName = thisDevice;
883
+ for (let i = 0; i < nameArray.length; i += 1) {
884
+ if (!Object.hasOwnProperty.call(thisName, nameArray[i])) {
885
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
886
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
887
+ return callback(null, errorObj);
888
+ }
889
+ thisName = thisName[nameArray[i]];
890
+ }
891
+ thisDevice.name = thisName;
892
+ let thisOstype = thisDevice;
893
+ for (let i = 0; i < ostypeArray.length; i += 1) {
894
+ if (!Object.hasOwnProperty.call(thisOstype, ostypeArray[i])) {
895
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
896
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
897
+ return callback(null, errorObj);
898
+ }
899
+ thisOstype = thisOstype[ostypeArray[i]];
900
+ }
901
+ thisDevice.ostype = ostypePrefix + thisOstype;
902
+ let thisPort = thisDevice;
903
+ for (let i = 0; i < portArray.length; i += 1) {
904
+ if (!Object.hasOwnProperty.call(thisPort, portArray[i])) {
905
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
906
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
907
+ return callback(null, errorObj);
908
+ }
909
+ thisPort = thisPort[portArray[i]];
910
+ }
911
+ thisDevice.port = thisPort;
912
+ let thisIp = thisDevice;
913
+ for (let i = 0; i < ipArray.length; i += 1) {
914
+ if (!Object.hasOwnProperty.call(thisIp, ipArray[i])) {
915
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['getDevicesFiltered'], null, null, null);
916
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
917
+ return callback(null, errorObj);
918
+ }
919
+ thisIp = thisIp[ipArray[i]];
920
+ }
921
+ thisDevice.ipaddress = thisIp;
797
922
 
798
923
  // if there is no filter - return the device
799
924
  if (filterName.length === 0) {
@@ -841,6 +966,13 @@ class Meraki extends AdapterBaseCl {
841
966
  const origin = `${this.id}-${meth}`;
842
967
  log.trace(origin);
843
968
 
969
+ // make sure we are set up for device broker isAlive
970
+ if (!this.props.devicebroker || !this.props.devicebroker.isAlive || !this.props.devicebroker.isAlive.path) {
971
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.isAlive.path'], null, null, null);
972
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
973
+ return callback(null, errorObj);
974
+ }
975
+
844
976
  // verify the required fields have been provided
845
977
  if (deviceName === undefined || deviceName === null || deviceName === '' || deviceName.length === 0) {
846
978
  const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['deviceName'], null, null, null);
@@ -871,21 +1003,78 @@ class Meraki extends AdapterBaseCl {
871
1003
 
872
1004
  // !! using Generic makes it easier on the Adapter Builder (just need to change the path)
873
1005
  // !! you can also replace with a specific call if that is easier
874
- const uriPath = `/call/toget/status/${uuid}`;
875
- return this.genericAdapterRequest(uriPath, 'GET', {}, {}, {}, (result, error) => {
1006
+ let uriPath = '';
1007
+ let uriMethod = 'GET';
1008
+ let callQuery = {};
1009
+ let callBody = {};
1010
+ let callHeaders = {};
1011
+ let statusField = 'status';
1012
+ let statusArray = ['status'];
1013
+ let statusValue = 'true';
1014
+ if (this.props.devicebroker.isAlive.path) {
1015
+ uriPath = `${this.props.devicebroker.isAlive.path}`;
1016
+ uriPath = uriPath.replace('{deviceid}', uuid);
1017
+ }
1018
+ if (this.props.devicebroker.isAlive.method) {
1019
+ uriMethod = this.props.devicebroker.isAlive.method;
1020
+ }
1021
+ if (this.props.devicebroker.isAlive.query) {
1022
+ try {
1023
+ callQuery = this.props.devicebroker.isAlive.query;
1024
+ } catch (e) {
1025
+ log.warn('Could not parse query parameter for isAlive call');
1026
+ }
1027
+ }
1028
+ if (this.props.devicebroker.isAlive.body) {
1029
+ try {
1030
+ callBody = this.props.devicebroker.isAlive.body;
1031
+ } catch (e) {
1032
+ log.warn('Could not parse body for isAlive call');
1033
+ }
1034
+ }
1035
+ if (this.props.devicebroker.isAlive.headers) {
1036
+ try {
1037
+ callHeaders = this.props.devicebroker.isAlive.headers;
1038
+ } catch (e) {
1039
+ log.warn('Could not parse headers for isAlive call');
1040
+ }
1041
+ }
1042
+ if (this.props.devicebroker.isAlive.response && this.props.devicebroker.isAlive.status_field) {
1043
+ statusField = this.props.devicebroker.isAlive.status_field;
1044
+ statusArray = statusField.split('.');
1045
+ }
1046
+ if (this.props.devicebroker.isAlive.response && this.props.devicebroker.isAlive.status_value) {
1047
+ statusValue = this.props.devicebroker.isAlive.response.status_value;
1048
+ }
1049
+
1050
+ return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
876
1051
  // if we received an error or their is no response on the results return an error
877
1052
  if (error) {
878
1053
  return callback(null, error);
879
1054
  }
1055
+
880
1056
  // !! should update this to make sure we are checking for the appropriate object/field
881
- if (!result.response || !result.response.returnObj || !Object.hasOwnProperty.call(result.response.returnObj, 'statusField')) {
1057
+ if (!result.response || !result.response.returnObj) {
882
1058
  const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['isAlive'], null, null, null);
883
1059
  log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
884
1060
  return callback(null, errorObj);
885
1061
  }
1062
+ let thisObj = result.response.returnObj;
1063
+ for (let i = 0; i < statusArray.length; i += 1) {
1064
+ if (!Object.hasOwnProperty.call(thisObj, statusArray[i])) {
1065
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['isAlive'], null, null, null);
1066
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1067
+ return callback(null, errorObj);
1068
+ }
1069
+ thisObj = thisObj[statusArray[i]];
1070
+ }
886
1071
 
887
1072
  // !! return the response - Update to the appropriate object/field
888
- return callback(!result.response.returnObj.statusField);
1073
+ let response = true;
1074
+ if (thisObj.toString() !== statusValue) {
1075
+ response = false;
1076
+ }
1077
+ return callback(response);
889
1078
  });
890
1079
  });
891
1080
  } catch (ex) {
@@ -910,6 +1099,13 @@ class Meraki extends AdapterBaseCl {
910
1099
  const origin = `${this.id}-${meth}`;
911
1100
  log.trace(origin);
912
1101
 
1102
+ // make sure we are set up for device broker getConfig
1103
+ if (!this.props.devicebroker || !this.props.devicebroker.getConfig || !this.props.devicebroker.getConfig.path) {
1104
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getConfig.path'], null, null, null);
1105
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1106
+ return callback(null, errorObj);
1107
+ }
1108
+
913
1109
  // verify the required fields have been provided
914
1110
  if (deviceName === undefined || deviceName === null || deviceName === '' || deviceName.length === 0) {
915
1111
  const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['deviceName'], null, null, null);
@@ -940,8 +1136,41 @@ class Meraki extends AdapterBaseCl {
940
1136
 
941
1137
  // !! using Generic makes it easier on the Adapter Builder (just need to change the path)
942
1138
  // !! you can also replace with a specific call if that is easier
943
- const uriPath = `/call/toget/config/${uuid}`;
944
- return this.genericAdapterRequest(uriPath, 'GET', {}, {}, {}, (result, error) => {
1139
+ let uriPath = '';
1140
+ let uriMethod = 'GET';
1141
+ let callQuery = {};
1142
+ let callBody = {};
1143
+ let callHeaders = {};
1144
+ if (this.props.devicebroker.getConfig.path) {
1145
+ uriPath = `${this.props.devicebroker.getConfig.path}`;
1146
+ uriPath = uriPath.replace('{deviceid}', uuid);
1147
+ }
1148
+ if (this.props.devicebroker.getConfig.method) {
1149
+ uriMethod = this.props.devicebroker.getConfig.method;
1150
+ }
1151
+ if (this.props.devicebroker.getConfig.query) {
1152
+ try {
1153
+ callQuery = this.props.devicebroker.getConfig.query;
1154
+ } catch (e) {
1155
+ log.warn('Could not parse query parameter for getConfig call');
1156
+ }
1157
+ }
1158
+ if (this.props.devicebroker.getConfig.body) {
1159
+ try {
1160
+ callBody = this.props.devicebroker.getConfig.body;
1161
+ } catch (e) {
1162
+ log.warn('Could not parse body for getConfig call');
1163
+ }
1164
+ }
1165
+ if (this.props.devicebroker.getConfig.headers) {
1166
+ try {
1167
+ callHeaders = this.props.devicebroker.getConfig.headers;
1168
+ } catch (e) {
1169
+ log.warn('Could not parse headers for getConfig call');
1170
+ }
1171
+ }
1172
+
1173
+ return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
945
1174
  // if we received an error or their is no response on the results return an error
946
1175
  if (error) {
947
1176
  return callback(null, error);
@@ -964,23 +1193,62 @@ class Meraki extends AdapterBaseCl {
964
1193
  /**
965
1194
  * @summary Gets the device count from the system
966
1195
  *
967
- * @function getCount
1196
+ * @function iapGetDeviceCount
968
1197
  *
969
1198
  * @param {getCallback} callback - callback function to return the result
970
1199
  * (count) or the error
971
1200
  */
972
- getCount(callback) {
973
- const meth = 'adapter-getCount';
1201
+ iapGetDeviceCount(callback) {
1202
+ const meth = 'adapter-iapGetDeviceCount';
974
1203
  const origin = `${this.id}-${meth}`;
975
1204
  log.trace(origin);
976
1205
 
1206
+ // make sure we are set up for device broker getCount
1207
+ if (!this.props.devicebroker || !this.props.devicebroker.getCount || !this.props.devicebroker.getCount.path) {
1208
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Properties', ['devicebroker.getCount.path'], null, null, null);
1209
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1210
+ return callback(null, errorObj);
1211
+ }
1212
+
977
1213
  // verify the required fields have been provided
978
1214
 
979
1215
  try {
980
- // !! using Generic makes it easier on the Adapter Builder (just need to change the path)
1216
+ // !! using Generic makes it easier on the Adapter Builder (just need to set the path or call in properties)
981
1217
  // !! you can also replace with a specific call if that is easier
982
- const uriPath = '/call/toget/count';
983
- return this.genericAdapterRequest(uriPath, 'GET', {}, {}, {}, (result, error) => {
1218
+ let uriPath = '';
1219
+ let uriMethod = 'GET';
1220
+ let callQuery = {};
1221
+ let callBody = {};
1222
+ let callHeaders = {};
1223
+ if (this.props.devicebroker.getCount.path) {
1224
+ uriPath = this.props.devicebroker.getCount.path;
1225
+ }
1226
+ if (this.props.devicebroker.getCount.method) {
1227
+ uriMethod = this.props.devicebroker.getCount.method;
1228
+ }
1229
+ if (this.props.devicebroker.getCount.query) {
1230
+ try {
1231
+ callQuery = this.props.devicebroker.getCount.query;
1232
+ } catch (e) {
1233
+ log.warn('Could not parse query parameter for getCount call');
1234
+ }
1235
+ }
1236
+ if (this.props.devicebroker.getCount.body) {
1237
+ try {
1238
+ callBody = this.props.devicebroker.getCount.body;
1239
+ } catch (e) {
1240
+ log.warn('Could not parse body for getCount call');
1241
+ }
1242
+ }
1243
+ if (this.props.devicebroker.getCount.headers) {
1244
+ try {
1245
+ callHeaders = this.props.devicebroker.getCount.headers;
1246
+ } catch (e) {
1247
+ log.warn('Could not parse headers for getCount call');
1248
+ }
1249
+ }
1250
+
1251
+ return this.genericAdapterRequest(uriPath, uriMethod, callQuery, callBody, callHeaders, (result, error) => {
984
1252
  // if we received an error or their is no response on the results return an error
985
1253
  if (error) {
986
1254
  return callback(null, error);
@@ -996,6 +1264,117 @@ class Meraki extends AdapterBaseCl {
996
1264
  }
997
1265
  }
998
1266
 
1267
+ /* GENERIC ADAPTER REQUEST - allows extension of adapter without new calls being added */
1268
+ /**
1269
+ * Makes the requested generic call
1270
+ *
1271
+ * @function genericAdapterRequest
1272
+ * @param {String} uriPath - the path of the api call - do not include the host, port, base path or version (required)
1273
+ * @param {String} restMethod - the rest method (GET, POST, PUT, PATCH, DELETE) (required)
1274
+ * @param {Object} queryData - the parameters to be put on the url (optional).
1275
+ * Can be a stringified Object.
1276
+ * @param {Object} requestBody - the body to add to the request (optional).
1277
+ * Can be a stringified Object.
1278
+ * @param {Object} addlHeaders - additional headers to be put on the call (optional).
1279
+ * Can be a stringified Object.
1280
+ * @param {getCallback} callback - a callback function to return the result (Generics)
1281
+ * or the error
1282
+ */
1283
+ genericAdapterRequest(uriPath, restMethod, queryData, requestBody, addlHeaders, callback) {
1284
+ const meth = 'adapter-genericAdapterRequest';
1285
+ const origin = `${this.id}-${meth}`;
1286
+ log.trace(origin);
1287
+
1288
+ if (this.suspended && this.suspendMode === 'error') {
1289
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'AD.600', [], null, null, null);
1290
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1291
+ return callback(null, errorObj);
1292
+ }
1293
+
1294
+ /* HERE IS WHERE YOU VALIDATE DATA */
1295
+ if (uriPath === undefined || uriPath === null || uriPath === '') {
1296
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['uriPath'], null, null, null);
1297
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1298
+ return callback(null, errorObj);
1299
+ }
1300
+ if (restMethod === undefined || restMethod === null || restMethod === '') {
1301
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Missing Data', ['restMethod'], null, null, null);
1302
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1303
+ return callback(null, errorObj);
1304
+ }
1305
+
1306
+ /* HERE IS WHERE YOU SET THE DATA TO PASS INTO REQUEST */
1307
+ // remove any leading / and split the uripath into path variables
1308
+ let myPath = uriPath;
1309
+ while (myPath.indexOf('/') === 0) {
1310
+ myPath = myPath.substring(1);
1311
+ }
1312
+ const pathVars = myPath.split('/');
1313
+ const queryParamsAvailable = queryData;
1314
+ const queryParams = {};
1315
+ const bodyVars = requestBody;
1316
+
1317
+ // loop in template. long callback arg name to avoid identifier conflicts
1318
+ Object.keys(queryParamsAvailable).forEach((thisKeyInQueryParamsAvailable) => {
1319
+ if (queryParamsAvailable[thisKeyInQueryParamsAvailable] !== undefined && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== null
1320
+ && queryParamsAvailable[thisKeyInQueryParamsAvailable] !== '') {
1321
+ queryParams[thisKeyInQueryParamsAvailable] = queryParamsAvailable[thisKeyInQueryParamsAvailable];
1322
+ }
1323
+ });
1324
+
1325
+ // set up the request object - payload, uriPathVars, uriQuery, uriOptions, addlHeaders
1326
+ const reqObj = {
1327
+ payload: bodyVars,
1328
+ uriPathVars: pathVars,
1329
+ uriQuery: queryParams,
1330
+ uriOptions: {}
1331
+ };
1332
+ // add headers if provided
1333
+ if (addlHeaders) {
1334
+ reqObj.addlHeaders = addlHeaders;
1335
+ }
1336
+
1337
+ // determine the call and return flag
1338
+ let action = 'getGenerics';
1339
+ let returnF = true;
1340
+ if (restMethod.toUpperCase() === 'POST') {
1341
+ action = 'createGeneric';
1342
+ } else if (restMethod.toUpperCase() === 'PUT') {
1343
+ action = 'updateGeneric';
1344
+ } else if (restMethod.toUpperCase() === 'PATCH') {
1345
+ action = 'patchGeneric';
1346
+ } else if (restMethod.toUpperCase() === 'DELETE') {
1347
+ action = 'deleteGeneric';
1348
+ returnF = false;
1349
+ }
1350
+
1351
+ try {
1352
+ // Make the call -
1353
+ // identifyRequest(entity, action, requestObj, returnDataFlag, callback)
1354
+ return this.requestHandlerInst.identifyRequest('.generic', action, reqObj, returnF, (irReturnData, irReturnError) => {
1355
+ // if we received an error or their is no response on the results
1356
+ // return an error
1357
+ if (irReturnError) {
1358
+ /* HERE IS WHERE YOU CAN ALTER THE ERROR MESSAGE */
1359
+ return callback(null, irReturnError);
1360
+ }
1361
+ if (!Object.hasOwnProperty.call(irReturnData, 'response')) {
1362
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Invalid Response', ['genericAdapterRequest'], null, null, null);
1363
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1364
+ return callback(null, errorObj);
1365
+ }
1366
+
1367
+ /* HERE IS WHERE YOU CAN ALTER THE RETURN DATA */
1368
+ // return the response
1369
+ return callback(irReturnData, null);
1370
+ });
1371
+ } catch (ex) {
1372
+ const errorObj = this.requestHandlerInst.formatErrorObject(this.id, meth, 'Caught Exception', null, null, null, ex);
1373
+ log.error(`${origin}: ${errorObj.IAPerror.displayString}`);
1374
+ return callback(null, errorObj);
1375
+ }
1376
+ }
1377
+
999
1378
  /**
1000
1379
  * @callback healthCallback
1001
1380
  * @param {Object} result - the result of the get request (contains an id and a status)