The "when" and "if-feature" statements are both used to make an object conditional, but they are very different.


The "when" statement is used to make some instances of a YANG object subtree conditional,
based on values of other data in the server that can change at run-time.


        container static-routes {
          when "derived-from-or-self(../type, 'rt:static')" {
            description
              "This container is only valid for the 'static' routing
               protocol.";
          }
          description
            "Configuration of the 'static' pseudo-protocol.

             Address-family-specific modules augment this node with
             their lists of routes.";
        }


The YANG object "static-routes" is always present in the server object tree (if ietf-routing module loaded).

Data entries in the server will only have the container present if the corresponding "type" leaf is "static.



The "if-feature" statement is used to make all instances of a YANG object subtree conditional, 

based on boot-time parameters that cannot be changed at run-time.


        leaf default-rib {
          if-feature "multiple-ribs";
          type boolean;
          default "true";
          description
            "This flag has the value of 'true' if and only if the RIB
             is the default RIB for the given address family.

             By default, control-plane protocols place their routes
             in the default RIBs.";
        }


The leaf "default-rib" is only present in the server object tree if the ietf-routing module is loaded AND the "multiple-ribs" feature is supported by the server.

  • If the feature is supported, then all instances of list "rib" will have this leaf present, or the default "true" will be used.
  • If the feature is not supported, then no instances of list "rib" will have this leaf present, and no default value will be used.