Hi Andy,

On 16/11/2017 10:42, Andy Bierman wrote:


On Wed, Nov 15, 2017 at 4:53 PM, Robert Wilton <[email protected] <mailto:[email protected]>> wrote:

    Hi Andy,


    On 16/11/2017 02:29, Andy Bierman wrote:
    Hi,

    The per-datastore feature aspect of NMDA is a new and significant
    change to YANG.

        |  |  +--ro feature* [name]
        |  |  |  +--ro name yang:yang-identifier
        |  |  |  +--ro not-implemented-in*
        |  |  |              -> /yang-library/datastore/name


    YANG does not define feature conformance at this granularity.
    I strongly object to this change to YANG conformance.
    A server can only advertise a YANG feature if it implemented on
    the entire server.

    This extra complexity is not present on the openconfig solution
    or requirements.
    In terms of comparison, it definitely is:
    - you can have different features for the config and state trees
    (e.g. "router-id" feature in RFC 8022).
    - sometimes the conventions are not followed completely
    consistently, e.g. different types, or semantics between config
    and state.
    - sometimes the structures differ between config and state.

    So, the problem comparing between config and state is not easier
    in either the IETF split tree or OpenConfig solutions.

    Comparing any datastore to <operational> is much more complex
    (any may not be possible)
    if the features are different for a given module.
    You can always compare (except deviations in operational).  If a
    feature is enabled on any configuration datastore then it must
    also be enabled on operational.


This is not apparent from the text.

I agree that this can be better explained, either in YANG library, and/or in the datastores architecture.  This is implied by the datastore draft today, but there is no harm to make it a bit more explicit.


The draft-02 library is very out of date at this point.

Yes, sorry.  The -02 is out of date with the latest proposal which was discussed/developed after the cutoff date.   Functionality wise they are intended to be capable of expressing the same things, but the proposal in this original thread is intended to be simpler.



I only care about restricting the conventional datastores, <intended> and <operational>. It will be a massive client rewrite if the client cannot compare <intended> to <operational>
with 1 schema tree.

<intended> also counts as a conventional datastore so the list of modules, features, deviations MUST be the same as for <running>, <startup>, and <candidate>.

But yes, I entirely agree that it must be possible to compare from <intended> to <operational> in an easy way.  Arguably that is one of the key aspects of this work.



If the updated draft reflects the feature-in-operational requirement above then
I have no objections to the proposed YANG library functionality.

OK, we will ensure that this is clearly documented.



I am still concerned about per-datastore deviations.
IMO, the server MUST implement the same deviations in these special datastores.

For a normal server YANG deviation "e.g. changing types, or value space, etc" then the same deviations MUST be applied to ALL datastores.


If that cannot be done, the operational node will not be present. Another leaf node
(like admin-state/oper-state) needs to be used instead.

Yes, entirely agree.

The only type of per datastore deviation is to remove a node. Further, if that deviation is applied to one of the conventional datastores then it must apply to all of the conventional datastores.



If the server does implement per-datastore deviations,
clients may not work (if they use the conventional datastore schema tree for <operational>).
The same thing happens if the client ignores plain-old-deviations now,
so this is not a big deal.

I think that I agree.






    E.g.  take "router-id" feature from RFC8022bis (that was also
    defined in RFC8022).

    This feature can be enabled:
    (i) everywhere (i.e. <conventional> + <i2rs-ephemeral> +
    <operational>), or
    (ii) <conventional> + <operational>, or
    (iii) <i2rs-ephemral> + <operational>, or
    (iv) <operational> only, or
    (v) or in none of them.



I still think the WG needs to define YANG conformance for datastores,
The question "what datastores does server implementation X support for module foo?" is covered. The question "what datastores MUST, SHOULD, MAY a compliant server implementation
support for module foo?" is totally ignored.

The RESTCONF NMDA draft states:

   An NMDA-compliant RESTCONF server MUST support the operational state
   datastore.  Such a server identifies that it supports NMDA both by
   implementing the {+restconf}/ds/ietf-datastores:operational resource,
   and by implementing at least revision 201X-XX-XX of the
   "ietf-yang-library" module, as specified in
   [I-D.nmdsdt-netconf-rfc7895bis].


The NETCONF NMDA protocol draft should have a similar statement.

Do you think that this conformance statement is insufficient?

Or is your concern about whether modules are expected to be implemented?

Thanks,
Rob




    Hence, <operational> always contains a superset of the nodes.


    I do not see how <operational> can be true superset of the
    conventional datastores
    if the features are different.

    Because of the statement above.

    Thanks,
    Rob




Andy



    Andy


    On Wed, Nov 15, 2017 at 9:29 AM, Robert Wilton <[email protected]
    <mailto:[email protected]>> wrote:

        I don't think that this is really a good idea.  You would end
        up returning server metadata in addition to the configuration.

        I still think that the YANG library proposal is the best
        solution.

        Thanks,
        Rob


        On 16/11/2017 01:21, Vladimir Vassilev wrote:
        Hello,

        I have a proposal based on <get-data> that provides an
        elegant solution to consider as a 3rd option.  It is based
        on keeping exactly the same model as in RFC 7895 and using
        <get-data> RPC to retrieve datastore specific yang-library
        instance data in a similar way one would use <get-data> to
        retrieve the datastore contents. In addition a top level
        config=false container e.g. /datastores with list of
        supported datastores that does not need to be part of the
        yang-library module:

        module: ietf-datastores
        +--ro datastores
        |  +--ro datastore* [name]
        |     +--ro name          identityref

        Vladimir

        On 11/09/2017 05:51 PM, Robert Wilton wrote:

        Hi,

        Given some of the feedback related to the complexity of the
        YANG library bis structure, we have come up with two other
        possible structures for the YANG library data:

        (1) A simplified structure to make YANG library meet the
        NMDA requirements, but that is closer to the existing YANG
        library structure, and arguably simpler.
        (2) An enhanced version of the structure (1) above, that is
        also extended to allow the structure to be reused for
        schema-mount via an augmentation.

        For reference, at the end of this email, I have also
        included the tree diagram of the existing YANG library, and
        the current YANG library bis draft
        (draft-ietf-netconf-rfc7895bis-02) version.

        Considering the two new YANG library structures:

        ------------------------

        *(1) A simplified structure to make YANG library meet the
        NMDA requirements, but that is closer to the existing YANG
        library structure.*

        The main changes are:
        (i) Split "implemented modules" and "import-only-modules"
        into two separate lists, making the most important list
        (i.e. implemented modules) keyed by module name only and
        hence easier to reference.
        (ii) Assume modules are implemented in all datastores by
        default (with a "not-implemented-in" leaflist of datastores
        that a module is not implemented in).
        (iii) Assume that features are implemented in all
        datastores by default (with a "not-implemented-in" leaflist
        of datastores that a feature is not implemented in).
        (iv) Deleted module-sets.
        (v) Datastores are now just a list of supported datastores
        (that could potentially be extended with further per
        datastore properties in future).

        Manually generated tree output for proposed YANG library:

        module: ietf-yang-library
         +--ro yang-library
            +--ro modules
            |  +--ro module* [name]
            |  |  +--ro name yang:yang-identifier
            |  |  +--ro revision? revision-identifier
            |  |  +--ro schema? inet:uri
            |  |  +--ro namespace inet:uri
            |  |  +--ro submodule* [name]
            |  |  |  +--ro name yang:yang-identifier
            |  |  |  +--ro revision? yang:yang-identifier
            |  |  |  +--ro schema? inet:uri
            |  |  +--ro not-implemented-in*
            |  |  |              -> /yang-library/datastore/name
            |  |  +--ro feature* [name]
            |  |  |  +--ro name yang:yang-identifier
            |  |  |  +--ro not-implemented-in*
            |  |  |              -> /yang-library/datastore/name
            |  |  +--ro deviation*
            |  |                 -> ../name
            |  |
            |  +--ro import-only-module* [name revision]
            |     +--ro name yang:yang-identifier
            |     +--ro revision            union
            |     +--ro schema?             inet:uri
            |     +--ro namespace           inet:uri
            |     +--ro submodule* [name]
            |        +--ro name yang:yang-identifier
            |        +--ro revision yang:revision-identifier
            |        +--ro schema? inet:uri
            +--ro datastore* [name] // Allows future per datastore
        properties.
            |  +--ro name identityref
            +--ro checksum       string

        ------------------------------

        *(2) An enhanced version of the structure (1) above, that
        is extended to allow the structure to be reused for
        schema-mount via an augmentation.*

        This is similar to the structure above, except that the
        "the set of modules" is contained in a list of named schema
        (e.g. similar to the schema mount draft), allowing this
        structure to be re-used for schema mount.

        Schema mount would be expected to augment yang-library to
        add in the additional schema mount information.  In the
        tree diagram, I have shown the schema-mount mount-point
        augmentation, but not including namespaces yet.

        Every server would be required to provide at least one
        schema in the schema list, and the primary schema for the
        device would always be given the name "primary".

        module: ietf-yang-library
         +--ro yang-library
            +--ro schema* [name]
            |  +--ro name string
            |  +--ro checksum string
            |  +--ro module* [name]
            |  |  +--ro name yang:yang-identifier
            |  |  +--ro revision? yang:revision-identifier
            |  |  +--ro schema? inet:uri
            |  |  +--ro namespace inet:uri
            |  |  +--ro submodule* [name]
            |  |  |  +--ro name yang:yang-identifier
            |  |  |  +--ro revision? yang:yang-identifier
            |  |  |  +--ro schema? inet:uri
            |  |  +--ro not-implemented-in*
            |  |  |              -> /yang-library/datastore/name
            |  |  +--ro feature* [name]
            |  |  |  +--ro name yang:yang-identifier
            |  |  |  +--ro not-implemented-in*
            |  |  |              -> /yang-library/datastore/name
            |  |  +--ro deviation*
            |  |  |              -> ../name
            |  |  +- schema-mount:mount-point* [label]
            |  |     +--ro label         yang:yang-identifier
            |  |     +--ro config?       boolean
            |  |     +--ro (schema-ref)
            |  |        +--:(inline)
            |  |        |  +--ro inline?       empty
            |  | +--:(use-schema)
            |  |           +--ro use-schema* [name]
            |  |              +--ro name
            |  |              | -> /yang-library/schema/name
            |  |              +--ro parent-reference* yang:xpath1.0
            |  |
            |  +--ro import-only-module* [name revision]
            |     +--ro name yang:yang-identifier
            |     +--ro revision            union
            |     +--ro schema?             inet:uri
            |     +--ro namespace           inet:uri
            |     +--ro submodule* [name]
            |        +--ro name yang:yang-identifier
            |        +--ro revision yang:revision-identifier
            |        +--ro schema? inet:uri
            +--ro datastore* [name] // Allows future per datastore
        properties.
            |  +--ro name identityref
            +--ro checksum       string

        Please can you provide comments on these structures, in
        particular:

        Is this version better (i.e. simpler) that the version
        currently in draft-ietf-netconf-rfc7895bis-02 (below)?

        Should we try and make the structure extensible for
        schema-mount via augmentation (i.e. version (2)), or is it
        better that schema-mount has its own separate subtree?

        For reference only I have included the existing YANG
        library and YANG library bis draft tree diagrams.

        Thanks,
        Rob


        -----------------------------

        *** FOR REFERENCE ONLY ***

        (3)  The current YANG library structure in YANG library bis
        (draft-ietf-netconf-rfc7895bis-02)

            module: ietf-yang-library
                +--ro yang-library
                   +--ro modules
                   |  +--ro module* [id]
                   |     +--ro id                  string
                   |     +--ro name                yang:yang-identifier
                   |     +--ro revision?           revision-identifier
                   |     +--ro schema?             inet:uri
                   |     +--ro namespace           inet:uri
                   |     +--ro feature*            yang:yang-identifier
                   |     +--ro deviation* [module]
                   |     |  +--ro module    -> ../../id
                   |     +--ro conformance-type    enumeration
                   |     +--ro submodule* [name]
                   |        +--ro name        yang:yang-identifier
                   |        +--ro revision?   revision-identifier
                   |        +--ro schema?     inet:uri
                   +--ro module-sets
                   |  +--ro module-set* [id]
                   |     +--ro id        string
                   |     +--ro module*   -> ../../../modules/module/id
                   +--ro datastores
                   |  +--ro datastore* [name]
                   |     +--ro name          identityref
                   |     +--ro module-set
                   |             -> ../../../module-sets/module-set/id
                   +--ro checksum       string

        -----------------------------

        *** FOR REFERENCE ONLY ***

        (4)  The current YANG library structure (RFC 7895)

               +--ro modules-state
                  +--ro module-set-id    string
                  +--ro module* [name revision]
                     +--ro name                yang:yang-identifier
                     +--ro revision            union
                     +--ro schema?             inet:uri
                     +--ro namespace           inet:uri
                     +--ro feature*            yang:yang-identifier
                     +--ro deviation* [name revision]
                     |  +--ro name        yang:yang-identifier
                     |  +--ro revision    union
                     +--ro conformance-type    enumeration
                     +--ro submodule* [name revision]
                        +--ro name        yang:yang-identifier
                        +--ro revision    union
                        +--ro schema?     inet:uri



        _______________________________________________
        Netconf mailing list
        [email protected] <mailto:[email protected]>
        https://www.ietf.org/mailman/listinfo/netconf
        <https://www.ietf.org/mailman/listinfo/netconf>



        _______________________________________________
        netmod mailing list
        [email protected] <mailto:[email protected]>
        https://www.ietf.org/mailman/listinfo/netmod
        <https://www.ietf.org/mailman/listinfo/netmod>





_______________________________________________
netmod mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to