Andy Bierman <a...@yumaworks.com> wrote:
> On Thu, Sep 29, 2016 at 10:44 PM, Martin Bjorklund <m...@tail-f.com> wrote:
> 
> > Andy Bierman <a...@yumaworks.com> wrote:
> > > Hi,
> > >
> > > The deviation section has a lot of fluff text about how bad deviations
> > are,
> > > but very little text on how to process the "deviate" statement correctly.
> > >
> > > The text is not clear if the statements altered in the target module
> > > are semantic patches or syntactic patches.  Are the sub-statements
> > > of the deviate-stmt fully processed in the scope of the deviation module
> > > or in the scope of the target module? In this example, is the type-stmt
> > > resolved in A or dev-A?
> >
> > Deviations are not special compared to other statements; if you refer
> > to something in an external module the external module must be
> > imported and the prefixes are resolved in the module where they are
> > used.  The type statement is resolved in the same way if it is defined
> > in a leaf, a typedef or in a deviate.
> >
> > So in the examples below, all variants are legal.
> >
> 
> OK
> 
> But it is not intuitive that the resulting type-stmt is not validated at
> all within the target
> module

Syntactically, it is evaluated in A-dev, but the result must be
semantically validated together with A.  For example:

  module A {
    ...
    leaf foo {
      type uint32;
    }
  }

  module A-dev {
    ...
    deviation /a:foo {
      deviate add {
        default -1;  // error!
      }
    }
  }


/martin


> , compared to some other deviations:
> 
> 
>    module A {
>       ...
>       list foo {
>          max-elements 3;
>          ...
>       }
>    }
> 
>    module A-dev {
>       ...
>       deviation /a:foo {
>          deviate add {
>              min-elements 4;
>          }
>       }
>    }
> 
> 
> The "min-elements 4" statement is valid in the A-dev module but when patched
> into list /foo it is not valid.
> 
> 
> 
> Andy
> 
> 
> >
> > > Similar issues for deviating a default for an identityref.
> > >
> > >
> > >   module A {
> > >     namespace "...";
> > >     prefix a;
> > >     // no imports!
> > >
> > >     leaf foo {
> > >        type string;
> > >      }
> > >
> > >     leaf bar {
> > >        type string;
> > >      }
> > >
> > >     leaf baz {
> > >        type string;
> > >      }
> > >   }
> > >
> > >   module A-dev {
> > >     ...
> > >     import A { prefix a; }
> > >     import C { prefix c; }
> > >     import ietf-interfaces { prefix if; }
> > >
> > >     // variant 1: inline leafref but module A does not import path module
> > >     deviation /a:foo {
> > >        deviate replace {
> > >           type leafref {
> > >                base /c:modules/c:module/c:name;
> > >            }
> > >         }
> > >      }
> > >
> > >
> > >    // variant 2: imported typedef but module A does not import it
> > >     deviation /a:bar {
> > >        deviate replace {
> > >           type if:interface-ref;
> > >         }
> > >      }
> > >
> > >
> > >     // variant 3: local typedef but module A cannot import it (circular
> > > imports)
> > >     typedef mystring {
> > >         type string { length "1..10"; }
> > >     }
> > >
> > >     deviation /a:baz {
> > >        deviate replace {
> > >           type mystring;
> > >         }
> > >      }
> > >   }
> >
> >
> >
> > /martin
> >

_______________________________________________
netmod mailing list
netmod@ietf.org
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to