Mario Corral
Mario Corral

Reputation: 397

How to make an Orion NGSIv2 subscription that notifies cygnus in NGSIv1?

EDIT 2

curl  --include \
      --header 'Content-Type: application/json' \
      --request POST \
      --data-binary '{
                       "description": "Day subscription",
                       "subject": {
                         "entities": [
                           {
                             "idPattern": "es-leon-.*",
                             "type": "Event"
                           }
                         ],
                         "condition": {
                           "attrs": [
                              "Title",
                              "dFlag"
                           ],
                           "expression": {
                             "q": "dFlag>0"
                           }
                         }
                       },
                       "notification": {
                         "http": {
                             "url" : "http://localhost:5050/notify"
                         },
                         "attrs": [
                           "Title",
                           "dFlag"
                         ],
                         "attrsFormat":"legacy"
                       }
                     }' \
      'http://localhost:1026/v2/subscriptions'

In Orion the subscription register ok (thanks for the tips in the comments) but I'm having the same issue as said in here even though I use "attrsFormat":"legacy" I'm making something wrong? why orion is not using ngsiv1 to send the notification to cygnus?

The cygnus error trace.

Cygnus shows orion is responding this:

{
    "subscriptionId": "574315e77775f31b8d3da719",
    "data": [{
        "id": "es-leon-0",
        "type": "Event",
        "Title": {
            "type": "none",
            "value": "pepe",
            "metadata": {}
        },
        "dFlag": {
            "type": "text",
            "value": "1",
            "metadata": {}
        }
    }]
}

When it has to respond the lines below to be in ngsiv1:

{
    "subscriptionId": "5743178d7775f31b8d3da71a",
    "originator": "localhost",
    "contextResponses": [{
        "contextElement": {
            "type": "Event",
            "isPattern": "false",
            "id": "es-leon-0",
            "attributes": [{
                "name": "Title",
                "type": "text",
                "value": "pep"
            }, {
                "name": "dFlag",
                "type": "text",
                "value": "1"
            }]
        },
        "statusCode": {
            "code": "200",
            "reasonPhrase": "OK"
        }
    }]
}

Original Question

As said in other question :

EDIT: note also that you can use NGSIv2 to create/update entities at Orion and have notifications in NGSIv1 if you:

Create the subscription using NGSIv1 operations

Create the subscription using NGSIv2 operations with attrsFormat equal to legacy. Have a look to more detailed information here.

So I made up this subscription:

curl  --include \
      --header 'Content-Type: application/json' \
      --request POST \
      --data-binary '{
                       "description": "Day subscription",
                       "subject": {
                         "entities": [
                           {
                             "idPattern": "es-leon-.*",
                             "type": "Event"
                           }
                         ],
                         "condition": {
                           "attributes": [
                              "Title",
                              "dFlag"
                           ],
                           "expression": {
                             "q": "dFlag > 0"
                           }
                         }
                       },
                       "notification": {
                         "callback": "http://localhost:5050/notify",
                         "attributes": [
                           "Title",
                           "dFlag"
                         ]
                       }
                     }' \
      'http://localhost:1026/v1/subscriptions'

but orion don't let me register it throwing this error:

HTTP/1.1 400 Bad Request
Connection: Keep-Alive
Content-Length: 67
Content-Type: application/json
Fiware-Correlator: 2ecdfc74-1c2f-11e6-82d7-000d3a23bf27
Date: Tue, 17 May 2016 12:59:25 GMT

{"error":"BadRequest","description":"no condition attrs specified"}

Is this the way to use legacy attributes so it can work with cygnus with NGSIv2? Thanks for the help.

EDIT 1:

Following the answer the subscription should be like this: Right?

curl  --include \
      --header 'Content-Type: application/json' \
      --request POST \
      --data-binary '{
                       "description": "Day subscription",
                       "subject": {
                         "entities": [
                           {
                             "idPattern": "es-leon-.*",
                             "type": "Event"
                           }
                         ],
                         "condition": {
                           "attributes": [
                              "Title",
                              "dFlag"
                           ],
                           "expression": {
                             "q": "dFlag > 0"
                           }
                         }
                       },
                       "notification": {
                         "http": {
                             "url" : "http://localhost:5050/notify"
                         },
                         "attributes": [
                           "Title",
                           "dFlag"
                         ],
                         "attrsFormat":"legacy"
                       }
                     }' \
      'http://localhost:1026/v2/subscriptions'

But I'm still getting an error:

HTTP/1.1 100 Continue

HTTP/1.1 400 Bad Request
Connection: Keep-Alive
Content-Length: 67
Content-Type: application/json
Fiware-Correlator: 60a0a1d2-1ddf-11e6-8bd6-000d3a23bf27
Date: Thu, 19 May 2016 16:33:11 GMT

{"error":"BadRequest","description":"no condition attrs specified"}

Upvotes: 2

Views: 458

Answers (1)

fgalan
fgalan

Reputation: 12294

Use attrs instead of attributes (both in subject.conditions and in notification).

In addition, note that callback is no longer used. You have to use:

"notification": {
  "http": {
    "url": "http://localhost:5050/notify"
  },
  ..
}

In addition, if you want notifications to use NGSIv1 format you should include attrsFormat field with value legacy in notification as described in the documentation.

Finally, note that the rigth operation URL is /v2/subscriptions, not /v1/subscriptions as shown in your example.

EDIT 1: considering the new payload in EDIT 1 section in the question, note that:

  • You should use attrs inside condition, not attributes (the error message is complaining about that)

  • You should use attrs inside notification, not attributes

  • You should use "q": "dFlag>0" (i.e. no whitespaces in the query string). Look to the example in the NGSIv2 specification:

Eg:

"expression": {
  "q": "temperature>40"
}

EDIT 2: Orion versions previous to 1.2 use attrsFormat outside notification field. Thus, if you are using Orion 1.1, try to use "attrsFormat": "legacy" as first level field in the subscription payload JSON.

Upvotes: 2

Related Questions