Re: [netmod] schema mount open issue #1

Martin Bjorklund <mbj@tail-f.com> Wed, 23 August 2017 06:28 UTC

Return-Path: <mbj@tail-f.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 9F2AA132332 for <netmod@ietfa.amsl.com>; Tue, 22 Aug 2017 23:28:09 -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, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
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 bLbXngrISyHw for <netmod@ietfa.amsl.com>; Tue, 22 Aug 2017 23:28:07 -0700 (PDT)
Received: from mail.tail-f.com (mail.tail-f.com [46.21.102.45]) by ietfa.amsl.com (Postfix) with ESMTP id 340EB1321ED for <netmod@ietf.org>; Tue, 22 Aug 2017 23:28:07 -0700 (PDT)
Received: from localhost (h-40-225.A165.priv.bahnhof.se [94.254.40.225]) by mail.tail-f.com (Postfix) with ESMTPSA id 418DA1AE01AA; Wed, 23 Aug 2017 08:28:06 +0200 (CEST)
Date: Wed, 23 Aug 2017 08:29:06 +0200
Message-Id: <20170823.082906.1853252260651620253.mbj@tail-f.com>
To: lberger@labn.net
Cc: netmod@ietf.org
From: Martin Bjorklund <mbj@tail-f.com>
In-Reply-To: <1aa26e59-6999-8f8a-6cd6-5e74050453bd@labn.net>
References: <20170822.122022.1375224682803846655.mbj@tail-f.com> <1aa26e59-6999-8f8a-6cd6-5e74050453bd@labn.net>
X-Mailer: Mew version 6.7 on Emacs 24.5 / Mule 6.0 (HANACHIRUSATO)
Mime-Version: 1.0
Content-Type: Text/Plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Archived-At: <https://mailarchive.ietf.org/arch/msg/netmod/3ZOOzW1D6M18OfVQ08AGhMEMUJo>
Subject: Re: [netmod] schema mount open issue #1
X-BeenThere: netmod@ietf.org
X-Mailman-Version: 2.1.22
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: Wed, 23 Aug 2017 06:28:10 -0000

Lou Berger <lberger@labn.net> wrote:
> Hi Martin,
> 
> See below.
> 
> 
> On 8/22/2017 6:20 AM, Martin Bjorklund wrote:
> > Hi,
> >
> > Lada presented an open issue in schema mount in Prague.  (See slide 6
> > in
> > https://datatracker.ietf.org/meeting/99/materials/slides-99-netmod-sessb-schema-mount)
> >
> > The original problem comes from the NI use case
> > (https://tools.ietf.org/html/draft-ietf-rtgwg-ni-model).  In this
> > use case, interfaces are assigned to NIs by:
> >
> >    augment /if:interfaces/if:interface:
> >      +--rw bind-ni-name?   -> /network-instances/network-instance/name
> >
> > Modules that are mounted within the NI might have references to
> > interfaces.  The idea is that a specific NI can only reference the
> > interfaces that has been assigned to it.
> >
> > In schema mount, we have the "parent-reference" XPath expression that
> > in this case will be "/if:interfaces/if:interface".  The problem is
> > that this XPath expression will evaluate to a node set that contains
> > *all* interfaces in the system.  We would like this to contain just
> > the interfaces assigned to the NI.
> >
> > It turns out that this can be done with a simple change to the
> > "parent-reference" node.  If we state that this XPath expression is
> > evaluated in an XPath context where the context node is the node in
> > the data tree where the mount point is defined (instead of "/"), we
> > can use as parent-reference:
> >
> >   /if:interfaces/if:interface[ni:bind-network-instance-name = ../ni:name]
> >
> > Putting this together we'd have:
> >
> >   augment "/if:interfaces/if:interface" {
> >     leaf bind-ni-name {
> >       type leafref {
> >         path "/network-instances/network-instance/name";
> >       }
> >     }
> >   }
> >
> >   container network-instances {
> >     list network-instance {
> >       key name;
> >       leaf name { ... }
> >       ...
> >       container root {
> >         // this would be the XPath context root for parent-reference
> >         yangmnt:mount-point ni-root;
> >       }
> >     }
> >   }
> 
> note that the current NI definition is:

Yes I saw that.

>    module: ietf-network-instance
>      +--rw network-instances
>         +--rw network-instance* [name]
>            +--rw name           string
>            +--rw enabled?       boolean
>            +--rw description?   string
>            +--rw (ni-type)?
>            +--rw (root-type)?
>               +--:(vrf-root)
>               |  +--mp vrf-root?
>               +--:(vsi-root)
>               |  +--mp vsi-root?
>               +--:(vv-root)
>                  +--mp vv-root?

Note that the extension yangmnt:mount-point can only be present in a
container or list, not in a choice/case.

But what is the point of a choice with three different mount points?

>    augment /if:interfaces/if:interface:
>      +--rw bind-ni-name?   -> /network-instances/network-instance/name
>    augment /if:interfaces/if:interface/ip:ipv4:
>      +--rw bind-ni-name?   -> /network-instances/network-instance/name
>    augment /if:interfaces/if:interface/ip:ipv6:
>      +--rw bind-ni-name?   -> /network-instances/network-instance/name
> 
> > And in state data:
> >
> >
> > "ietf-yang-schema-mount:schema-mounts": {
> >   "namespace": [
> >     {
> >       "prefix": "ni",
> >       "uri": "urn:ietf:params:xml:ns:yang:ietf-network-instance"
> >     },
> >     {
> >       "prefix": "if",
> >       "uri": "urn:ietf:params:xml:ns:yang:ietf-interfaces"
> >     }
> >   ]
> >   "mount-point": [
> >     {
> >       "target": "/ni:network-instances/ni:network-instance/ni:root",
> Can you confirm that with the current definition the target is:
> 
>       "target": "/ni:network-instances/ni:network-instance",
> 
> correct?

See above; the current definition is invalid.

> >       "parent-reference": [
> >             "/if:interfaces/if:interface
> >              [ni:bind-network-instance-name = ../ni:name]"

Correction.  This should be:

            "/if:interfaces/if:interface
             [ni:bind-network-instance-name = current()/../ni:name]"

> >                           ],
> Also, can you confirm that if we wanted to cover v4, v6 (for example
> purposes) interfaces-state, the full parent reference list would be:
> 
>       "parent-reference": [
>             "/if:interfaces/if:interface
>              [ni:bind-ni-name = ./ni:name]",
>             "/if:interfaces/if:interface/ip:ipv4
>              [ni:bind-ni-name = ./ni:name]",
>             "/if:interfaces/if:interface/ip:ipv6
>              [ni:bind-ni-name = ./ni:name]",
>              "/if:interfaces-state/if:interface"
> 
>  correct?

No it would be:

  /if:interfaces-state/if:interface[
    if:name = /if:interfaces/if:interface[
      ni:bind-ni-name = current()/../ni:name]/if:name]

etc.

I.e., the interfaces in -state that that has the same names as the
interfaces in config that has the correct bind-ni-name.
   

> Note that interfaces-state isn't filtered as the bind-ni-name isn't
> present in -state.
> 
> >       "use-schema": [
> >         {
> >           "name": "ni-schema"
> >         }
> >       ]
> >     }
> >   ]
> >
> >
> >
> > Note that this does NOT affect the schema that is mounted; it only
> > affects the result of the parent-reference XPath expressions.
> >
> >
> > I think that we should make this change, since it allows for more
> > precise parent-references.
> I'm okay with the change (just want to see the draft moved forward ;-)
> 
> Lou
> (As contributor)



/martin