On Wed, Sep 14, 2016 at 1:42 PM, Martin Bjorklund <[email protected]> wrote:

> Andy Bierman <[email protected]> wrote:
> > On Wed, Sep 14, 2016 at 10:08 AM, Martin Bjorklund <[email protected]>
> wrote:
> >
> > > Andy Bierman <[email protected]> wrote:
> > > > On Wed, Sep 14, 2016 at 5:29 AM, Vladimir Vassilev <
> > > [email protected]
> > > > > wrote:
> > > >
> > > > > On 09/13/2016 06:48 PM, Andy Bierman wrote:
> > > > >
> > > > > Hi,
> > > > >
> > > > > I am not in favor of changing when-stmt so it works like must-stmt.
> > > > > I prefer it work as designed.  It is like choice-stmt, where a new
> case
> > > > > will cause objects from the previously selected case to be
> > > automatically
> > > > > deleted.
> > > > >
> > > > > There is no text in RFC 7950 that actually says an error is
> returned
> > > > > if a when-stmt is false because an anyxml or anydata input
> parameter
> > > > > was converted to top-level YANG nodes and reprocessed.
> > >
> > > Hmm, I agree that the text could be more precise.  But note that
> > > section 8.3 says:
> > >
> > >    For configuration data, there are three windows when constraints
> MUST
> > >    be enforced:
> > >
> > > So the entire section 8.3 is all about configuration data, which is
> > > manipulated by various RPCs.
> > >
> > > Section 8.3.2 specifically talks about "applying the data to the
> > > configuration
> > > datastore", and that "unknown-element" is returned for a request that
> > > modifies a node tagged with "when".
> > >
> > >
> >
> > You mean this sentence:
> >
> >    o  Modification requests for nodes tagged with "when", and the "when"
> >       condition evaluates to "false".  In this case, the server MUST
> >       reply with an "unknown-element" <error-tag> in the <rpc-error>.
> >
> > Consider this example:
> >
> >    leaf foo {
> >       type int32;
> >       when "../bar=20";
> >    }
> >
> >
> > So the text only applies to modifications to the /foo leaf, right?
> > Create and delete operations do not cause an error.
>
> The intention was that also create/delete would cause this error.
>
> > Edits to other nodes (e.g., /bar) do not cause an error.
>
> Yes.
>
> > This does not seem to do anything because the objects specified in the
> > when-stmt
> > are not allowed to be part of the object affected by the when-stmt.
> >
> >    o  If the "when" statement is a child of any other data definition
> >       statement, the accessible tree is tentatively altered during the
> >       processing of the XPath expression by replacing all instances of
> >       the data node for which the "when" statement is defined with a
> >       single dummy node with the same name, but with no value and no
> >       children.  If no such instance exists, the dummy node is
> >       tentatively created.  The context node is this dummy node.
> >
> >
> > So I do not see how I can edit /foo and cause /foo to be deleted.
>
> Agreed.
>
> > According to the text, if I alter /bar (not /foo) then /foo can be
> silently
> > deleted and this is not an error.
>
> Yes.
>
>
Customers have asked for this to be an error.
We have a CLI parameter to turn on/off the error.

It is generally considered a client programming error if the edit payload
contains
any nodes that get immediately deleted because of false when-stmts.
In generally indicates that the client's notion of the existing config is
incorrect.



> /martin
>

Andy


>
>
>
> >
> >
> >
> > > /martin
> > >
> > >
> > >
> > Andy
> >
> >
> > >
> > >
> > >
> > > > >
> > > > > The text only covers direct when-stmts like below:
> > > > >
> > > > >    rpc plot-point {
> > > > >       input {
> > > > >         leaf point-type {
> > > > >           type enumeration {
> > > > >               enum 2d;
> > > > >               enum 3d;
> > > > >           }
> > > > >           mandatory true;
> > > > >         }
> > > > >         leaf X { type int32; mandatory true; }
> > > > >         leaf Y { type int32; mandatory true; }
> > > > >         leaf Z {
> > > > >            when "../point-type = '3d';
> > > > >            mandatory true;
> > > > >            type int32;
> > > > >        }
> > > > >      }
> > > > >    }
> > > > >
> > > > >
> > > > > If the client sets point-type to '2d' and provides a Z leaf, then
> an
> > > error
> > > > > is returned.
> > > > > This is the only type of usage the text in question actually
> covers.
> > > > >
> > > > > It is <edit-config> RPC that has started the thread (the 'when'
> > > validation
> > > > > in <plot-point> is much clearer and I agree with all you say
> above).
> > > There
> > > > > was the original example by Yves (changed when "A" to when "../A"):
> > > > >
> > > > >   container root {
> > > > >     leaf A {
> > > > >       type empty:
> > > > >     }
> > > > >     leaf B {
> > > > >       when "../A";
> > > > >       type uint32;
> > > > >     }
> > > > >   }
> > > > > ... and the netconf <edit-config>:
> > > > >
> > > > >      <rpc message-id="101"
> > > > >           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
> > > > >        <edit-config>
> > > > >          <target>
> > > > >            <running/>
> > > > >          </target>
> > > > >          <config>
> > > > >            <root xmlns="http://dummy.com"; <http://dummy.com>>
> > > > >              <A/>
> > > > >              <B>
> > > > >                3
> > > > >              </B>
> > > > >            </dummy>
> > > > >          </config>
> > > > >        </edit-config>
> > > > >      </rpc>
> > > > >
> > > > > There is consensus the 'when' statement is satisfied in this case
> which
> > > > > answers his original question.
> > > > >
> > > > > However if we make change to the original example by assuming the
> > > target
> > > > > is not 'running' but 'candidate' and /root/A is already present
> before
> > > the
> > > > > following <edit-config> is processed:
> > > > >
> > > > >      <rpc message-id="101"
> > > > >           xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
> > > > >        <edit-config>
> > > > >          <target>
> > > > >            <candidate/>
> > > > >          </target>
> > > > >          <config>
> > > > >            <root xmlns="http://dummy.com"; <http://dummy.com>>
> > > > >              <B>
> > > > >                3
> > > > >              </B>
> > > > >            </dummy>
> > > > >          </config>
> > > > >        </edit-config>
> > > > >      </rpc>
> > > > >
> > > > > My interpretation of the relevant text in YANG 1.0 and YANG 1.1 is
> the
> > > > > 'when' statement is satisfied since when the <edit-config> is
> applied
> > > to
> > > > > the 'candidate' configuration the result will be valid 'candidate'
> > > > > configuration state and this is what matters. If there is
> consensus on
> > > that
> > > > > I have nothing to add.
> > > > >
> > > > >
> > > >
> > > >
> > > >
> > > > Here is the YANG for <edit-config>.
> > > > Note that there is no when-stmt at all in the entire definition.
> > > > The claims that RFC 7950 actually says enforce the when-stmts that
> > > > are implied by the objects represented in the <config> anyxml subtree
> > > > are just not careful readers.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >     rpc edit-config {
> > > >       description
> > > >
> > > >
> > > >         "The <edit-config> operation loads all or part of a specified
> > > >          configuration to the specified target configuration.";
> > > >
> > > >       reference "RFC 6241, Section 7.2
> > > > <https://tools.ietf.org/html/rfc6241#section-7.2>";
> > > >
> > > >       input {
> > > >         container target {
> > > >           description
> > > >             "Particular configuration to edit.";
> > > >
> > > >           choice config-target {
> > > >             mandatory true;
> > > >             description
> > > >               "The configuration target.";
> > > >
> > > >             leaf candidate {
> > > >               if-feature candidate;
> > > >               type empty;
> > > >               description
> > > >                 "The candidate configuration is the config target.";
> > > >             }
> > > >             leaf running {
> > > >               if-feature writable-running;
> > > >               type empty;
> > > >               description
> > > >                 "The running configuration is the config source.";
> > > >             }
> > > >           }
> > > >         }
> > > >
> > > >         leaf default-operation {
> > > >           type enumeration {
> > > >             enum merge {
> > > >               description
> > > >                 "The default operation is merge.";
> > > >             }
> > > >             enum replace {
> > > >               description
> > > >                 "The default operation is replace.";
> > > >             }
> > > >             enum none {
> > > >               description
> > > >                 "There is no default operation.";
> > > >             }
> > > >           }
> > > >           default "merge";
> > > >           description
> > > >             "The default operation to use.";
> > > >
> > > >         leaf test-option {
> > > >           if-feature validate;
> > > >           type enumeration {
> > > >             enum test-then-set {
> > > >               description
> > > >                 "The server will test and then set if no errors.";
> > > >             }
> > > >             enum set {
> > > >               description
> > > >                 "The server will set without a test first.";
> > > >             }
> > > >
> > > >             enum test-only {
> > > >               description
> > > >                 "The server will only test and not set, even
> > > >                  if there are no errors.";
> > > >             }
> > > >           }
> > > >           default "test-then-set";
> > > >           description
> > > >             "The test option to use.";
> > > >         }
> > > >
> > > >         leaf error-option {
> > > >           type enumeration {
> > > >             enum stop-on-error {
> > > >               description
> > > >                 "The server will stop on errors.";
> > > >             }
> > > >             enum continue-on-error {
> > > >               description
> > > >                 "The server may continue on errors.";
> > > >             }
> > > >             enum rollback-on-error {
> > > >               description
> > > >                 "The server will roll back on errors.
> > > >                  This value can only be used if the
> 'rollback-on-error'
> > > >                  feature is supported.";
> > > >             }
> > > >           }
> > > >           default "stop-on-error";
> > > >           description
> > > >             "The error option to use.";
> > > >         }
> > > >
> > > >         choice edit-content {
> > > >
> > > >           mandatory true;
> > > >           description
> > > >             "The content for the edit operation.";
> > > >
> > > >           anyxml config {
> > > >             description
> > > >               "Inline Config content.";
> > > >           }
> > > >           leaf url {
> > > >             if-feature url;
> > > >             type inet:uri;
> > > >             description
> > > >               "URL-based config content.";
> > > >           }
> > > >         }
> > > >       }
> > > >     }
> > > >
> > > >
> > > >
> > > > > Vladimir
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Andy
> > > > >
> > > > >
> > > > > On Tue, Sep 13, 2016 at 4:43 AM, Vladimir Vassilev <
> > > > > [email protected]> wrote:
> > > > >
> > > > >> On 09/13/2016 01:26 PM, Juergen Schoenwaelder wrote:
> > > > >>
> > > > >>> On Tue, Sep 13, 2016 at 01:19:02PM +0200, Vladimir Vassilev
> wrote:
> > > > >>>
> > > > >>>> I am wondering in which cases this is useful. Consider a
> candidate
> > > > >>>>> datastore - why would a 'when' expression have to true after
> each
> > > > >>>>> edit? Why do we force clients to send edits in such a way that
> > > 'when'
> > > > >>>>> expressions are true after each edit?
> > > > >>>>>
> > > > >>>> For example command line <TAB> completion in
> /interfaces/interface
> > > can
> > > > >>>> evaluate all 'when' statements in child data nodes and
> > > augmentations and
> > > > >>>> come up with relevant list of container and leaf child
> completions
> > > > >>>> based on
> > > > >>>> the already created /interfaces/interface/type (same applies
> for the
> > > > >>>> options
> > > > >>>> a user is presented with in a GUI after specifying the 'name'
> and
> > > > >>>> 'type' of
> > > > >>>> the interface). It is the same with 'if-feature' evaluations.
> The
> > > 'must'
> > > > >>>> statements however can be more complicated since they are only
> > > checked
> > > > >>>> when
> > > > >>>> the interactive incremental edit process is complete and
> <commit> is
> > > > >>>> attempted.
> > > > >>>>
> > > > >>>> I do not see what <TAB> completion has to do with the
> processing of
> > > > >>> edit-config on the server. Are people implementing <TAB>
> completion
> > > by
> > > > >>> sending edit-configs to a server? But yes, trying to enforce
> > > > >>> constraints while doing <TAB> completion may lead to surprises
> for
> > > > >>> people not understanding the constraints being enforced via
> > > > >>> incremental <TAB> completion.
> > > > >>>
> > > > >> Well it means that the 'candidate' configuration can not be in a
> state
> > > > >> where any of the 'when' statements fail (since it is modified only
> > > with
> > > > >> <edit-config>). This is significant reduction of the entropy and
> thus
> > > can
> > > > >> be utilized for automation. In my example that fact is used for
> <TAB>
> > > > >> completion.
> > > > >>
> > > > >> Vladimir
> > > > >>
> > > > >> _______________________________________________
> > > > >> netmod mailing list
> > > > >> [email protected]
> > > > >> https://www.ietf.org/mailman/listinfo/netmod
> > > > >>
> > > > >
> > > > >
> > > > >
> > >
>
_______________________________________________
netmod mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to