On Thu, Jan 12, 2017 at 4:47 AM, Martin Bjorklund <m...@tail-f.com> wrote:

> Andy Bierman <a...@yumaworks.com> wrote:
> > On Wed, Jan 11, 2017 at 9:21 AM, Ladislav Lhotka <lho...@nic.cz> wrote:
> >
> > >
> > > > On 11 Jan 2017, at 17:56, Andy Bierman <a...@yumaworks.com> wrote:
> > > >
> > > > Hi,
> > > >
> > > >
> > > > On Wed, Jan 11, 2017 at 7:12 AM, Robert Wilton <rwil...@cisco.com>
> > > wrote:
> > > >
> > > >
> > > > On 11/01/2017 09:22, Martin Bjorklund wrote:
> > > > Andy Bierman <a...@yumaworks.com> wrote:
> > > > On Tue, Jan 10, 2017 at 1:20 PM, Kent Watsen <kwat...@juniper.net>
> > > wrote:
> > > >
> > > > I think it is better to have a human decide what is in the module
> > > > instead of relying on a pyang plugin to generate some additional
> module
> > > > that follows some simplistic pattern.
> > > > It may be simple, but I’m thinking that’s only because it’s not
> tricky
> > > ;)
> > > >
> > > >
> > > > The client and server developers still need to know about this
> > > > auto-generated module
> > > > and implement it.  Operators might have to know about it to use it.
> > > > My idea is not to auto generate models on the fly.
> > > >
> > > > My aim is to allow folks to start writing models in the desired long
> > > term format (i.e. combined config and state tree) with the model
> designer
> > > being able to assume the existence of the operational state datastore.
> > > >
> > > >
> > > >
> > > > I am not convinced this "new format" has solved anything.
> > > > Don't you need separate description-stmts in every node for each
> > > > datastore?  What does the value mean if pre-configured? configured?
> > > > operational?  Will the auto-generated objects be exactly correct
> > > > and never need any alterations or additional text?
> > > > They still need to be used by developers and YANG tools.
> > >
> > > Right, this is one problem of this "deduplication": even if two nodes -
> > > one config and the other state - have the same name or even type
> (which is
> > > not always the case, as we know), their semantics is often different.
> An IP
> > > address in configuration means a manually configured address whereas in
> > > state it may come from any source. So writing sensible descriptions
> will
> > > become tricky.
> > >
> > > >
> > > > Is is that realistic to force the config structure and operational
> > > structure
> > > > to be the same? Seems it is quite common to monitor data structures
> > > > with additional keys or different keys.  This is completely
> unsupported
> > > > so separate /foo and /foo-state trees will still exist.
> > >
> > > I agree.
> > >
> > > Lada
> > >
> > > >
> > > > IMO this combination of trees needs to be proven.
> > > > Take ietf-interfaces and show how much better it will work
> > > > if the /interfaces and /interfaces-state trees were combined.
> > > >
> > > >
> > > > Andy
> > > >
> > > >
> > > > The tooling would be there to statically generate the extra foo-state
> > > config false node modules for servers that don't support the
> operational
> > > state datastore.  This could be done once, and the extra foo-state
> modules
> > > committed to the github YANG respository in the same way that models
> are
> > > extracted from IETF RFCs today.
> > > >
> > > > The aim here is that the single model being produced by IETF would be
> > > usable both by new client/servers that support an operational state
> > > datastore, and also by existing NETCONF client/servers that don't
> implement
> > > an operational state datastore.
> > > >
> > > > I'm not proposing that as a long term solution, but as a path to
> make it
> > > easier for folk to migrate, and to not slow down the model writing
> effort.
> > > Otherwise, it may be hard to get a protocol model writer to design the
> YANG
> > > model in a way that is not fully usable on any current devices.
> > > >
> > > > As an illustration, an RFC published combined ietf-interfaces model
> may
> > > look like this:
> > > >
> > >
> >
> >
> > OK -- let me see if I understand the value of combining ietf-interfaces.
> >
> >
> > Here is the starting tree:
> >
> >
> >      +--rw interfaces
> >       |  +--rw interface* [name]
> >       |     +--rw name                        string
> >       |     +--rw description?                string
> >       |     +--rw type                        identityref
> >       |     +--rw enabled?                    boolean
> >       |     +--rw link-up-down-trap-enable?   enumeration
> >       +--ro interfaces-state
> >          +--ro interface* [name]
> >             +--ro name               string
> >             +--ro type               identityref
> >             +--ro admin-status       enumeration
> >             +--ro oper-status        enumeration
> >             +--ro last-change?       yang:date-and-time
> >             +--ro if-index           int32
> >             +--ro phys-address?      yang:phys-address
> >             +--ro higher-layer-if*   interface-state-ref
> >             +--ro lower-layer-if*    interface-state-ref
> >             +--ro speed?             yang:gauge64
> >             +--ro statistics
> >                +--ro discontinuity-time    yang:date-and-time
> >                +--ro in-octets?            yang:counter64
> >                +--ro in-unicast-pkts?      yang:counter64
> >                +--ro in-broadcast-pkts?    yang:counter64
> >                +--ro in-multicast-pkts?    yang:counter64
> >                +--ro in-discards?          yang:counter32
> >                +--ro in-errors?            yang:counter32
> >                +--ro in-unknown-protos?    yang:counter32
> >
> >                +--ro out-octets?           yang:counter64
> >                +--ro out-unicast-pkts?     yang:counter64
> >                +--ro out-broadcast-pkts?   yang:counter64
> >                +--ro out-multicast-pkts?   yang:counter64
> >                +--ro out-discards?         yang:counter32
> >                +--ro out-errors?           yang:counter32
> >
> >
> >
> > So these are the objects that would no longer be duplicated:
> >
> >     - name
> >     - type
> >
> > Neither one is supposed to have a different value in operational state vs
> > configuration.
> >
> >    - enabled
> >    - link-up-down-trap-enable
> >
> > These 2 could be different in operational state I suppose.
> > An RPC can provide the operational value without changing the YANG module
> >
> >     rpc get-oper-value {
> >       input {
> >          leaf node {
> >             type instance-identifier;
> >              description "the config=true node to check";
> >           }
> >       }
> >       output {
> >           anydata value {
> >              description
> >                "contains 1 child node matching the input 'node'
> parameter.
> >                 The value of the node is the current operational value."
> >           }
> >      }
> >    }
>
> This is essentially what we propose, except that we have generalized
> it so that more than one value can be retreived: <get-state> or
> <get-data> which takes a filter just like <get>.
>
>
OK

How do I retrieve the same subtree from multiple contexts at once
so I can reduce time-skew caused by retrieving config-tree then oper-tree?


>
> >    <rpc>
> >       <get-oper-value>
> >           <node>/if:interfaces/if:interface[if:name='eth0']/
> enabled</node>
> >       </get-oper-value>
> >    </rpc>
> >
> >
> >    <rpc-reply>
> >        <value>
> >           <if:enabled>false</if:enabled>
> >         </value>
> >      </rpc-reply>
> >
> > I don't need to change the YANG module at all to support operational
> state.
>
> Correct.  Old modules will continue to work.  Clients that <get-state>
> both /interfaces and /interfaces-state will receive some duplicate
> data.
>
> However, the new model allows for combined trees to be defined.
>
>

Here are the things that do not work anymore if a designer uses the new
tree approach:


YANG statements:
   - It is not possible to define these statements so they are different
for config and oper
      - must
      - when
      - unique
      - key
      - min-elements
      - max-elements
      - leafref (path)
      - if-feature
      - deviation
      - type (or any sub-statements of type-stmt)
      - status
      - description
      - reference

YANG allows must-when to reference state data nodes in every XPath context
except 1:
   - state data
   - RPC input
   - RPC output
   - action input
   - action output
   - notification payload

Seems like you are removing a lot of YANG functionality in order to make
the problem-space
fit your solution-space.



>
> /martin
>
> >
> >
> > Andy
> >
>


Andy


> >
> >
> > > > module: ietf-interfaces-combined
> > > >     +--rw interfaces
> > > >        +--rw interface* [name]
> > > >           +--rw name                        string
> > > >           +--rw description?                string
> > > >           +--rw type                        identityref
> > > >           +--rw enabled?                    boolean
> > > >           +--rw link-up-down-trap-enable?   enumeration {if-mib}?
> > > >           +--ro oper-status                 enumeration
> > > >           +--ro last-change? yang:date-and-time
> > > >           +--ro if-index                    int32 {if-mib}?
> > > >           +--ro phys-address? yang:phys-address
> > > >           +--ro higher-layer-if*            interface-ref
> > > >           +--ro lower-layer-if*             interface-ref
> > > >           +--ro speed?                      yang:gauge64
> > > >           +--ro statistics
> > > >              +--ro discontinuity-time    yang:date-and-time
> > > >              +--ro in-octets?            yang:counter64
> > > >              +--ro in-unicast-pkts?      yang:counter64
> > > >              +--ro in-broadcast-pkts?    yang:counter64
> > > >              +--ro in-multicast-pkts?    yang:counter64
> > > >              +--ro in-discards?          yang:counter32
> > > >              +--ro in-errors?            yang:counter32
> > > >              +--ro in-unknown-protos?    yang:counter32
> > > >              +--ro out-octets?           yang:counter64
> > > >              +--ro out-unicast-pkts?     yang:counter64
> > > >              +--ro out-broadcast-pkts?   yang:counter64
> > > >              +--ro out-multicast-pkts?   yang:counter64
> > > >              +--ro out-discards?         yang:counter32
> > > >              +--ro out-errors?           yang:counter32
> > > >
> > > > The extra generated model would look like this:
> > > >
> > > > module: ietf-interfaces-combined-state
> > > >     +--ro interfaces-state
> > > >        +--ro interface* [name]
> > > >           +--ro name                        string
> > > >           +--ro description?                string
> > > >           +--ro type                        identityref
> > > >           +--ro enabled?                    boolean
> > > >           +--ro link-up-down-trap-enable?   enumeration {if:if-mib}?
> > > >           +--ro oper-status                 enumeration
> > > >           +--ro last-change? yang:date-and-time
> > > >           +--ro if-index                    int32 {if:if-mib}?
> > > >           +--ro phys-address? yang:phys-address
> > > >           +--ro higher-layer-if* if:interface-ref
> > > >           +--ro lower-layer-if* if:interface-ref
> > > >           +--ro speed?                      yang:gauge64
> > > >           +--ro statistics
> > > >              +--ro discontinuity-time    yang:date-and-time
> > > >              +--ro in-octets?            yang:counter64
> > > >              +--ro in-unicast-pkts?      yang:counter64
> > > >              +--ro in-broadcast-pkts?    yang:counter64
> > > >              +--ro in-multicast-pkts?    yang:counter64
> > > >              +--ro in-discards?          yang:counter32
> > > >              +--ro in-errors?            yang:counter32
> > > >              +--ro in-unknown-protos?    yang:counter32
> > > >              +--ro out-octets?           yang:counter64
> > > >              +--ro out-unicast-pkts?     yang:counter64
> > > >              +--ro out-broadcast-pkts?   yang:counter64
> > > >              +--ro out-multicast-pkts?   yang:counter64
> > > >              +--ro out-discards?         yang:counter32
> > > >              +--ro out-errors?           yang:counter32
> > > >
> > > > Servers that support operational-state would just implement
> > > ietf-interfaces-combined
> > > >
> > > > Servers that don't support operational-state could implement
> > > ietf-interfaces-combined and ietf-interfaces-combined-state, probably
> not
> > > implementing the duplicate config false leaves under the interfaces
> config
> > > tree.  Deviations could also be auto-generated to remove the config
> false
> > > leaves from the config tree so that they are only in the state tree.
> > > >
> > > > Of course, Clients may need to support both schemes depending on what
> > > types of devices they are interacting with.
> > > >
> > > > Finally, I've illustrated this using ietf-interfaces, but I'm not
> > > actually proposing immediately changing that model.  I was more
> thinking
> > > about IETF protocols that in the process of working on their YANG
> models.
> > > >
> > > > Rob
> > > >
> > > >
> > > > Exactly.  I agree that this is a real hack.  Implementations can use
> > > > whatever transformation tricks they want in order to comply with
> > > > different standards, but the standard modules should be very clear.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > /martin
> > > > _______________________________________________
> > > > 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
> > >
> > > --
> > > Ladislav Lhotka, CZ.NIC Labs
> > > PGP Key ID: 0xB8F92B08A9F76C67
> > >
> > >
> > >
> > >
> > >
> > >
>
_______________________________________________
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to