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
package/lib/command/migration.js
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2016 Telefonica Investigación y Desarrollo, S.A.U
|
|
3
|
-
*
|
|
4
|
-
* This file is part of fiware-iotagent-lib
|
|
5
|
-
*
|
|
6
|
-
* fiware-iotagent-lib is free software: you can redistribute it and/or
|
|
7
|
-
* modify it under the terms of the GNU Affero General Public License as
|
|
8
|
-
* published by the Free Software Foundation, either version 3 of the License,
|
|
9
|
-
* or (at your option) any later version.
|
|
10
|
-
*
|
|
11
|
-
* fiware-iotagent-lib is distributed in the hope that it will be useful,
|
|
12
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
14
|
-
* See the GNU Affero General Public License for more details.
|
|
15
|
-
*
|
|
16
|
-
* You should have received a copy of the GNU Affero General Public
|
|
17
|
-
* License along with fiware-iotagent-lib.
|
|
18
|
-
* If not, see http://www.gnu.org/licenses/.
|
|
19
|
-
*
|
|
20
|
-
* For those usages not covered by the GNU Affero General Public License
|
|
21
|
-
* please contact with::[contacto@tid.es]
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/* eslint-disable no-prototype-builtins */
|
|
25
|
-
|
|
26
|
-
const async = require('async');
|
|
27
|
-
const logger = require('logops');
|
|
28
|
-
const apply = async.apply;
|
|
29
|
-
const MongoClient = require('mongodb').MongoClient;
|
|
30
|
-
const serviceTranslation = {
|
|
31
|
-
apikey: 'apikey',
|
|
32
|
-
token: 'trust',
|
|
33
|
-
cbroker: 'cbHost',
|
|
34
|
-
entity_type: 'type',
|
|
35
|
-
resource: 'resource',
|
|
36
|
-
service: 'service',
|
|
37
|
-
service_path: 'subservice',
|
|
38
|
-
attributes: 'attributes',
|
|
39
|
-
static_attributes: 'staticAttributes'
|
|
40
|
-
};
|
|
41
|
-
const deviceTranslation = {
|
|
42
|
-
device_id: 'id',
|
|
43
|
-
entity_name: 'name',
|
|
44
|
-
entity_type: 'type',
|
|
45
|
-
endpoint: 'endpoint',
|
|
46
|
-
timezone: 'timezone',
|
|
47
|
-
service: 'service',
|
|
48
|
-
service_path: 'subservice',
|
|
49
|
-
protocol: 'protocol',
|
|
50
|
-
attributes: 'active',
|
|
51
|
-
static_attributes: 'staticAttributes',
|
|
52
|
-
commands: 'commands',
|
|
53
|
-
registration_id: 'registrationId'
|
|
54
|
-
};
|
|
55
|
-
const context = {
|
|
56
|
-
op: 'IoTAgentNGSI.MigrationTool'
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
function connectToDb(dbConfig, dbName, callback) {
|
|
60
|
-
const url = 'mongodb://' + dbConfig.host + ':' + (dbConfig.port || 27017) + '/' + dbName;
|
|
61
|
-
|
|
62
|
-
MongoClient.connect(url, { useNewUrlParser: true }, callback);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function generateCollectionTranslator(translationKey) {
|
|
66
|
-
function translateItem(item, innerCb) {
|
|
67
|
-
const translatedItem = {};
|
|
68
|
-
|
|
69
|
-
for (const i in item) {
|
|
70
|
-
if (item.hasOwnProperty(i) && translationKey[i]) {
|
|
71
|
-
translatedItem[translationKey[i]] = item[i];
|
|
72
|
-
} else if (i !== '_id') {
|
|
73
|
-
logger.warn(context, 'Attribute [%s] was not found for item translation', i);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
innerCb(null, translatedItem);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
return function translateCollection(docs, innerCb) {
|
|
81
|
-
async.map(docs, translateItem, innerCb);
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
function migrate(dbConfig, originDb, targetDb, service, subservice, callback) {
|
|
86
|
-
function saveToTargetDb(db, collection, docs, innerCb) {
|
|
87
|
-
if (docs.length > 0) {
|
|
88
|
-
db.db()
|
|
89
|
-
.collection(collection)
|
|
90
|
-
/* eslint-disable-next-line no-unused-vars */
|
|
91
|
-
.insertMany(docs, function (error, inserts) {
|
|
92
|
-
innerCb(error);
|
|
93
|
-
});
|
|
94
|
-
} else {
|
|
95
|
-
innerCb();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function setDefaultName(item, innerCb) {
|
|
100
|
-
if (!item.name || item.name === '') {
|
|
101
|
-
item.name = item.type + ':' + item.id;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
innerCb(null, item);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function applyDefaultName(docs, innerCb) {
|
|
108
|
-
async.map(docs, setDefaultName, innerCb);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function translateProtocol(item, innerCb) {
|
|
112
|
-
if (item.protocol && dbConfig.protocols && dbConfig.protocols[item.protocol]) {
|
|
113
|
-
item.protocol = dbConfig.protocols[item.protocol];
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
innerCb(null, item);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
function applyProtocolTranslations(docs, innerCb) {
|
|
120
|
-
async.map(docs, translateProtocol, innerCb);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function getCollection(db, name, service, subservice, innerCb) {
|
|
124
|
-
const query = {};
|
|
125
|
-
|
|
126
|
-
if (service) {
|
|
127
|
-
query.service = service;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (subservice) {
|
|
131
|
-
query.service_path = subservice;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
db.db().collection(name).find(query).toArray(innerCb);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
function closeDb(db, innerCb) {
|
|
138
|
-
/* eslint-disable-next-line no-unused-vars */
|
|
139
|
-
db.close(function (error) {
|
|
140
|
-
innerCb();
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function startMigration(dbResults, innerCb) {
|
|
145
|
-
const originDb = dbResults[0];
|
|
146
|
-
const targetDb = dbResults[1];
|
|
147
|
-
|
|
148
|
-
async.waterfall(
|
|
149
|
-
[
|
|
150
|
-
apply(getCollection, originDb, 'SERVICE', service, subservice),
|
|
151
|
-
generateCollectionTranslator(serviceTranslation),
|
|
152
|
-
apply(saveToTargetDb, targetDb, 'groups'),
|
|
153
|
-
apply(getCollection, originDb, 'DEVICE', service, subservice),
|
|
154
|
-
generateCollectionTranslator(deviceTranslation),
|
|
155
|
-
applyDefaultName,
|
|
156
|
-
applyProtocolTranslations,
|
|
157
|
-
apply(saveToTargetDb, targetDb, 'devices'),
|
|
158
|
-
apply(closeDb, originDb),
|
|
159
|
-
apply(closeDb, targetDb)
|
|
160
|
-
],
|
|
161
|
-
function (error) {
|
|
162
|
-
innerCb(error);
|
|
163
|
-
}
|
|
164
|
-
);
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
async.waterfall(
|
|
168
|
-
[
|
|
169
|
-
apply(async.series, [apply(connectToDb, dbConfig, originDb), apply(connectToDb, dbConfig, targetDb)]),
|
|
170
|
-
startMigration
|
|
171
|
-
],
|
|
172
|
-
callback
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
exports.migrate = migrate;
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright 2020 Telefonica Investigación y Desarrollo, S.A.U
|
|
3
|
-
*
|
|
4
|
-
* This file is part of fiware-iotagent-lib
|
|
5
|
-
*
|
|
6
|
-
* fiware-iotagent-lib is free software: you can redistribute it and/or
|
|
7
|
-
* modify it under the terms of the GNU Affero General Public License as
|
|
8
|
-
* published by the Free Software Foundation, either version 3 of the License,
|
|
9
|
-
* or (at your option) any later version.
|
|
10
|
-
*
|
|
11
|
-
* fiware-iotagent-lib is distributed in the hope that it will be useful,
|
|
12
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
14
|
-
* See the GNU Affero General Public License for more details.
|
|
15
|
-
*
|
|
16
|
-
* You should have received a copy of the GNU Affero General Public
|
|
17
|
-
* License along with fiware-iotagent-lib.
|
|
18
|
-
* If not, see http://www.gnu.org/licenses/.
|
|
19
|
-
*
|
|
20
|
-
* For those usages not covered by the GNU Affero General Public License
|
|
21
|
-
* please contact with::daniel.moranjimenez@telefonica.com
|
|
22
|
-
*
|
|
23
|
-
* Modified by: Federico M. Facca - Martel Innovate
|
|
24
|
-
* Modified by: Daniel Calvo - ATOS Research & Innovation
|
|
25
|
-
* Modified by: Jason Fox - FIWARE Foundation
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
const async = require('async');
|
|
29
|
-
const apply = async.apply;
|
|
30
|
-
const uuid = require('uuid');
|
|
31
|
-
const constants = require('../../constants');
|
|
32
|
-
const domain = require('domain');
|
|
33
|
-
const alarms = require('../common/alarmManagement');
|
|
34
|
-
const errors = require('../../errors');
|
|
35
|
-
const logger = require('logops');
|
|
36
|
-
const config = require('../../commonConfig');
|
|
37
|
-
const ngsiUtils = require('./../ngsi/ngsiUtils');
|
|
38
|
-
const registrationUtils = require('./registrationUtils');
|
|
39
|
-
const _ = require('underscore');
|
|
40
|
-
const utils = require('../northBound/restUtils');
|
|
41
|
-
const context = {
|
|
42
|
-
op: 'IoTAgentNGSI.Devices-v1'
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Creates the response handler for the initial entity creation request NGSIv1.
|
|
47
|
-
* This handler basically deals with the errors that could have been rised during
|
|
48
|
-
* the communication with the Context Broker.
|
|
49
|
-
*
|
|
50
|
-
* @param {Object} deviceData Object containing all the deviceData needed to send the registration.
|
|
51
|
-
* @param {Object} newDevice Device object that will be stored in the database.
|
|
52
|
-
* @return {function} Handler to pass to the request() function.
|
|
53
|
-
*/
|
|
54
|
-
function createInitialEntityHandlerNgsi1(deviceData, newDevice, callback) {
|
|
55
|
-
return function handleInitialEntityResponse(error, response, body) {
|
|
56
|
-
if (error) {
|
|
57
|
-
logger.error(
|
|
58
|
-
context,
|
|
59
|
-
'ORION-001: Connection error creating inital entity in the Context Broker: %s',
|
|
60
|
-
error
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
alarms.raise(constants.ORION_ALARM, error);
|
|
64
|
-
|
|
65
|
-
callback(error);
|
|
66
|
-
} else if (response && body && response.statusCode === 200) {
|
|
67
|
-
const errorField = ngsiUtils.getErrorField(body);
|
|
68
|
-
|
|
69
|
-
if (errorField) {
|
|
70
|
-
logger.error(context, 'Update error connecting to the Context Broker: %j', errorField);
|
|
71
|
-
callback(new errors.BadRequest(JSON.stringify(errorField)));
|
|
72
|
-
} else {
|
|
73
|
-
alarms.release(constants.ORION_ALARM);
|
|
74
|
-
logger.debug(context, 'Initial entity created successfully.');
|
|
75
|
-
callback(null, newDevice);
|
|
76
|
-
}
|
|
77
|
-
} else {
|
|
78
|
-
logger.error(
|
|
79
|
-
context,
|
|
80
|
-
'Protocol error connecting to the Context Broker [%d]: %s',
|
|
81
|
-
response.statusCode,
|
|
82
|
-
body
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
const errorObj = new errors.EntityGenericError(deviceData.id, deviceData.type, body);
|
|
86
|
-
|
|
87
|
-
callback(errorObj);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Creates the initial entity representing the device in the Context Broker using NGSIv1.
|
|
94
|
-
* This is important mainly to allow the rest of the updateContext operations to be performed
|
|
95
|
-
* using an UPDATE action instead of an APPEND one.
|
|
96
|
-
*
|
|
97
|
-
* @param {Object} deviceData Object containing all the deviceData needed to send the registration.
|
|
98
|
-
* @param {Object} newDevice Device object that will be stored in the database.
|
|
99
|
-
*/
|
|
100
|
-
function createInitialEntityNgsi1(deviceData, newDevice, callback) {
|
|
101
|
-
let cbHost = config.getConfig().contextBroker.url;
|
|
102
|
-
if (deviceData.cbHost && deviceData.cbHost.indexOf('://') !== -1) {
|
|
103
|
-
cbHost = deviceData.cbHost;
|
|
104
|
-
} else if (deviceData.cbHost && deviceData.cbHost.indexOf('://') === -1) {
|
|
105
|
-
cbHost = 'http://' + deviceData.cbHost;
|
|
106
|
-
}
|
|
107
|
-
const options = {
|
|
108
|
-
url: cbHost + '/v1/updateContext',
|
|
109
|
-
method: 'POST',
|
|
110
|
-
json: {
|
|
111
|
-
contextElements: [
|
|
112
|
-
{
|
|
113
|
-
type: deviceData.type,
|
|
114
|
-
isPattern: 'false',
|
|
115
|
-
id: String(deviceData.name),
|
|
116
|
-
attributes: []
|
|
117
|
-
}
|
|
118
|
-
],
|
|
119
|
-
updateAction: 'APPEND'
|
|
120
|
-
},
|
|
121
|
-
headers: {
|
|
122
|
-
'fiware-service': deviceData.service,
|
|
123
|
-
'fiware-servicepath': deviceData.subservice,
|
|
124
|
-
'fiware-correlator': (domain.active && domain.active.corr) || uuid.v4()
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
function formatAttributes(originalVector) {
|
|
129
|
-
const attributeList = [];
|
|
130
|
-
|
|
131
|
-
if (originalVector && originalVector.length) {
|
|
132
|
-
for (let i = 0; i < originalVector.length; i++) {
|
|
133
|
-
// (#628) check if attribute has entity_name:
|
|
134
|
-
// In that case attribute should not be appear in current entity
|
|
135
|
-
/*jshint camelcase: false */
|
|
136
|
-
if (!originalVector[i].entity_name) {
|
|
137
|
-
attributeList.push({
|
|
138
|
-
name: originalVector[i].name,
|
|
139
|
-
type: originalVector[i].type,
|
|
140
|
-
value: constants.getInitialValueForType(originalVector[i].type)
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return attributeList;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
function formatCommands(originalVector) {
|
|
150
|
-
const attributeList = [];
|
|
151
|
-
|
|
152
|
-
if (originalVector && originalVector.length) {
|
|
153
|
-
for (let i = 0; i < originalVector.length; i++) {
|
|
154
|
-
attributeList.push({
|
|
155
|
-
name: originalVector[i].name + constants.COMMAND_STATUS_SUFIX,
|
|
156
|
-
type: constants.COMMAND_STATUS,
|
|
157
|
-
value: 'UNKNOWN'
|
|
158
|
-
});
|
|
159
|
-
attributeList.push({
|
|
160
|
-
name: originalVector[i].name + constants.COMMAND_RESULT_SUFIX,
|
|
161
|
-
type: constants.COMMAND_RESULT,
|
|
162
|
-
value: ' '
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return attributeList;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
options.json.contextElements[0].attributes = [].concat(
|
|
171
|
-
formatAttributes(deviceData.active),
|
|
172
|
-
deviceData.staticAttributes,
|
|
173
|
-
formatCommands(deviceData.commands)
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
if (
|
|
177
|
-
('timestamp' in deviceData && deviceData.timestamp !== undefined
|
|
178
|
-
? deviceData.timestamp
|
|
179
|
-
: config.getConfig().timestamp) &&
|
|
180
|
-
!utils.isTimestamped(options.json)
|
|
181
|
-
) {
|
|
182
|
-
options.json.contextElements[0].attributes.push({
|
|
183
|
-
name: constants.TIMESTAMP_ATTRIBUTE,
|
|
184
|
-
type: constants.TIMESTAMP_TYPE,
|
|
185
|
-
value: ' '
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
logger.debug(context, 'Creating initial entity in the Context Broker:\n %s', JSON.stringify(options, null, 4));
|
|
190
|
-
utils.executeWithSecurity(options, newDevice, createInitialEntityHandlerNgsi1(deviceData, newDevice, callback));
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Updates the register of an existing device identified by the Id and Type in the Context Broker, and the internal
|
|
195
|
-
* registry. It uses NGSIv1.
|
|
196
|
-
*
|
|
197
|
-
* The device id and type are required fields for a registration updated. Only the following attributes will be
|
|
198
|
-
* updated: lazy, active and internalId. Any other change will be ignored. The registration for the lazy attributes
|
|
199
|
-
* of the updated entity will be updated if existing, and created if not. If new active attributes are created,
|
|
200
|
-
* the entity will be updated creating the new attributes.
|
|
201
|
-
*
|
|
202
|
-
* @param {Object} deviceObj Object with all the device information (mandatory).
|
|
203
|
-
*/
|
|
204
|
-
function updateRegisterDeviceNgsi1(deviceObj, entityInfoUpdated, callback) {
|
|
205
|
-
if (!deviceObj.id || !deviceObj.type) {
|
|
206
|
-
callback(new errors.MissingAttributes('Id or device missing'));
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
logger.debug(context, 'Update provisioned v1 device in Device Service');
|
|
211
|
-
|
|
212
|
-
function combineWithNewDevice(newDevice, oldDevice, callback) {
|
|
213
|
-
if (oldDevice) {
|
|
214
|
-
oldDevice.internalId = newDevice.internalId;
|
|
215
|
-
oldDevice.lazy = newDevice.lazy;
|
|
216
|
-
oldDevice.commands = newDevice.commands;
|
|
217
|
-
oldDevice.staticAttributes = newDevice.staticAttributes;
|
|
218
|
-
oldDevice.active = newDevice.active;
|
|
219
|
-
oldDevice.name = newDevice.name;
|
|
220
|
-
oldDevice.type = newDevice.type;
|
|
221
|
-
oldDevice.polling = newDevice.polling;
|
|
222
|
-
oldDevice.timezone = newDevice.timezone;
|
|
223
|
-
if ('timestamp' in newDevice && newDevice.timestamp !== undefined) {
|
|
224
|
-
oldDevice.timestamp = newDevice.timestamp;
|
|
225
|
-
}
|
|
226
|
-
oldDevice.endpoint = newDevice.endpoint || oldDevice.endpoint;
|
|
227
|
-
|
|
228
|
-
callback(null, oldDevice);
|
|
229
|
-
} else {
|
|
230
|
-
callback(new errors.DeviceNotFound(newDevice.id));
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
function getAttributeDifference(oldArray, newArray) {
|
|
235
|
-
let oldActiveKeys;
|
|
236
|
-
let newActiveKeys;
|
|
237
|
-
let updateKeys;
|
|
238
|
-
let result;
|
|
239
|
-
|
|
240
|
-
if (oldArray && newArray) {
|
|
241
|
-
newActiveKeys = _.pluck(newArray, 'name');
|
|
242
|
-
oldActiveKeys = _.pluck(oldArray, 'name');
|
|
243
|
-
|
|
244
|
-
updateKeys = _.difference(newActiveKeys, oldActiveKeys);
|
|
245
|
-
|
|
246
|
-
result = newArray.filter(function (attribute) {
|
|
247
|
-
return updateKeys.indexOf(attribute.name) >= 0;
|
|
248
|
-
});
|
|
249
|
-
} else if (newArray) {
|
|
250
|
-
result = newArray;
|
|
251
|
-
} else {
|
|
252
|
-
result = [];
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
return result;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
function extractDeviceDifference(newDevice, oldDevice, callback) {
|
|
259
|
-
const deviceData = {
|
|
260
|
-
id: oldDevice.id,
|
|
261
|
-
name: oldDevice.name,
|
|
262
|
-
type: oldDevice.type,
|
|
263
|
-
service: oldDevice.service,
|
|
264
|
-
subservice: oldDevice.subservice
|
|
265
|
-
};
|
|
266
|
-
|
|
267
|
-
deviceData.active = getAttributeDifference(oldDevice.active, newDevice.active);
|
|
268
|
-
deviceData.lazy = getAttributeDifference(oldDevice.lazy, newDevice.lazy);
|
|
269
|
-
deviceData.commands = getAttributeDifference(oldDevice.commands, newDevice.commands);
|
|
270
|
-
deviceData.staticAttributes = getAttributeDifference(oldDevice.staticAttributes, newDevice.staticAttributes);
|
|
271
|
-
|
|
272
|
-
function concatenateOldData(attributeArray, oldAttributeArray) {
|
|
273
|
-
if (typeof oldAttributeArray !== 'undefined' && oldAttributeArray.length > 0) {
|
|
274
|
-
attributeArray = attributeArray.concat(oldAttributeArray);
|
|
275
|
-
}
|
|
276
|
-
return attributeArray;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
if (entityInfoUpdated) {
|
|
280
|
-
deviceData.active = concatenateOldData(deviceData.active, oldDevice.active);
|
|
281
|
-
deviceData.lazy = concatenateOldData(deviceData.lazy, oldDevice.lazy);
|
|
282
|
-
deviceData.commands = concatenateOldData(deviceData.commands, oldDevice.commands);
|
|
283
|
-
deviceData.staticAttributes = concatenateOldData(deviceData.staticAttributes, oldDevice.staticAttributes);
|
|
284
|
-
if (oldDevice.name !== newDevice.name) {
|
|
285
|
-
deviceData.name = newDevice.name;
|
|
286
|
-
}
|
|
287
|
-
if (oldDevice.type !== newDevice.type) {
|
|
288
|
-
deviceData.type = newDevice.type;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
callback(null, deviceData, oldDevice);
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
async.waterfall(
|
|
296
|
-
[
|
|
297
|
-
apply(config.getRegistry().get, deviceObj.id, deviceObj.service, deviceObj.subservice),
|
|
298
|
-
apply(extractDeviceDifference, deviceObj),
|
|
299
|
-
createInitialEntityNgsi1,
|
|
300
|
-
apply(combineWithNewDevice, deviceObj),
|
|
301
|
-
apply(registrationUtils.sendRegistrations, false),
|
|
302
|
-
apply(registrationUtils.processContextRegistration, deviceObj),
|
|
303
|
-
config.getRegistry().update
|
|
304
|
-
],
|
|
305
|
-
callback
|
|
306
|
-
);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
exports.createInitialEntity = createInitialEntityNgsi1;
|
|
310
|
-
exports.updateRegisterDevice = updateRegisterDeviceNgsi1;
|