Fiware - Orion Context Broker subscription not sent to STH, "conditions should have been an array",

When I tried to use STH to store and receive data sent to OCB, I had a problem with the subscription.

My problem is that creating a subscription is going well. When I create a subscription as follows:

POST /v1/contextSubscriptions HTTP/1.1 Host: <cb_host>:1026 Content-Type: application/json Fiware-Service: myService Fiware-ServicePath: /myServicePath Cache-Control: no-cache { "entities": [ { "type": "cameraSimple", "isPattern": "true", "id": "sensor03" } ], "attributes": [ "class" ], "reference": "http://<cb_host>:8666/notify", "duration": "P1M", "notifyConditions": [ { "type": "ONCHANGE", "condValues": [ "class" ] } ], "throttling": "PT5S" } 

I get the following answer:

 { "subscribeResponse": { "subscriptionId": "588b4f38e2066a50fa98df9b", "duration": "P1M", "throttling": "PT5S" } } 

but on the Fiware server, I see an error about the conditions on the terminal on which the containers are running, and another about the attributes:

 orion | ERROR@14 :06:10 safeMongo.cpp[302]: Runtime Error (field 'conditions' was supposed to be an array but type=4 in BSONObj <{ _id: ObjectId('588b4f96e2066a50fa98df9c'), expiration: 1488116886, reference: "http://<cb_host>:8666/notify", custom: false, throttling: 5, servicePath: "/myServicePath", status: "active", entities: [ { id: "sensor03", isPattern: "true", type: "cameraSimple", isTypePattern: false } ], attrs: [ "class" ], metadata: [], blacklist: false, conditions: [ "class" ], expression: { q: "", mq: "", geometry: "", coords: "", georel: "" }, format: "JSON" }> from caller mongoSubCacheItemInsert:221) orion | ERROR@13 :48:10 safeMongo.cpp[302]: Runtime Error (field 'attrs' was supposed to be an array but type=4 in BSONObj <{ _id: ObjectId('588b4f96e2066a50fa98df9c'), expiration: 1488116886, reference: "http://<cb_host>:8666/notify", custom: false, throttling: 5, servicePath: "/myServicePath", status: "active", entities: [ { id: "sensor03", isPattern: "true", type: "cameraSimple", isTypePattern: false } ], attrs: [ "class" ], metadata: [], blacklist: false, conditions: [ "class" ], expression: { q: "", mq: "", geometry: "", coords: "", georel: "" }, format: "JSON" }> from caller mongoSubCacheItemInsert:215) 

Also, when updating the values ​​for my entity

 PUT /v2/entities/sensor03/attrs/class/value HTTP/1.1 Host: <cb_host>:1026 Accept: application/json Fiware-Service: myService Fiware-ServicePath: /myServicePath Cache-Control: no-cache "monitor" 

I get nothing when requesting STH:

 GET /STH/v1/contextEntities/type/myDevice/id/sensor03/attributes/class?lastN=10 HTTP/1.1 Host: <cb_host>:8666 Accept: application/json Fiware-Service: myService Fiware-ServicePath: /myServicePath Cache-Control: no-cache 

returns:

 { "contextResponses": [ { "contextElement": { "attributes": [ { "name": "class", "values": [] } ], "id": "sensor03", "isPattern": false, "type": "myDevice" }, "statusCode": { "code": "200", "reasonPhrase": "OK" } } ] } 

Note:

  • I am using NGSI V1 because I suspect that V2 is not yet supported for STH receiving NGSI V2 notifications regarding this issue . Also, I did not find any documentation regarding "Getting the initial source context information" using NGSI V2, for example, this page
  • I am using a Docker machine with one Debian 8 virtual machine running on Fiware-Lab with the following images:

     mongodb: image: mongo:2.6 hostname: mongodb container_name: mongodb command: --smallfiles orion: image: fiware/orion:develop hostname: orion container_name: orion links: - mongodb expose: - "1026" ports: - "1026:1026" command: -dbhost mongodb fiware-sth-comet: image: telefonicaiot/fiware-sth-comet links: - mongodb ports: - "8666:8666" environment: - STH_HOST=0.0.0.0 - DB_URI=mongodb:27017 

EDIT 1: After removing the “development” of the Orion Docker image, I now run verison “1.6.0-next” from Orion and I no longer have a runtime error. However, I cannot get any historical value of the attributes of the object. I have to make a mistake in the request, but I do not know where.

Now my file the file for the dock looks like this:

 mongo: image: mongo:3.2 command: --nojournal orion: image: fiware/orion links: - mongo ports: - "1026:1026" command: -dbhost mongo fiware-sth-comet: image: telefonicaiot/fiware-sth-comet links: - mongo ports: - "8666:8666" environment: - STH_HOST=0.0.0.0 - DB_URI=mongo:27017 cygnus: image: fiware/cygnus-ngsi links: -mongo 

EDIT 2: Following @ GermánTorodelValle's advice, I'm trying to simulate a notification in an STH container, like CB:

 curl -X POST -H "Accept: application/json" -H "Content-Type: application/json" -H "Fiware-Service: myService" -H "Fiware-ServicePath: /myServicePath" -d '{ "subscriptionId" : "57a9ce8ae997e37e85a4be39", "originator" : "orion.contextBroker.instance", "contextResponses" : [ { "contextElement" : { "attributes" : [ { "name" : "class", "type" : "Text", "value" : "monitor" } ], "type" : "cameraSimple", "isPattern" : "false", "id" : "sensor03" }, "statusCode" : { "code" : "200", "reasonPhrase" : "OK" } } ] }' "http://172.17.0.1:8666/notify" 

Entering the STH container is as follows:

 time=2017-02-02T13:50:36.809Z | lvl=ERROR | corr=39638217-c300-48c0-9122-bff6164d5298 | trans=39638217-c300-48c0-9122-bff6164d5298 | op=OPER_STH_POST | from=n/a | srv=myService | subsrv=/myServicePath | comp=STH | msg=Error when getting the raw data collection for storing:MongoError: db already exists with different case already have: [sth_myservice] trying to create [sth_myService] time=2017-02-02T13:50:36.810Z | lvl=WARN | corr=c322ddc8-2140-484b-a123-4e5b9b60742e | trans=c322ddc8-2140-484b-a123-4e5b9b60742e | op=OPER_STH_POST | from=n/a | srv=myService | subsrv=/myServicePath | comp=STH | msg=POST /notify, event={"request":"1486043436805:3577e9b29ee6:1:iym1stlz:10018","timestamp":1486043436810,"tags":["handler","error"],"data":{"msec":3.6443320512771606,"error":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","data":{"name":"MongoError","message":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","ok":0,"errmsg":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","code":13297,"isBoom":true,"isServer":true,"data":null,"output":{"statusCode":500,"payload":{"statusCode":500,"error":"Internal Server Error","message":"An internal server error occurred"},"headers":{}}}},"internal":true} time=2017-02-02T13:50:36.812Z | lvl=ERROR | corr=6c864793-c7ef-462a-a43d-75cdae8d20a3 | trans=6c864793-c7ef-462a-a43d-75cdae8d20a3 | op=OPER_STH_POST | from=n/a | srv=myService | subsrv=/myServicePath | comp=STH | msg=POST /notify, event={"request":"1486043436805:3577e9b29ee6:1:iym1stlz:10018","timestamp":1486043436811,"tags":["internal","error"],"data":{"name":"MongoError","message":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","ok":0,"errmsg":"db already exists with different case already have: [sth_myservice] trying to create [sth_myService]","code":13297,"isBoom":true,"isServer":true,"data":null,"output":{"statusCode":500,"payload":{"statusCode":500,"error":"Internal Server Error","message":"An internal server error occurred"},"headers":{"content-type":"application/json; charset=utf-8","cache-control":"no-cache","content-length":96}}},"internal":true} time=2017-02-02T13:50:38.143Z | lvl=INFO | corr=n/a | trans=n/a | op=OPER_STH_SERVER_LOG | from=n/a | srv=n/a | subsrv=n/a | comp=STH | msg=Everything OK, 0 requests attended in the last 60s interval 
+5
source share
1 answer

Since the question is so self-sufficient and complete (thank you very much, @lukas), let me just mention 2 aspects as a summary and answer:

  • STH only supports NGSI v1 notifications, so please subscribe to STH for an instance of the context broker using NGSI v1.
  • The MongoDB database imposes a restriction on the fact that 2 databases cannot have the same name, except for a separate capitalization (see https://docs.mongodb.com/manual/reference/limits/#naming-restrictions ), therefore , you cannot use 2 different service names that only change their capitalization using STH, since the database name is generated from the service name. This means that you cannot use myservice and myservice as services for which STH is going to collect data. Include some extra character for any of them, and everything should be fine.

Thank you very much!;)

+1
source

Source: https://habr.com/ru/post/1263450/


All Articles