<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc linkmailto="no" ?>
<?rfc editing="no" ?>
<?rfc comments="yes" ?>
<?rfc inline="yes"?>
<?rfc rfcedstyle="yes"?>
<?rfc-ext allow-markup-in-artwork="yes" ?>
<?rfc-ext include-index="no" ?>
<!--<?rfc strict="no"?> -->

<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     docName="draft-ietf-netmod-yang-module-filename-13"
     category="std"
     consensus="true"
     updates="6020, 7950, 9907"
     ipr="trust200902">

  <front>
    <title abbrev="YANG Module File Name Convention">
        YANG module file name convention
    </title>

    <author fullname="Per Andersson" initials="P." surname="Andersson">
      <organization>Ionio Systems</organization>
      <address>
        <email>per.ietf@ionio.se</email>
      </address>
    </author>

    <date/>
    <area>OPS Area</area>
    <workgroup>NETMOD Working Group</workgroup>

    <abstract>
      <t>
        This document defines the YANG module file name convention. The convention
        extends the YANG module file name using revision&nbhy;date, with
        the YANG semantic version extension. The YANG semantic version extension
        allows for an informative version to be associated with a particular
        YANG module revision.
      </t>
      <t>
        This document updates RFCs 6020, 7950, and 9907.
      </t>
    </abstract>
  </front>
  <middle>
    <section anchor="intro" title="Introduction">
      <t>
        This document defines the YANG module file name convention. It extends
        the current convention defined in <xref target="RFC6020"/>,
        <xref target="RFC7950"/>, and
        <xref target="RFC9907"/>, which uses revision-date,
        with the YANG semantic version extension defined in
        <xref target="I-D.ietf-netmod-yang-semver"/>.
      </t>

      <section title="Terminology">
        <t>
          The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
          NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
          "MAY", and "OPTIONAL" in this document are to be interpreted as
          described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
          when, and only when, they appear in all capitals, as shown here.
        </t>
      </section>

      <section anchor="motivation" title="Motivation">
        <t>
          Using YANG semantic version instead of revision
          date conveys additional information to the user. A revision
          date only tells the user that it has been updated, while, for
          instance, a YANG Semver version can tell the user about the module's
          compatibility level at a glance. Having this information available
          in the module file name, makes it possible to
          quickly identify the module revision without searching in the
          file contents and checking the revisions. Having the YANG semantic
          version visible in the file name will make it easier to handle large
          sets of YANG modules.
        </t>
      </section>
    </section>

    <section anchor="module-filenames" title="YANG Module File Names">
      <t>
        This section updates <xref section="5.2" target="RFC7950"/>,
        <xref section="5.2" target="RFC6020"/>, and
        <xref section="3.2" target="RFC9907"/>.
      </t>

      <t>
        If a revision has an associated YANG semantic version (ysv:version)
        then a YANG file SHOULD be created that uses the YANG semantic version
        in the file name. Additionally, YANG files with or without the
        revision-date MAY be created. The name of the files SHOULD be of
        the form:
        <figure align="center" anchor="filename" suppress-title="true">
          <artwork align="left" name="filename-abnf">
<![CDATA[
    module-or-submodule-name ['@' (ysv:version) / (revision-date)]
        ( '.yang' / '.yin' )
]]>
          </artwork>
        </figure>
        E.g., acme&nbhy;router&nbhy;module@2.0.3.yang,
        acme&nbhy;router&nbhy;module@2024&nbhy;05&nbhy;15.yang, or
        acme&nbhy;router&nbhy;module.yang.
      </t>

      <t>
        Due to limitations of tooling, requirements of interoperability with
        legacy systems, and deployed system limitations, it might be difficult
        or impractical to use the file name convention defined in this document.
        In such cases it is acceptable to not use the YANG module file name
        convention.
      </t>

      <t>
        The ysv:version in the file name MUST match the ysv:version in the most
        recent revision of the YANG module.
      </t>

      <t>
        Even though the ysv:version and the file name must match, the
        authorative source for the ysv:version is the contents in the YANG
        module, not the file name.
      </t>

      <t>
        Note that several files might be created as a consequence of using
        ysv:version or revision-date. For instance a YANG module without
        ysv:version can be defined in either "module.yang",
        "module@2020-02-20.yang", or both. A YANG module with ysv:version can be
        represented by "module@1.0.0.yang", "module@2026-06-02.yang", "module.yang".
        The contents of the YANG modules for the same revision MUST be identical
        byte-for-byte.
      </t>

      <t>
        In short, the YANG semantic version file name scheme is RECOMMENDED,
        as its use will convey compatibility status at a glance without the
        need to read the module. If a system or tooling can't handle the YANG
        module file name convention, it is acceptable to not support or use the
        convention defined in this document.
      </t>

      <section anchor="code-components" title="Code Components">
        <t>
          This section updates <xref section="3.2" target="RFC9907"/>.
        </t>

        <t>
            If a revision has a ysv:version, the "&lt;CODE BEGINS&gt;" tag MUST
            be followed by a file name specified in this section. The name
            string form that include the ysv:version SHOULD be used. The
            ysv:version in the file name MUST match the ysv:version used in
            the most recent revision date.
        </t>

        <t>
         The following example is for the "2026-06-02" revision of the
         "ietf-foo" module, with ysv:version "1.0.0":
         <figure>
           <preamble>&lt;CODE BEGINS&gt; file "ietf-foo@1.0.0.yang"</preamble>
           <artwork><![CDATA[
        module ietf-foo {
          namespace "urn:ietf:params:xml:ns:yang:ietf-foo";
          prefix "foo";
          organization "...";
          contact "...";
          description "...";
          revision 2026-06-02 {
            ysv:version 1.0.0;
            description "Latest revision";
            reference "RFC FFFF: Foo Protocol";
          }
          // ... more statements
        }
]]></artwork>
           <postamble>&lt;CODE ENDS&gt;</postamble>
         </figure>
        </t>
      </section>

      <section anchor="yang-semver" title="Coexistence with YANG Semver">
        <t>
          All valid identifiers for YANG semantic version
          are valid in the file name as well. See more details for YANG Semver
          identifiers in
          <xref section="4.3" target="I-D.ietf-netmod-yang-semver"/>.
        </t>
        <t>
          The following example is a valid YANG module file name
        <figure align="center" anchor="filename-label" suppress-title="true">
          <artwork align="left">
<![CDATA[
    example-module@2.3.1_non_compatible+build2237refM443ss.yang
]]>
          </artwork>
        </figure>
        </t>
        <t>
          There might exist two modules
          derived from version 2.0.0 with the same X.Y.Z digits (2.0.1) but
          different version labels:
          <figure align="center" anchor="filenames-same-ver"
                  suppress-title="true">
            <artwork align="left">
<![CDATA[
    2.0.1-draft-superman-super-stuff-03

    2.0.1-draft-batman-cool-addition-07   (a competing draft)
]]>
            </artwork>
          </figure>
        </t>
      </section>
    </section>

    <section title="Operational Considerations">
      <t>
        The delimiter symbol for YANG Semver is "@", the at sign (ASCII
        code decimal 64). The same symbol is also used for revision-date. The
        patterns for YANG Semver and revision-date will never match the
        same string, and it is easy to visually identify each of the
        conventions.
      </t>

      <t>
        The YANG module file name convention does not impact modules already in
        use.
      </t>

      <t>
        Tooling might need updates to handle the YANG module file name
        convention defined in this document. In most cases this should be a
        small effort. When migrating to the YANG module file name convention,
        different methods can be used to support existing files and new files.
        An example is the use of symlinks with the file name defined in this
        document to existing files can be used when migrating existing
        YANG modules to the YANG module file name convention.
      </t>
    </section>

    <section title="IANA Considerations">
      <t>
          For complete guidance on how to handle YANG modules in RFCs and IANA
          registries, with regards to
          <xref target="I-D.ietf-netmod-yang-module-versioning"/>,
          <xref target="I-D.ietf-netmod-yang-semver"/>, and YANG module file
          names, see <xref target="I-D.ietf-netmod-iana-yang-guidance"/>.
      </t>

      <t>
        The "YANG Module Names" registry under "YANG Parameters" registry group need to support YANG modules
        with both the existing file name convention and the file name
        convention defined in this document.
      </t>

      <t>
        The IANA action is to update the registry to support the YANG module
        file name convention. If a YANG module (or submodule) has an
        associated YANG semantic version (ysv:version) a file name including it
        is listed. Additionally, a file name with revision-date is listed for
        the YANG module (or submodule). Files with the same revision are
        identical byte-for-byte.
      </t>
    </section>

    <section anchor="security" title="Security Considerations">
      <t>There are no security considerations for this document.</t>
    </section>
  </middle>
  <back>
    <references title="Normative References">
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-netmod-yang-module-versioning.xml"/>
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-netmod-yang-semver.xml"/>
      <?rfc include="reference.RFC.2119.xml"?> <!-- MUSTs, etc. -->
      <?rfc include="reference.RFC.6020.xml"?> <!-- YANG (orig) -->
      <?rfc include="reference.RFC.7950.xml"?> <!-- YANG (curr) -->
      <?rfc include="reference.RFC.8174.xml"?> <!-- rfc2119 update -->
      <?rfc include="reference.RFC.9907.xml"?> <!-- YANG guidelines -->
    </references>
    <references title="Informative References">
      <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-netmod-iana-yang-guidance.xml"/>
    </references>

    <section title="Known Incompatibilities">
      <t>
        RFC Ed: This note is to be removed before publishing as an RFC.
      </t>
      <t>
        There are currently no known publicly available tools that support
        the YANG semantic version file name schema. There are known
        proprietary tooling that already uses the file name schema presented
        in this document.
      </t>
      <t>
        At the IETF 119 Hackathon, there was a project that investigated
        the feasibility to modify popular YANG tooling to support the proposed
        schema. There was a successful attempt to modify pyang to support the
        file name schema and also "recommended-min" previously included in
        <xref target="I-D.ietf-netmod-yang-module-versioning"/>. Furthermore,
        there were efforts in researching yanger and libyang to support the
        schema, but the hackathon ended before these projects could be
        concluded.
      </t>
    </section>

    <section title="Acknowledgements" numbered="no">
      <t>
        The author would like to thank Joe Clarke, Reshad Rahman, Mahesh
        Jethanandani, David Dong, Aihua Guo, Barry Leiba, Joel M. Halpern,
        Meir Goldman, Carsten Bormann, and Kent Watsen for their excellent
        technical reviews, support, and guidance.
      </t>
    </section>
  </back>
</rfc>
