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
@@ -27,21 +27,24 @@
27
27
 
28
28
  /* eslint-disable consistent-return */
29
29
 
30
- const request = require('request');
30
+ const request = require('../../request-shim');
31
31
  const statsService = require('./../stats/statsRegistry');
32
32
  const async = require('async');
33
33
  const apply = async.apply;
34
34
  const alarms = require('../common/alarmManagement');
35
35
  const errors = require('../../errors');
36
36
  const utils = require('../northBound/restUtils');
37
+ const pluginUtils = require('../../plugins/pluginUtils');
37
38
  const config = require('../../commonConfig');
38
39
  const constants = require('../../constants');
40
+ const jexlParser = require('../../plugins/jexlParser');
39
41
  const moment = require('moment-timezone');
40
42
  const NGSIUtils = require('./ngsiUtils');
41
43
  const logger = require('logops');
42
44
  const context = {
43
45
  op: 'IoTAgentNGSI.Entities-v2'
44
46
  };
47
+ const _ = require('underscore');
45
48
 
46
49
  /**
47
50
  * Amends an NGSIv2 Geoattribute from String to GeoJSON format
@@ -234,15 +237,13 @@ function generateNGSI2OperationHandler(operationName, entityName, typeInformatio
234
237
 
235
238
  logger.error(context, 'Operation ' + operationName + ' error connecting to the Context Broker: %j', body);
236
239
 
237
- const errorField = NGSIUtils.getErrorField(body);
238
- if (
239
- response.statusCode &&
240
- response.statusCode === 404 &&
241
- errorField.details.includes(typeInformation.type)
242
- ) {
240
+ let errorField = body.error;
241
+ if (body.description) {
242
+ errorField += ':' + body.description;
243
+ }
244
+
245
+ if (errorField !== undefined) {
243
246
  callback(new errors.DeviceNotFound(entityName));
244
- } else if (errorField.code && errorField.code === '404') {
245
- callback(new errors.AttributeNotFound());
246
247
  } else {
247
248
  callback(new errors.EntityGenericError(entityName, typeInformation.type, body));
248
249
  }
@@ -292,7 +293,6 @@ function sendQueryValueNgsi2(entityName, attributes, typeInformation, token, cal
292
293
 
293
294
  const options = NGSIUtils.createRequestObject(url, typeInformation, token);
294
295
  options.method = 'GET';
295
- options.json = true;
296
296
 
297
297
  if (!typeInformation || !typeInformation.type) {
298
298
  callback(new errors.TypeNotFound(null, entityName));
@@ -314,6 +314,92 @@ function sendQueryValueNgsi2(entityName, attributes, typeInformation, token, cal
314
314
  );
315
315
  }
316
316
 
317
+ /**
318
+ * Remove id, type and any hidden attrs after processing
319
+ *
320
+ * @param {Object} enities Unprocessed entities
321
+ * @param {Object} typeInformation Configuration information for the device.
322
+ */
323
+ function removeHiddenAttrsFromMultiEntity(entities, typeInformation) {
324
+ var explicitAttrsList = [];
325
+ if (typeInformation.explicitAttrs) {
326
+ explicitAttrsList.push('type');
327
+ explicitAttrsList.push('id');
328
+ if (typeof typeInformation.explicitAttrs === 'boolean') {
329
+ if (typeInformation.timestamp) {
330
+ explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
331
+ }
332
+
333
+ if (typeInformation.active) {
334
+ typeInformation.active.forEach((attr) => {
335
+ explicitAttrsList.push(attr.name);
336
+ });
337
+ }
338
+ if (typeInformation.staticAttributes) {
339
+ typeInformation.staticAttributes.forEach((attr) => {
340
+ explicitAttrsList.push(attr.name);
341
+ });
342
+ }
343
+ } else if (typeof typeInformation.explicitAttrs === 'string') {
344
+ entities.forEach((entity) => {
345
+ const attsArray = pluginUtils.extractAttributesArrayFromNgsi2Entity(entity);
346
+ const ctx = jexlParser.extractContext(attsArray);
347
+ const res = jexlParser.applyExpression(typeInformation.explicitAttrs, ctx, typeInformation);
348
+ explicitAttrsList = explicitAttrsList.concat(res);
349
+ });
350
+ }
351
+ }
352
+ if (explicitAttrsList.length > 0) {
353
+ logger.debug(context, 'removeHiddenAttrsFromMultiEntity %s', explicitAttrsList);
354
+ entities.forEach((entity) => {
355
+ const hidden = _.difference(_.keys(entity), explicitAttrsList);
356
+ hidden.forEach((attr) => {
357
+ delete entity[attr];
358
+ });
359
+ });
360
+ }
361
+ return entities;
362
+ }
363
+ /**
364
+ * Remove id, type and any hidden attrs after processing
365
+ *
366
+ * @param {Object} result An Unprocessed entity
367
+ * @param {Object} typeInformation Configuration information for the device.
368
+ */
369
+ function removeHiddenAttrs(result, typeInformation) {
370
+ delete result.id;
371
+ delete result.type;
372
+ var explicitAttrsList = [];
373
+ if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'boolean') {
374
+ if (typeInformation.timestamp) {
375
+ explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
376
+ }
377
+ if (typeInformation.active) {
378
+ typeInformation.active.forEach((attr) => {
379
+ explicitAttrsList.push(attr.name);
380
+ });
381
+ }
382
+ if (typeInformation.staticAttributes) {
383
+ typeInformation.staticAttributes.forEach((attr) => {
384
+ explicitAttrsList.push(attr.name);
385
+ });
386
+ }
387
+ } else if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'string') {
388
+ const attsArray = pluginUtils.extractAttributesArrayFromNgsi2Entity(result);
389
+ const ctx = jexlParser.extractContext(attsArray);
390
+ const res = jexlParser.applyExpression(typeInformation.explicitAttrs, ctx, typeInformation);
391
+ explicitAttrsList = res;
392
+ }
393
+ if (explicitAttrsList.length > 0) {
394
+ logger.debug(context, 'removeHiddenAttrs %s', explicitAttrsList);
395
+ const hidden = _.difference(_.keys(result), explicitAttrsList);
396
+ hidden.forEach((attr) => {
397
+ delete result[attr];
398
+ });
399
+ }
400
+ return result;
401
+ }
402
+
317
403
  /**
318
404
  * Makes an update in the Device's entity in the context broker, with the values given in the 'attributes' array. This
319
405
  * array should comply to the NGSIv2's attribute format.
@@ -328,7 +414,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
328
414
 
329
415
  let url = '/v2/entities/' + entityName + '/attrs';
330
416
 
331
- if (typeInformation.type) {
417
+ if (typeInformation && typeInformation.type) {
332
418
  url += '?type=' + typeInformation.type;
333
419
  }
334
420
 
@@ -343,9 +429,6 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
343
429
  return;
344
430
  }
345
431
 
346
- payload.id = entityName;
347
- payload.type = typeInformation.type;
348
-
349
432
  for (let i = 0; i < attributes.length; i++) {
350
433
  if (attributes[i].name && attributes[i].type) {
351
434
  payload[attributes[i].name] = {
@@ -361,7 +444,9 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
361
444
  return;
362
445
  }
363
446
  }
364
-
447
+ //overwritte if id or type missnamed atributes reach this point
448
+ payload.id = entityName;
449
+ payload.type = typeInformation.type;
365
450
  payload = NGSIUtils.castJsonNativeAttributes(payload);
366
451
  async.waterfall(
367
452
  [
@@ -384,7 +469,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
384
469
  ) {
385
470
  // jshint maxdepth:5
386
471
  if (!utils.isTimestampedNgsi2(result)) {
387
- options.json = addTimestampNgsi2(result, typeInformation.timezone);
472
+ result = addTimestampNgsi2(result, typeInformation.timezone);
388
473
  // jshint maxdepth:5
389
474
  } else if (!utils.IsValidTimestampedNgsi2(result)) {
390
475
  logger.error(context, 'Invalid timestamp:%s', JSON.stringify(result));
@@ -392,15 +477,17 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
392
477
  return;
393
478
  }
394
479
  }
395
-
396
480
  options.json = {
397
481
  actionType: 'append',
398
- entities: result
482
+ entities: removeHiddenAttrsFromMultiEntity(result, typeInformation)
399
483
  };
484
+ if (config.getConfig().appendMode === true) {
485
+ options.json.actionType = 'append';
486
+ } else {
487
+ options.json.actionType = 'update';
488
+ }
400
489
  } else {
401
- delete result.id;
402
- delete result.type;
403
- options.json = result;
490
+ options.json = removeHiddenAttrs(result, typeInformation);
404
491
  logger.debug(context, 'typeInformation: %j', typeInformation);
405
492
  if (
406
493
  'timestamp' in typeInformation && typeInformation.timestamp !== undefined
@@ -415,6 +502,11 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
415
502
  return;
416
503
  }
417
504
  }
505
+ if (config.getConfig().appendMode === true) {
506
+ options.method = 'POST';
507
+ } else {
508
+ options.method = 'PATCH';
509
+ }
418
510
  }
419
511
  } else {
420
512
  delete payload.id;
@@ -424,6 +516,13 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
424
516
  // Purge object_id from entities before sent to CB
425
517
  // object_id was added by createNgsi2Entity to allow multientity
426
518
  // with duplicate attribute names.
519
+
520
+ //some entities may be empty if they had only wrong attributes id-type
521
+ //we filter the array
522
+ if (options.json.entities) {
523
+ options.json.entities = options.json.entities.filter((value) => Object.keys(value).length > 0);
524
+ }
525
+
427
526
  let att;
428
527
  if (options.json.entities) {
429
528
  for (let entity = 0; entity < options.json.entities.length; entity++) {
@@ -471,17 +570,28 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
471
570
  }
472
571
  }
473
572
 
474
- logger.debug(context, 'Updating device value in the Context Broker at [%s]', options.url);
475
- logger.debug(
476
- context,
477
- 'Using the following NGSI v2 request:\n\n%s\n\n',
478
- JSON.stringify(options, null, 4)
479
- );
480
-
481
- request(
482
- options,
483
- generateNGSI2OperationHandler('update', entityName, typeInformation, token, options, callback)
484
- );
573
+ // Prevent to update an entity with an empty payload
574
+ if (Object.keys(options.json).length > 0) {
575
+ logger.debug(context, 'Updating device value in the Context Broker at [%s]', options.url);
576
+ logger.debug(
577
+ context,
578
+ 'Using the following NGSI v2 request:\n\n%s\n\n',
579
+ JSON.stringify(options, null, 4)
580
+ );
581
+
582
+ request(
583
+ options,
584
+ generateNGSI2OperationHandler('update', entityName, typeInformation, token, options, callback)
585
+ );
586
+ } else {
587
+ logger.debug(
588
+ context,
589
+ 'Not updating device value in the Context Broker at [%s] due to empty payload \n\n[%s]\n\n',
590
+ options.url,
591
+ JSON.stringify(options, null, 4)
592
+ );
593
+ callback(null);
594
+ }
485
595
  }
486
596
  }
487
597
  );
@@ -49,14 +49,11 @@ function init() {
49
49
  case 'ld':
50
50
  entityHandler = require('./entities-NGSI-LD');
51
51
  break;
52
- case 'v2':
53
- entityHandler = require('./entities-NGSI-v2');
54
- break;
55
52
  case 'mixed':
56
53
  entityHandler = require('./entities-NGSI-mixed');
57
54
  break;
58
55
  default:
59
- entityHandler = require('./entities-NGSI-v1');
56
+ entityHandler = require('./entities-NGSI-v2');
60
57
  }
61
58
  }
62
59
 
@@ -135,9 +132,10 @@ function executeWithDeviceInformation(operationFunction) {
135
132
  attributes,
136
133
  deviceInformation
137
134
  );
138
- config.getGroupRegistry().getType(type, function (error, deviceGroup) {
135
+ const currentType = type ? type : deviceInformation.type;
136
+ config.getGroupRegistry().getType(currentType, function (error, deviceGroup) {
139
137
  let typeInformation;
140
- const configDeviceInfo = config.getConfig().types[type];
138
+ const configDeviceInfo = config.getConfig().types[currentType];
141
139
  if (error) {
142
140
  logger.debug(context, 'error %j in get group device', error);
143
141
  }
@@ -233,27 +233,6 @@ function getMetaData(typeInformation, name, metadata) {
233
233
  return undefined;
234
234
  }
235
235
 
236
- /**
237
- * Given a NGSI Body, determines whether it contains any NGSI error.
238
- *
239
- * @param {String} body String representing a NGSI body in JSON format.
240
- * @return {Number|*}
241
- */
242
- function getErrorField(body) {
243
- let errorField = body.errorCode || body.orionError;
244
-
245
- if (body && body.contextResponses) {
246
- for (const i in body.contextResponses) {
247
- if (body.contextResponses[i].statusCode && body.contextResponses[i].statusCode.code !== '200') {
248
- errorField = body.contextResponses[i].statusCode;
249
- }
250
- }
251
- }
252
-
253
- return errorField;
254
- }
255
-
256
- exports.getErrorField = intoTrans(context, getErrorField);
257
236
  exports.createRequestObject = createRequestObject;
258
237
  exports.applyMiddlewares = applyMiddlewares;
259
238
  exports.getMetaData = getMetaData;
@@ -108,9 +108,14 @@ function subscribeNgsiLD(device, triggers, content, callback) {
108
108
  const options = {
109
109
  method: 'POST',
110
110
  headers: {
111
- 'fiware-service': device.service
111
+ 'fiware-service': device.service,
112
+ 'fiware-servicepath': device.subservice,
113
+ 'NGSILD-Tenant': device.service,
114
+ 'NGSILD-Path': device.subservice,
115
+ 'Content-Type': 'application/ld+json'
112
116
  },
113
117
  json: {
118
+ '@context': config.getConfig().contextBroker.jsonLdContext,
114
119
  type: 'Subscription',
115
120
  entities: [
116
121
  {
@@ -121,10 +126,12 @@ function subscribeNgsiLD(device, triggers, content, callback) {
121
126
 
122
127
  watchedAttributes: triggers,
123
128
  notification: {
124
- http: {
125
- url: config.getConfig().providerUrl + '/notify'
129
+ endpoint: {
130
+ uri: config.getConfig().providerUrl + '/notify',
131
+ accept: 'application/json'
126
132
  },
127
- attributes: content || []
133
+ attributes: content || [],
134
+ format: 'normalized'
128
135
  }
129
136
  }
130
137
  };
@@ -210,7 +217,9 @@ function unsubscribeNgsiLD(device, id, callback) {
210
217
  method: 'DELETE',
211
218
  headers: {
212
219
  'fiware-service': device.service,
213
- 'fiware-servicepath': device.subservice
220
+ 'fiware-servicepath': device.subservice,
221
+ 'NGSILD-Tenant': device.service,
222
+ 'NGSILD-Path': device.subservice
214
223
  }
215
224
  };
216
225
 
@@ -40,14 +40,11 @@ function init() {
40
40
  case 'ld':
41
41
  subscriptionHandler = require('./subscription-NGSI-LD');
42
42
  break;
43
- case 'v2':
44
- subscriptionHandler = require('./subscription-NGSI-v2');
45
- break;
46
43
  case 'mixed':
47
44
  subscriptionHandler = require('./subscription-NGSI-mixed');
48
45
  break;
49
46
  default:
50
- subscriptionHandler = require('./subscription-NGSI-v1');
47
+ subscriptionHandler = require('./subscription-NGSI-v2');
51
48
  }
52
49
  }
53
50
 
@@ -40,6 +40,7 @@ const context = {
40
40
  const updateContextTemplateNgsiLD = require('../../templates/updateContextNgsiLD.json');
41
41
  const notificationTemplateNgsiLD = require('../../templates/notificationTemplateNgsiLD.json');
42
42
  const contextServerUtils = require('./contextServerUtils');
43
+ const ngsiLD = require('../ngsi/entities-NGSI-LD');
43
44
 
44
45
  const updatePaths = ['/ngsi-ld/v1/entities/:entity/attrs/:attr'];
45
46
  const queryPaths = ['/ngsi-ld/v1/entities/:entity'];
@@ -250,10 +251,10 @@ function defaultQueryHandlerNgsiLD(id, type, service, subservice, attributes, ca
250
251
  attributeType = lazyAttribute.type;
251
252
  }
252
253
 
253
- contextElement[attributes[i]] = {
254
+ contextElement[attributes[i]] = ngsiLD.convertAttrNGSILD({
254
255
  type: attributeType,
255
256
  value: ''
256
- };
257
+ });
257
258
  }
258
259
 
259
260
  callback(null, contextElement);
@@ -408,6 +409,10 @@ function handleQueryNgsiLD(req, res, next) {
408
409
  }
409
410
 
410
411
  logger.debug(context, 'Handling query from [%s]', req.get('host'));
412
+ if ((req.is('json') || req.is('application/ld+json')) === false) {
413
+ return handleQueryContextRequests(new errors.UnsupportedContentType(req.header('content-type')));
414
+ }
415
+
411
416
  if (req.body) {
412
417
  logger.debug(context, JSON.stringify(req.body, null, 4));
413
418
  }
@@ -204,7 +204,7 @@ function handleUpdateNgsi2(req, res, next) {
204
204
  [apply(async.map, req.body.entities, apply(generateUpdateActionsNgsi2, req)), reduceActions, async.series],
205
205
  function (error, result) {
206
206
  if (error) {
207
- logger.debug(context, 'There was an error handling the update action: %s.', error);
207
+ logger.debug(context, 'There was an error handling the update action: %j.', error);
208
208
 
209
209
  next(error);
210
210
  } else {
@@ -538,25 +538,37 @@ function handleQueryNgsi2(req, res, next) {
538
538
  logger.debug(context, JSON.stringify(req.body, null, 4));
539
539
  }
540
540
  const contextEntity = {};
541
+ const entities = req.body.entities || [];
541
542
 
542
- // At the present moment, IOTA supports query request with one entity and without patterns. This is aligned
543
- // with the utilization cases in combination with ContextBroker. Other cases are returned as error
544
- if (req.body.entities.length !== 1) {
543
+ if (!req.is('json')) {
545
544
  logger.warn(
546
- 'queries with entities number different to 1 are not supported (%d found)',
547
- req.body.entities.length
545
+ 'queries must offer JSON entities, content-type not supported (%s found)',
546
+ req.header('content-type')
548
547
  );
549
- handleQueryContextRequests({ code: 400, name: 'BadRequest', message: 'more than one entity in query' });
550
- return;
548
+ return handleQueryContextRequests(new errors.UnsupportedContentType(req.header('content-type')));
549
+ }
550
+
551
+ // At the present moment, IOTA supports query request with one entity and without patterns. This is aligned
552
+ // with the utilization cases in combination with ContextBroker. Other cases are returned as error
553
+ if (entities.length !== 1) {
554
+ logger.warn('queries with entities number different to 1 are not supported (%d found)', entities.length);
555
+ return handleQueryContextRequests({
556
+ code: 400,
557
+ name: 'BadRequest',
558
+ message: 'query does not contain a single entity'
559
+ });
551
560
  }
552
- if (req.body.entities[0].idPattern) {
561
+ if (entities[0].idPattern) {
553
562
  logger.warn('queries with idPattern are not supported');
554
- handleQueryContextRequests({ code: 400, name: 'BadRequest', message: 'idPattern usage in query' });
555
- return;
563
+ return handleQueryContextRequests({
564
+ code: 400,
565
+ name: 'BadRequest',
566
+ message: 'idPattern usage in query'
567
+ });
556
568
  }
557
569
 
558
- contextEntity.id = req.body.entities[0].id;
559
- contextEntity.type = req.body.entities[0].type;
570
+ contextEntity.id = entities[0].id;
571
+ contextEntity.type = entities[0].type;
560
572
  const queryAtts = req.body.attrs;
561
573
  createQueryRequest(queryAtts, contextEntity, handleQueryContextRequests);
562
574
  }
@@ -41,14 +41,11 @@ function init() {
41
41
  case 'ld':
42
42
  contextServerHandler = require('./contextServer-NGSI-LD');
43
43
  break;
44
- case 'v2':
45
- contextServerHandler = require('./contextServer-NGSI-v2');
46
- break;
47
44
  case 'mixed':
48
45
  contextServerHandler = require('./contextServer-NGSI-mixed');
49
46
  break;
50
47
  default:
51
- contextServerHandler = require('./contextServer-NGSI-v1');
48
+ contextServerHandler = require('./contextServer-NGSI-v2');
52
49
  }
53
50
  }
54
51
 
@@ -26,14 +26,10 @@
26
26
 
27
27
  const async = require('async');
28
28
  const apply = async.apply;
29
- const logger = require('logops');
30
29
  const constants = require('../../constants');
31
30
  const config = require('../../commonConfig');
32
31
  const ngsi = require('../ngsi/ngsiService');
33
32
  const commands = require('../commands/commandService');
34
- const context = {
35
- op: 'IoTAgentNGSI.ContextServerUtils'
36
- };
37
33
 
38
34
  /**
39
35
  * Returns the Current Tenant defined for the NGSI-LD Broker. Tenant is based on the request
@@ -68,81 +64,6 @@ function getLDPath(req) {
68
64
  return config.getConfig().contextBroker.fallbackPath;
69
65
  }
70
66
 
71
- /**
72
- * Create the response for an UpdateContext operation, based on the results of the individual updates. The signature
73
- * retains the results object for homogeinity with the createQuery* version.
74
- *
75
- * @param {Object} req Request that was handled in first place.
76
- * @param {Object} res Response that will be sent.
77
- * @param {Object} results Ignored for this function. TODO: to be removed in later versions.
78
- * @return {{contextResponses: Array}}
79
- */
80
-
81
- /* eslint-disable-next-line no-unused-vars */
82
- function createUpdateResponse(req, res, results) {
83
- const result = {
84
- contextResponses: []
85
- };
86
-
87
- for (let i = 0; i < req.body.contextElements.length; i++) {
88
- const contextResponse = {
89
- contextElement: {
90
- attributes: req.body.contextElements[i].attributes,
91
- id: req.body.contextElements[i].id,
92
- isPattern: false,
93
- type: req.body.contextElements[i].type
94
- },
95
- statusCode: {
96
- code: 200,
97
- reasonPhrase: 'OK'
98
- }
99
- };
100
-
101
- for (let j = 0; j < contextResponse.contextElement.attributes.length; j++) {
102
- contextResponse.contextElement.attributes[i].value = '';
103
- }
104
-
105
- result.contextResponses.push(contextResponse);
106
- }
107
-
108
- logger.debug(context, 'Generated update response: %j', result);
109
-
110
- return result;
111
- }
112
-
113
- /**
114
- * Create the response for a queryContext operation based on the individual results gathered from the query handlers.
115
- * The returned response is in the NGSI Response format.
116
- *
117
- * @param {Object} req Request that was handled in first place.
118
- * @param {Object} res Response that will be sent.
119
- * @param {Object} results Individual Context Element results from the query handlers.
120
- * @return {{contextResponses: Array}}
121
- */
122
- function createQueryResponse(req, res, results) {
123
- const result = {
124
- contextResponses: []
125
- };
126
-
127
- for (let i = 0; i < results.length; i++) {
128
- const contextResponse = {
129
- contextElement: results[i],
130
- statusCode: {
131
- code: 200,
132
- reasonPhrase: 'OK'
133
- }
134
- };
135
-
136
- contextResponse.contextElement.isPattern = false;
137
-
138
- result.contextResponses.push(contextResponse);
139
- }
140
-
141
- logger.debug(context, 'Generated query response: %j', result);
142
-
143
- return result;
144
- }
145
-
146
67
  /**
147
68
  * Retrieve the Device that corresponds to a Context Update, and execute the update side effects
148
69
  * if there were any (e.g.: creation of attributes related to comands).
@@ -199,8 +120,6 @@ exports.updateHandler = null;
199
120
  exports.commandHandler = null;
200
121
  exports.queryHandler = null;
201
122
  exports.notificationHandler = null;
202
- exports.createUpdateResponse = createUpdateResponse;
203
- exports.createQueryResponse = createQueryResponse;
204
123
  exports.executeUpdateSideEffects = executeUpdateSideEffects;
205
124
  exports.pushCommandsToQueue = pushCommandsToQueue;
206
125
  exports.getLDTenant = getLDTenant;