Re: [netmod] xpath expressions in JSON

Andy Bierman <andy@yumaworks.com> Thu, 11 October 2018 09:21 UTC

Return-Path: <andy@yumaworks.com>
X-Original-To: netmod@ietfa.amsl.com
Delivered-To: netmod@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id C2AB3130DC1 for <netmod@ietfa.amsl.com>; Thu, 11 Oct 2018 02:21:36 -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, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=yumaworks-com.20150623.gappssmtp.com
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 9bV2H4j_zRBX for <netmod@ietfa.amsl.com>; Thu, 11 Oct 2018 02:21:33 -0700 (PDT)
Received: from mail-lj1-x235.google.com (mail-lj1-x235.google.com [IPv6:2a00:1450:4864:20::235]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 47B76129BBF for <netmod@ietf.org>; Thu, 11 Oct 2018 02:21:33 -0700 (PDT)
Received: by mail-lj1-x235.google.com with SMTP id j4-v6so7526079ljc.12 for <netmod@ietf.org>; Thu, 11 Oct 2018 02:21:33 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yumaworks-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=M8rFsXK9HE3fK9IfFN65Sq0xX7/jIHKAT3tr2ipThPA=; b=jqNmMBGqZC0cuxgWNpYzrvipob7462kTWfFMR/Uk6GHjFJULtVhPF3fjG1A4RA0qtA 5wZjCjUiZMoc8pFhhltJvPyDcG5Jfslx4yDScmvGlvOeIvLwApRfahw47/XZdY2Q9NNu CmvwXssNSf4LUBu9hyWlgHDSaMlbFdxecMr+U7IYJn+DZcRfXofZ7TZLQm1h8XsYsIOo vwxcHnEKnfVYgBLBTDQIKuSlwmg1NfjAoY85XVusKncAsigqkqEuvfBpxctf+0e75OGg e+whQP5Z0+CEBZyjzWXSHqeBraSpN3HAIFrN6BbtPHTasxftSUvGqW95DLMT20MpFnR5 GBGQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=M8rFsXK9HE3fK9IfFN65Sq0xX7/jIHKAT3tr2ipThPA=; b=s9R5yY7kJoY0kc3DGkvQRgaHUcPxvfg8W85U1H78aLPUbpE9E6s9u2LJ7qUJtwE86/ ZbgT5iwgdSYVsTLCWYY8FYfm3uOac1J84yKCMU1xAANOIzNZ6U4TVxz4s2hSMAgLHyE+ pMc1QjDdXzfxoCp7s76pDgab0B0t83sojIe0r5UcZHx1KBPBJ18KvCoWbodA+dF19IL4 byHGh/mbXXgZuQ27l4/5CdOJJ9V6ffIYFJHU2tMoAH8ZSwF7j2mSyMraX+va9N3s6LFH 3yS6Gm/OXVfJ+NKnhc2dHGKFKGd8Eq/cR0LMxwMe92Av/DCoA7jfgZE5I9alHtrIl5x5 khjw==
X-Gm-Message-State: ABuFfojCPAf4hkm8vrWK7zZEKWOfPpuhrzBOdRKIlCcEnDtdZUE8Usga x5gHuW1YXZH6KgCRfoFnOyWWHfMaRDx+K6sZ/csq7Q==
X-Google-Smtp-Source: ACcGV60VnfrmpTiB7pazQSVqFHDht6N00p1pcrkYq11MwSkZzDs/nA0s5LgguiNbDY6vJFd5VCNC0+XvPT6r5vo3J+c=
X-Received: by 2002:a2e:9047:: with SMTP id n7-v6mr564475ljg.10.1539249691048; Thu, 11 Oct 2018 02:21:31 -0700 (PDT)
MIME-Version: 1.0
Received: by 2002:a19:f811:0:0:0:0:0 with HTTP; Thu, 11 Oct 2018 02:21:29 -0700 (PDT)
In-Reply-To: <20181011.083904.763170181197608903.mbj@tail-f.com>
References: <20181010.155915.278994099457235212.mbj@tail-f.com> <3B614CF4-9545-4C31-BEF4-CDFBF72AA045@cisco.com> <CABCOCHT32pSP3raNj6pP3BY9ji4DnOoOAaKVY7QyfV4tqqp9KA@mail.gmail.com> <20181011.083904.763170181197608903.mbj@tail-f.com>
From: Andy Bierman <andy@yumaworks.com>
Date: Thu, 11 Oct 2018 02:21:29 -0700
Message-ID: <CABCOCHQ58Z0TpVLGVcw_TT-OG+1pWQERyCnU7NFO_Gob7JLLcA@mail.gmail.com>
To: Martin Bjorklund <mbj@tail-f.com>
Cc: "Reshad Rahman (rrahman)" <rrahman@cisco.com>, Ladislav Lhotka <lhotka@nic.cz>, NetMod WG <netmod@ietf.org>
Content-Type: multipart/alternative; boundary="0000000000000e4e780577f07f50"
Archived-At: <https://mailarchive.ietf.org/arch/msg/netmod/BjrfAxl-h-IKv1Na9WX2GD7W6Kw>
Subject: Re: [netmod] xpath expressions in JSON
X-BeenThere: netmod@ietf.org
X-Mailman-Version: 2.1.29
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: <https://mailarchive.ietf.org/arch/browse/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: Thu, 11 Oct 2018 09:21:37 -0000

On Wed, Oct 10, 2018 at 11:39 PM, Martin Bjorklund <mbj@tail-f.com> wrote:

> Andy Bierman <andy@yumaworks.com> wrote:
> > On Wed, Oct 10, 2018 at 6:59 PM, Reshad Rahman (rrahman) <
> rrahman@cisco.com>
> > wrote:
> >
> > > On 2018-10-10, 9:59 AM, "netmod on behalf of Martin Bjorklund" <
> > > netmod-bounces@ietf.org on behalf of mbj@tail-f.com> wrote:
> > >
> > >     Ladislav Lhotka <lhotka@nic.cz> wrote:
> > >     > Martin Bjorklund <mbj@tail-f.com> writes:
> > >     >
> > >     > > Hi,
> > >     > >
> > >     > > While reviewing restconf-notif, I saw this example:
> > >     > >
> > >     > >    {
> > >     > >       "ietf-subscribed-notifications:input": {
> > >     > >          "stream": "NETCONF",
> > >     > >          "stream-xpath-filter": "/ds:foo/",
> > >     > >          "dscp": "10"
> > >     > >       }
> > >     > >    }
> > >     > >
> > >     > > Note the "stream-xpath-filter".  It has a prefix in the XPath
> > > string.
> > >     > > How are prefixes declared when JSON is used?
> > >     > >
> > >     > > The leaf "stream-xpath-filter" says:
> > >     > >
> > >     > >               o  The set of namespace declarations are those in
> > > scope on
> > >     > >                  the 'stream-xpath-filter' leaf element.
> > >     > >
> > >     > > (I think I provided that text...)
> > >     > >
> > >     > > This assumes that the encoding is XML, or at leas that the
> encoding
> > >     > > can somehow transfer namespace declarations.
> > >     >
> > >     > It can't. There are two options:
> > >     >
> > >     > 1. have different representations of this value in XML and JSON,
> > >     >    analogically to instance indentifiers (sec. 6.11 in RFC 7951).
> > >     >
> > >     > 2. use a module name rather than a prefix in XML, too.
> > >     >
> > >     > I would suggest #2.
> > > <RR> But that means making non-backwards compatible change to the XML
> > > representation?
> > >
> >
> > Not really. It means NETMOD WG would be creating its own special variant
> of
> > XPath.
>
> Not at all.  What I propose is perfectly fine, legal XPath 1.0.
>
> XPath 1.0 says that an XPath expression is evaluated in a context.
> One item in the context is a set of mappings from <prefix> to <uri>,
> where <prefix> is used to lookup prefixes used in the XPath
> expression, e.g. in "/foo:interfaces" "foo" is the prefix.
>
> It is perfectly fine to say that the prefix mapping set is this:
>
>    "ietf-interfaces" -> "urn:ietf:params:xml:ns:yang:ietf-interfaces"
>    "ietf-ip"         -> "urn:ietf:params:xml:ns:yang:ietf-ip"
>
> and use that to evaluate the expression
>
>   /ietf-interfaces:interfaces/ietf-interfaces:interface/ietf-ip/ipv4
>
>
>

The XPath expression is normally parsed within an XML instance document.
There are "xmlns" attributes present that map the prefix to a namespace URI.
These mappings will not be present in the JSON at all.

A custom XPath implementation is required to magically identify the prefix
as a module name and magically find the namespace URI for the module name.
A normal XPath implementation will not find any namespace mapping for the
prefixes.

An XPath expression has no concept of the "current module" inherited from
the parent
like the JSON encoding. This is problematic for predicates

   /ietf-interfaces:interfaces/interface[name='eth0']

XPath says the missing prefixes for 'interface' and 'name' are simply
missing (no namespace).
The JSON encoding says "ietf-interfaces" is used for 'interfaces'. and
'interface'.
There is no specification for the 'name' node inside a predicate.

So you must mean the full module name will be used at every node:

 /ietf-interfaces:interfaces/ietf-interfaces:interface[ietf-interfaces:name='eth0']



>
> /martin
>
>
Andy


>
> >
> >
> > >     Hmm, so you mean change the leaf "stream-xpath-filter" to say:
> > >
> > >              o  The set of namespace declarations has one member for
> each
> > >                 YANG module supported by the server.  This member maps
> > >                 from the YANG module name to the YANG module namespace.
> > >
> > >                 This means that in the XPath expression, the module
> name
> > >                 serves as the prefix.
> > >
> > >     .... and then also give an example of this.
> > >
> > >     This is probably what we need to do in all places where
> yang:xpath1.0
> > >     is used, going forward.  Maybe even define a new type
> > >     yang:xpath1.0-2 (name?) with the set of namespace declarations
> > >     built-in.
> > >
> >
> >
> > We should avoid making off-the-shelf implementations of standards like
> > XPath unusable.
> > At the very least this should be only available if the server supports it
> > (with a capability URI)
> >
> >
> >
> > > <RR> So we need an update to RFC7951?
> > >
> > > Regards,
> > > Reshad.
> > >
> > >
> >
> > Andy
> >
> >
> > >
> > >     /martin
> > >
> > >
> > >
> > >
> > >
> > >     >
> > >     > Lada
> > >     >
> > >     > >
> > >     > > How is this supposed to work with JSON?
> > >     > >
> > >     > >
> > >     > > /martin
> > >     > >
> > >     > > _______________________________________________
> > >     > > netmod mailing list
> > >     > > netmod@ietf.org
> > >     > > https://www.ietf.org/mailman/listinfo/netmod
> > >     >
> > >     > --
> > >     > Ladislav Lhotka
> > >     > Head, CZ.NIC Labs
> > >     > PGP Key ID: 0xB8F92B08A9F76C67
> > >     >
> > >
> > >     _______________________________________________
> > >     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
> > >
>