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.
- package/.github/workflows/ci.yml +17 -1
- package/.readthedocs.yml +7 -0
- package/CHANGES_NEXT_RELEASE +0 -1
- package/README.md +1 -0
- package/doc/Contribution.md +60 -1
- package/doc/advanced-topics.md +136 -14
- package/doc/api.md +38 -22
- package/doc/apiary/iotagent.apib +1 -3
- package/doc/architecture.md +2 -2
- package/doc/config-basic-example.js +0 -1
- package/doc/deprecated.md +2 -2
- package/doc/development.md +13 -6
- package/doc/expressionLanguage.md +519 -277
- package/doc/getting-started.md +0 -1
- package/doc/howto.md +13 -17
- package/doc/installationguide.md +67 -69
- package/doc/usermanual.md +48 -16
- package/docker/Mosquitto/Dockerfile +4 -9
- package/docker/Mosquitto/README.md +2 -0
- package/docker/Mosquitto/startMosquitto.sh +18 -1
- package/lib/command/commandLine.js +1 -1
- package/lib/commonConfig.js +5 -14
- package/lib/errors.js +0 -16
- package/lib/fiware-iotagent-lib.js +5 -0
- package/lib/jexlTranformsMap.js +71 -0
- package/lib/model/Command.js +1 -1
- package/lib/model/Device.js +5 -2
- package/lib/model/Group.js +20 -2
- package/lib/model/dbConn.js +7 -1
- package/lib/plugins/attributeAlias.js +6 -13
- package/lib/plugins/bidirectionalData.js +2 -27
- package/lib/plugins/expressionParser.js +41 -17
- package/lib/plugins/expressionPlugin.js +21 -27
- package/lib/plugins/jexlParser.js +71 -67
- package/lib/plugins/multiEntity.js +68 -147
- package/lib/plugins/pluginUtils.js +12 -48
- package/lib/plugins/timestampProcessPlugin.js +1 -46
- package/lib/request-shim.js +111 -0
- package/lib/services/common/domain.js +2 -2
- package/lib/services/common/genericMiddleware.js +6 -2
- package/lib/services/common/iotManagerService.js +1 -1
- package/lib/services/common/securityServiceKeystone.js +1 -1
- package/lib/services/common/securityServiceOAuth2.js +3 -2
- package/lib/services/devices/deviceRegistryMongoDB.js +29 -22
- package/lib/services/devices/deviceService.js +56 -33
- package/lib/services/devices/devices-NGSI-LD.js +42 -14
- package/lib/services/devices/devices-NGSI-mixed.js +3 -3
- package/lib/services/devices/devices-NGSI-v2.js +48 -24
- package/lib/services/devices/registrationUtils.js +1 -134
- package/lib/services/groups/groupRegistryMemory.js +2 -0
- package/lib/services/groups/groupRegistryMongoDB.js +58 -76
- package/lib/services/groups/groupService.js +1 -1
- package/lib/services/ngsi/entities-NGSI-LD.js +205 -124
- package/lib/services/ngsi/entities-NGSI-v2.js +142 -32
- package/lib/services/ngsi/ngsiService.js +4 -6
- package/lib/services/ngsi/ngsiUtils.js +0 -21
- package/lib/services/ngsi/subscription-NGSI-LD.js +14 -5
- package/lib/services/ngsi/subscriptionService.js +1 -4
- package/lib/services/northBound/contextServer-NGSI-LD.js +7 -2
- package/lib/services/northBound/contextServer-NGSI-v2.js +25 -13
- package/lib/services/northBound/contextServer.js +1 -4
- package/lib/services/northBound/contextServerUtils.js +0 -81
- package/lib/services/northBound/deviceProvisioningServer.js +36 -9
- package/lib/services/northBound/northboundServer.js +2 -0
- package/lib/services/northBound/restUtils.js +2 -39
- package/lib/templates/updateDevice.json +4 -0
- package/lib/templates/updateDeviceLax.json +4 -0
- package/package.json +13 -13
- package/test/tools/utils.js +2 -0
- package/test/unit/examples/deviceProvisioningRequests/provisionAnotherDevice.json +1 -1
- package/test/unit/examples/deviceProvisioningRequests/provisionDeviceMissingParameters.json +1 -1
- package/test/unit/examples/deviceProvisioningRequests/provisionDuplicatedDev.json +1 -1
- package/test/unit/examples/deviceProvisioningRequests/provisionFullDevice.json +1 -1
- package/test/unit/examples/deviceProvisioningRequests/provisionNewDeviceMalformed1.json +1 -1
- package/test/unit/examples/groupProvisioningRequests/multipleGroupsCreation.json +1 -1
- package/test/unit/examples/iotamRequests/registrationEmpty.json +1 -1
- package/test/unit/examples/iotamRequests/registrationWithGroups.json +2 -2
- package/test/unit/examples/iotamRequests/registrationWithGroupsWithoutCB.json +2 -2
- package/test/unit/examples/iotamRequests/registrationWithStaticGroups.json +2 -2
- package/test/unit/expressions/jexlExpression-test.js +119 -0
- package/test/unit/general/config-multi-core-test.js +1 -1
- package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +30 -77
- package/test/unit/general/deviceService-test.js +19 -35
- package/test/unit/general/loglevel-api_test.js +8 -13
- package/test/unit/general/migration-test.js +1 -0
- package/test/unit/general/startup-test.js +3 -2
- package/test/unit/general/statistics-persistence_test.js +2 -2
- package/test/unit/general/statistics-service_test.js +2 -2
- package/test/unit/lazyAndCommands/commandRegistry_test.js +18 -18
- package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +16 -24
- package/test/unit/mongodb/mongodb-connectionoptions-test.js +2 -2
- package/test/unit/mongodb/mongodb-group-registry-test.js +11 -11
- package/test/unit/mongodb/mongodb-registry-test.js +55 -131
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent1.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent2.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgent4.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDevice.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup3.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateCommands1.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent1.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent2.json +1 -1
- package/test/unit/ngsi-ld/examples/contextAvailabilityRequests/updateIoTAgent3.json +1 -1
- package/test/unit/ngsi-ld/examples/contextRequests/createMinimumProvisionedDevice.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDevice.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -14
- package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -14
- package/test/unit/ngsi-ld/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic3.json +1 -15
- package/test/unit/ngsi-ld/examples/contextRequests/createTimeInstantMinimumDevice.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextAliasPlugin6.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextAutocast5.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin12a.json +7 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin13.json +13 -13
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin16.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin17.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin1a.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin29.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin31.json +15 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin32.json +17 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin33.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin34.json +17 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin4a.json +36 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin5.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin7.json +16 -16
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin8a.json +18 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextGeoproperties3.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +6 -6
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +3 -3
- package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionCommands1.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionDeviceStatic.json +0 -7
- package/test/unit/ngsi-ld/examples/contextRequests/updateProvisionMinimumDevice.json +0 -7
- package/test/unit/ngsi-ld/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +20 -17
- package/test/unit/ngsi-ld/examples/subscriptionRequests/simpleSubscriptionRequest.json +18 -15
- package/test/unit/ngsi-ld/examples/subscriptionRequests/simpleSubscriptionRequest2.json +18 -15
- package/test/unit/ngsi-ld/expressions/expressionBasedTransformations-test.js +21 -21
- package/test/unit/ngsi-ld/expressions/jexlBasedTransformations-test.js +1018 -0
- package/test/unit/ngsi-ld/general/config-jsonld-contexts-test.js +2 -2
- package/test/unit/ngsi-ld/general/contextBrokerOAuthSecurityAccess-test.js +24 -24
- package/test/unit/ngsi-ld/general/deviceService-test.js +7 -7
- package/test/unit/ngsi-ld/general/https-support-test.js +14 -13
- package/test/unit/ngsi-ld/general/iotam-autoregistration-test.js +8 -7
- package/test/unit/ngsi-ld/general/startup-test.js +2 -1
- package/test/unit/ngsi-ld/lazyAndCommands/active-devices-attribute-update-test.js +10 -8
- package/test/unit/ngsi-ld/lazyAndCommands/command-test.js +11 -12
- package/test/unit/ngsi-ld/lazyAndCommands/lazy-devices-test.js +25 -29
- package/test/unit/ngsi-ld/lazyAndCommands/polling-commands-test.js +16 -15
- package/test/unit/ngsi-ld/ngsiService/active-devices-test.js +18 -17
- package/test/unit/ngsi-ld/ngsiService/autocast-test.js +13 -12
- package/test/unit/ngsi-ld/ngsiService/geoproperties-test.js +10 -9
- package/test/unit/ngsi-ld/ngsiService/staticAttributes-test.js +3 -3
- package/test/unit/ngsi-ld/ngsiService/subscriptions-test.js +25 -24
- package/test/unit/ngsi-ld/plugins/alias-plugin_test.js +13 -12
- package/test/unit/ngsi-ld/plugins/bidirectional-plugin_test.js +27 -26
- package/test/unit/ngsi-ld/plugins/compress-timestamp-plugin_test.js +5 -5
- package/test/unit/ngsi-ld/plugins/event-plugin_test.js +3 -3
- package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +75 -14
- package/test/unit/ngsi-ld/plugins/timestamp-processing-plugin_test.js +3 -3
- package/test/unit/ngsi-ld/provisioning/device-provisioning-api_test.js +54 -53
- package/test/unit/ngsi-ld/provisioning/device-registration_test.js +20 -19
- package/test/unit/ngsi-ld/provisioning/device-update-registration_test.js +23 -22
- package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +58 -70
- package/test/unit/ngsi-ld/provisioning/provisionDeviceMultientity-test.js +8 -7
- package/test/unit/ngsi-ld/provisioning/removeProvisionedDevice-test.js +19 -19
- package/test/unit/ngsi-ld/provisioning/singleConfigurationMode-test.js +18 -20
- package/test/unit/ngsi-ld/provisioning/updateProvisionedDevices-test.js +43 -49
- package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +16 -14
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent1.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent2.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent3.json +19 -0
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent4.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent5.json +19 -0
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDevice.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup3.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateCommands1.json +3 -3
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent1.json +3 -3
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent2.json +1 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/updateIoTAgent3.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin1.json +17 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin11.json +5 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin12.json +2 -2
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin15.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin16.json +14 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin17.json +14 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin18.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin19.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin2.json +13 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin20.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin21.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin22.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin23.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin24.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin25.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin26.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin27.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin28.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin29.json +22 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin3.json +5 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin30.json +6 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin31.json +18 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin32.json +16 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin33.json +22 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin34.json +12 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin4.json +12 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin5.json +5 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin6.json +5 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin7.json +5 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin8.json +17 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin9.json +5 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware1.json +10 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware2.json +10 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin1.json +2 -2
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin10.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin11.json +13 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin12.json +33 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin13.json +33 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin14.json +33 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin15.json +25 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin16.json +25 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin2.json +2 -2
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin3.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin4.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin5.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin6.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin7.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin8.json +2 -2
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityPlugin9.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin1.json +8 -8
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +4 -4
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin3.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin4.json +2 -2
- package/test/unit/ngsiv2/examples/contextRequests/updateProvisionDevice.json +20 -0
- package/test/unit/ngsiv2/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +1 -1
- package/test/unit/ngsiv2/examples/subscriptionRequests/simpleSubscriptionRequest.json +1 -1
- package/test/unit/ngsiv2/examples/subscriptionRequests/simpleSubscriptionRequest2.json +1 -1
- package/test/unit/ngsiv2/expressions/expressionBasedTransformations-test.js +93 -60
- package/test/unit/ngsiv2/expressions/expressionCombinedTransformations-test.js +16 -16
- package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +548 -164
- package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +34 -33
- package/test/unit/ngsiv2/general/deviceService-test.js +15 -14
- package/test/unit/ngsiv2/general/https-support-test.js +14 -13
- package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +8 -7
- package/test/unit/ngsiv2/general/startup-test.js +2 -1
- package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +9 -7
- package/test/unit/ngsiv2/lazyAndCommands/command-test.js +13 -12
- package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +323 -51
- package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +22 -20
- package/test/unit/ngsiv2/ngsiService/active-devices-test.js +114 -26
- package/test/unit/ngsiv2/ngsiService/autocast-test.js +16 -16
- package/test/unit/ngsiv2/ngsiService/geoproperties-test.js +39 -38
- package/test/unit/{ngsiService → ngsiv2/ngsiService}/queryDeviceInformationInCb-test.js +25 -54
- package/test/unit/ngsiv2/ngsiService/staticAttributes-test.js +5 -5
- package/test/unit/ngsiv2/ngsiService/subscriptions-test.js +25 -24
- package/test/unit/ngsiv2/plugins/alias-plugin_test.js +22 -22
- package/test/unit/ngsiv2/plugins/bidirectional-plugin_test.js +27 -26
- package/test/unit/ngsiv2/plugins/compress-timestamp-plugin_test.js +7 -7
- package/test/unit/ngsiv2/plugins/event-plugin_test.js +4 -4
- package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +549 -24
- package/test/unit/ngsiv2/plugins/timestamp-processing-plugin_test.js +4 -4
- package/test/unit/{plugins → ngsiv2/plugins}/translation-inPlugins_test.js +25 -25
- package/test/unit/{provisioning → ngsiv2/provisioning}/device-group-api-test.js +44 -75
- package/test/unit/{provisioning/device-group-utils_test.js → ngsiv2/provisioning/device-group-utils-test.js} +15 -14
- package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +74 -73
- package/test/unit/ngsiv2/provisioning/device-registration_test.js +20 -19
- package/test/unit/ngsiv2/provisioning/device-update-registration_test.js +30 -29
- package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +58 -69
- package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +8 -7
- package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +19 -19
- package/test/unit/ngsiv2/provisioning/singleConfigurationMode-test.js +18 -19
- package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +49 -52
- package/test/unit/plugins/capture-configuration-inPlugins_test.js +6 -4
- package/test/unit/plugins/capture-provision-inPlugins_test.js +13 -23
- package/.nyc_output/016aca19-69bf-4681-9b41-2835c5131681.json +0 -1
- package/.nyc_output/processinfo/016aca19-69bf-4681-9b41-2835c5131681.json +0 -1
- package/.nyc_output/processinfo/index.json +0 -1
- package/lib/services/devices/devices-NGSI-v1.js +0 -293
- package/lib/services/devices/registrationUtils.js_avega +0 -589
- package/lib/services/ngsi/entities-NGSI-v1.js +0 -300
- package/lib/services/ngsi/subscription-NGSI-v1.js +0 -234
- package/lib/services/northBound/contextServer-NGSI-v1.js +0 -526
- package/lib/templates/notificationTemplateNgsi1.json +0 -75
- package/lib/templates/updateContextNgsi1.json +0 -50
- package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent1.json +0 -21
- package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent2.json +0 -21
- package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent3.json +0 -25
- package/test/unit/examples/contextAvailabilityRequests/registerIoTAgent4.json +0 -22
- package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentAttributeUpdates.json +0 -16
- package/test/unit/examples/contextAvailabilityRequests/registerIoTAgentCommands.json +0 -21
- package/test/unit/examples/contextAvailabilityRequests/registerNewDevice1.json +0 -21
- package/test/unit/examples/contextAvailabilityRequests/registerNewDevice2.json +0 -21
- package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice.json +0 -25
- package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDevice2.json +0 -21
- package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup.json +0 -33
- package/test/unit/examples/contextAvailabilityRequests/registerProvisionedDeviceWithGroup2.json +0 -33
- package/test/unit/examples/contextAvailabilityRequests/unregisterDevice1.json +0 -22
- package/test/unit/examples/contextAvailabilityRequests/unregisterDevice3.json +0 -26
- package/test/unit/examples/contextAvailabilityRequests/unregisterProvisionedDevice.json +0 -26
- package/test/unit/examples/contextAvailabilityRequests/updateCommands1.json +0 -22
- package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent1.json +0 -22
- package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent2.json +0 -26
- package/test/unit/examples/contextAvailabilityRequests/updateIoTAgent3.json +0 -22
- package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Failed.json +0 -8
- package/test/unit/examples/contextAvailabilityResponses/registerIoTAgent1Success.json +0 -4
- package/test/unit/examples/contextAvailabilityResponses/registerNewDevice1Success.json +0 -4
- package/test/unit/examples/contextAvailabilityResponses/registerNewDevice2Success.json +0 -4
- package/test/unit/examples/contextAvailabilityResponses/registerProvisionedDeviceSuccess.json +0 -4
- package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Failed.json +0 -8
- package/test/unit/examples/contextAvailabilityResponses/unregisterDevice1Success.json +0 -4
- package/test/unit/examples/contextAvailabilityResponses/updateCommands1Success.json +0 -4
- package/test/unit/examples/contextAvailabilityResponses/updateIoTAgent1Success.json +0 -6
- package/test/unit/examples/contextProviderResponses/queryInformationResponse.json +0 -22
- package/test/unit/examples/contextProviderResponses/queryInformationResponseEmptyAttributes.json +0 -22
- package/test/unit/examples/contextProviderResponses/queryInformationStaticAttributesResponse.json +0 -27
- package/test/unit/examples/contextProviderResponses/updateInformationResponse.json +0 -22
- package/test/unit/examples/contextProviderResponses/updateInformationResponse2.json +0 -22
- package/test/unit/examples/contextRequests/contextSubscriptionRequest.json +0 -20
- package/test/unit/examples/contextRequests/contextSubscriptionRequest2.json +0 -20
- package/test/unit/examples/contextRequests/createBidirectionalDevice.json +0 -17
- package/test/unit/examples/contextRequests/createDatetimeProvisionedDevice.json +0 -17
- package/test/unit/examples/contextRequests/createGeopointProvisionedDevice.json +0 -17
- package/test/unit/examples/contextRequests/createMinimumProvisionedDevice.json +0 -17
- package/test/unit/examples/contextRequests/createProvisionedDevice.json +0 -32
- package/test/unit/examples/contextRequests/createProvisionedDeviceMultientity.json +0 -32
- package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroup.json +0 -47
- package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic.json +0 -52
- package/test/unit/examples/contextRequests/createProvisionedDeviceWithGroupAndStatic2.json +0 -52
- package/test/unit/examples/contextRequests/createTimeinstantDevice.json +0 -17
- package/test/unit/examples/contextRequests/queryContext1.json +0 -13
- package/test/unit/examples/contextRequests/queryContext2.json +0 -13
- package/test/unit/examples/contextRequests/queryContextAliasPlugin1.json +0 -10
- package/test/unit/examples/contextRequests/queryContextCompressTimestamp1.json +0 -13
- package/test/unit/examples/contextRequests/updateActiveAttributes.json +0 -11
- package/test/unit/examples/contextRequests/updateContext1.json +0 -22
- package/test/unit/examples/contextRequests/updateContext2.json +0 -22
- package/test/unit/examples/contextRequests/updateContext3.json +0 -17
- package/test/unit/examples/contextRequests/updateContext3WithStatic.json +0 -22
- package/test/unit/examples/contextRequests/updateContext4.json +0 -22
- package/test/unit/examples/contextRequests/updateContext5.json +0 -19
- package/test/unit/examples/contextRequests/updateContextAliasPlugin.json +0 -22
- package/test/unit/examples/contextRequests/updateContextAliasPlugin2.json +0 -17
- package/test/unit/examples/contextRequests/updateContextAppendMode.json +0 -22
- package/test/unit/examples/contextRequests/updateContextCommandError.json +0 -22
- package/test/unit/examples/contextRequests/updateContextCommandExpired.json +0 -22
- package/test/unit/examples/contextRequests/updateContextCommandFinish.json +0 -22
- package/test/unit/examples/contextRequests/updateContextCommandStatus.json +0 -17
- package/test/unit/examples/contextRequests/updateContextCompressTimestamp1.json +0 -22
- package/test/unit/examples/contextRequests/updateContextCompressTimestamp2.json +0 -29
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin1.json +0 -17
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin2.json +0 -27
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin3.json +0 -17
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin4.json +0 -17
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin5.json +0 -27
- package/test/unit/examples/contextRequests/updateContextMiddleware1.json +0 -22
- package/test/unit/examples/contextRequests/updateContextMultiEntityPlugin3.json +0 -35
- package/test/unit/examples/contextRequests/updateContextMultientityPlugin1.json +0 -30
- package/test/unit/examples/contextRequests/updateContextMultientityPlugin2.json +0 -30
- package/test/unit/examples/contextRequests/updateContextProcessTimestamp1.json +0 -29
- package/test/unit/examples/contextRequests/updateContextStaticAttributes.json +0 -22
- package/test/unit/examples/contextRequests/updateContextTimestamp.json +0 -41
- package/test/unit/examples/contextRequests/updateContextTimestampOverride.json +0 -22
- package/test/unit/examples/contextRequests/updateContextTimestampOverrideWithoutMilis.json +0 -22
- package/test/unit/examples/contextRequests/updateContextTimestampTimezone.json +0 -41
- package/test/unit/examples/contextRequests/updateProvisionActiveAttributes1.json +0 -17
- package/test/unit/examples/contextRequests/updateProvisionCommands1.json +0 -27
- package/test/unit/examples/contextRequests/updateProvisionDeviceStatic.json +0 -38
- package/test/unit/examples/contextRequests/updateProvisionMinimumDevice.json +0 -17
- package/test/unit/examples/contextResponses/contextSubscriptionRequest2Success.json +0 -7
- package/test/unit/examples/contextResponses/contextSubscriptionRequestSuccess.json +0 -7
- package/test/unit/examples/contextResponses/createBidirectionalDeviceSuccess.json +0 -22
- package/test/unit/examples/contextResponses/createDatetimeProvisionedDeviceSuccess.json +0 -22
- package/test/unit/examples/contextResponses/createGeopointProvisionedDeviceSuccess.json +0 -22
- package/test/unit/examples/contextResponses/createProvisionedDeviceSuccess.json +0 -22
- package/test/unit/examples/contextResponses/createTimeinstantSuccess.json +0 -22
- package/test/unit/examples/contextResponses/queryContext1Success.json +0 -27
- package/test/unit/examples/contextResponses/queryContext2Error.json +0 -7
- package/test/unit/examples/contextResponses/queryContext2UnknownError.json +0 -6
- package/test/unit/examples/contextResponses/queryContext3Error.json +0 -34
- package/test/unit/examples/contextResponses/queryContextAliasPlugin1Success.json +0 -27
- package/test/unit/examples/contextResponses/queryContextCompressTimestamp1Success.json +0 -27
- package/test/unit/examples/contextResponses/updateActiveAttributesSuccess.json +0 -16
- package/test/unit/examples/contextResponses/updateContext1Failed.json +0 -7
- package/test/unit/examples/contextResponses/updateContext1Success.json +0 -27
- package/test/unit/examples/contextResponses/updateContext2Failed.json +0 -35
- package/test/unit/examples/contextResponses/updateContextAliasPlugin2Success.json +0 -27
- package/test/unit/examples/contextResponses/updateContextAliasPluginSuccess.json +0 -27
- package/test/unit/examples/contextResponses/updateContextCommandFinishSuccess.json +0 -27
- package/test/unit/examples/contextResponses/updateContextCommandStatusSuccess.json +0 -22
- package/test/unit/examples/contextResponses/updateContextCompressTimestamp1Success.json +0 -27
- package/test/unit/examples/contextResponses/updateContextCompressTimestamp2Success.json +0 -34
- package/test/unit/examples/contextResponses/updateContextEvents1Success.json +0 -27
- package/test/unit/examples/contextResponses/updateContextExpressionPlugin1Success.json +0 -22
- package/test/unit/examples/contextResponses/updateContextExpressionPlugin2Success.json +0 -22
- package/test/unit/examples/contextResponses/updateContextExpressionPlugin3Success.json +0 -22
- package/test/unit/examples/contextResponses/updateContextExpressionPlugin5Success.json +0 -32
- package/test/unit/examples/contextResponses/updateContextMultientityPlugin1Success.json +0 -40
- package/test/unit/examples/contextResponses/updateContextMultientityPlugin2Success.json +0 -40
- package/test/unit/examples/contextResponses/updateContextMultientityPlugin3Success.json +0 -40
- package/test/unit/examples/contextResponses/updateContextProcessTimestamp1Success.json +0 -27
- package/test/unit/examples/contextResponses/updateProvisionActiveAttributes1Success.json +0 -22
- package/test/unit/examples/contextResponses/updateProvisionCommands1Success.json +0 -32
- package/test/unit/examples/contextResponses/updateProvisionMinimumDeviceSuccess.json +0 -22
- package/test/unit/examples/subscriptionRequests/bidirectionalNotification.json +0 -24
- package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRemove.json +0 -3
- package/test/unit/examples/subscriptionRequests/bidirectionalSubscriptionRequest.json +0 -22
- package/test/unit/examples/subscriptionRequests/errorNotification.json +0 -24
- package/test/unit/examples/subscriptionRequests/simpleNotification.json +0 -24
- package/test/unit/examples/subscriptionRequests/simpleSubscriptionRemove.json +0 -3
- package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest.json +0 -19
- package/test/unit/examples/subscriptionRequests/simpleSubscriptionRequest1.json +0 -19
- package/test/unit/examples/subscriptionResponses/bidirectionalSubscriptionSuccess.json +0 -6
- package/test/unit/examples/subscriptionResponses/simpleSubscriptionSuccess.json +0 -6
- package/test/unit/expressions/expressionBasedTransformations-test.js +0 -328
- package/test/unit/expressions/expressionCombinedTransformations-test.js +0 -306
- package/test/unit/expressions/jexlBasedTransformations-test.js +0 -334
- package/test/unit/general/contextBrokerOAuthSecurityAccess-test.js +0 -902
- package/test/unit/general/https-support-test.js +0 -286
- package/test/unit/general/iotam-autoregistration-test.js +0 -368
- package/test/unit/lazyAndCommands/active-devices-attribute-update-test.js +0 -168
- package/test/unit/lazyAndCommands/command-test.js +0 -341
- package/test/unit/lazyAndCommands/lazy-devices-test.js +0 -878
- package/test/unit/lazyAndCommands/polling-commands-test.js +0 -421
- package/test/unit/ngsi-ld/examples/contextRequests/updateContextExpressionPlugin20.json +0 -25
- package/test/unit/ngsiService/active-devices-test.js +0 -692
- package/test/unit/ngsiService/staticAttributes-test.js +0 -148
- package/test/unit/ngsiService/subscriptions-test.js +0 -345
- package/test/unit/plugins/alias-plugin_test.js +0 -158
- package/test/unit/plugins/bidirectional-plugin_test.js +0 -564
- package/test/unit/plugins/compress-timestamp-plugin_test.js +0 -257
- package/test/unit/plugins/event-plugin_test.js +0 -119
- package/test/unit/plugins/multientity-plugin_test.js +0 -248
- package/test/unit/plugins/timestamp-processing-plugin_test.js +0 -119
- package/test/unit/provisioning/device-provisioning-api_test.js +0 -748
- package/test/unit/provisioning/device-registration_test.js +0 -432
- package/test/unit/provisioning/device-update-registration_test.js +0 -326
- package/test/unit/provisioning/listProvisionedDevices-test.js +0 -488
- package/test/unit/provisioning/provisionDeviceMultientity-test.js +0 -123
- package/test/unit/provisioning/removeProvisionedDevice-test.js +0 -244
- package/test/unit/provisioning/singleConfigurationMode-test.js +0 -346
- 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
|
-
|
|
238
|
-
if (
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
475
|
-
|
|
476
|
-
context,
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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-
|
|
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
|
-
|
|
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[
|
|
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
|
-
|
|
125
|
-
|
|
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-
|
|
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: %
|
|
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
|
-
|
|
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
|
|
547
|
-
req.
|
|
545
|
+
'queries must offer JSON entities, content-type not supported (%s found)',
|
|
546
|
+
req.header('content-type')
|
|
548
547
|
);
|
|
549
|
-
handleQueryContextRequests(
|
|
550
|
-
|
|
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 (
|
|
561
|
+
if (entities[0].idPattern) {
|
|
553
562
|
logger.warn('queries with idPattern are not supported');
|
|
554
|
-
handleQueryContextRequests({
|
|
555
|
-
|
|
563
|
+
return handleQueryContextRequests({
|
|
564
|
+
code: 400,
|
|
565
|
+
name: 'BadRequest',
|
|
566
|
+
message: 'idPattern usage in query'
|
|
567
|
+
});
|
|
556
568
|
}
|
|
557
569
|
|
|
558
|
-
contextEntity.id =
|
|
559
|
-
contextEntity.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-
|
|
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;
|