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

Martin Bjorklund <mbj@tail-f.com> Sun, 23 March 2014 10:07 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 75C961A6F58 for <netmod@ietfa.amsl.com>; Sun, 23 Mar 2014 03:07:46 -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 y8j4JdVjT-pM for <netmod@ietfa.amsl.com>; Sun, 23 Mar 2014 03:07:44 -0700 (PDT)
Received: from mail.tail-f.com (mail.tail-f.com [109.74.15.94]) by ietfa.amsl.com (Postfix) with ESMTP id B85461A6F60 for <netmod@ietf.org>; Sun, 23 Mar 2014 03:07:43 -0700 (PDT)
Received: from localhost (s193-12-74-81.cust.tele2.se [193.12.74.81]) by mail.tail-f.com (Postfix) with ESMTPSA id 5574937C30C; Sun, 23 Mar 2014 11:07:42 +0100 (CET)
Date: Sun, 23 Mar 2014 11:07:41 +0100
Message-Id: <20140323.110741.449355686.mbj@tail-f.com>
To: lhotka@nic.cz
From: Martin Bjorklund <mbj@tail-f.com>
In-Reply-To: <m2ob0xb697.fsf@nic.cz>
References: <m2bnwy7j0c.fsf@nic.cz> <CABCOCHRFjzj40nWtckJRPCbxCMSwojadRh0rBb27qMRyHx8MHA@mail.gmail.com> <m2ob0xb697.fsf@nic.cz>
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/cSQwpuGThTtblCJiVeWpEd24YTo
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: Sun, 23 Mar 2014 10:07:46 -0000

Ladislav Lhotka <lhotka@nic.cz> wrote:
> Andy Bierman <andy@yumaworks.com> writes:
> 
> ...
> 
> >
> > The attribute mapping needs to correspond to the XML attribute mapping.
> > Attributes have string values, so the mapping above will not work.
> 
> I don't understand. XML schemas can define attribute values to be of other
> types, too, not only string.
> 
> >
> > Attributes can be qualified or unqualified.  If qualified, then the
> > module-name
> > is used as a prefix:
> >
> >   "foo" [ 1, 2, { "@foo-mod:owner":"admin1", "foo":3}, {
> > "@foo-mod:owner":"admin2", "foo":4},
> >
> >
> > This approach presumes the attribute has a YANG module name that defines
> > the attribute,
> > which is of course not allowed.
> >
> > RFC 6241 defines XML attributes for the <get> operation, using a hack
> > called the  'get-filter-element-attributes' extension.
> > http://www.netconfcentral.org/modules/ietf-netconf/2011-06-01#get-filter-element-attributes.56
> 
> This is another extension that violates the rule stated in RFC 6020,
> sec. 6.3.1:
> 
>    If a YANG compiler does not support a particular extension, which
>    appears in a YANG module as an unknown-statement (see Section 12),
>    the entire unknown-statement MAY be ignored by the compiler.
> 
> >
> > The NETCONF-EX <get2> operation has a "with-metadata" parameter that uses
> > identities
> > to map attributes to YANG.
> >
> > I think a standard mechanism is needed to properly map attributes to JSON
> > and XML.
> 
> I'd suggest to define two generic constructs:
> 
> 1. Metadata
> 
> Every JSON value (false / null / true / object / array / number / string) can
> be changed into a "@tagged-value" object, e.g. the number 42 can become
> 
> {
>   "@tagged-value" : {
>     "@owner": "admin1",
>     "@value": 42
>   }
> }
> 
> Multiple metadata key-value pairs may be present inside the "@tagged-value"
> object.
> 
> 2. Properties
> 
> For a property "foo", every JSON value can be changed into a "@foo" object,
> e.g.
> 
> {
>   "@foo": 42
> }
> 
> Such property objects may nest, e.g.
> 
> {
>   "@bar":
>   {
>     "@foo": 42
>   }
> }
>   
> Both constructs work for list and leaf-list entries, and may be also combined.

This makes both client and server programming much more complex.  The
whole point of using JSON is supposedly that it maps well to built-in
datastructures in modern languages.  This property makes parsing
trivial, and makes it easy to get values.  For example:

  res = json_parse(...)
  if res['ssh']['enabled']:
     ...

now, with the proposed encoding, I have to be prepared for 'ssh' being
a '@tagged-value', and '@enabled' being a tagged-value, and
combinations thereof:

  if res['ssh']['enabled']
     or res['@tagged-value']['ssh']['enabled']
     or res['@tagged-value']['ssh']['@tagged-value']['enabled']
     or ...

As I write this I realize that I don't really understand your
proposal..., so the code above is not correct - but the point is the
same; as soon as you allow multiple encodings you make coding much
more complex.

Maybe the original JSON mapping idea is the only one that works; i.e.,
map pure YANG data to JSON.  No meta data.  A protocol that needs meta
data should not use JSON; use XML instead.


/martin