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".


/martin





> >
> > 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