On Sun, Aug 11, 2024 at 02:10:31PM +0000, Kent Watsen wrote:
> 
> This email begins a two-week WGLC on:
> 
>       System-defined Configuration
>       https://datatracker.ietf.org/doc/html/draft-ietf-netmod-system-config-08

I have reviewed draft-ietf-netmod-system-config-08 as part of the WG
last call. I think the document is _not_ready_, in fact, I find the
document inconsistent. There is text (and a figure) suggesting that
system config is merged after template expansion into intendedn and
then there is text and lots of details how system config is copied
into running. These are two very different things and you either do
copy to running or merge to intended.

Here are my notes as I was going through the document from the
beginning to the end.

* Abstract

  - The abstract is not well written for readers not familiar with the
    details of the work nor is it clear to me what the second sentence
    tries to convey. Here is an attempt to write a replacement
    abstract:

      The Network Management Datastore Architecture (NMDA) defined in
      RFC 8342 defines several configuration datastores holding
      configuration information. The content of these configuration
      datastores is controlled by clients. This document introduces
      the concept of a system configuration datastore holding
      configuration controlled by the system on which a server is
      running.

      This document updates RFC 6241, RFC 8040, RFC 8342, and RFC
      8526.

* Introduction

  - I think the second paragraph in the Introduction is
    handwaving. The system configuration is clearly exposed and the
    structure follows a data model, the new system datastore is no
    different. Also the 3rd paragraph is not good, a server allowing a
    reference from a configuration datastore to operational state is
    broken. I would love to see this text be rewritten to state the
    problem instead of avoiding an elaboration of bad implementation
    practice as a justification for this work. In other words, the
    text should say that YANG does not allow configuration data to
    reference operational state data (and why) and then it should
    motivate why a system configuration datastore helps to improve the
    situation.

  - There is text about a 'resolve-system" parameter in the
    Introduction and it remains unclear where and when this parameter
    is used. It is a parameter of what?

  - The text "If a system-defined node is referenced ..." seems to be
    belong to the terminology section. And the term "system-defined
    node" deserves to be defined.

  - Why is the merging of system into intended happening after any
    expansions of templates or removal of inactive configuration? Is
    there a specific reason for this? Given that we have no
    specification for templates or inactive configuration, is it wise
    to fix the order? Also note that Figure 1 is misleading since it
    kind of indicates a merge _before_ intended. Why do we not have:

      |                              | // configuration transformations,
      |                              | // e.g., removal of nodes marked
      |                              | // as "inactive", expansion of
      +--------------+---------------+ // templates, merge of <system>
                     |
                     |
                     v
               +------------+
               | <intended> |  // subject to validation
               | (ct, ro)   |
               +------------+

* Kinds of System Configuration

  - I did search for immediate and conditional and it seems that the
    two terms defined here are not really used anywhere. If so, do we
    need the definitions? And if we need them, why are these terms not
    defined in section 1.1? My preference is to not defined terms we
    do not use. In section 4.2, it is stated that <system> MAY change
    dynamically and hence all information is conditionally present. I
    suggest to simply remove section 2.

* The System Configuration Datastore (<system>)

* Static Characteristics of <system>

  - I am confused about what is being said there. The text says
    "should not cause the automatic update of <running> and later it
    says "Servers migrate system configuration update in <running>". I
    think this needs more clarity.

    I think you _never_ update running. According to your model,
    <system> feeds into intended. Perhaps you meant <intended>? If so,
    I believe there are situations where updating intended is the
    right thing to do (say the system's default MTU of an interface
    changes and there is no explicit configuration for it) but there
    may also be situations where indeed the upgrade may need to be
    rejected (e.g., if an update would rename all interfaces, which
    may cause for example firewall rules to mean something very
    different). I believe we should have better and contradiction free
    text here. And the text should not talk about updating <running>.

    I am also not sure why this is a static characteristic. Perhaps
    the important portions from section 4 can be merged into section 5
    and we get rid of the distinction of static characteristics and
    dynamic characteristics?

* Dynamic Behaviors

  - The phrase "Clients MAY reference nodes defined in <system>" is
    misleading. A client does not reference nodes, a client controls
    configuration in other datastores and these datastores may contain
    nodes referencing nodes defined in <system>. In other words, it
    should be "Clients may create configuration data nodes that
    reference nodes in the <system> datastore ..." or something like
    that. I also believe the MAY should just be a may.

  - Again, what is the reason for merging after template expansion and
    removal of inactive? Why is this a MUST? What breaks if I would
    say remove inactive after the merge? There may be valid reasons
    and it may be useful to capture them.

  - "Whenever configuration in <system> changes, the server MUST also
    immediately update and validate <intended>."

  - See above on comments on the figure. I would go even further and
    draw it as follows:

 +-----------+         |        +-----------+         |
 | <system>  |         +------->| <running> |<--------+
 | (ct, ro)  |                  | (ct, rw)  |
 +-----------+                  +-----------+
      |                              | 
      |              +---------------+
      |              |
      |              |  // configuration transformations, e.g., removal
      +--------------+  // of nodes marked as "inactive", expansion of
                     |  // templates, merge of <system>
                     v
               +------------+
               | <intended> |  // subject to validation
               | (ct, ro)   |
               +------------+

  - What does it mean to "remove a copied system node from <running>"?
    Copied by whom? Perhaps you mean 'delete and overriding system
    node'?

  - I did not understand what section 5.1.1 tries to tell me. And it
    talks about "configuration copied from <system> into <running>",
    copied by whom? And why would something in <running> be tagged
    origin intended? My attempts to make sense out of 5.1.1 cause
    disagreement with it.

  - I think section 5.2 is not well worded. It talks about 'declaring
    system configuration' but I think we never really used the phrase
    to 'declare configuration'. It seems that all the text in 5.2
    essentially reduces to this statement:

      Clients can create configuration data nodes in <running> that
      match configuration data nodes in <system>. This can be
      necessary, for example, when the client does not support the
      "resolve-system" parameter (Section 5.3) in order to validate
      <intended>.

   - Section 5.3 says that "resolve-system" causes the server to copy
     the entire referenced system configuration, including all
     descendants into the target datastore (e.g., <candidate> and
     <running>). Really? This is not what I got from the text I read
     before and this is clearly not what the figures suggest. I also
     find this "copy into running" problematic; I thought so that that
     "resolve-system" causes <system> content to be merged into
     <intended>?

   - Why is it desirable to allow implementations supporting
     "resolve-system" but not exposing <system>? This means that there
     is no way to predict for a client what an edit-config will
     resolve to. Is this desirable?

   - Section 5.4 tells me that some data in <running> may override
     what is in <system> but some other data may not since system
     config is immutable. "The immutability of system configuration is
     defined in [I-D.ietf-netmod-immutable-flag]." So does this create
     a dependency on the immutability flag? Or is the idea that
     clients do not require to know this since they can go into trial
     and error mode? Is this desirable? And if so, what exactly is the
     error information to expect and react on?

   - Is <system> configuration that is not referenced directly or
     indirectly from <running> applied (or merged into intended) or
     not? In the example, are all applications visible if there is a
     "resolve-system"? Or only if they are referenced by explicit
     config?

   - In the example, can a explicit client express that a specific
     application should not make it into <intended>? Something like
     resolve-system but if that brings in xyz, please fail the
     edit-config since xyz is a no-go. And can I request that a
     specific application should make it into running without having
     to write an ACL or something else that references the
     application? If I do not know what system provides, do I go trial
     and error to explore what the list of system preconfigured
     applications is?

* Default Interactions

  - There are "should not" and MUST rules here but there is no
    explanation why these rules are important. What breaks if a
    <system> data node happens to have the schema's default value?

* The "ietf-system-datastore" Module

  - Why is section 8.2 here? I expected to see the definition of the
    "ietf-system-datastore" module and not a 2+ pages example of
    something relatively unrelated. Perhaps move all lengthy examples
    into the appendix and use only short concise examples where really
    needed in the body of the specification. In this section, I do not
    see the need for an example at all.

* Security Considerations

  - While you follow the default security templates, I wonder whether
    more needs to be said here. If I have a server supporting
    resolve-system but not implementing <system>, I have no way to
    predict how the result produced by an edit-config will look
    like. So I have to fully trust that resolve-system does not lead
    to a modification of running that may have undesirable
    consequences.

I did not go to rewrite my review now that I see that I fundamentally
misunderstood the proposed solution at the beginning. The reason is
that Figure 1 is misleading. The reason is that you seem to have
two models and neither is captured in Figure 1:

 +-----------+         |        +-----------+         |
 | <system>  |         +------->| <running> |<--------+
 | (ct, ro)  |                  | (ct, rw)  |
 +-----------+                  +-----------+
                                     | // configuration transformations,
                                     | // e.g., removal of nodes marked
                                     | // as "inactive", expansion of
                     +---------------+ // templates
                     |
                     |
                     v
               +------------+
               | <intended> |  // subject to validation
               | (ct, ro)   |
               +------------+

This is the situation where the client learns about system config by
reading <system> and then explicitly copying over into <running>
whatever is needed. The other model is really a partial copy of
<system> into <running> via the "resolve-system" magic:

 +-----------+         |        +-----------+         |
 | <system>  |         +------->| <running> |<--------+
 | (ct, ro)  |----------------->| (ct, rw)  |
 +-----------+                  +-----------+
                                     | // configuration transformations,
                                     | // e.g., removal of nodes marked
                                     | // as "inactive", expansion of
                     +---------------+ // templates
                     |
                     |
                     v
               +------------+
               | <intended> |  // subject to validation
               | (ct, ro)   |
               +------------+

But then I do find statements like this:

   Configuration in <running> is merged with <system> to create the
   contents of <intended> after the configuration transformations to
   <running> (e.g., template expansion, removal of inactive
   configuration defined in [RFC8342]) have been performed
   (Section 5.1).

This apparently is conflict with what is really proposed. So my
confusion is very well justified I think. There is a very big
difference between thinking of <intended> as an overlay of <running>
and <system> or thinking of <system> as something that either explicit
or implicitly is copied into <running> as a side-effect of certain
operations.

/js

-- 
Jürgen Schönwälder              Constructor University Bremen gGmbH
Phone: +49 421 200 3587         Campus Ring 1 | 28759 Bremen | Germany

_______________________________________________
netmod mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to