iotagent-node-lib 2.17.0 → 2.20.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 -2
- package/.nyc_output/76bc24ff-5fac-4b5a-997d-de2799342eb0.json +1 -0
- package/.nyc_output/processinfo/76bc24ff-5fac-4b5a-997d-de2799342eb0.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -1
- package/CHANGES_NEXT_RELEASE +1 -0
- package/README.md +3 -54
- package/doc/advanced-topics.md +121 -85
- package/doc/api.md +52 -52
- package/doc/development.md +13 -6
- package/doc/expressionLanguage.md +514 -312
- package/doc/installationguide.md +66 -64
- package/doc/usermanual.md +48 -16
- package/docker/Mosquitto/Dockerfile +1 -0
- package/docker/Mosquitto/README.md +1 -0
- package/docker/Mosquitto/startMosquitto.sh +9 -4
- package/lib/commonConfig.js +1 -14
- package/lib/errors.js +0 -16
- package/lib/fiware-iotagent-lib.js +4 -2
- package/lib/jexlTranformsMap.js +13 -2
- package/lib/model/Device.js +4 -1
- package/lib/model/Group.js +19 -1
- package/lib/plugins/attributeAlias.js +6 -13
- package/lib/plugins/bidirectionalData.js +1 -21
- package/lib/plugins/expressionParser.js +7 -6
- package/lib/plugins/expressionPlugin.js +11 -25
- package/lib/plugins/jexlParser.js +8 -4
- package/lib/plugins/multiEntity.js +54 -145
- 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 +6 -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 +2 -0
- package/lib/services/devices/deviceService.js +2 -5
- package/lib/services/devices/devices-NGSI-LD.js +1 -1
- package/lib/services/devices/devices-NGSI-v2.js +4 -8
- package/lib/services/devices/registrationUtils.js +1 -134
- package/lib/services/ngsi/entities-NGSI-LD.js +205 -124
- package/lib/services/ngsi/entities-NGSI-v2.js +109 -15
- package/lib/services/ngsi/ngsiService.js +4 -6
- package/lib/services/ngsi/ngsiUtils.js +0 -36
- 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 +24 -12
- package/lib/services/northBound/contextServer.js +1 -4
- package/lib/services/northBound/contextServerUtils.js +0 -81
- package/lib/services/northBound/deviceProvisioningServer.js +31 -7
- package/lib/services/northBound/northboundServer.js +2 -0
- package/lib/services/northBound/restUtils.js +1 -38
- package/lib/templates/updateDevice.json +4 -0
- package/lib/templates/updateDeviceLax.json +4 -0
- package/package.json +10 -16
- package/test/tools/utils.js +2 -0
- package/test/unit/examples/groupProvisioningRequests/multipleGroupsCreation.json +1 -1
- package/test/unit/expressions/jexlExpression-test.js +44 -5
- package/test/unit/general/contextBrokerKeystoneSecurityAccess-test.js +19 -66
- package/test/unit/general/deviceService-test.js +11 -27
- package/test/unit/general/loglevel-api_test.js +6 -11
- package/test/unit/general/startup-test.js +2 -1
- package/test/unit/memoryRegistry/deviceRegistryMemory_test.js +8 -16
- package/test/unit/mongodb/mongodb-group-registry-test.js +1 -1
- package/test/unit/mongodb/mongodb-registry-test.js +38 -114
- 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/expressions/jexlBasedTransformations-test.js +1018 -0
- package/test/unit/ngsi-ld/general/contextBrokerOAuthSecurityAccess-test.js +2 -2
- package/test/unit/ngsi-ld/general/deviceService-test.js +1 -1
- package/test/unit/ngsi-ld/general/https-support-test.js +2 -1
- package/test/unit/ngsi-ld/general/iotam-autoregistration-test.js +2 -1
- package/test/unit/ngsi-ld/general/startup-test.js +1 -0
- package/test/unit/ngsi-ld/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
- package/test/unit/ngsi-ld/lazyAndCommands/command-test.js +2 -1
- package/test/unit/ngsi-ld/lazyAndCommands/lazy-devices-test.js +2 -6
- package/test/unit/ngsi-ld/lazyAndCommands/polling-commands-test.js +2 -1
- package/test/unit/ngsi-ld/ngsiService/active-devices-test.js +1 -0
- package/test/unit/ngsi-ld/ngsiService/autocast-test.js +1 -0
- package/test/unit/ngsi-ld/ngsiService/geoproperties-test.js +1 -0
- package/test/unit/ngsi-ld/ngsiService/subscriptions-test.js +4 -3
- package/test/unit/ngsi-ld/plugins/alias-plugin_test.js +1 -0
- package/test/unit/ngsi-ld/plugins/bidirectional-plugin_test.js +3 -2
- package/test/unit/ngsi-ld/plugins/multientity-plugin_test.js +61 -0
- package/test/unit/ngsi-ld/provisioning/device-provisioning-api_test.js +2 -1
- package/test/unit/ngsi-ld/provisioning/device-registration_test.js +3 -2
- package/test/unit/ngsi-ld/provisioning/device-update-registration_test.js +1 -0
- package/test/unit/ngsi-ld/provisioning/listProvisionedDevices-test.js +42 -54
- package/test/unit/ngsi-ld/provisioning/provisionDeviceMultientity-test.js +2 -1
- package/test/unit/ngsi-ld/provisioning/removeProvisionedDevice-test.js +4 -4
- package/test/unit/ngsi-ld/provisioning/singleConfigurationMode-test.js +3 -5
- package/test/unit/ngsi-ld/provisioning/updateProvisionedDevices-test.js +12 -18
- package/test/unit/ngsi-mixed/provisioning/ngsi-versioning-test.js +3 -1
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent3.json +19 -0
- package/test/unit/ngsiv2/examples/contextAvailabilityRequests/registerIoTAgent5.json +19 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin17.json +1 -1
- package/test/unit/ngsiv2/examples/contextRequests/updateContextExpressionPlugin29.json +22 -0
- 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/updateContextMiddleware1.json +10 -0
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMiddleware2.json +10 -0
- 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/updateContextMultientityTimestampPlugin1.json +6 -6
- package/test/unit/ngsiv2/examples/contextRequests/updateContextMultientityTimestampPlugin2.json +3 -3
- package/test/unit/{examples → ngsiv2/examples}/contextRequests/updateProvisionDevice.json +0 -0
- package/test/unit/ngsiv2/expressions/expressionBasedTransformations-test.js +37 -4
- package/test/unit/ngsiv2/expressions/jexlBasedTransformations-test.js +598 -0
- package/test/unit/ngsiv2/general/contextBrokerOAuthSecurityAccess-test.js +3 -2
- package/test/unit/ngsiv2/general/deviceService-test.js +9 -8
- package/test/unit/ngsiv2/general/https-support-test.js +2 -1
- package/test/unit/ngsiv2/general/iotam-autoregistration-test.js +2 -1
- package/test/unit/ngsiv2/general/startup-test.js +1 -0
- package/test/unit/ngsiv2/lazyAndCommands/active-devices-attribute-update-test.js +3 -1
- package/test/unit/ngsiv2/lazyAndCommands/command-test.js +2 -1
- package/test/unit/ngsiv2/lazyAndCommands/lazy-devices-test.js +287 -15
- package/test/unit/ngsiv2/lazyAndCommands/polling-commands-test.js +3 -1
- package/test/unit/ngsiv2/ngsiService/active-devices-test.js +88 -0
- package/test/unit/{ngsiService → ngsiv2/ngsiService}/queryDeviceInformationInCb-test.js +20 -49
- package/test/unit/ngsiv2/ngsiService/subscriptions-test.js +4 -3
- package/test/unit/ngsiv2/plugins/bidirectional-plugin_test.js +3 -2
- package/test/unit/ngsiv2/plugins/multientity-plugin_test.js +526 -0
- package/test/unit/{plugins → ngsiv2/plugins}/translation-inPlugins_test.js +21 -21
- package/test/unit/{provisioning → ngsiv2/provisioning}/device-group-api-test.js +19 -50
- package/test/unit/{provisioning/device-group-utils_test.js → ngsiv2/provisioning/device-group-utils-test.js} +5 -4
- package/test/unit/ngsiv2/provisioning/device-provisioning-api_test.js +2 -1
- package/test/unit/ngsiv2/provisioning/device-registration_test.js +3 -2
- package/test/unit/ngsiv2/provisioning/device-update-registration_test.js +4 -3
- package/test/unit/ngsiv2/provisioning/listProvisionedDevices-test.js +42 -53
- package/test/unit/ngsiv2/provisioning/provisionDeviceMultientity-test.js +2 -1
- package/test/unit/ngsiv2/provisioning/removeProvisionedDevice-test.js +4 -4
- package/test/unit/ngsiv2/provisioning/singleConfigurationMode-test.js +3 -4
- package/test/unit/ngsiv2/provisioning/updateProvisionedDevices-test.js +14 -20
- package/test/unit/plugins/capture-configuration-inPlugins_test.js +3 -1
- package/test/unit/plugins/capture-provision-inPlugins_test.js +8 -18
- package/.eslintcache +0 -1
- package/.nyc_output/dca24ca1-851e-490c-9d34-8d13b3330297.json +0 -1
- package/.nyc_output/processinfo/dca24ca1-851e-490c-9d34-8d13b3330297.json +0 -1
- package/bin/agentConsole.js +0 -257
- package/bin/iotAgentTester.js +0 -44
- package/lib/command/commandLine.js +0 -918
- package/lib/command/migration.js +0 -176
- package/lib/services/devices/devices-NGSI-v1.js +0 -310
- package/lib/services/ngsi/entities-NGSI-v1.js +0 -299
- 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 -26
- 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 -32
- 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/updateContextExpressionPlugin10.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/updateContextExpressionPlugin6.json +0 -17
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin7.json +0 -27
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin8.json +0 -22
- package/test/unit/examples/contextRequests/updateContextExpressionPlugin9.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 -42
- 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/general/migration-test.js +0 -256
- 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
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
/* eslint-disable consistent-return */
|
|
27
27
|
|
|
28
|
-
const request = require('request');
|
|
28
|
+
const request = require('../../request-shim');
|
|
29
29
|
const statsService = require('./../stats/statsRegistry');
|
|
30
30
|
const async = require('async');
|
|
31
31
|
const apply = async.apply;
|
|
@@ -34,6 +34,7 @@ const errors = require('../../errors');
|
|
|
34
34
|
const utils = require('../northBound/restUtils');
|
|
35
35
|
const config = require('../../commonConfig');
|
|
36
36
|
const constants = require('../../constants');
|
|
37
|
+
const jexlParser = require('../../plugins/jexlParser');
|
|
37
38
|
const moment = require('moment-timezone');
|
|
38
39
|
const logger = require('logops');
|
|
39
40
|
const _ = require('underscore');
|
|
@@ -43,19 +44,8 @@ const context = {
|
|
|
43
44
|
const NGSIv2 = require('./entities-NGSI-v2');
|
|
44
45
|
const NGSIUtils = require('./ngsiUtils');
|
|
45
46
|
|
|
46
|
-
const NGSI_LD_NULL = { '@type': 'Intangible', '@value': null };
|
|
47
47
|
const NGSI_LD_URN = 'urn:ngsi-ld:';
|
|
48
48
|
|
|
49
|
-
/**
|
|
50
|
-
* Determines if a value is a number - Not a Number replaced by Null
|
|
51
|
-
*
|
|
52
|
-
* @param {String} value Value to be analyzed
|
|
53
|
-
* @return {Number}
|
|
54
|
-
*/
|
|
55
|
-
function valueOfOrNull(value) {
|
|
56
|
-
return isNaN(value) ? NGSI_LD_NULL : value;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
49
|
/**
|
|
60
50
|
* Amends an NGSIv2 attribute to NGSI-LD format
|
|
61
51
|
* All native JSON types are respected and cast as Property values
|
|
@@ -66,100 +56,112 @@ function valueOfOrNull(value) {
|
|
|
66
56
|
* format
|
|
67
57
|
*/
|
|
68
58
|
|
|
69
|
-
function
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
break;
|
|
112
|
-
case 'time':
|
|
113
|
-
obj.value = {
|
|
114
|
-
'@type': 'Time',
|
|
115
|
-
'@value': moment.tz(attr.value, 'Etc/UTC').format(moment.HTML5_FMT.TIME_SECONDS)
|
|
116
|
-
};
|
|
117
|
-
break;
|
|
118
|
-
|
|
119
|
-
// GeoProperties
|
|
120
|
-
case 'geoproperty':
|
|
121
|
-
case 'point':
|
|
122
|
-
case 'geo:point':
|
|
123
|
-
case 'geo:json':
|
|
124
|
-
obj.type = 'GeoProperty';
|
|
125
|
-
obj.value = NGSIUtils.getLngLats('Point', attr.value);
|
|
126
|
-
break;
|
|
127
|
-
case 'linestring':
|
|
128
|
-
case 'geo:linestring':
|
|
129
|
-
obj.type = 'GeoProperty';
|
|
130
|
-
obj.value = NGSIUtils.getLngLats('LineString', attr.value);
|
|
131
|
-
break;
|
|
132
|
-
case 'polygon':
|
|
133
|
-
case 'geo:polygon':
|
|
134
|
-
obj.type = 'GeoProperty';
|
|
135
|
-
obj.value = NGSIUtils.getLngLats('Polygon', attr.value);
|
|
136
|
-
break;
|
|
137
|
-
case 'multipoint':
|
|
138
|
-
case 'geo:multipoint':
|
|
139
|
-
obj.type = 'GeoProperty';
|
|
140
|
-
obj.value = NGSIUtils.getLngLats('MultiPoint', attr.value);;
|
|
141
|
-
break;
|
|
142
|
-
case 'multilinestring':
|
|
143
|
-
case 'geo:multilinestring':
|
|
144
|
-
obj.type = 'GeoProperty';
|
|
145
|
-
obj.value = NGSIUtils.getLngLats( 'MultiLineString', attr.value);
|
|
146
|
-
break;
|
|
147
|
-
case 'multipolygon':
|
|
148
|
-
case 'geo:multipolygon':
|
|
149
|
-
obj.type = 'GeoProperty';
|
|
150
|
-
obj.value = NGSIUtils.getLngLats( 'MultiPolygon', attr.value);
|
|
151
|
-
break;
|
|
152
|
-
|
|
153
|
-
// Relationships
|
|
154
|
-
case 'relationship':
|
|
155
|
-
obj.type = 'Relationship';
|
|
156
|
-
obj.object = attr.value;
|
|
157
|
-
delete obj.value;
|
|
158
|
-
break;
|
|
59
|
+
function convertAttrNGSILD(attr) {
|
|
60
|
+
// eslint eqeqeq - deliberate double equals to include undefined.
|
|
61
|
+
if (attr.value == null || Number.isNaN(attr.value)) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
let obj = { type: 'Property', value: attr.value };
|
|
65
|
+
|
|
66
|
+
switch (attr.type.toLowerCase()) {
|
|
67
|
+
// Properties
|
|
68
|
+
case 'property':
|
|
69
|
+
case 'string':
|
|
70
|
+
case 'text':
|
|
71
|
+
case 'textunrestricted':
|
|
72
|
+
break;
|
|
73
|
+
|
|
74
|
+
// Other Native JSON Types
|
|
75
|
+
case 'boolean':
|
|
76
|
+
obj.value = !!attr.value;
|
|
77
|
+
break;
|
|
78
|
+
case 'float':
|
|
79
|
+
if (isNaN(attr.value)) {
|
|
80
|
+
obj = undefined;
|
|
81
|
+
} else {
|
|
82
|
+
obj.value = Number.parseFloat(attr.value);
|
|
83
|
+
}
|
|
84
|
+
break;
|
|
85
|
+
case 'integer':
|
|
86
|
+
if (isNaN(attr.value)) {
|
|
87
|
+
obj = undefined;
|
|
88
|
+
} else {
|
|
89
|
+
obj.value = Number.parseInt(attr.value);
|
|
90
|
+
}
|
|
91
|
+
break;
|
|
92
|
+
case 'number':
|
|
93
|
+
if (isNaN(attr.value)) {
|
|
94
|
+
obj = undefined;
|
|
95
|
+
} else if (NGSIUtils.isFloat(attr.value)) {
|
|
96
|
+
obj.value = Number.parseFloat(attr.value);
|
|
97
|
+
} else {
|
|
98
|
+
obj.value = Number.parseInt(attr.value);
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
159
101
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
102
|
+
// Temporal Properties
|
|
103
|
+
case 'datetime':
|
|
104
|
+
obj.value = {
|
|
105
|
+
'@type': 'DateTime',
|
|
106
|
+
'@value': moment.tz(attr.value, 'Etc/UTC').toISOString()
|
|
107
|
+
};
|
|
108
|
+
break;
|
|
109
|
+
case 'date':
|
|
110
|
+
obj.value = {
|
|
111
|
+
'@type': 'Date',
|
|
112
|
+
'@value': moment.tz(attr.value, 'Etc/UTC').format(moment.HTML5_FMT.DATE)
|
|
113
|
+
};
|
|
114
|
+
break;
|
|
115
|
+
case 'time':
|
|
116
|
+
obj.value = {
|
|
117
|
+
'@type': 'Time',
|
|
118
|
+
'@value': moment.tz(attr.value, 'Etc/UTC').format(moment.HTML5_FMT.TIME_SECONDS)
|
|
119
|
+
};
|
|
120
|
+
break;
|
|
121
|
+
|
|
122
|
+
// GeoProperties
|
|
123
|
+
case 'geoproperty':
|
|
124
|
+
case 'point':
|
|
125
|
+
case 'geo:point':
|
|
126
|
+
case 'geo:json':
|
|
127
|
+
obj.type = 'GeoProperty';
|
|
128
|
+
obj.value = NGSIUtils.getLngLats('Point', attr.value);
|
|
129
|
+
break;
|
|
130
|
+
case 'linestring':
|
|
131
|
+
case 'geo:linestring':
|
|
132
|
+
obj.type = 'GeoProperty';
|
|
133
|
+
obj.value = NGSIUtils.getLngLats('LineString', attr.value);
|
|
134
|
+
break;
|
|
135
|
+
case 'polygon':
|
|
136
|
+
case 'geo:polygon':
|
|
137
|
+
obj.type = 'GeoProperty';
|
|
138
|
+
obj.value = NGSIUtils.getLngLats('Polygon', attr.value);
|
|
139
|
+
break;
|
|
140
|
+
case 'multipoint':
|
|
141
|
+
case 'geo:multipoint':
|
|
142
|
+
obj.type = 'GeoProperty';
|
|
143
|
+
obj.value = NGSIUtils.getLngLats('MultiPoint', attr.value);
|
|
144
|
+
break;
|
|
145
|
+
case 'multilinestring':
|
|
146
|
+
case 'geo:multilinestring':
|
|
147
|
+
obj.type = 'GeoProperty';
|
|
148
|
+
obj.value = NGSIUtils.getLngLats('MultiLineString', attr.value);
|
|
149
|
+
break;
|
|
150
|
+
case 'multipolygon':
|
|
151
|
+
case 'geo:multipolygon':
|
|
152
|
+
obj.type = 'GeoProperty';
|
|
153
|
+
obj.value = NGSIUtils.getLngLats('MultiPolygon', attr.value);
|
|
154
|
+
break;
|
|
155
|
+
|
|
156
|
+
// Relationships
|
|
157
|
+
case 'relationship':
|
|
158
|
+
obj.type = 'Relationship';
|
|
159
|
+
obj.object = attr.value;
|
|
160
|
+
delete obj.value;
|
|
161
|
+
break;
|
|
162
|
+
|
|
163
|
+
default:
|
|
164
|
+
obj.value = { '@type': attr.type, '@value': attr.value };
|
|
163
165
|
}
|
|
164
166
|
|
|
165
167
|
if (attr.metadata) {
|
|
@@ -178,7 +180,7 @@ function convertNGSIv2ToLD(attr) {
|
|
|
178
180
|
obj.unitCode = attr.metadata[key].value;
|
|
179
181
|
break;
|
|
180
182
|
default:
|
|
181
|
-
obj[key] =
|
|
183
|
+
obj[key] = convertAttrNGSILD(attr.metadata[key]);
|
|
182
184
|
}
|
|
183
185
|
});
|
|
184
186
|
delete obj.TimeInstant;
|
|
@@ -201,7 +203,7 @@ function formatAsNGSILD(json) {
|
|
|
201
203
|
case 'id':
|
|
202
204
|
id = json[key];
|
|
203
205
|
obj[key] = id;
|
|
204
|
-
if (!id.startsWith(NGSI_LD_URN)){
|
|
206
|
+
if (!id.startsWith(NGSI_LD_URN)) {
|
|
205
207
|
obj[key] = NGSI_LD_URN + json.type + ':' + id;
|
|
206
208
|
logger.debug(context, 'Amending id to a valid URN: %s', obj[key]);
|
|
207
209
|
}
|
|
@@ -214,7 +216,7 @@ function formatAsNGSILD(json) {
|
|
|
214
216
|
// element for NSGI-LD.
|
|
215
217
|
break;
|
|
216
218
|
default:
|
|
217
|
-
obj[key] =
|
|
219
|
+
obj[key] = convertAttrNGSILD(json[key]);
|
|
218
220
|
}
|
|
219
221
|
});
|
|
220
222
|
|
|
@@ -288,18 +290,15 @@ function generateNGSILDOperationHandler(operationName, entityName, typeInformati
|
|
|
288
290
|
);
|
|
289
291
|
} else if (response && body && response.statusCode === 404) {
|
|
290
292
|
logger.info(context, 'Received the following response from the CB:\n\n%s\n\n', bodyAsString);
|
|
291
|
-
|
|
292
293
|
logger.error(context, 'Operation ' + operationName + ' error connecting to the Context Broker: %j', body);
|
|
293
294
|
|
|
294
|
-
|
|
295
|
-
if (
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
) {
|
|
295
|
+
let errorField = body.error;
|
|
296
|
+
if (body.description) {
|
|
297
|
+
errorField += ':' + body.description;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (errorField !== undefined) {
|
|
300
301
|
callback(new errors.DeviceNotFound(entityName));
|
|
301
|
-
} else if (errorField.code && errorField.code === '404') {
|
|
302
|
-
callback(new errors.AttributeNotFound());
|
|
303
302
|
} else {
|
|
304
303
|
callback(new errors.EntityGenericError(entityName, typeInformation.type, body));
|
|
305
304
|
}
|
|
@@ -332,7 +331,6 @@ function sendQueryValueNgsiLD(entityName, attributes, typeInformation, token, ca
|
|
|
332
331
|
|
|
333
332
|
const options = NGSIUtils.createRequestObject(url, typeInformation, token);
|
|
334
333
|
options.method = 'GET';
|
|
335
|
-
options.json = true;
|
|
336
334
|
|
|
337
335
|
if (!typeInformation || !typeInformation.type) {
|
|
338
336
|
callback(new errors.TypeNotFound(null, entityName));
|
|
@@ -376,7 +374,7 @@ function addLinkedEntities(typeInformation, json) {
|
|
|
376
374
|
return calculatedType;
|
|
377
375
|
}
|
|
378
376
|
const linkedTypeInfo = {};
|
|
379
|
-
if(typeInformation.staticAttributes){
|
|
377
|
+
if (typeInformation.staticAttributes) {
|
|
380
378
|
typeInformation.staticAttributes.forEach((item) => {
|
|
381
379
|
if (item.link) {
|
|
382
380
|
linkedTypeInfo[item.name] = item.link;
|
|
@@ -405,6 +403,90 @@ function addLinkedEntities(typeInformation, json) {
|
|
|
405
403
|
});
|
|
406
404
|
}
|
|
407
405
|
|
|
406
|
+
/**
|
|
407
|
+
* Remove id, type and any hidden attrs after processing
|
|
408
|
+
*
|
|
409
|
+
* @param {Object} enities Unprocessed entities
|
|
410
|
+
* @param {Object} typeInformation Configuration information for the device.
|
|
411
|
+
*/
|
|
412
|
+
function removeHiddenAttrsFromMultiEntity(entities, typeInformation) {
|
|
413
|
+
var explicitAttrsList = [];
|
|
414
|
+
if (typeInformation.explicitAttrs) {
|
|
415
|
+
explicitAttrsList.push('type');
|
|
416
|
+
explicitAttrsList.push('id');
|
|
417
|
+
if (typeof typeInformation.explicitAttrs === 'boolean') {
|
|
418
|
+
if (typeInformation.timestamp) {
|
|
419
|
+
explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
|
|
420
|
+
}
|
|
421
|
+
if (typeInformation.active) {
|
|
422
|
+
typeInformation.active.forEach((attr) => {
|
|
423
|
+
explicitAttrsList.push(attr.name);
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
if (typeInformation.staticAttributes) {
|
|
427
|
+
typeInformation.staticAttributes.forEach((attr) => {
|
|
428
|
+
explicitAttrsList.push(attr.name);
|
|
429
|
+
});
|
|
430
|
+
}
|
|
431
|
+
} else if (typeof typeInformation.explicitAttrs === 'string') {
|
|
432
|
+
entities.forEach((entity) => {
|
|
433
|
+
const attsArray = utils.extractAttributesArrayFromNgsi2Entity(entity);
|
|
434
|
+
const ctx = jexlParser.extractContext(attsArray);
|
|
435
|
+
const res = jexlParser.parse(typeInformation.explicitAttrs, ctx);
|
|
436
|
+
explicitAttrsList = explicitAttrsList.concat(res);
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if (explicitAttrsList.length > 0) {
|
|
441
|
+
entities.forEach((entity) => {
|
|
442
|
+
const hidden = _.difference(_.keys(entity), explicitAttrsList);
|
|
443
|
+
hidden.forEach((attr) => {
|
|
444
|
+
delete entity[attr];
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
return entities;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Remove id, type and any hidden attrs after processing
|
|
453
|
+
*
|
|
454
|
+
* @param {Object} result Unprocessed entity
|
|
455
|
+
* @param {Object} typeInformation Configuration information for the device.
|
|
456
|
+
*/
|
|
457
|
+
function removeHiddenAttrs(result, typeInformation) {
|
|
458
|
+
delete result.id;
|
|
459
|
+
delete result.type;
|
|
460
|
+
var explicitAttrsList = [];
|
|
461
|
+
if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'boolean') {
|
|
462
|
+
if (typeInformation.timestamp) {
|
|
463
|
+
explicitAttrsList.push(constants.TIMESTAMP_ATTRIBUTE);
|
|
464
|
+
}
|
|
465
|
+
if (typeInformation.active) {
|
|
466
|
+
typeInformation.active.forEach((attr) => {
|
|
467
|
+
explicitAttrsList.push(attr.name);
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
if (typeInformation.staticAttributes) {
|
|
471
|
+
typeInformation.staticAttributes.forEach((attr) => {
|
|
472
|
+
explicitAttrsList.push(attr.name);
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
} else if (typeInformation.explicitAttrs && typeof typeInformation.explicitAttrs === 'string') {
|
|
476
|
+
const attsArray = utils.extractAttributesArrayFromNgsi2Entity(result);
|
|
477
|
+
const ctx = jexlParser.extractContext(attsArray);
|
|
478
|
+
const res = jexlParser.parse(typeInformation.explicitAttrs, ctx);
|
|
479
|
+
explicitAttrsList = res;
|
|
480
|
+
}
|
|
481
|
+
if (explicitAttrsList.length > 0) {
|
|
482
|
+
const hidden = _.difference(_.keys(result), explicitAttrsList);
|
|
483
|
+
hidden.forEach((attr) => {
|
|
484
|
+
delete result[attr];
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
return result;
|
|
488
|
+
}
|
|
489
|
+
|
|
408
490
|
/**
|
|
409
491
|
* Makes an update in the Device's entity in the context broker, with the values given in the 'attributes' array.
|
|
410
492
|
* This array should comply to the NGSI-LD's attribute format.
|
|
@@ -416,7 +498,6 @@ function addLinkedEntities(typeInformation, json) {
|
|
|
416
498
|
*/
|
|
417
499
|
function sendUpdateValueNgsiLD(entityName, attributes, typeInformation, token, callback) {
|
|
418
500
|
let payload = {};
|
|
419
|
-
|
|
420
501
|
const url = '/ngsi-ld/v1/entityOperations/upsert/?options=update';
|
|
421
502
|
|
|
422
503
|
const options = NGSIUtils.createRequestObject(url, typeInformation, token);
|
|
@@ -477,11 +558,10 @@ function sendUpdateValueNgsiLD(entityName, attributes, typeInformation, token, c
|
|
|
477
558
|
}
|
|
478
559
|
}
|
|
479
560
|
|
|
480
|
-
options.json = result;
|
|
561
|
+
options.json = removeHiddenAttrsFromMultiEntity(result, typeInformation);
|
|
481
562
|
} else {
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
options.json = result;
|
|
563
|
+
// Remove id, type and any hidden attrs after processing
|
|
564
|
+
options.json = removeHiddenAttrs(result, typeInformation);
|
|
485
565
|
logger.debug(context, 'typeInformation: %j', typeInformation);
|
|
486
566
|
if (
|
|
487
567
|
'timestamp' in typeInformation && typeInformation.timestamp !== undefined
|
|
@@ -570,6 +650,7 @@ function sendUpdateValueNgsiLD(entityName, attributes, typeInformation, token, c
|
|
|
570
650
|
);
|
|
571
651
|
}
|
|
572
652
|
|
|
653
|
+
exports.convertAttrNGSILD = convertAttrNGSILD;
|
|
573
654
|
exports.formatAsNGSILD = formatAsNGSILD;
|
|
574
655
|
exports.sendUpdateValue = sendUpdateValueNgsiLD;
|
|
575
656
|
exports.sendQueryValue = sendQueryValueNgsiLD;
|
|
@@ -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,11 +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 (
|
|
240
|
+
let errorField = body.error;
|
|
241
|
+
if (body.description) {
|
|
242
|
+
errorField += ':' + body.description;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (errorField !== undefined) {
|
|
239
246
|
callback(new errors.DeviceNotFound(entityName));
|
|
240
|
-
} else if (errorField.code && errorField.code === '404') {
|
|
241
|
-
callback(new errors.AttributeNotFound());
|
|
242
247
|
} else {
|
|
243
248
|
callback(new errors.EntityGenericError(entityName, typeInformation.type, body));
|
|
244
249
|
}
|
|
@@ -288,7 +293,6 @@ function sendQueryValueNgsi2(entityName, attributes, typeInformation, token, cal
|
|
|
288
293
|
|
|
289
294
|
const options = NGSIUtils.createRequestObject(url, typeInformation, token);
|
|
290
295
|
options.method = 'GET';
|
|
291
|
-
options.json = true;
|
|
292
296
|
|
|
293
297
|
if (!typeInformation || !typeInformation.type) {
|
|
294
298
|
callback(new errors.TypeNotFound(null, entityName));
|
|
@@ -310,6 +314,92 @@ function sendQueryValueNgsi2(entityName, attributes, typeInformation, token, cal
|
|
|
310
314
|
);
|
|
311
315
|
}
|
|
312
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
|
+
|
|
313
403
|
/**
|
|
314
404
|
* Makes an update in the Device's entity in the context broker, with the values given in the 'attributes' array. This
|
|
315
405
|
* array should comply to the NGSIv2's attribute format.
|
|
@@ -324,7 +414,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
|
|
|
324
414
|
|
|
325
415
|
let url = '/v2/entities/' + entityName + '/attrs';
|
|
326
416
|
|
|
327
|
-
if (typeInformation.type) {
|
|
417
|
+
if (typeInformation && typeInformation.type) {
|
|
328
418
|
url += '?type=' + typeInformation.type;
|
|
329
419
|
}
|
|
330
420
|
|
|
@@ -339,9 +429,6 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
|
|
|
339
429
|
return;
|
|
340
430
|
}
|
|
341
431
|
|
|
342
|
-
payload.id = entityName;
|
|
343
|
-
payload.type = typeInformation.type;
|
|
344
|
-
|
|
345
432
|
for (let i = 0; i < attributes.length; i++) {
|
|
346
433
|
if (attributes[i].name && attributes[i].type) {
|
|
347
434
|
payload[attributes[i].name] = {
|
|
@@ -357,7 +444,9 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
|
|
|
357
444
|
return;
|
|
358
445
|
}
|
|
359
446
|
}
|
|
360
|
-
|
|
447
|
+
//overwritte if id or type missnamed atributes reach this point
|
|
448
|
+
payload.id = entityName;
|
|
449
|
+
payload.type = typeInformation.type;
|
|
361
450
|
payload = NGSIUtils.castJsonNativeAttributes(payload);
|
|
362
451
|
async.waterfall(
|
|
363
452
|
[
|
|
@@ -390,7 +479,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
|
|
|
390
479
|
}
|
|
391
480
|
options.json = {
|
|
392
481
|
actionType: 'append',
|
|
393
|
-
entities: result
|
|
482
|
+
entities: removeHiddenAttrsFromMultiEntity(result, typeInformation)
|
|
394
483
|
};
|
|
395
484
|
if (config.getConfig().appendMode === true) {
|
|
396
485
|
options.json.actionType = 'append';
|
|
@@ -398,9 +487,7 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
|
|
|
398
487
|
options.json.actionType = 'update';
|
|
399
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
|
|
@@ -429,6 +516,13 @@ function sendUpdateValueNgsi2(entityName, attributes, typeInformation, token, ca
|
|
|
429
516
|
// Purge object_id from entities before sent to CB
|
|
430
517
|
// object_id was added by createNgsi2Entity to allow multientity
|
|
431
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
|
+
|
|
432
526
|
let att;
|
|
433
527
|
if (options.json.entities) {
|
|
434
528
|
for (let entity = 0; entity < options.json.entities.length; entity++) {
|
|
@@ -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
|
}
|