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

Martin Bjorklund <mbj@tail-f.com> Wed, 26 March 2014 15:17 UTC

Return-Path: <mbj@tail-f.com>
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 EB2511A0113 for <netmod@ietfa.amsl.com>; Wed, 26 Mar 2014 08:17:49 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.911
X-Spam-Level:
X-Spam-Status: No, score=-1.911 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, SPF_PASS=-0.001, T_RP_MATCHES_RCVD=-0.01] 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 SFPCYtJf9Cyv for <netmod@ietfa.amsl.com>; Wed, 26 Mar 2014 08:17:47 -0700 (PDT)
Received: from mail.tail-f.com (mail.tail-f.com [109.74.15.94]) by ietfa.amsl.com (Postfix) with ESMTP id E1E9B1A00E3 for <netmod@ietf.org>; Wed, 26 Mar 2014 08:17:46 -0700 (PDT)
Received: from localhost (138.162.241.83.in-addr.dgcsystems.net [83.241.162.138]) by mail.tail-f.com (Postfix) with ESMTPSA id 1A9C43B411D; Wed, 26 Mar 2014 16:17:45 +0100 (CET)
Date: Wed, 26 Mar 2014 16:17:44 +0100
Message-Id: <20140326.161744.477118160786846212.mbj@tail-f.com>
To: andy@yumaworks.com
From: Martin Bjorklund <mbj@tail-f.com>
In-Reply-To: <CABCOCHSmt-Mr2fe-Xmpajz0v8jg=XOJsY4CMEtCBe1GzTbL6EA@mail.gmail.com>
References: <CABCOCHTg5T+k_LzyNz=bwUKC5AS5gYcBVODL4ZUihUWXQbDbkQ@mail.gmail.com> <20140326.152737.330538996469661145.mbj@tail-f.com> <CABCOCHSmt-Mr2fe-Xmpajz0v8jg=XOJsY4CMEtCBe1GzTbL6EA@mail.gmail.com>
X-Mailer: Mew version 6.5 on Emacs 23.4 / Mule 6.0 (HANACHIRUSATO)
Mime-Version: 1.0
Content-Type: Text/Plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Archived-At: http://mailarchive.ietf.org/arch/msg/netmod/J9UGW6e8AtOt0_Ho19oga6V8eyc
Cc: 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: Wed, 26 Mar 2014 15:17:50 -0000

Andy Bierman <andy@yumaworks.com> wrote:
> On Wed, Mar 26, 2014 at 7:27 AM, Martin Bjorklund <mbj@tail-f.com> wrote:
> 
> > Andy Bierman <andy@yumaworks.com> wrote:
> > > On Wed, Mar 26, 2014 at 7:10 AM, Ladislav Lhotka <lhotka@nic.cz> wrote:
> > >
> > > >
> > > > On 26 Mar 2014, at 14:57, Martin Bjorklund <mbj@tail-f.com> wrote:
> > > >
> > > > > Ladislav Lhotka <lhotka@nic.cz> wrote:
> > > > >> Martin Bjorklund <mbj@tail-f.com> writes:
> > > > >>
> > > > >>> Hi,
> > > > >>>
> > > > >>> Here's yet another attempt to handle attributes in JSON, without
> > > > >>> changing the encoding for the case that there are no attributes
> > > > >>> present.
> > > > >>>
> > > > >>> In all examples, the attributes "inactive" and "etag" are present.
> > > > >>>
> > > > >>> Attributes are encoded differently depending on the type of object:
> > > > >>>
> > > > >>>
> > > > >>> leaf
> > > > >>> ----
> > > > >>>
> > > > >>> Encode the attributes as a sibling to the leaf.
> > > > >>>
> > > > >>>
> > > > >>>  leaf foo {
> > > > >>>    type string;
> > > > >>>  }
> > > > >>>
> > > > >>>  "foo": "some value";
> > > > >>>  "@foo": {
> > > > >>>     "inactive": true,
> > > > >>>     "etag": "...";
> > > > >>>   }
> > > > >>>
> > > > >>>
> > > > >>> list instance
> > > > >>> -------------
> > > > >>>
> > > > >>> Encode the attributes within the list instance.
> > > > >>>
> > > > >>>
> > > > >>>  list bar {
> > > > >>>    key name;
> > > > >>>    leaf name {
> > > > >>>      type string;
> > > > >>>    }
> > > > >>>    ...
> > > > >>>  }
> > > > >>>
> > > > >>>  "bar": [
> > > > >>>     {
> > > > >>>        "@bar": {
> > > > >>>           "inactive": true,
> > > > >>>           "etag": "..."
> > > > >>>         }
> > > > >>>         "name": "instance name";
> > > > >>>      }]
> > > > >>>
> > > > >>
> > > > >> This could be ambiguous:
> > > > >>
> > > > >> list bar {
> > > > >>  key name;
> > > > >>  leaf name { ... }
> > > > >>  leaf bar { ... }
> > > > >> }
> > > > >>
> > > > >> Then you don't know whether the attributes belong to the list entry
> > > > >> or to the contained leaf.
> > > > >
> > > > > Right. Then we use "@@bar" for the list / container attributes.
> > > >
> > > > OK, then this scheme is fine with me.
> > > >
> > > >
> > > Looks more complicated than other solution proposals.
> >
> > Do we agree that we don't want different encodings for values if there
> > are attributes or not?  I.e., if my code works when no attributes are
> > present, it should also work if there are attributes?
> >
> >
> Not if the normal encoding is painful to use.
> The use attributes is going to be rare.
> I want the expected "plain" encoding when there are no attributes.
> Code that generates JSON and does not care about attributes
> must not be rendered useless because the JSON is specially encoded
> in RESTCONF.  We want to leverage wide knowledge of JSON,
> not invent our own incompatible version of it.
> 
> 
> 
> > If so, do we have any other proposal?
> >
> > I am all for a simpler solution!
> >
> >
> 
> Putting attributes at the sibling level does not work for leaf-lists.

See my proposal.

> Even for leafs, it is difficult to parse.  JSON objects are unordered,
> so the "@foo" could appear anywhere, even before "foo".

Sure.  So what?  Since they are unordered, you have to parse
everything before starting to process anyway. 

> The schemes
> I proposed always keeps the attributes within the node for the attributes
> (just like XML).

The proposals I have seen either changes the encoding depending on
atribute presence, or are very chatty, which would remove the
simplicity of using JSON.

> One idea I had was to simply disallow attributes for leaf and leaf-list.
> They can only go in container or list nodes.  This is restrictive but then
> there
> will not be any dual decoding possibilities.

Yes I think this is a bit too restrictive.  (We tried in RESTCONF to
let leafs just be fields, but now they are their own resources.)


/martin