Re: [netmod] attributes in draft-lhotka-netmod-yang-json

Ladislav Lhotka <lhotka@nic.cz> Sat, 22 March 2014 08:08 UTC

Return-Path: <lhotka@nic.cz>
X-Original-To: netmod@ietfa.amsl.com
Delivered-To: netmod@ietfa.amsl.com
Received: from localhost (ietfa.amsl.com [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id 01CB21A0584 for <netmod@ietfa.amsl.com>; Sat, 22 Mar 2014 01:08:55 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.9
X-Spam-Level:
X-Spam-Status: No, score=-1.9 tagged_above=-999 required=5 tests=[BAYES_00=-1.9] autolearn=ham
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id yTtgnLMG8Cyh for <netmod@ietfa.amsl.com>; Sat, 22 Mar 2014 01:08:51 -0700 (PDT)
Received: from trail.lhotka.name (trail.lhotka.name [77.48.224.143]) by ietfa.amsl.com (Postfix) with ESMTP id 433FE1A0079 for <netmod@ietf.org>; Sat, 22 Mar 2014 01:08:51 -0700 (PDT)
Received: from localhost (localhost [127.0.0.1]) by trail.lhotka.name (Postfix) with ESMTP id 833F0540594; Sat, 22 Mar 2014 09:08:40 +0100 (CET)
Received: from trail.lhotka.name ([127.0.0.1]) by localhost (trail.lhotka.name [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5DkV+kvT+W1n; Sat, 22 Mar 2014 09:08:35 +0100 (CET)
Received: from localhost (unknown [172.29.2.202]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by trail.lhotka.name (Postfix) with ESMTPSA id F2879540192; Sat, 22 Mar 2014 09:08:33 +0100 (CET)
From: Ladislav Lhotka <lhotka@nic.cz>
To: Andy Bierman <andy@yumaworks.com>, Martin Bjorklund <mbj@tail-f.com>
In-Reply-To: <CABCOCHSM7CwAPFOZ4qzzTtTRRX0LWE2Gb+ZWzmDpwBGSKRGhOg@mail.gmail.com>
References: <3FADE5E8-88AC-4FD0-A2F6-72F408FAFFC4@juniper.net> <20140320.150426.496532825.mbj@tail-f.com> <CABCOCHT3AJR0u=-GV1eM8geL-F2j7HSBsw0uBb1DYDvZio6eCA@mail.gmail.com> <CABCOCHSM7CwAPFOZ4qzzTtTRRX0LWE2Gb+ZWzmDpwBGSKRGhOg@mail.gmail.com>
User-Agent: Notmuch/0.17~rc2+11~g2de8ce9 (http://notmuchmail.org) Emacs/24.3.50.2 (x86_64-apple-darwin13.0.0)
Date: Sat, 22 Mar 2014 09:08:35 +0100
Message-ID: <m2bnwy7j0c.fsf@nic.cz>
MIME-Version: 1.0
Content-Type: text/plain
Archived-At: http://mailarchive.ietf.org/arch/msg/netmod/xFqW1ZRrTBWf8Vmx2A8QqCsQHT0
Cc: "netmod@ietf.org" <netmod@ietf.org>
Subject: Re: [netmod] attributes in draft-lhotka-netmod-yang-json
X-BeenThere: netmod@ietf.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: NETMOD WG list <netmod.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/netmod>, <mailto:netmod-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/netmod/>
List-Post: <mailto:netmod@ietf.org>
List-Help: <mailto:netmod-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/netmod>, <mailto:netmod-request@ietf.org?subject=subscribe>
X-List-Received-Date: Sat, 22 Mar 2014 08:08:55 -0000

Andy Bierman <andy@yumaworks.com> writes:

> On Thu, Mar 20, 2014 at 8:25 AM, Andy Bierman <andy@yumaworks.com> wrote:
>
>>
>>
>>
>> On Thu, Mar 20, 2014 at 7:04 AM, Martin Bjorklund <mbj@tail-f.com> wrote:
>>
>>> Dean Bogdanovic <deanb@juniper.net> wrote:
>>> > Hi,
>>> >
>>> > In draft yang leaf node is defined as name value pair in json
>>> >
>>> > If it would be represented, as an object then we can assign attributes
>>> to it.
>>> >
>>> > Example
>>> > "host-name" {
>>> >    "data" : "router",
>>> >       "attributes" : { "protect" : protect}
>>> > }
>>> >
>>> > We need attributes for several things, so lets try to figure out how to
>>> enable
>>> > them.
>>>
>>> I agree that the lack of attributes is a problem with the JSON
>>> mapping.
>>>
>>> The problem with your solution is that it adds noise to the normal
>>> case where there are no attributes.  We're using another encoding:
>>>
>>>    "host-name": "router",
>>>    "@host-name": {
>>>        "protect": "protect",
>>>        ...
>>>     }
>>>
>>> Yep, not very elegant...
>>>
>>>
>
> More importantly, it doesn't work for lists or leaf-lists.
> The attributes cannot be siblings (or ancestors) of the target data node.

An option for boolean-type properties is to wrap the affected object or value, e.g.

"@protect": {
    "host-name": ...
}

or

"foo" : [ 1, 2, {"@protect": 3}, 4]

Instead of defining a general JSON equivalent of XML attributes, it might actually be easier to come up with an ad hoc representation for every use case. This is the approach of some native JSON applications such as MongoDB.

So, the specification of each global property (e.g. "protected") would also define an appropriate encoding in both XML and JSON.

>
> Consider the following YANG data-stmt, and how an attribute
> would be encoded in every data node (as a worse-case example).
>
>
> container top {
>   list A {
>     key id;
>     leaf id { type string; }
>     leaf-list aa { type int8; }
>   }
>   leaf host-name { type string; }
> }
>
> Plain JSON
>
> { "top" : {
>   "A" : [
>     { "id":"entry-1",
>       "aa": [42, 19]
>     },
>     { "id":"entry-2",
>       "aa" : [99, 11]
>     } ]
>   },
>   "host-name":"router"
> }
>
> Add attribute to each node:
>    leaf owner { type string; }
>
> With Owner Attribute using RESTCONF encoding:
>
> { "top" : {
>   "@owner":"system",
>   "A" : [
>     { "@owner":"admin1",
>       "id" : {
>         "@owner":"admin1",
>         "id": "entry-1"
>       },
>       "aa" : [ { "@owner":"admin1",  "aa": 42 },
>                  { "@owner":"admin1",  "aa": 19 } ]
>     },
>     { "@owner":"admin2",
>       "id" : {
>         "@owner":"admin2",
>         "id": "entry-2"
>       },
>       "aa" : [ { "@owner":"admin2",  "aa": 99 },
>                  { "@owner":"admin2",  "aa": 11 } ]
>     } ]
>   },
>   "host-name" : { "@owner":"system",
>                          "host-name":"router" }
> }
>
>
> This is not elegant either, but it works for all YANG node types.
> How would your encoding look for this example?

"@owned-object": {
    "@owner": "system",
    "host-name": "router"
}

Lada

>
>
>
> Andy
>
>
>
>
>>
>> This is how RESTCONF encodes these attributes in a leaf:
>> (see sec. 3.4.1)
>>
>>    "host-name" : {
>>        "@protect" : "protect",
>>        "host-name" : "router"
>>    }
>>
>> Lada says that this is a YANG to JSON mapping and YANG has no attributes,
>> so the attribute encoding is in RESTCONF.  I think it would be better
>> if there was 1 mapping, instead of a different mapping in each protocol
>> that uses this JSON encoding of YANG data.
>>
>> I do not think YANG needs to model attributes!
>> The protocol may need to use them to tag data with meta-data.
>> We do not need to model some leafs as attributes and others
>> as child nodes in YANG data models.  Use RelaxNG instead
>> of YANG to do that.
>>
>>
>>
>>
>>> /martin
>>>
>>>
>> Andy
>>
>>
>>> _______________________________________________
>>> netmod mailing list
>>> netmod@ietf.org
>>> https://www.ietf.org/mailman/listinfo/netmod
>>>
>>
>>
> _______________________________________________
> netmod mailing list
> netmod@ietf.org
> https://www.ietf.org/mailman/listinfo/netmod

-- 
Ladislav Lhotka, CZ.NIC Labs
PGP Key ID: E74E8C0C