iotagent-node-lib 2.15.1 → 2.19.0

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 (448) hide show
  1. package/.github/workflows/ci.yml +17 -1
  2. package/.readthedocs.yml +7 -0
  3. package/CHANGES_NEXT_RELEASE +0 -1
  4. package/README.md +1 -0
  5. package/doc/Contribution.md +60 -1
  6. package/doc/advanced-topics.md +136 -14
  7. package/doc/api.md +38 -22
  8. package/doc/apiary/iotagent.apib +1 -3
  9. package/doc/architecture.md +2 -2
  10. package/doc/config-basic-example.js +0 -1
  11. package/doc/deprecated.md +2 -2
  12. package/doc/development.md +13 -6
  13. package/doc/expressionLanguage.md +519 -277
  14. package/doc/getting-started.md +0 -1
  15. package/doc/howto.md +13 -17
  16. package/doc/installationguide.md +67 -69
  17. package/doc/usermanual.md +48 -16
  18. package/docker/Mosquitto/Dockerfile +4 -9
  19. package/docker/Mosquitto/README.md +2 -0
  20. package/docker/Mosquitto/startMosquitto.sh +18 -1
  21. package/lib/command/commandLine.js +1 -1
  22. package/lib/commonConfig.js +5 -14
  23. package/lib/errors.js +0 -16
  24. package/lib/fiware-iotagent-lib.js +5 -0
  25. package/lib/jexlTranformsMap.js +71 -0
  26. package/lib/model/Command.js +1 -1
  27. package/lib/model/Device.js +5 -2
  28. package/lib/model/Group.js +20 -2
  29. package/lib/model/dbConn.js +7 -1
  30. package/lib/plugins/attributeAlias.js +6 -13
  31. package/lib/plugins/bidirectionalData.js +2 -27
  32. package/lib/plugins/expressionParser.js +41 -17
  33. package/lib/plugins/expressionPlugin.js +21 -27
  34. package/lib/plugins/jexlParser.js +71 -67
  35. package/lib/plugins/multiEntity.js +68 -147
  36. package/lib/plugins/pluginUtils.js +12 -48
  37. package/lib/plugins/timestampProcessPlugin.js +1 -46
  38. package/lib/request-shim.js +111 -0
  39. package/lib/services/common/domain.js +2 -2
  40. package/lib/services/common/genericMiddleware.js +6 -2
  41. package/lib/services/common/iotManagerService.js +1 -1
  42. package/lib/services/common/securityServiceKeystone.js +1 -1
  43. package/lib/services/common/securityServiceOAuth2.js +3 -2
  44. package/lib/services/devices/deviceRegistryMongoDB.js +29 -22
  45. package/lib/services/devices/deviceService.js +56 -33
  46. package/lib/services/devices/devices-NGSI-LD.js +42 -14
  47. package/lib/services/devices/devices-NGSI-mixed.js +3 -3
  48. package/lib/services/devices/devices-NGSI-v2.js +48 -24
  49. package/lib/services/devices/registrationUtils.js +1 -134
  50. package/lib/services/groups/groupRegistryMemory.js +2 -0
  51. package/lib/services/groups/groupRegistryMongoDB.js +58 -76
  52. package/lib/services/groups/groupService.js +1 -1
  53. package/lib/services/ngsi/entities-NGSI-LD.js +205 -124
  54. package/lib/services/ngsi/entities-NGSI-v2.js +142 -32
  55. package/lib/services/ngsi/ngsiService.js +4 -6
  56. package/lib/services/ngsi/ngsiUtils.js +0 -21
  57. package/lib/services/ngsi/subscription-NGSI-LD.js +14 -5
  58. package/lib/services/ngsi/subscriptionService.js +1 -4
  59. package/lib/services/northBound/contextServer-NGSI-LD.js +7 -2
  60. package/lib/services/northBound/contextServer-NGSI-v2.js +25 -13
  61. package/lib/services/northBound/contextServer.js +1 -4
  62. package/lib/services/northBound/contextServerUtils.js +0 -81
  63. package/lib/services/northBound/deviceProvisioningServer.js +36 -9
  64. package/lib/services/northBound/northboundServer.js +2 -0
  65. package/lib/services/northBound/restUtils.js +2 -39
  66. package/lib/templates/updateDevice.json +4 -0
  67. package/lib/templates/updateDeviceLax.json +4 -0
  68. package/package.json +13 -13
  69. package/test/tools/utils.js +2 -0
  70. package/test/unit/examples/deviceProvisioningRequests/provisionAnotherDevice.json +1 -1
  71. package/test/unit/examples/deviceProvisioningRequests/provisionDeviceMissingParameters.json +1 -1
  72. package/test/unit/examples/deviceProvisioningRequests/provisionDuplicatedDev.json +1 -1
  73. package/test/unit/examples/deviceProvisioningRequests/provisionFullDevice.json +1 -1
  74. package/test/unit/examples/deviceProvisioningRequests/provisionNewDeviceMalformed1.json +1 -1
  75. package/test/unit/examples/groupProvisioningRequests/multipleGroupsCreation.json +1 -1
  76. package/test/unit/examples/iotamRequests/registrationEmpty.json +1 -1
  77. package/test/unit/examples/iotamRequests/registrationWithGroups.json +2 -2
  78. package/test/unit/examples/iotamRequests/registrationWithGroupsWithoutCB.json +2 -2
  79. package/test/unit/examples/iotamRequests/registrationWithStaticGroups.json +2 -2
  80. package/test/unit/expressions/jexlExpression-test.js +119 -0
  81. package/test/unit/general/config-multi-core-test.js +1 -1
  82. package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +30 -77
  83. package/test/unit/general/deviceService-test.js +19 -35
  84. package/test/unit/general/loglevel-api_test.js +8 -13
  85. package/test/unit/general/migration-test.js +1 -0
  86. package/test/unit/general/startup-test.js +3 -2
  87. package/test/unit/general/statistics-persistence_test.js +2 -2
  88. package/test/unit/general/statistics-service_test.js +2 -2
  89. package/test/unit/lazyAndCommands/commandRegistry_test.js +18 -18
  90. package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +16 -24
  91. package/test/unit/mongodb/mongodb-connectionoptions-test.js +2 -2
  92. package/test/unit/mongodb/mongodb-group-registry-test.js +11 -11
  93. package/test/unit/mongodb/mongodb-registry-test.js +55 -131
  94. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent1.json +1 -1
  95. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent2.json +1 -1
  96. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent4.json +1 -1
  97. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +1 -1
  98. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDevice.json +1 -1
  99. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +1 -1
  100. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +1 -1
  101. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +1 -1
  102. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup3.json +1 -1
  103. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateCommands1.json +1 -1
  104. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent1.json +1 -1
  105. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent2.json +1 -1
  106. package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent3.json +1 -1
  107. package/test/unit/ngsi-ld/examples/contextRequests/createMinimumProvisionedDevice.json +0 -7
  108. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDevice.json +0 -7
  109. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -7
  110. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -14
  111. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -14
  112. package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic3.json +1 -15
  113. package/test/unit/ngsi-ld/examples/contextRequests/createTimeInstantMinimumDevice.json +0 -7
  114. package/test/unit/ngsi-ld/examples/contextRequests/updateContextAliasPlugin6.json +0 -7
  115. package/test/unit/ngsi-ld/examples/contextRequests/updateContextAutocast5.json +0 -7
  116. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin12a.json +7 -0
  117. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin13.json +13 -13
  118. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin16.json +0 -7
  119. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin17.json +0 -7
  120. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +18 -0
  121. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +18 -0
  122. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin31.json +15 -0
  123. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +17 -0
  124. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin33.json +18 -0
  125. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin34.json +17 -0
  126. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin4a.json +36 -0
  127. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin5.json +0 -7
  128. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin7.json +16 -16
  129. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin8a.json +18 -0
  130. package/test/unit/ngsi-ld/examples/contextRequests/updateContextGeoproperties3.json +0 -7
  131. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  132. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +6 -6
  133. package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +3 -3
  134. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -7
  135. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionCommands1.json +0 -7
  136. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionDeviceStatic.json +0 -7
  137. package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionMinimumDevice.json +0 -7
  138. package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +20 -17
  139. package/test/unit/ngsi-ld/examples/subscriptionRequests/simpleSubscriptionRequest.json +18 -15
  140. package/test/unit/ngsi-ld/examples/subscriptionRequests/simpleSubscriptionRequest2.json +18 -15
  141. package/test/unit/ngsi-ld/expressions/expressionBasedTransformations-test.js +21 -21
  142. package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1018 -0
  143. package/test/unit/ngsi-ld/general/config-jsonld-contexts-test.js +2 -2
  144. package/test/unit/ngsi-ld/general/contextBrokerOAuthSecurityAccess-test.js +24 -24
  145. package/test/unit/ngsi-ld/general/deviceService-test.js +7 -7
  146. package/test/unit/ngsi-ld/general/https-support-test.js +14 -13
  147. package/test/unit/ngsi-ld/general/iotam-autoregistration-test.js +8 -7
  148. package/test/unit/ngsi-ld/general/startup-test.js +2 -1
  149. package/test/unit/ngsi-ld/lazyAndCommands/active-devices-attribute-update-test.js +10 -8
  150. package/test/unit/ngsi-ld/lazyAndCommands/command-test.js +11 -12
  151. package/test/unit/ngsi-ld/lazyAndCommands/lazy-devices-test.js +25 -29
  152. package/test/unit/ngsi-ld/lazyAndCommands/polling-commands-test.js +16 -15
  153. package/test/unit/ngsi-ld/ngsiService/active-devices-test.js +18 -17
  154. package/test/unit/ngsi-ld/ngsiService/autocast-test.js +13 -12
  155. package/test/unit/ngsi-ld/ngsiService/geoproperties-test.js +10 -9
  156. package/test/unit/ngsi-ld/ngsiService/staticAttributes-test.js +3 -3
  157. package/test/unit/ngsi-ld/ngsiService/subscriptions-test.js +25 -24
  158. package/test/unit/ngsi-ld/plugins/alias-plugin_test.js +13 -12
  159. package/test/unit/ngsi-ld/plugins/bidirectional-plugin_test.js +27 -26
  160. package/test/unit/ngsi-ld/plugins/compress-timestamp-plugin_test.js +5 -5
  161. package/test/unit/ngsi-ld/plugins/event-plugin_test.js +3 -3
  162. package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +75 -14
  163. package/test/unit/ngsi-ld/plugins/timestamp-processing-plugin_test.js +3 -3
  164. package/test/unit/ngsi-ld/provisioning/device-provisioning-api_test.js +54 -53
  165. package/test/unit/ngsi-ld/provisioning/device-registration_test.js +20 -19
  166. package/test/unit/ngsi-ld/provisioning/device-update-registration_test.js +23 -22
  167. package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +58 -70
  168. package/test/unit/ngsi-ld/provisioning/provisionDeviceMultientity-test.js +8 -7
  169. package/test/unit/ngsi-ld/provisioning/removeProvisionedDevice-test.js +19 -19
  170. package/test/unit/ngsi-ld/provisioning/singleConfigurationMode-test.js +18 -20
  171. package/test/unit/ngsi-ld/provisioning/updateProvisionedDevices-test.js +43 -49
  172. package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +16 -14
  173. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent1.json +1 -1
  174. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent2.json +1 -1
  175. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent3.json +19 -0
  176. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent4.json +1 -1
  177. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent5.json +19 -0
  178. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +1 -1
  179. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDevice.json +1 -1
  180. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +1 -1
  181. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +1 -1
  182. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +1 -1
  183. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup3.json +1 -1
  184. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateCommands1.json +3 -3
  185. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent1.json +3 -3
  186. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent2.json +1 -1
  187. package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent3.json +1 -1
  188. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin1.json +17 -1
  189. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin11.json +5 -1
  190. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin12.json +2 -2
  191. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin15.json +6 -0
  192. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin16.json +14 -0
  193. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin17.json +14 -0
  194. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin18.json +6 -0
  195. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin19.json +6 -0
  196. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin2.json +13 -1
  197. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin20.json +6 -0
  198. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin21.json +6 -0
  199. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin22.json +6 -0
  200. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin23.json +6 -0
  201. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin24.json +6 -0
  202. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin25.json +6 -0
  203. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin26.json +6 -0
  204. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin27.json +6 -0
  205. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin28.json +6 -0
  206. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin29.json +22 -0
  207. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin3.json +5 -1
  208. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin30.json +6 -0
  209. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin31.json +18 -0
  210. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json +16 -0
  211. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json +22 -0
  212. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json +12 -0
  213. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin4.json +12 -0
  214. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin5.json +5 -1
  215. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin6.json +5 -1
  216. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin7.json +5 -1
  217. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin8.json +17 -1
  218. package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin9.json +5 -1
  219. package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware1.json +10 -0
  220. package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware2.json +10 -0
  221. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin1.json +2 -2
  222. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin10.json +1 -1
  223. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin11.json +13 -0
  224. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin12.json +33 -0
  225. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin13.json +33 -0
  226. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin14.json +33 -0
  227. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
  228. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin16.json +25 -0
  229. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin2.json +2 -2
  230. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin3.json +1 -1
  231. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin4.json +1 -1
  232. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin5.json +1 -1
  233. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin6.json +1 -1
  234. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin7.json +1 -1
  235. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin8.json +2 -2
  236. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin9.json +1 -1
  237. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +8 -8
  238. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +4 -4
  239. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin3.json +1 -1
  240. package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin4.json +2 -2
  241. package/test/unit/ngsiv2/examples/contextRequests/updateProvisionDevice.json +20 -0
  242. package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +1 -1
  243. package/test/unit/ngsiv2/examples/subscriptionRequests/simpleSubscriptionRequest.json +1 -1
  244. package/test/unit/ngsiv2/examples/subscriptionRequests/simpleSubscriptionRequest2.json +1 -1
  245. package/test/unit/ngsiv2/expressions/expressionBasedTransformations-test.js +93 -60
  246. package/test/unit/ngsiv2/expressions/expressionCombinedTransformations-test.js +16 -16
  247. package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +548 -164
  248. package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +34 -33
  249. package/test/unit/ngsiv2/general/deviceService-test.js +15 -14
  250. package/test/unit/ngsiv2/general/https-support-test.js +14 -13
  251. package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +8 -7
  252. package/test/unit/ngsiv2/general/startup-test.js +2 -1
  253. package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +9 -7
  254. package/test/unit/ngsiv2/lazyAndCommands/command-test.js +13 -12
  255. package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +323 -51
  256. package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +22 -20
  257. package/test/unit/ngsiv2/ngsiService/active-devices-test.js +114 -26
  258. package/test/unit/ngsiv2/ngsiService/autocast-test.js +16 -16
  259. package/test/unit/ngsiv2/ngsiService/geoproperties-test.js +39 -38
  260. package/test/unit/{ngsiService → ngsiv2/ngsiService}/queryDeviceInformationInCb-test.js +25 -54
  261. package/test/unit/ngsiv2/ngsiService/staticAttributes-test.js +5 -5
  262. package/test/unit/ngsiv2/ngsiService/subscriptions-test.js +25 -24
  263. package/test/unit/ngsiv2/plugins/alias-plugin_test.js +22 -22
  264. package/test/unit/ngsiv2/plugins/bidirectional-plugin_test.js +27 -26
  265. package/test/unit/ngsiv2/plugins/compress-timestamp-plugin_test.js +7 -7
  266. package/test/unit/ngsiv2/plugins/event-plugin_test.js +4 -4
  267. package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +549 -24
  268. package/test/unit/ngsiv2/plugins/timestamp-processing-plugin_test.js +4 -4
  269. package/test/unit/{plugins → ngsiv2/plugins}/translation-inPlugins_test.js +25 -25
  270. package/test/unit/{provisioning → ngsiv2/provisioning}/device-group-api-test.js +44 -75
  271. package/test/unit/{provisioning/device-group-utils_test.js → ngsiv2/provisioning/device-group-utils-test.js} +15 -14
  272. package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +74 -73
  273. package/test/unit/ngsiv2/provisioning/device-registration_test.js +20 -19
  274. package/test/unit/ngsiv2/provisioning/device-update-registration_test.js +30 -29
  275. package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +58 -69
  276. package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +8 -7
  277. package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +19 -19
  278. package/test/unit/ngsiv2/provisioning/singleConfigurationMode-test.js +18 -19
  279. package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +49 -52
  280. package/test/unit/plugins/capture-configuration-inPlugins_test.js +6 -4
  281. package/test/unit/plugins/capture-provision-inPlugins_test.js +13 -23
  282. package/.nyc_output/016aca19-69bf-4681-9b41-2835c5131681.json +0 -1
  283. package/.nyc_output/processinfo/016aca19-69bf-4681-9b41-2835c5131681.json +0 -1
  284. package/.nyc_output/processinfo/index.json +0 -1
  285. package/lib/services/devices/devices-NGSI-v1.js +0 -293
  286. package/lib/services/devices/registrationUtils.js_avega +0 -589
  287. package/lib/services/ngsi/entities-NGSI-v1.js +0 -300
  288. package/lib/services/ngsi/subscription-NGSI-v1.js +0 -234
  289. package/lib/services/northBound/contextServer-NGSI-v1.js +0 -526
  290. package/lib/templates/notificationTemplateNgsi1.json +0 -75
  291. package/lib/templates/updateContextNgsi1.json +0 -50
  292. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent1.json +0 -21
  293. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent2.json +0 -21
  294. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent3.json +0 -25
  295. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent4.json +0 -22
  296. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentAttributeUpdates.json +0 -16
  297. package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +0 -21
  298. package/test/unit/examples/contextAvailabilityRequests/registerNewDevice1.json +0 -21
  299. package/test/unit/examples/contextAvailabilityRequests/registerNewDevice2.json +0 -21
  300. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice.json +0 -25
  301. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +0 -21
  302. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +0 -33
  303. package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +0 -33
  304. package/test/unit/examples/contextAvailabilityRequests/unregisterDevice1.json +0 -22
  305. package/test/unit/examples/contextAvailabilityRequests/unregisterDevice3.json +0 -26
  306. package/test/unit/examples/contextAvailabilityRequests/unregisterProvisionedDevice.json +0 -26
  307. package/test/unit/examples/contextAvailabilityRequests/updateCommands1.json +0 -22
  308. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent1.json +0 -22
  309. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent2.json +0 -26
  310. package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent3.json +0 -22
  311. package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Failed.json +0 -8
  312. package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Success.json +0 -4
  313. package/test/unit/examples/contextAvailabilityResponses/registerNewDevice1Success.json +0 -4
  314. package/test/unit/examples/contextAvailabilityResponses/registerNewDevice2Success.json +0 -4
  315. package/test/unit/examples/contextAvailabilityResponses/registerProvisionedDeviceSuccess.json +0 -4
  316. package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Failed.json +0 -8
  317. package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Success.json +0 -4
  318. package/test/unit/examples/contextAvailabilityResponses/updateCommands1Success.json +0 -4
  319. package/test/unit/examples/contextAvailabilityResponses/updateIoTAgent1Success.json +0 -6
  320. package/test/unit/examples/contextProviderResponses/queryInformationResponse.json +0 -22
  321. package/test/unit/examples/contextProviderResponses/queryInformationResponseEmptyAttributes.json +0 -22
  322. package/test/unit/examples/contextProviderResponses/queryInformationStaticAttributesResponse.json +0 -27
  323. package/test/unit/examples/contextProviderResponses/updateInformationResponse.json +0 -22
  324. package/test/unit/examples/contextProviderResponses/updateInformationResponse2.json +0 -22
  325. package/test/unit/examples/contextRequests/contextSubscriptionRequest.json +0 -20
  326. package/test/unit/examples/contextRequests/contextSubscriptionRequest2.json +0 -20
  327. package/test/unit/examples/contextRequests/createBidirectionalDevice.json +0 -17
  328. package/test/unit/examples/contextRequests/createDatetimeProvisionedDevice.json +0 -17
  329. package/test/unit/examples/contextRequests/createGeopointProvisionedDevice.json +0 -17
  330. package/test/unit/examples/contextRequests/createMinimumProvisionedDevice.json +0 -17
  331. package/test/unit/examples/contextRequests/createProvisionedDevice.json +0 -32
  332. package/test/unit/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -32
  333. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroup.json +0 -47
  334. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -52
  335. package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -52
  336. package/test/unit/examples/contextRequests/createTimeinstantDevice.json +0 -17
  337. package/test/unit/examples/contextRequests/queryContext1.json +0 -13
  338. package/test/unit/examples/contextRequests/queryContext2.json +0 -13
  339. package/test/unit/examples/contextRequests/queryContextAliasPlugin1.json +0 -10
  340. package/test/unit/examples/contextRequests/queryContextCompressTimestamp1.json +0 -13
  341. package/test/unit/examples/contextRequests/updateActiveAttributes.json +0 -11
  342. package/test/unit/examples/contextRequests/updateContext1.json +0 -22
  343. package/test/unit/examples/contextRequests/updateContext2.json +0 -22
  344. package/test/unit/examples/contextRequests/updateContext3.json +0 -17
  345. package/test/unit/examples/contextRequests/updateContext3WithStatic.json +0 -22
  346. package/test/unit/examples/contextRequests/updateContext4.json +0 -22
  347. package/test/unit/examples/contextRequests/updateContext5.json +0 -19
  348. package/test/unit/examples/contextRequests/updateContextAliasPlugin.json +0 -22
  349. package/test/unit/examples/contextRequests/updateContextAliasPlugin2.json +0 -17
  350. package/test/unit/examples/contextRequests/updateContextAppendMode.json +0 -22
  351. package/test/unit/examples/contextRequests/updateContextCommandError.json +0 -22
  352. package/test/unit/examples/contextRequests/updateContextCommandExpired.json +0 -22
  353. package/test/unit/examples/contextRequests/updateContextCommandFinish.json +0 -22
  354. package/test/unit/examples/contextRequests/updateContextCommandStatus.json +0 -17
  355. package/test/unit/examples/contextRequests/updateContextCompressTimestamp1.json +0 -22
  356. package/test/unit/examples/contextRequests/updateContextCompressTimestamp2.json +0 -29
  357. package/test/unit/examples/contextRequests/updateContextExpressionPlugin1.json +0 -17
  358. package/test/unit/examples/contextRequests/updateContextExpressionPlugin2.json +0 -27
  359. package/test/unit/examples/contextRequests/updateContextExpressionPlugin3.json +0 -17
  360. package/test/unit/examples/contextRequests/updateContextExpressionPlugin4.json +0 -17
  361. package/test/unit/examples/contextRequests/updateContextExpressionPlugin5.json +0 -27
  362. package/test/unit/examples/contextRequests/updateContextMiddleware1.json +0 -22
  363. package/test/unit/examples/contextRequests/updateContextMultiEntityPlugin3.json +0 -35
  364. package/test/unit/examples/contextRequests/updateContextMultientityPlugin1.json +0 -30
  365. package/test/unit/examples/contextRequests/updateContextMultientityPlugin2.json +0 -30
  366. package/test/unit/examples/contextRequests/updateContextProcessTimestamp1.json +0 -29
  367. package/test/unit/examples/contextRequests/updateContextStaticAttributes.json +0 -22
  368. package/test/unit/examples/contextRequests/updateContextTimestamp.json +0 -41
  369. package/test/unit/examples/contextRequests/updateContextTimestampOverride.json +0 -22
  370. package/test/unit/examples/contextRequests/updateContextTimestampOverrideWithoutMilis.json +0 -22
  371. package/test/unit/examples/contextRequests/updateContextTimestampTimezone.json +0 -41
  372. package/test/unit/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -17
  373. package/test/unit/examples/contextRequests/updateProvisionCommands1.json +0 -27
  374. package/test/unit/examples/contextRequests/updateProvisionDeviceStatic.json +0 -38
  375. package/test/unit/examples/contextRequests/updateProvisionMinimumDevice.json +0 -17
  376. package/test/unit/examples/contextResponses/contextSubscriptionRequest2Success.json +0 -7
  377. package/test/unit/examples/contextResponses/contextSubscriptionRequestSuccess.json +0 -7
  378. package/test/unit/examples/contextResponses/createBidirectionalDeviceSuccess.json +0 -22
  379. package/test/unit/examples/contextResponses/createDatetimeProvisionedDeviceSuccess.json +0 -22
  380. package/test/unit/examples/contextResponses/createGeopointProvisionedDeviceSuccess.json +0 -22
  381. package/test/unit/examples/contextResponses/createProvisionedDeviceSuccess.json +0 -22
  382. package/test/unit/examples/contextResponses/createTimeinstantSuccess.json +0 -22
  383. package/test/unit/examples/contextResponses/queryContext1Success.json +0 -27
  384. package/test/unit/examples/contextResponses/queryContext2Error.json +0 -7
  385. package/test/unit/examples/contextResponses/queryContext2UnknownError.json +0 -6
  386. package/test/unit/examples/contextResponses/queryContext3Error.json +0 -34
  387. package/test/unit/examples/contextResponses/queryContextAliasPlugin1Success.json +0 -27
  388. package/test/unit/examples/contextResponses/queryContextCompressTimestamp1Success.json +0 -27
  389. package/test/unit/examples/contextResponses/updateActiveAttributesSuccess.json +0 -16
  390. package/test/unit/examples/contextResponses/updateContext1Failed.json +0 -7
  391. package/test/unit/examples/contextResponses/updateContext1Success.json +0 -27
  392. package/test/unit/examples/contextResponses/updateContext2Failed.json +0 -35
  393. package/test/unit/examples/contextResponses/updateContextAliasPlugin2Success.json +0 -27
  394. package/test/unit/examples/contextResponses/updateContextAliasPluginSuccess.json +0 -27
  395. package/test/unit/examples/contextResponses/updateContextCommandFinishSuccess.json +0 -27
  396. package/test/unit/examples/contextResponses/updateContextCommandStatusSuccess.json +0 -22
  397. package/test/unit/examples/contextResponses/updateContextCompressTimestamp1Success.json +0 -27
  398. package/test/unit/examples/contextResponses/updateContextCompressTimestamp2Success.json +0 -34
  399. package/test/unit/examples/contextResponses/updateContextEvents1Success.json +0 -27
  400. package/test/unit/examples/contextResponses/updateContextExpressionPlugin1Success.json +0 -22
  401. package/test/unit/examples/contextResponses/updateContextExpressionPlugin2Success.json +0 -22
  402. package/test/unit/examples/contextResponses/updateContextExpressionPlugin3Success.json +0 -22
  403. package/test/unit/examples/contextResponses/updateContextExpressionPlugin5Success.json +0 -32
  404. package/test/unit/examples/contextResponses/updateContextMultientityPlugin1Success.json +0 -40
  405. package/test/unit/examples/contextResponses/updateContextMultientityPlugin2Success.json +0 -40
  406. package/test/unit/examples/contextResponses/updateContextMultientityPlugin3Success.json +0 -40
  407. package/test/unit/examples/contextResponses/updateContextProcessTimestamp1Success.json +0 -27
  408. package/test/unit/examples/contextResponses/updateProvisionActiveAttributes1Success.json +0 -22
  409. package/test/unit/examples/contextResponses/updateProvisionCommands1Success.json +0 -32
  410. package/test/unit/examples/contextResponses/updateProvisionMinimumDeviceSuccess.json +0 -22
  411. package/test/unit/examples/subscriptionRequests/bidirectionalNotification.json +0 -24
  412. package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRemove.json +0 -3
  413. package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +0 -22
  414. package/test/unit/examples/subscriptionRequests/errorNotification.json +0 -24
  415. package/test/unit/examples/subscriptionRequests/simpleNotification.json +0 -24
  416. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRemove.json +0 -3
  417. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest.json +0 -19
  418. package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest1.json +0 -19
  419. package/test/unit/examples/subscriptionResponses/bidirectionalSubscriptionSuccess.json +0 -6
  420. package/test/unit/examples/subscriptionResponses/simpleSubscriptionSuccess.json +0 -6
  421. package/test/unit/expressions/expressionBasedTransformations-test.js +0 -328
  422. package/test/unit/expressions/expressionCombinedTransformations-test.js +0 -306
  423. package/test/unit/expressions/jexlBasedTransformations-test.js +0 -334
  424. package/test/unit/general/contextBrokerOAuthSecurityAccess-test.js +0 -902
  425. package/test/unit/general/https-support-test.js +0 -286
  426. package/test/unit/general/iotam-autoregistration-test.js +0 -368
  427. package/test/unit/lazyAndCommands/active-devices-attribute-update-test.js +0 -168
  428. package/test/unit/lazyAndCommands/command-test.js +0 -341
  429. package/test/unit/lazyAndCommands/lazy-devices-test.js +0 -878
  430. package/test/unit/lazyAndCommands/polling-commands-test.js +0 -421
  431. package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin20.json +0 -25
  432. package/test/unit/ngsiService/active-devices-test.js +0 -692
  433. package/test/unit/ngsiService/staticAttributes-test.js +0 -148
  434. package/test/unit/ngsiService/subscriptions-test.js +0 -345
  435. package/test/unit/plugins/alias-plugin_test.js +0 -158
  436. package/test/unit/plugins/bidirectional-plugin_test.js +0 -564
  437. package/test/unit/plugins/compress-timestamp-plugin_test.js +0 -257
  438. package/test/unit/plugins/event-plugin_test.js +0 -119
  439. package/test/unit/plugins/multientity-plugin_test.js +0 -248
  440. package/test/unit/plugins/timestamp-processing-plugin_test.js +0 -119
  441. package/test/unit/provisioning/device-provisioning-api_test.js +0 -748
  442. package/test/unit/provisioning/device-registration_test.js +0 -432
  443. package/test/unit/provisioning/device-update-registration_test.js +0 -326
  444. package/test/unit/provisioning/listProvisionedDevices-test.js +0 -488
  445. package/test/unit/provisioning/provisionDeviceMultientity-test.js +0 -123
  446. package/test/unit/provisioning/removeProvisionedDevice-test.js +0 -244
  447. package/test/unit/provisioning/singleConfigurationMode-test.js +0 -346
  448. package/test/unit/provisioning/updateProvisionedDevices-test.js +0 -436
@@ -54,7 +54,6 @@ const attributeList = [
54
54
  'transport',
55
55
  'polling',
56
56
  'timestamp',
57
- 'autoprovision',
58
57
  'explicitAttrs',
59
58
  'expressionLanguage',
60
59
  'ngsiVersion'
@@ -188,26 +187,11 @@ function listDevices(type, service, subservice, limit, offset, callback) {
188
187
  });
189
188
  }
190
189
 
191
- /**
192
- * Internal function used to find a device in the DB.
193
- *
194
- * @param {String} id ID of the Device to find.
195
- * @param {String} service Service the device belongs to (optional).
196
- * @param {String} subservice Division inside the service (optional).
197
- */
198
- function getDeviceById(id, service, subservice, callback) {
199
- const queryParams = {
200
- id,
201
- service,
202
- subservice
203
- };
204
- context = fillService(context, queryParams);
205
- logger.debug(context, 'Looking for device with id [%s].', id);
206
-
190
+ function findOneInMongoDB(queryParams, id, callback) {
207
191
  const query = Device.model.findOne(queryParams);
208
192
  query.select({ __v: 0 });
209
193
 
210
- query.exec(function handleGet(error, data) {
194
+ query.lean().exec(function handleGet(error, data) {
211
195
  if (error) {
212
196
  logger.debug(context, 'Internal MongoDB Error getting device: %s', error);
213
197
 
@@ -224,6 +208,24 @@ function getDeviceById(id, service, subservice, callback) {
224
208
  });
225
209
  }
226
210
 
211
+ /**
212
+ * Internal function used to find a device in the DB.
213
+ *
214
+ * @param {String} id ID of the Device to find.
215
+ * @param {String} service Service the device belongs to (optional).
216
+ * @param {String} subservice Division inside the service (optional).
217
+ */
218
+ function getDeviceById(id, service, subservice, callback) {
219
+ const queryParams = {
220
+ id,
221
+ service,
222
+ subservice
223
+ };
224
+ context = fillService(context, queryParams);
225
+ logger.debug(context, 'Looking for device with id [%s].', id);
226
+ findOneInMongoDB(queryParams, id, callback);
227
+ }
228
+
227
229
  /**
228
230
  * Retrieves a device using it ID, converting it to a plain Object before calling the callback.
229
231
  *
@@ -236,7 +238,7 @@ function getDevice(id, service, subservice, callback) {
236
238
  if (error) {
237
239
  callback(error);
238
240
  } else {
239
- callback(null, data.toObject());
241
+ callback(null, data);
240
242
  }
241
243
  });
242
244
  }
@@ -253,13 +255,13 @@ function getByName(name, service, servicepath, callback) {
253
255
 
254
256
  query.select({ __v: 0 });
255
257
 
256
- query.exec(function handleGet(error, data) {
258
+ query.lean().exec(function handleGet(error, data) {
257
259
  if (error) {
258
260
  logger.debug(context, 'Internal MongoDB Error getting device: %s', error);
259
261
 
260
262
  callback(new errors.InternalDbError(error));
261
263
  } else if (data) {
262
- callback(null, data.toObject());
264
+ callback(null, data);
263
265
  } else {
264
266
  logger.debug(context, 'Device [%s] not found.', name);
265
267
 
@@ -284,8 +286,10 @@ function update(device, callback) {
284
286
  data.active = device.active;
285
287
  data.internalId = device.internalId;
286
288
  data.staticAttributes = device.staticAttributes;
289
+ data.internalAttributes = device.internalAttributes;
287
290
  data.commands = device.commands;
288
291
  data.endpoint = device.endpoint;
292
+ data.polling = device.polling;
289
293
  data.name = device.name;
290
294
  data.type = device.type;
291
295
  data.apikey = device.apikey;
@@ -293,7 +297,10 @@ function update(device, callback) {
293
297
  data.explicitAttrs = device.explicitAttrs;
294
298
  data.ngsiVersion = device.ngsiVersion;
295
299
 
296
- data.save(saveDeviceHandler(callback));
300
+ /* eslint-disable-next-line new-cap */
301
+ const deviceObj = new Device.model(data);
302
+ deviceObj.isNew = false;
303
+ deviceObj.save(saveDeviceHandler(callback));
297
304
  }
298
305
  });
299
306
  }
@@ -54,14 +54,11 @@ function init() {
54
54
  case 'ld':
55
55
  deviceHandler = require('./devices-NGSI-LD');
56
56
  break;
57
- case 'v2':
58
- deviceHandler = require('./devices-NGSI-v2');
59
- break;
60
57
  case 'mixed':
61
58
  deviceHandler = require('./devices-NGSI-mixed');
62
59
  break;
63
60
  default:
64
- deviceHandler = require('./devices-NGSI-v1');
61
+ deviceHandler = require('./devices-NGSI-v2');
65
62
  }
66
63
  }
67
64
 
@@ -172,6 +169,12 @@ function mergeDeviceWithConfiguration(fields, defaults, deviceData, configuratio
172
169
  if (configuration && configuration.ngsiVersion) {
173
170
  deviceData.ngsiVersion = configuration.ngsiVersion;
174
171
  }
172
+ if (configuration && configuration.expressionLanguage && deviceData.expressionLanguage === undefined) {
173
+ deviceData.expressionLanguage = configuration.expressionLanguage;
174
+ }
175
+ if (configuration && configuration.explicitAttrs !== undefined && deviceData.explicitAttrs === undefined) {
176
+ deviceData.explicitAttrs = configuration.explicitAttrs;
177
+ }
175
178
 
176
179
  logger.debug(context, 'deviceData after merge with conf: %j', deviceData);
177
180
  callback(null, deviceData);
@@ -184,6 +187,16 @@ function mergeDeviceWithConfiguration(fields, defaults, deviceData, configuratio
184
187
  * @param {Object} deviceObj Device data.
185
188
  */
186
189
  function findConfigurationGroup(deviceObj, callback) {
190
+ function handlerGroupFindByType(error, group) {
191
+ if (!group) {
192
+ config
193
+ .getGroupRegistry()
194
+ .findSilently(deviceObj.service, deviceObj.subservice, deviceObj.apikey, handlerGroupFind);
195
+ } else {
196
+ handlerGroupFind(error, group);
197
+ }
198
+ }
199
+
187
200
  function handlerGroupFind(error, group) {
188
201
  let effectiveGroup = group;
189
202
 
@@ -201,13 +214,7 @@ function findConfigurationGroup(deviceObj, callback) {
201
214
  } else {
202
215
  config
203
216
  .getGroupRegistry()
204
- .findTypeSilently(
205
- deviceObj.service,
206
- deviceObj.subservice,
207
- deviceObj.type,
208
- deviceObj.apikey,
209
- handlerGroupFind
210
- );
217
+ .findTypeSilently(deviceObj.service, deviceObj.subservice, deviceObj.type, deviceObj.apikey, handlerGroupFindByType);
211
218
  }
212
219
  }
213
220
 
@@ -225,14 +232,19 @@ function findConfigurationGroup(deviceObj, callback) {
225
232
  */
226
233
  function registerDevice(deviceObj, callback) {
227
234
  function checkDuplicates(deviceObj, innerCb) {
228
- /* eslint-disable-next-line no-unused-vars */
229
- config.getRegistry().get(deviceObj.id, deviceObj.service, deviceObj.subservice, function (error, device) {
230
- if (!error) {
231
- innerCb(new errors.DuplicateDeviceId(deviceObj.id));
232
- } else {
233
- innerCb();
235
+ config.getRegistry().getSilently(
236
+ deviceObj.id,
237
+ deviceObj.service,
238
+ deviceObj.subservice,
239
+ /* eslint-disable-next-line no-unused-vars */
240
+ function (error, device) {
241
+ if (!error) {
242
+ innerCb(new errors.DuplicateDeviceId(deviceObj.id));
243
+ } else {
244
+ innerCb();
245
+ }
234
246
  }
235
- });
247
+ );
236
248
  }
237
249
 
238
250
  function prepareDeviceData(deviceObj, configuration, callback) {
@@ -262,17 +274,22 @@ function registerDevice(deviceObj, callback) {
262
274
  }
263
275
 
264
276
  if (!deviceData.name) {
265
- var conjunction;
277
+ let conjunction;
266
278
  if (configuration && configuration.defaultEntityNameConjunction !== undefined) {
267
- conjunction = configuration.defaultEntityNameConjunction;
279
+ conjunction = configuration.defaultEntityNameConjunction;
268
280
  } else {
269
281
  conjunction = config.getConfig().defaultEntityNameConjunction;
270
282
  }
271
283
  deviceData.name = deviceData.type + conjunction + deviceData.id;
272
284
  if (config.checkNgsiLD(configuration)) {
273
285
  deviceData.name = 'urn:ngsi-ld:' + deviceData.type + conjunction + deviceData.id;
274
- }
275
- logger.debug(context, 'Device name not found, falling back to deviceType%sdeviceId [%s]', conjunction, deviceData.name);
286
+ }
287
+ logger.debug(
288
+ context,
289
+ 'Device name not found, falling back to deviceType%sdeviceId [%s]',
290
+ conjunction,
291
+ deviceData.name
292
+ );
276
293
  }
277
294
 
278
295
  if (!configuration && config.getConfig().types[deviceData.type]) {
@@ -310,9 +327,6 @@ function registerDevice(deviceObj, callback) {
310
327
  if ('timestamp' in deviceData && deviceData.timestamp !== undefined) {
311
328
  deviceObj.timestamp = deviceData.timestamp;
312
329
  }
313
- if ('autoprovision' in deviceData && deviceData.autoprovision !== undefined) {
314
- deviceObj.autoprovision = deviceData.autoprovision;
315
- }
316
330
  if ('explicitAttrs' in deviceData && deviceData.explicitAttrs !== undefined) {
317
331
  deviceObj.explicitAttrs = deviceData.explicitAttrs;
318
332
  }
@@ -402,8 +416,8 @@ function unregisterDevice(id, service, subservice, callback) {
402
416
  });
403
417
  }
404
418
 
405
- function updateRegisterDevice(deviceObj, callback) {
406
- deviceHandler.updateRegisterDevice(deviceObj, callback);
419
+ function updateRegisterDevice(deviceObj, entityInfoUpdated, callback) {
420
+ deviceHandler.updateRegisterDevice(deviceObj, entityInfoUpdated, callback);
407
421
  }
408
422
 
409
423
  /**
@@ -552,15 +566,24 @@ function findOrCreate(deviceId, group, callback) {
552
566
  if ('timestamp' in group && group.timestamp !== undefined) {
553
567
  newDevice.timestamp = group.timestamp;
554
568
  }
555
- if ('autoprovision' in group && group.autoprovision !== undefined) {
556
- newDevice.autoprovision = group.autoprovision;
557
- }
558
569
  if ('ngsiVersion' in group && group.ngsiVersion !== undefined) {
559
570
  newDevice.ngsiVersion = group.ngsiVersion;
560
571
  }
561
- registerDevice(newDevice, function (error, device) {
562
- callback(error, device, group);
563
- });
572
+ if ('explicitAttrs' in group && group.explicitAttrs !== undefined) {
573
+ newDevice.explicitAttrs = group.explicitAttrs;
574
+ }
575
+ if ('expressionLanguage' in group && group.expressionLanguage !== undefined) {
576
+ newDevice.expressionLanguage = group.expressionLanguage;
577
+ }
578
+ // Check autoprovision flag in order to register or not device
579
+ if (group.autoprovision === undefined || group.autoprovision === true) {
580
+ registerDevice(newDevice, function (error, device) {
581
+ callback(error, device, group);
582
+ });
583
+ } else {
584
+ logger.info(context, 'Device %j not provisioned due autoprovision is disabled by its conf %j', newDevice, group);
585
+ callback(new errors.DeviceNotFound(deviceId));
586
+ }
564
587
  } else {
565
588
  callback(error);
566
589
  }
@@ -23,7 +23,7 @@
23
23
  * Modified by: Jason Fox - FIWARE Foundation
24
24
  */
25
25
 
26
- const request = require('request');
26
+ const request = require('../../request-shim');
27
27
  const async = require('async');
28
28
  const apply = async.apply;
29
29
  const constants = require('../../constants');
@@ -275,7 +275,7 @@ function updateEntityNgsiLD(deviceData, updatedDevice, callback) {
275
275
  *
276
276
  * @param {Object} deviceObj Object with all the device information (mandatory).
277
277
  */
278
- function updateRegisterDeviceNgsiLD(deviceObj, callback) {
278
+ function updateRegisterDeviceNgsiLD(deviceObj, entityInfoUpdated, callback) {
279
279
  if (!deviceObj.id || !deviceObj.type) {
280
280
  callback(new errors.MissingAttributes('Id or device missing'));
281
281
  return;
@@ -350,21 +350,49 @@ function updateRegisterDeviceNgsiLD(deviceObj, callback) {
350
350
  deviceData.commands = getAttributeDifference(oldDevice.commands, newDevice.commands);
351
351
  deviceData.staticAttributes = getAttributeDifference(oldDevice.staticAttributes, newDevice.staticAttributes);
352
352
 
353
+ if (entityInfoUpdated) {
354
+ jsonConcat(deviceData.active, oldDevice.active);
355
+ jsonConcat(deviceData.lazy, oldDevice.lazy);
356
+ jsonConcat(deviceData.commands, oldDevice.commands);
357
+ jsonConcat(deviceData.staticAttributes, oldDevice.staticAttributes);
358
+ if (oldDevice.name !== newDevice.name) {
359
+ deviceData.name = newDevice.name;
360
+ }
361
+ if (oldDevice.type !== newDevice.type) {
362
+ deviceData.type = newDevice.type;
363
+ }
364
+ }
365
+
353
366
  callback(null, deviceData, oldDevice);
354
367
  }
355
368
 
356
- async.waterfall(
357
- [
358
- apply(config.getRegistry().get, deviceObj.id, deviceObj.service, deviceObj.subservice),
359
- apply(extractDeviceDifference, deviceObj),
360
- updateEntityNgsiLD,
361
- apply(combineWithNewDevice, deviceObj),
362
- apply(registrationUtils.sendRegistrations, false),
363
- apply(registrationUtils.processContextRegistration, deviceObj),
364
- config.getRegistry().update
365
- ],
366
- callback
367
- );
369
+ if (entityInfoUpdated) {
370
+ async.waterfall(
371
+ [
372
+ apply(config.getRegistry().get, deviceObj.id, deviceObj.service, deviceObj.subservice),
373
+ apply(extractDeviceDifference, deviceObj),
374
+ createInitialEntityNgsiLD,
375
+ apply(combineWithNewDevice, deviceObj),
376
+ apply(registrationUtils.sendRegistrations, false),
377
+ apply(registrationUtils.processContextRegistration, deviceObj),
378
+ config.getRegistry().update
379
+ ],
380
+ callback
381
+ );
382
+ } else {
383
+ async.waterfall(
384
+ [
385
+ apply(config.getRegistry().get, deviceObj.id, deviceObj.service, deviceObj.subservice),
386
+ apply(extractDeviceDifference, deviceObj),
387
+ updateEntityNgsiLD,
388
+ apply(combineWithNewDevice, deviceObj),
389
+ apply(registrationUtils.sendRegistrations, false),
390
+ apply(registrationUtils.processContextRegistration, deviceObj),
391
+ config.getRegistry().update
392
+ ],
393
+ callback
394
+ );
395
+ }
368
396
  }
369
397
 
370
398
  exports.createInitialEntity = createInitialEntityNgsiLD;
@@ -53,11 +53,11 @@ function createInitialEntityNgsiMixed(deviceData, newDevice, callback) {
53
53
  *
54
54
  * @param {Object} deviceObj Object with all the device information (mandatory).
55
55
  */
56
- function updateRegisterDeviceNgsiMixed(deviceObj, callback) {
56
+ function updateRegisterDeviceNgsiMixed(deviceObj, entityInfoUpdated, callback) {
57
57
  if (config.checkNgsiLD(deviceObj)) {
58
- deviceHandlerLD.updateRegisterDevice(deviceObj, callback);
58
+ deviceHandlerLD.updateRegisterDevice(deviceObj, entityInfoUpdated, callback);
59
59
  } else {
60
- deviceHandlerV2.updateRegisterDevice(deviceObj, callback);
60
+ deviceHandlerV2.updateRegisterDevice(deviceObj, entityInfoUpdated, callback);
61
61
  }
62
62
  }
63
63
 
@@ -27,7 +27,7 @@
27
27
 
28
28
  /* eslint-disable consistent-return */
29
29
 
30
- const request = require('request');
30
+ const request = require('../../request-shim');
31
31
  const async = require('async');
32
32
  const apply = async.apply;
33
33
  const uuid = require('uuid');
@@ -94,7 +94,7 @@ function createInitialEntityHandlerNgsi2(deviceData, newDevice, callback) {
94
94
  body
95
95
  );
96
96
 
97
- const errorObj = new errors.EntityGenericError(deviceData.id, deviceData.type, body);
97
+ const errorObj = new errors.EntityGenericError(deviceData.id, deviceData.type, body, response.statusCode);
98
98
 
99
99
  callback(errorObj);
100
100
  }
@@ -112,11 +112,7 @@ function createInitialEntityHandlerNgsi2(deviceData, newDevice, callback) {
112
112
  function updateEntityHandlerNgsi2(deviceData, updatedDevice, callback) {
113
113
  return function handleEntityResponse(error, response, body) {
114
114
  if (error) {
115
- logger.error(
116
- context,
117
- 'ORION-001: Connection error creating inital entity in the Context Broker: %s',
118
- error
119
- );
115
+ logger.error(context, 'ORION-001: Connection error updating entity in the Context Broker: %s', error);
120
116
 
121
117
  alarms.raise(constants.ORION_ALARM, error);
122
118
 
@@ -133,7 +129,7 @@ function updateEntityHandlerNgsi2(deviceData, updatedDevice, callback) {
133
129
  body
134
130
  );
135
131
 
136
- const errorObj = new errors.EntityGenericError(deviceData.id, deviceData.type, body);
132
+ const errorObj = new errors.EntityGenericError(deviceData.id, deviceData.type, body, response.statusCode);
137
133
 
138
134
  callback(errorObj);
139
135
  }
@@ -335,7 +331,7 @@ function updateEntityNgsi2(deviceData, updatedDevice, callback) {
335
331
  *
336
332
  * @param {Object} deviceObj Object with all the device information (mandatory).
337
333
  */
338
- function updateRegisterDeviceNgsi2(deviceObj, callback) {
334
+ function updateRegisterDeviceNgsi2(deviceObj, entityInfoUpdated, callback) {
339
335
  if (!deviceObj.id || !deviceObj.type) {
340
336
  callback(new errors.MissingAttributes('Id or device missing'));
341
337
  return;
@@ -357,12 +353,12 @@ function updateRegisterDeviceNgsi2(deviceObj, callback) {
357
353
  if ('timestamp' in newDevice && newDevice.timestamp !== undefined) {
358
354
  oldDevice.timestamp = newDevice.timestamp;
359
355
  }
360
- if ('autoprovision' in newDevice && newDevice.autoprovision !== undefined) {
361
- oldDevice.autoprovision = newDevice.autoprovision;
362
- }
363
356
  if ('explicitAttrs' in newDevice && newDevice.explicitAttrs !== undefined) {
364
357
  oldDevice.explicitAttrs = newDevice.explicitAttrs;
365
358
  }
359
+ if ('expressionLanguage' in newDevice && newDevice.expressionLanguage !== undefined) {
360
+ oldDevice.expressionLanguage = newDevice.expressionLanguage;
361
+ }
366
362
 
367
363
  oldDevice.endpoint = newDevice.endpoint || oldDevice.endpoint;
368
364
 
@@ -410,21 +406,49 @@ function updateRegisterDeviceNgsi2(deviceObj, callback) {
410
406
  deviceData.commands = getAttributeDifference(oldDevice.commands, newDevice.commands);
411
407
  deviceData.staticAttributes = getAttributeDifference(oldDevice.staticAttributes, newDevice.staticAttributes);
412
408
 
409
+ if (entityInfoUpdated) {
410
+ jsonConcat(deviceData.active, oldDevice.active);
411
+ jsonConcat(deviceData.lazy, oldDevice.lazy);
412
+ jsonConcat(deviceData.commands, oldDevice.commands);
413
+ jsonConcat(deviceData.staticAttributes, oldDevice.staticAttributes);
414
+ if (oldDevice.name !== newDevice.name) {
415
+ deviceData.name = newDevice.name;
416
+ }
417
+ if (oldDevice.type !== newDevice.type) {
418
+ deviceData.type = newDevice.type;
419
+ }
420
+ }
421
+
413
422
  callback(null, deviceData, oldDevice);
414
423
  }
415
424
 
416
- async.waterfall(
417
- [
418
- apply(config.getRegistry().get, deviceObj.id, deviceObj.service, deviceObj.subservice),
419
- apply(extractDeviceDifference, deviceObj),
420
- updateEntityNgsi2,
421
- apply(combineWithNewDevice, deviceObj),
422
- apply(registrationUtils.sendRegistrations, false),
423
- apply(registrationUtils.processContextRegistration, deviceObj),
424
- config.getRegistry().update
425
- ],
426
- callback
427
- );
425
+ if (entityInfoUpdated) {
426
+ async.waterfall(
427
+ [
428
+ apply(config.getRegistry().get, deviceObj.id, deviceObj.service, deviceObj.subservice),
429
+ apply(extractDeviceDifference, deviceObj),
430
+ createInitialEntityNgsi2,
431
+ apply(combineWithNewDevice, deviceObj),
432
+ apply(registrationUtils.sendRegistrations, false),
433
+ apply(registrationUtils.processContextRegistration, deviceObj),
434
+ config.getRegistry().update
435
+ ],
436
+ callback
437
+ );
438
+ } else {
439
+ async.waterfall(
440
+ [
441
+ apply(config.getRegistry().get, deviceObj.id, deviceObj.service, deviceObj.subservice),
442
+ apply(extractDeviceDifference, deviceObj),
443
+ updateEntityNgsi2,
444
+ apply(combineWithNewDevice, deviceObj),
445
+ apply(registrationUtils.sendRegistrations, false),
446
+ apply(registrationUtils.processContextRegistration, deviceObj),
447
+ config.getRegistry().update
448
+ ],
449
+ callback
450
+ );
451
+ }
428
452
  }
429
453
 
430
454
  exports.createInitialEntity = createInitialEntityNgsi2;
@@ -31,7 +31,6 @@ const logger = require('logops');
31
31
  const _ = require('underscore');
32
32
  const intoTrans = require('../common/domain').intoTrans;
33
33
  const config = require('../../commonConfig');
34
- const ngsiUtils = require('./../ngsi/ngsiUtils');
35
34
  const context = {
36
35
  op: 'IoTAgentNGSI.Registration'
37
36
  };
@@ -40,45 +39,6 @@ const utils = require('../northBound/restUtils');
40
39
 
41
40
  const NGSI_LD_URN = 'urn:ngsi-ld:';
42
41
 
43
- /**
44
- * Generates a handler for the registration requests that checks all the possible errors derived from the registration.
45
- * The parameter information is needed in order to fulfill error information.
46
- *
47
- * @param {Boolen} unregister Indicates whether this registration is an unregistration or register.
48
- * @param {Object} deviceData Object containing all the deviceData needed to send the registration.
49
- * @return {Function} The generated handler.
50
- */
51
- function createRegistrationHandler(unregister, deviceData, callback) {
52
- return function handleRegistrationResponse(error, response, body) {
53
- if (error) {
54
- logger.error(context, 'ORION-002: Connection error sending registrations to the Context Broker: %s', error);
55
- callback(error);
56
- } else if (response && body && response.statusCode === 200) {
57
- const errorField = ngsiUtils.getErrorField(body);
58
-
59
- if (errorField) {
60
- logger.error(context, 'Registration error connecting to the Context Broker: %j', errorField);
61
- callback(new errors.BadRequest(JSON.stringify(errorField)));
62
- } else {
63
- logger.debug(context, 'Registration success.');
64
- callback(null, body);
65
- }
66
- } else {
67
- let errorObj;
68
-
69
- logger.error(context, 'ORION-003: Protocol error connecting to the Context Broker: %j', errorObj);
70
-
71
- if (unregister) {
72
- errorObj = new errors.UnregistrationError(deviceData.id, deviceData.type);
73
- } else {
74
- errorObj = new errors.RegistrationError(deviceData.id, deviceData.type);
75
- }
76
-
77
- callback(errorObj);
78
- }
79
- };
80
- }
81
-
82
42
  /**
83
43
  * Generates a handler for the registration requests that checks all the possible errors derived from the registration.
84
44
  * The parameter information is needed in order to fulfill error information.
@@ -161,93 +121,6 @@ function createRegistrationHandlerNgsi2(unregister, deviceData, callback) {
161
121
  };
162
122
  }
163
123
 
164
- /**
165
- * Sends a Context Provider registration or unregistration request to the Context Broker using NGSIv1.
166
- * As registrations cannot be removed, an unregistration consists of an update of the existent registration
167
- * to make reduce its duration to 1 second.
168
- *
169
- * The entity type, entity name and lazy attributes list are needed in order to send the registration:
170
- *
171
- * @param {Boolen} unregister Indicates whether this registration is an unregistration or register.
172
- * @param {Object} deviceData Object containing all the deviceData needed to send the registration.
173
- */
174
- function sendRegistrationsNgsi1(unregister, deviceData, callback) {
175
- let cbHost = config.getConfig().contextBroker.url;
176
- if (deviceData.cbHost && deviceData.cbHost.indexOf('://') !== -1) {
177
- cbHost = deviceData.cbHost;
178
- } else if (deviceData.cbHost && deviceData.cbHost.indexOf('://') === -1) {
179
- cbHost = 'http://' + deviceData.cbHost;
180
- }
181
-
182
- const options = {
183
- url: cbHost + '/NGSI9/registerContext',
184
- method: 'POST',
185
- json: {
186
- contextRegistrations: [
187
- {
188
- entities: [
189
- {
190
- type: deviceData.type,
191
- isPattern: 'false',
192
- id: String(deviceData.name)
193
- }
194
- ],
195
- attributes: [],
196
- providingApplication: config.getConfig().providerUrl
197
- }
198
- ],
199
- duration: unregister ? 'PT1S' : config.getConfig().deviceRegistrationDuration
200
- },
201
- headers: {
202
- 'fiware-service': deviceData.service,
203
- 'fiware-servicepath': deviceData.subservice
204
- }
205
- };
206
-
207
- function formatAttributes(originalVector) {
208
- const attributeList = [];
209
-
210
- if (originalVector && originalVector.length) {
211
- for (let i = 0; i < originalVector.length; i++) {
212
- attributeList.push({
213
- name: originalVector[i].name,
214
- type: originalVector[i].type
215
- });
216
- }
217
- }
218
-
219
- return attributeList;
220
- }
221
-
222
- function mergeWithSameName(old, current) {
223
- const keys = _.pluck(old, 'name');
224
-
225
- if (keys.indexOf(current.name) < 0) {
226
- old.push(current);
227
- }
228
-
229
- return old;
230
- }
231
-
232
- if (deviceData.registrationId) {
233
- options.json.registrationId = deviceData.registrationId;
234
- }
235
-
236
- options.json.contextRegistrations[0].attributes = options.json.contextRegistrations[0].attributes
237
- .concat(formatAttributes(deviceData.lazy), formatAttributes(deviceData.commands))
238
- .reduce(mergeWithSameName, []);
239
-
240
- if (options.json.contextRegistrations[0].attributes.length === 0) {
241
- logger.debug(context, 'No Context Provider registrations found for unregister');
242
- callback(null, deviceData);
243
- } else {
244
- logger.debug(context, 'Sending v1 device registrations to Context Broker at [%s]', options.url);
245
- logger.debug(context, 'Using the following request:\n\n%s\n\n', JSON.stringify(options, null, 4));
246
-
247
- utils.executeWithSecurity(options, deviceData, createRegistrationHandler(unregister, deviceData, callback));
248
- }
249
- }
250
-
251
124
  /**
252
125
  * Sends a Context Provider unregistration request to the Context Broker using NGSIv2.
253
126
  *
@@ -263,7 +136,6 @@ function sendUnregistrationsNgsi2(deviceData, callback) {
263
136
  const options = {
264
137
  url: cbHost + '/v2/registrations/' + deviceData.registrationId,
265
138
  method: 'DELETE',
266
- json: true,
267
139
  headers: {
268
140
  'fiware-service': deviceData.service,
269
141
  'fiware-servicepath': deviceData.subservice
@@ -304,7 +176,6 @@ function sendUnregistrationsNgsiLD(deviceData, callback) {
304
176
  const options = {
305
177
  url: cbHost + '/ngsi-ld/v1/csourceRegistrations/' + deviceData.registrationId,
306
178
  method: 'DELETE',
307
- json: true,
308
179
  headers: {
309
180
  'fiware-service': deviceData.service,
310
181
  'fiware-servicepath': deviceData.subservice,
@@ -469,7 +340,6 @@ function sendRegistrationsNgsiLD(unregister, deviceData, callback) {
469
340
  logger.debug(context, 'Amending id to a valid URN: %s', id);
470
341
  }
471
342
 
472
-
473
343
  const options = {
474
344
  url: cbHost + '/ngsi-ld/v1/csourceRegistrations/',
475
345
  method: 'POST',
@@ -514,11 +384,9 @@ function sendRegistrations(unregister, deviceData, callback) {
514
384
  case 'ld':
515
385
  sendRegistrationsNgsiLD(unregister, deviceData, callback);
516
386
  break;
517
- case 'v2':
387
+ default:
518
388
  sendRegistrationsNgsi2(unregister, deviceData, callback);
519
389
  break;
520
- default:
521
- sendRegistrationsNgsi1(unregister, deviceData, callback);
522
390
  }
523
391
  }
524
392
 
@@ -540,5 +408,4 @@ function processContextRegistration(deviceData, body, callback) {
540
408
  }
541
409
 
542
410
  exports.sendRegistrations = intoTrans(context, sendRegistrations);
543
- exports.createRegistrationHandler = intoTrans(context, createRegistrationHandler);
544
411
  exports.processContextRegistration = processContextRegistration;