Subject: Re: [OSPF] [yang-doctors] Yangdoctors last call review of draft-ietf-ospf-yang-09

From: "Acee Lindem (acee)" <[email-masked]>
Date: Thu, 1 Feb 2018 21:54:59 +0000

Martin, Lada,

I believe this got lost with all the discussion of schema mount/yang library during roughly the same time frame.  You have both advocated using derived-from()/dervived-from-or-self() for ietf-ospf.yang checking. However, either I have misinterpreted the RFC 7950 description of these YANG functions or the yangvalidator validation is broken. Please see below. 

Thanks,
Acee 

On 1/22/18, 1:42 PM, "Acee Lindem (acee)" <[email-masked]> wrote:

    Hi Martin, Lada, 
    
    In experimenting with this, I get YANGLINT validation errors. I’m not sure what I’m missing but the first argument to derived-from()/derive-from-or-self() is the schema node and the second is the identity – correct?
    For example, the following YANG leaf:
    
    identity ospf-protocol {
        base "rt:routing-protocol";
        description "Any version the OSPF protocol";
      }
    
      identity ospfv2 {
        base "ospf-protocol";
        description "OSPFv2";
      }
    
      identity ospfv3 {
        base "ospf-protocol";
        description "OSPFv3";
      }
    
    leaf routing-protocol-name {
          type leafref {
            path "/rt:routing/rt:control-plane-protocols/"
               + "rt:control-plane-protocol/rt:name";
          }
          must "derived-from( "
    	+ "/rt:routing/rt:control-plane-protocols/"
            + "rt:control-plane-protocol[rt:name=current()]/"
            + "rt:type, ospf:ospf-protocol)";
          description
           "OSPF routing protocol instance name.";
        }
    
    Gives me: 
    
    warn: Schema node "ietf-ospf:ospf-protocol" not found (derived-from( /ietf-routing:routing/ietf-routing:control-plane-protocols/ietf-routing:control-plane-protocol[ietf-routing:name=current()]/ietf-routing:type, ietf-ospf:ospf-protocol) with context node "/ietf-ospf:if-state-change/routing-protocol-name".
    
    Thanks
    Acee 
    
    On 1/10/18, 4:36 AM, "Martin Bjorklund" <[email-masked]> wrote:
    
        Hi,
        
        I think we can agree that the model in this I-D should use
        derived-from-or-self() instead of string comparison, and conclude this
        discussion here.  I suggest that if we need to further discuss the
        representation of identityrefs, then we start a new thred on the
        NETMOD ML.

        /martin

        Ladislav Lhotka <[email-masked]> wrote:
        > On Tue, 2018-01-09 at 16:23 +0100, Martin Bjorklund wrote:
        > > Ladislav Lhotka <[email-masked]> wrote:
        > > > On Tue, 2018-01-09 at 09:06 +0100, Martin Bjorklund wrote:
        > > 
        > > > > Hi,
        > > 
        > > > > 
        > > 
        > > > > Ladislav Lhotka <[email-masked]> wrote:
        > > 
        > > > > > Hi Acee,
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > please see inline.
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > On Mon, 2018-01-08 at 19:28 +0000, Acee Lindem (acee) wrote:
        > > 
        > > > > 
        > > 
        > > > > > > Hi Lada,
        > > 
        > > > > 
        > > 
        > > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > Apologies for the delay. We somewhat got hung up on 4 and 6. See
        > > inline.
        > > 
        > > > > 
        > > 
        > > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > On 12/6/17, 6:26 AM, "Ladislav Lhotka" <[email-masked]> wrote:
        > > 
        > > > > 
        > > 
        > > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > > Reviewer: Ladislav Lhotka
        > > 
        > > > > 
        > > 
        > > > > > > > Review result: Ready with Issues
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > ...
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > > 3. Maybe the draft could mention that implementations should supply
        > > a
        > > 
        > > > > 
        > > 
        > > > > > > >   default routing domain as a system-controlled resource.
        > > 
        > > > > 
        > > 
        > > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > Isn’t this more of an RFC8022BIS statement? I guess we could state
        > > this as
        > > 
        > > > > 
        > > 
        > > > > > > an assumption.
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > Probably, but it is not a YANG issue, so I'd leave it to you routing
        > > folks
        > > 
        > > > > to
        > > 
        > > > > 
        > > 
        > > > > > decide.
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > >  
        > > 
        > > > > 
        > > 
        > > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > > 4. In "when" expressions, the module uses literal strings for
        > > 
        > > > > 
        > > 
        > > > > > > >   identities. This is known to be problematic, the XPath functions
        > > 
        > > > > 
        > > 
        > > > > > > >   derived-from() or derived-from-or-self() should be used instead.
        > > 
        > > > > 
        > > 
        > > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > > Why is this problematic? Is it because the types can be extended?
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > That's one reason: derived identities should often also satisfy the
        > > 
        > > > > constraint.
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > But the more serious problem is that things like
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > >     when "../../../../../../../rt:type = 'ospf:ospfv3'"
        > > 
        > > > > 
        > > 
        > > > > > 
        > > 
        > > > > 
        > > 
        > > > > > rely on plain string comparison that depends od the actual prefix used
        > > for
        > > 
        > > > > the
        > > 
        > > > > 
        > > 
        > > > > > "rt:type" value. For one, according to RFC 7951 the JSON encoding of
        > > this
        > > 
        > > > > value
        > > 
        > > > > 
        > > 
        > > > > > would be "ietf-ospf:ospfv3" so the above expression is always false. 
        > > 
        > > > > 
        > > 
        > > > > 
        > > 
        > > > > This is not correct; the when expression is not evaluated on the JSON
        > > 
        > > > > encoding.  See the last paragraph of section 9.10.3 in RFC 7950:
        > > 
        > > > > 
        > > 
        > > > >    The string value of a node of type "identityref" in a "must" or
        > > 
        > > > >    "when" XPath expression is the referred identity's qualified name
        > > 
        > > > >    with the prefix present.  If the referred identity is defined in an
        > > 
        > > > >    imported module, the prefix in the string value is the prefix defined
        > > 
        > > > >    in the corresponding "import" statement.  Otherwise, the prefix in
        > > 
        > > > >    the string value is the prefix for the current module.
        > > 
        > > > 
        > > 
        > > > This is weird, to say the least. The leafref instance may have an identity
        > > value
        > > 
        > > > that is defined in a module that (has to be implemented by the server but)
        > > 
        > > > needn't be imported in the module that contains the XPath expression. So I
        > > don't
        > > 
        > > > know what 'corresponding "import" statement' this paragraph is talking
        > > about.
        > > 
        > > 
        > > It has to import the module in order to give a prefix, which then can
        > > be used in the XPath expression.
        > 
        > In the XPath expression above, do you mean the "rt" prefix of "rt:type"? If so,
        > it is irrelevant for the string comparison, what's important is the *value* of
        > the "rt:type" instance, which can be an identity defined in a module that
        > needn't be imported by ietf-routing, ietf-ospf or whatever. Sec. 9.10.2:
        > 
        >    On a particular server, the valid values are further restricted to the set of
        >      identities defined in the modules implemented by the server.
        > 
        > > 
        > > > Also, potentially there can be a collision in prefixes and then this also
        > > breaks
        > > 
        > > > down.
        > > 
        > > 
        > > No, two modules cannot be imported with the same prefix.
        > 
        > I have to disagree. An identity derived from the "ietf-routing:control-protocol-
        > type" base identity can be defined in a module that is not imported anywhere. If
        > a server declares such a module as implemented, then "rt:type" may have this
        > value per sec. 9.10.2.
        > 
        > And, consequently, there may be two different modules with conflicting prefixes
        > defining identities that are derived from "ietf-routing:control-protocol-type". 
        > 
        > > 
        > > > A moral of the namespace/prefix story in XML was that relying of namespace
        > > 
        > > > prefixes having a particular value is a really bad idea. I know that the
        > > cited
        > > 
        > > > paragraph was intended to make such XPath string comparisons more
        > > deterministic,
        > > 
        > > > but it is also problematic and should be avoided if possible.
        > > 
        > > 
        > > Note that this prefix is under the control of the module designer
        > > writing the XPath expression.  The same identityref value might use a
        > 
        > No, it is not. The prefixes appear in instance data.
        > 
        > Lada
        > 
        > > different prefix in some other module.
        > > 
        > > 
        > > /martin
        > > 
        > > 
        > > 
        > > > 
        > > 
        > > > Lada
        > > 
        > > > 
        > > 
        > > > > 
        > > 
        > > > > So the equality test of the identityref is correct.
        > > 
        > > > > 
        > > 
        > > > > However, I agree that in most cases 'derived-from-or-self' should be
        > > 
        > > > > used, in order to handle derived identities.
        > > 
        > > > > 
        > > 
        > > > > 
        > > 
        > > > > /martin
        > > 
        > > > -- 
        > > 
        > > > Ladislav Lhotka
        > > 
        > > > Head, CZ.NIC Labs
        > > 
        > > > PGP Key ID: 0xB8F92B08A9F76C67
        > > 
        > > > 
        > > 
        > -- 
        > Ladislav Lhotka
        > Head, CZ.NIC Labs
        > PGP Key ID: 0xB8F92B08A9F76C67
        >

---

From: "Acee Lindem (acee)" <[email-masked]>
Date: Thu, 1 Feb 2018 21:57:11 +0000

Hi Martin, 
Please see my example of the yangvalidator not working - we can't use these YANG 1.1 functions until this is resolved. 
Thanks,
Acee 

    Hi,

    /martin

---

From: Martin Bjorklund <[email-masked]>
Date: Thu, 01 Feb 2018 23:15:00 +0100 (CET)

Hi,

The second argument must be a string, so you should add quotes:

  must "derived-from( "
     + "/rt:routing/rt:control-plane-protocols/"
     + "rt:control-plane-protocol[rt:name=current()]/"
     + "rt:type, 'ospf:ospf-protocol')";
    -------------^------------------^   

/martin

"Acee Lindem (acee)" <[email-masked]> wrote:
> Martin, Lada,
> 
> I believe this got lost with all the discussion of schema mount/yang
> library during roughly the same time frame.  You have both advocated
> using derived-from()/dervived-from-or-self() for ietf-ospf.yang
> checking. However, either I have misinterpreted the RFC 7950
> description of these YANG functions or the yangvalidator validation is
> broken. Please see below.
> 
> Thanks,
> Acee 
> 
>     In experimenting with this, I get YANGLINT validation errors. I’m not
>     sure what I’m missing but the first argument to
>     derived-from()/derive-from-or-self() is the schema node and the second
>     is the identity – correct?
>     warn: Schema node "ietf-ospf:ospf-protocol" not found (derived-from(
>     /ietf-routing:routing/ietf-routing:control-plane-protocols/ietf-routing:control-plane-protocol[ietf-routing:name=current()]/ietf-routing:type,
>     ietf-ospf:ospf-protocol) with context node
>     "/ietf-ospf:if-state-change/routing-protocol-name".
>     
>     Thanks
>     Acee 
>

---

From: "Acee Lindem (acee)" <[email-masked]>
Date: Fri, 2 Feb 2018 00:18:25 +0000

Hi Martin,
That works. 
Thanks,
Acee 

On 2/1/18, 5:15 PM, "Martin Bjorklund" <[email-masked]> wrote:

    Hi,

      must "derived-from( "

    /martin