<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-netmod-schedule-yang-03" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="Common Schedule YANG">A Common YANG Data Model for Scheduling</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-schedule-yang-03"/>
    <author fullname="Qiufang Ma" role="editor">
      <organization>Huawei</organization>
      <address>
        <postal>
          <street>101 Software Avenue, Yuhua District</street>
          <city>Jiangsu</city>
          <code>210012</code>
          <country>China</country>
        </postal>
        <email>maqiufang1@huawei.com</email>
      </address>
    </author>
    <author fullname="Qin Wu">
      <organization>Huawei</organization>
      <address>
        <postal>
          <street>101 Software Avenue, Yuhua District</street>
          <city>Jiangsu</city>
          <code>210012</code>
          <country>China</country>
        </postal>
        <email>bill.wu@huawei.com</email>
      </address>
    </author>
    <author fullname="Mohamed Boucadair" role="editor">
      <organization>Orange</organization>
      <address>
        <postal>
          <city>Rennes</city>
          <code>35000</code>
          <country>France</country>
        </postal>
        <email>mohamed.boucadair@orange.com</email>
      </address>
    </author>
    <author fullname="Daniel King">
      <organization>Lancaster University</organization>
      <address>
        <postal>
          <country>United Kingdom</country>
        </postal>
        <email>d.king@lancaster.ac.uk</email>
      </address>
    </author>
    <date year="2024" month="October" day="10"/>
    <area>Operations and Management</area>
    <workgroup>netmod</workgroup>
    <keyword>calendaring</keyword>
    <keyword>scheduling</keyword>
    <keyword>YANG</keyword>
    <keyword>groupings</keyword>
    <abstract>
      <?line 57?>

<t>This document defines a common schedule YANG module which is
   designed to be applicable for scheduling purposes such as event, policy,
   services, or resources based on date and time. For the sake of better modularity,
   the module includes a set of recurrence related groupings with varying granularity levels
   (i.e., from basic to advanced).</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>This note is to be removed before publishing as an RFC.</t>
      <t>Discussion of this document takes place on the
    Network Modeling (NETMOD) Working Group mailing list (netmod@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/netmod/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/netmod-wg/schedule-yang"/>.</t>
    </note>
  </front>
  <middle>
    <?line 65?>

<section anchor="intro">
      <name>Introduction</name>
      <t>This document defines a common schedule YANG module ("ietf-schedule") that can
be used in several scheduling contexts, e.g., (but not limited to)
<xref target="I-D.ietf-opsawg-ucl-acl"/>, <xref target="I-D.contreras-opsawg-scheduling-oam-tests"/>,
and <xref target="I-D.ietf-tvr-schedule-yang"/>. The module includes a set of reusable groupings which
are designed to be applicable for scheduling purposes such as event, policy,
services or resources based on date and time.</t>
      <t>This document does not make any assumption about the nature of actions that are
triggered by the schedules. Detection and resolution of any schedule conflicts
are beyond the scope of this document.</t>
      <t><xref target="sec-mib"/> discusses relationship with the managed objects defined in <xref target="RFC3231"/>.</t>
      <t><xref target="usage"/> describes a set of examples to illustrate the use of the common schedule groupings (<xref target="sec-grp"/>).
And <xref target="sec-ext"/> provides sample modules to exemplify how future modules can use the extensibility
provisions in "ietf-schedule" (<xref target="sec-schedule"/>). Also, <xref target="ex-framework"/> provides
an example of using "ietf-schedule" module for scheduled use of resources framework (e.g., <xref target="RFC8413"/>).</t>
      <section anchor="editorial-note-to-be-removed-by-rfc-editor">
        <name>Editorial Note (To be removed by RFC Editor)</name>
        <t>Note to the RFC Editor: This section is to be removed prior to publication.</t>
        <t>This document contains placeholder values that need to be replaced with finalized
   values at the time of publication.  This note summarizes all of the
   substitutions that are needed.  No other RFC Editor instructions are specified
   elsewhere in this document.</t>
        <t>Please apply the following replacements:</t>
        <ul spacing="normal">
          <li>
            <t>XXXX --&gt; the assigned RFC number for this draft</t>
          </li>
          <li>
            <t>2024-04-16 --&gt; the actual date of the publication of this document</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>The meanings of the symbols in tree diagrams are defined in
   <xref target="RFC8340"/>.</t>
      <t>This document uses the YANG terminology defined in <xref section="3" sectionFormat="of" target="RFC7950"/>.</t>
      <t>The document makes use of the following terms:</t>
      <dl>
        <dt>Frequency:</dt>
        <dd>
          <t>Characterizes the type of a recurrence rule. Values are taken from "FREQ" rule in <xref section="3.3.10" sectionFormat="of" target="RFC5545"/>.</t>
        </dd>
        <dt/>
        <dd>
          <t>For example, repeating events based on an interval of a second or more are
classified as recurrence with a frequency value of "secondly".</t>
        </dd>
        <dt>icalendar:</dt>
        <dd>
          <t>Refers to Internet Calendaring per <xref target="RFC5545"/>.</t>
        </dd>
        <dt>Interval:</dt>
        <dd>
          <t>Refers to an integer that specifies at which intervals a recurrence rule repeats. Values are taken from "INTERVAL" rule in <xref section="3.3.10" sectionFormat="of" target="RFC5545"/>.</t>
        </dd>
        <dt/>
        <dd>
          <t>For example, "1", means every second for a secondly rule, every minute for a minutely rule, every hour for an hourly rule, etc.</t>
        </dd>
        <dt>System:</dt>
        <dd>
          <t>Refers to an entity that host a schedule that is managed using the YANG module defined in this document.</t>
        </dd>
      </dl>
    </section>
    <section anchor="sec-overview">
      <name>Module Overview</name>
      <section anchor="sec-features">
        <name>Features</name>
        <t>The "ietf-schedule" data model defines the recurrence related groupings using
   a modular approach. To that aim, a variety of representations of recurrence
   groupings ranging from basic to advanced (iclander like) are defined.
   To allow for different options, two features are defined in the data model:</t>
        <ul spacing="normal">
          <li>
            <t>"basic-recurrence"</t>
          </li>
          <li>
            <t>"icalendar-recurrence"</t>
          </li>
        </ul>
        <t>Refer to <xref target="sec-aug"/> for the use of these features.</t>
      </section>
      <section anchor="sec-types">
        <name>Types and Identities</name>
        <t>The "ietf-schedule" module (<xref target="sec-schedule"/>) defines the following identities:</t>
        <ul spacing="normal">
          <li>
            <t>"frequency-type": Characterizes the repeating interval rule of a schedule (per second, per minute, etc.).</t>
          </li>
          <li>
            <t>"schedule-type": Indicates the type of a schedule. The following types are defined so far:
            </t>
            <ul spacing="normal">
              <li>
                <t>one-shot: The schedule will trigger an action without the duration/end time being
  specified and then the schedule will disable itself (<xref section="3.3" sectionFormat="of" target="RFC3231"/>).</t>
              </li>
              <li>
                <t>period: The schedule is a period-based schedule consisting either a start and end or a start and positive duration of time.</t>
              </li>
              <li>
                <t>recurrence: This type is used for a recurrence-based schedule. A recurrence may be periodic (i.e., repeat over the same period, e.g., every five minutes) or not (i.e., repeat in a non-regular manner, e.g., every day at 8 and 9 AM).</t>
              </li>
            </ul>
          </li>
          <li>
            <t>"schedule-state": Indicates the status of a schedule (enabled, disabled, conflicted, finished, etc.). This identity can also be used
to manage the state of individual instances of a recurrence-based schedule.</t>
          </li>
          <li>
            <t>"discard-action": Specifies the action to perform when a schedule is discarded (e.g., generate a warning or an error message).</t>
          </li>
        </ul>
      </section>
      <section anchor="sec-grp">
        <name>Groupings</name>
        <t>The "ietf-schedule" module (<xref target="sec-schedule"/>) defines the following groupings:</t>
        <ul spacing="normal">
          <li>
            <t>"generic-schedule-params" (<xref target="sec-gen"/>)</t>
          </li>
          <li>
            <t>"period-of-time" (<xref target="sec-period"/>)</t>
          </li>
          <li>
            <t>"recurrence-basic" (<xref target="sec-rec"/>)</t>
          </li>
          <li>
            <t>"recurrence-utc" (<xref target="sec-rec-utc"/>)</t>
          </li>
          <li>
            <t>"recurrence-with-time-zone" (<xref target="sec-rec-tz"/>)</t>
          </li>
          <li>
            <t>"recurrence-utc-with-date-times" (<xref target="sec-rec-utc-dt"/>)</t>
          </li>
          <li>
            <t>"recurrence-time-zone-with-date-times" (<xref target="sec-rec-tz-dt"/>)</t>
          </li>
          <li>
            <t>"icalendar-recurrence" (<xref target="sec-ical-rec"/>)</t>
          </li>
          <li>
            <t>"schedule-status" and "schedule-status-with-name" (<xref target="sec-schedule-status"/>)</t>
          </li>
        </ul>
        <t><xref target="schedule-tree"/> provides an overview of the tree structure of
   the "ietf-schedule" module in terms of its groupings.</t>
        <figure anchor="schedule-tree">
          <name>Overall Schedule Tree Structure</name>
          <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
        </figure>
        <t>Each of these groupings is presented in the following subsections. Examples
   are provided in <xref target="usage"/>.</t>
        <section anchor="sec-gen">
          <name>The "generic-schedule-params" Grouping</name>
          <t>A system accepts and handles the schedule requests, which may help further
   automate the scheduling process of events, policy, services, or resources
   based on date and time. The "generic-schedule-params" grouping (<xref target="gsp-tree"/>)
   specifies a set of configuration parameters that are used by a system for
   validating requested schedules.</t>
          <figure anchor="gsp-tree">
            <name>Generic Schedule Configuration Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    +-- description?            string
    +-- time-zone-identifier?   sys:timezone-name
    +-- validity?               yang:date-and-time
    +-- max-allowed-start?      yang:date-and-time
    +-- min-allowed-start?      yang:date-and-time
    +-- max-allowed-end?        yang:date-and-time
    +-- discard-action?         identityref
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
          <t>The "description" includes a description of the schedule. No constraint is imposed
   on the structure nor the use of this parameter.</t>
          <t>The "time-zone-identifier" parameter, if provided, specifies the
   time zone reference of the date and time values with local time format.</t>
          <t>The "validity" parameter specifies the date and time after which a schedule
   will be considered as invalid. It determines the latest time that a schedule
   can be executed by a system and takes precedence over similar attributes
   that are provided at the schedule instance itself.</t>
          <t>The "max/min-allowed-start" parameters specify the maximum/minimum scheduled
   start date and time, a requested schedule will be rejected if the first
   occurrence of the schedule is later/earlier than the configured values.</t>
          <t>The "max-allowed-end" parameter specifies the maximum allowed end time of
   the last occurrence. A requested schedule will be rejected if the end time
   of last occurrence is later than the configured "max-allowed-end" value.</t>
          <t>The "discard-action" parameter specifies the action if a requested schedule
   is considered inactive or out-of-date.</t>
          <t>These parameters apply to all schedules on a system and are meant
   to provide guards against stale configuration, too short schedule requests
   that would prevent validation by admins of some critical systems, etc.</t>
        </section>
        <section anchor="sec-period">
          <name>The "period-of-time" Grouping</name>
          <t>The "period-of-time" grouping (<xref target="pt-tree"/>) represents a time period using
   either a start ("period-start") and end date and time ("period-end"), or a
   start ("period-start") and a positive time duration ("duration"). For the first
   format, the start of the period <bcp14>MUST</bcp14> be before the end of the period.</t>
          <t>The "period-description" includes a description of the period. No constraint is imposed
   on the structure nor the use of this parameter.</t>
          <figure anchor="pt-tree">
            <name>Period of Time Grouping Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    +-- period-description?     string
    +-- period-start            yang:date-and-time
    +-- time-zone-identifier?   sys:timezone-name
    +-- (period-type)?
       +--:(explicit)
       |  +-- period-end?       yang:date-and-time
       +--:(duration)
          +-- duration?         duration
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
        </section>
        <section anchor="sec-rec">
          <name>The "recurrence-basic" Grouping</name>
          <t>The "recurrence-basic" grouping (<xref target="rec-grp-tree"/>) specifies a simple recurrence rule.</t>
          <figure anchor="rec-grp-tree">
            <name>recurrence Grouping Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    +-- recurrence-description?   string
    +-- frequency                 identityref
    +-- interval?                 uint32
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
          <t>The frequency ("frequency") which is mandatory, identifies the type of recurrence rule. For example,
  a "daily" frequency value specifies repeating events based on an interval of a day or more.</t>
          <t>Consistent with <xref section="3.3.10" sectionFormat="of" target="RFC5545"/>, the interval ("interval") represents at which intervals the recurrence rule repeats. For example,
  within a daily recurrence rule, an interval value of "8" means every eight days.
  The default value is "1", meaning every second for a secondly recurrence rule,
  every minute for a minutely rule, every hour for an hourly rule, every day for a
  daily rule, and so on. Note that per <xref section="4.13" sectionFormat="of" target="I-D.ietf-netmod-rfc8407bis"/>, no "default" substatement is used here because there are cases (e.g., profiling) where the use of the default is problematic.</t>
          <t>The "recurrence-description" includes a description of the period. No constraint is imposed
  on the structure nor the use of this parameter.</t>
        </section>
        <section anchor="sec-rec-utc">
          <name>The "recurrence-utc" Grouping</name>
          <t>The "recurrence-utc" grouping (<xref target="rec-utc-grp-tree"/>) uses the "recurrence-basic"
   grouping and specifies a simple recurrence rule in UTC format.</t>
          <figure anchor="rec-utc-grp-tree">
            <name>recurrence-utc Grouping Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    +-- recurrence-first
    |  +-- start-time-utc?   yang:date-and-time
    |  +-- duration?         uint32
    +-- (recurrence-end)?
    |  +--:(until)
    |  |  +-- utc-until?          yang:date-and-time
    |  +--:(count)
    |     +-- count?              uint32
    +-- recurrence-description?   string
    +-- frequency                 identityref
    +-- interval?                 uint32
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
          <t>The "start-time-utc" indicates the start time in UTC format.</t>
          <t>The "duration" parameter specifies, in units of seconds, the time period of the first occurrence. Unless specified otherwise, the "duration" also applies to subsequent recurrence instances.</t>
          <t>Note that the "interval" and "duration" cover two distinct properties of a schedule event.
The interval specifies when a schedule will occur, combined with the frequency parameter; while the duration indicates how long
an occurence will last.</t>
          <t>The repetition can be scoped by a specified end time or by a count of occurrences,
  indicated by the "recurrence-end" choice. The "start-time-utc" value always counts
  as the first occurrence.</t>
          <t>The "recurrence-utc" grouping is designed to be reused in scheduling contexts
   where machine readability is more desirable.</t>
        </section>
        <section anchor="sec-rec-tz">
          <name>The "recurrence-with-time-zone" Grouping</name>
          <t>The "recurrence-with-time-zone" grouping (<xref target="rec-tz-grp-tree"/>) uses the
   "recurrence-basic" grouping and specifies a simple recurrence rule with a time zone.</t>
          <figure anchor="rec-tz-grp-tree">
            <name>recurrence-with-time-zone Grouping Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    +-- recurrence-first
    |  +-- start-time?             yang:date-and-time
    |  +-- duration?               duration
    |  +-- time-zone-identifier?   sys:timezone-name
    +-- (recurrence-end)?
    |  +--:(until)
    |  |  +-- until?              yang:date-and-time
    |  +--:(count)
    |     +-- count?              uint32
    +-- recurrence-description?   string
    +-- frequency                 identityref
    +-- interval?                 uint32
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
          <t>The "recurrence-first" container includes "start-time" and "duration" parameters
   to specify the start time and period of the first occurrence. Unless specified otherwise, the
   "duration" also applies to subsequent recurrence instances. It also includes a
   "time-zone-identifier" parameter which <bcp14>MUST</bcp14> be specified if the date
   and time value is neither reported in the format of UTC nor time zone offset
   to UTC.</t>
          <t>The repetition can be scoped by a specified end time or by a count of occurrences,
  indicated by the "recurrence-end" choice. The "start-time" value always counts
  as the first occurrence.</t>
          <t>Unlike the definition of "recurrence-utc" grouping (<xref target="sec-rec-utc"/>),
   "recurrence-with-time-zone" is intended to promote human readability over
   machine readability.</t>
        </section>
        <section anchor="sec-rec-utc-dt">
          <name>The "recurrence-utc-with-date-times" Grouping</name>
          <t>The "recurrence-utc-with-date-times" grouping (<xref target="rec-utc-dt-grp-tree"/>) uses
   the "recurrence-utc" grouping (<xref target="sec-rec-utc"/>) and adds a "period-timeticks"
   list to define an aggregate set of repeating occurrences.</t>
          <figure anchor="rec-utc-dt-grp-tree">
            <name>recurrence-utc-with-date-times Grouping Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    +-- recurrence-first
    |  +-- start-time-utc?   yang:date-and-time
    |  +-- duration?         uint32
    +-- (recurrence-end)?
    |  +--:(until)
    |  |  +-- utc-until?          yang:date-and-time
    |  +--:(count)
    |     +-- count?              uint32
    +-- recurrence-description?   string
    +-- frequency                 identityref
    +-- interval?                 uint32
    +-- period-timeticks* [period-start]
       +-- period-start    yang:timeticks
       +-- period-end?     yang:timeticks
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
          <t>The recurrence instances are specified by the union of occurrences defined
  by both the recurrence rule and "period-timeticks" list. Duplicate instances
  are ignored. The value of the "period-start" instance must not exceed the
  value indicated by the value of "frequency" instance, e.g., the timeticks
  value must not exceed 100 in a secondly recurrence rule, and it must not
  exceed 6000 in a minutely recurrence rule, and so on.</t>
        </section>
        <section anchor="sec-rec-tz-dt">
          <name>The "recurrence-time-zone-with-date-times" Grouping</name>
          <t>The "recurrence-time-zone-with-date-times" grouping (<xref target="rec-tz-dt-grp-tree"/>) uses
  the "recurrence-with-time-zone" grouping (<xref target="sec-rec-tz"/>) and
  adds a "period" list to define an aggregate set of repeating occurrences.</t>
          <figure anchor="rec-tz-dt-grp-tree">
            <name>recurrence-time-zone-with-date-times Grouping Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    +-- recurrence-first
    |  +-- start-time?             yang:date-and-time
    |  +-- duration?               duration
    |  +-- time-zone-identifier?   sys:timezone-name
    +-- (recurrence-bound)?
    |  +--:(until)
    |  |  +-- until?              yang:date-and-time
    |  +--:(count)
    |     +-- count?              uint32
    +-- recurrence-description?   string
    +-- frequency                 identityref
    +-- interval?                 uint32
    +-- period* [period-start]
       +-- period-description?     string
       +-- period-start            yang:date-and-time
       +-- time-zone-identifier?   sys:timezone-name
       +-- (period-type)?
          +--:(explicit)
          |  +-- period-end?       yang:date-and-time
          +--:(duration)
             +-- duration?         duration
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
          <t>The recurrence instances are specified by the union of occurrences defined
  by both the recurrence rule and "period" list. Duplicate instances
  are ignored.</t>
        </section>
        <section anchor="sec-ical-rec">
          <name>The "icalendar-recurrence" Grouping</name>
          <t>The "icalendar-recurrence" grouping (<xref target="ical-grp-tree"/>) uses the
  "recurrence-time-zone-with-date-times" grouping (<xref target="sec-rec-tz-dt"/>) and define
  more data nodes to enrich the definition of recurrence. The structure of the
  "icalendar-recurrence" grouping refers to the definition of recurrence
  component defined in Sections <xref target="RFC5545" section="3.3.10" sectionFormat="bare"/> and <xref target="RFC5545" section="3.8.5" sectionFormat="bare"/> of <xref target="RFC5545"/>.</t>
          <figure anchor="ical-grp-tree">
            <name>icalendar-recurrence Grouping Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    +-- recurrence-first
    |  +-- start-time?             yang:date-and-time
    |  +-- duration?               duration
    |  +-- time-zone-identifier?   sys:timezone-name
    +-- (recurrence-end)?
    |  +--:(until)
    |  |  +-- until?              yang:date-and-time
    |  +--:(count)
    |     +-- count?              uint32
    +-- recurrence-description?   string
    +-- frequency                 identityref
    +-- interval?                 uint32
    +-- period* [period-start]
    |  +-- period-description?     string
    |  +-- period-start            yang:date-and-time
    |  +-- time-zone-identifier?   sys:timezone-name
    |  +-- (period-type)?
    |     +--:(explicit)
    |     |  +-- period-end?       yang:date-and-time
    |     +--:(duration)
    |        +-- duration?         duration
    +-- bysecond*                 uint32
    +-- byminute*                 uint32
    +-- byhour*                   uint32
    +-- byday* [weekday]
    |  +-- direction*   int32
    |  +-- weekday      schedule:weekday
    +-- bymonthday*               int32
    +-- byyearday*                int32
    +-- byyearweek*               int32
    +-- byyearmonth*              uint32
    +-- bysetpos*                 int32
    +-- workweek-start?           schedule:weekday
    +-- exception-dates*          yang:date-and-time
  grouping schedule-status:
    ...
  grouping schedule-status-with-name:
    ...
]]></artwork>
          </figure>
          <t>An array of the "bysecond" (or "byminute", "byhour") specifies a list of
   seconds within a minute (or minutes within an hour, hours of the day). For
   example, within a "minutely" recurrence rule, the values of "byminute" node
   "10" and "20" means the occurrences generates at the 10th and 20th minute
   within an hour, reducing the number of recurrence instances from all minutes.</t>
          <t>The parameter "byday" specifies a list of days of the week, with an optional
   direction which indicates the nth occurrence of a specific day within
   the "monthly" or "yearly" frequency. For example, within a "monthly" rule,
   the "weekday" with a value of "monday" and the "direction" with a value of "-1"
   represents the last Monday of the month.</t>
          <t>An array of the "bymonthday" (or byyearday", "byyearweek", or "byyearmonth") specifies a list of
   days of the month (or days of the year, weeks of the year, or months of the year).
   For example, within a "yearly" recurrence rule, the values of "byyearmonth"
   instance "1" and "2" means the occurrences generates in January and February,
   increasing the "yearly" recurrence from every year to every January and February
   of the year.</t>
          <t>The "bysetpos" conveys a list of values that corresponds to the nth occurrence
   within the set of recurrence instances to be specified. For example, in a "monthly"
   recurrence rule, the "byday" data node specifies every Monday of the week, the
   "bysetpos" with value of "-1" represents the last Monday of the month.
   Not setting the "bysetpos" data node represents every Monday of the month.</t>
          <t>The "workweek-start" data node specifies the day on which the week starts. This is
   significant when a "weekly" recurrence rule has an interval greater than 1, and
   a "byday" data node is specified. This is also significant when in a "yearly" rule
   and a "byyearweek" is specified. The default value is "monday".</t>
          <t>The "exception-dates" data node specifies a list of exceptions for recurrence. The
   final recurrence set is generated by gathering all of the date and time values
   generated by any of the specified recurrence rule and date-times, and then
   excluding any start date and time values specified by "exception-dates" parameter.</t>
        </section>
        <section anchor="sec-schedule-status">
          <name>The "schedule-status" and "schedule-status-with-name" Groupings</name>
          <t>The "schedule-status" and "schedule-status-with-name" groupings (<xref target="sche-status-tree"/>) define common parameters
   for scheduling management/status exposure. The "schedule-status-with-name" grouping has the same
   structure as "schedule-status" but with an additional parameter to identify a schedule "schedule-id". Both
   structures are defined in the module to allow for better modularity and flexibility.</t>
          <figure anchor="sche-status-tree">
            <name>Schedule Status with and without Name Groupings Tree Structure</name>
            <artwork><![CDATA[
module: ietf-schedule

  grouping generic-schedule-params:
    ...
  grouping period-of-time:
    ...
  grouping recurrence-basic:
    ...
  grouping recurrence-utc:
    ...
  grouping recurrence-with-time-zone:
    ...
  grouping recurrence-utc-with-date-times:
    ...
  grouping recurrence-time-zone-with-date-times:
    ...
  grouping icalendar-recurrence:
    ...
  grouping schedule-status:
    +-- state?                    identityref
    +-- version?                  uint16
    +-- schedule-type?            identityref
    +--ro local-time?               yang:date-and-time
    +--ro last-update?              yang:date-and-time
    +--ro counter?                  yang:counter32
    +--ro last-occurrence?          yang:date-and-time
    +--ro upcoming-occurrence?      yang:date-and-time
    +--ro last-failed-occurrence?   yang:date-and-time
    +--ro failure-counter?          yang:counter32
  grouping schedule-status-with-name:
    +-- schedule-id?              string
    +-- state?                    identityref
    +-- version?                  uint16
    +-- schedule-type?            identityref
    +--ro local-time?               yang:date-and-time
    +--ro last-update?              yang:date-and-time
    +--ro counter?                  yang:counter32
    +--ro last-occurrence?          yang:date-and-time
    +--ro upcoming-occurrence?      yang:date-and-time
    +--ro last-failed-occurrence?   yang:date-and-time
    +--ro failure-counter?          yang:counter32
]]></artwork>
          </figure>
          <t>The "schedule-id" parameter is useful to uniquely identify a schedule in
   a network device or controller if multiple scheduling contexts exists.</t>
          <t>The "state" parameter is defined to configure/expose the scheduling state,
   depending on the use of the grouping. For a recurrence-based schedule, it
   represents the state of the overall recurrence. The "identityref" type is used for this
   parameter to allow extensibility in future modules.</t>
          <t>The "version" parameter is used to track the current schedule version
   information. The version can be bumped by the entity who create the schedule.
   The "last-update" parameter identifies when the schedule was last modified.
   In some contexts, this parameter can be used to track the configuration of a
   given schedule. In such cases, the "version" may not be used.</t>
          <t>The "schedule-type" parameter identifies the type of the current schedule.
   The "counter", "last-occurrence", and "upcoming-occurrence" data nodes are
   only avaliable when the "schedule-type" is "recurrence".</t>
          <t>"local-time" reports the actual local time as seen by the entity that
   host a schedule. This paramter can be used by a controller to infer the offset to UTC.</t>
          <t>"last-failed-occurrence" and "failure-counter" report the last failure that occured and
   the count of failures for this schedule.</t>
          <t>The current groupings capture common parameters that are applicable
   to typical scheduling contexts known so far. Future modules can define other
   useful parameters as needed. For example, in a  scheduling context with multiple
   system sources to feed the schedules, the "source" and "precedence" parameters
   may be needed to reflect how schedules from different sources should be prioritised.</t>
        </section>
      </section>
      <section anchor="sec-aug">
        <name>Features Use and Augmentations</name>
        <t><xref target="features"/> provides an example about how the features defined in <xref target="sec-features"/> can be used. Implementations
   may support a basic recurrence rule or an advanced one as needed, by declaring
   different features. Whether only one or both features are supported is implementation
   specific and depend on specific scheduling context.</t>
        <t>The common schedule groupings (<xref target="sec-grp"/>) can also be augmented to support specific needs. As an example,
   <xref target="augments"/> demonstrates how additional parameters can be added to comply with specifc schedule needs.</t>
      </section>
    </section>
    <section anchor="some-usage-restrictions">
      <name>Some Usage Restrictions</name>
      <t>There are some restrictions that need to be followed when using groupings defined
   in the "ietf-schedule" YANG module (<xref target="sec-grp"/>):</t>
      <ul spacing="normal">
        <li>
          <t>The instant in time represented by "period-start" <bcp14>MUST</bcp14> be before the
"period-end" for "period-of-time" grouping (<xref target="sec-period"/>).</t>
        </li>
        <li>
          <t>The combination of the day, month, and year represented for date and time
values <bcp14>MUST</bcp14> be valid. See <xref section="5.7" sectionFormat="of" target="RFC3339"/> for the maxinum day
number based on the month and year.</t>
        </li>
        <li>
          <t>The second <bcp14>MUST</bcp14> have the value "60" at the end of months in which a leap
second occurs for date and time values.</t>
        </li>
        <li>
          <t>Schedules received with a starting time in the past with respect to
current time <bcp14>SHOULD</bcp14> be ignored.</t>
        </li>
      </ul>
    </section>
    <section anchor="sec-mib">
      <name>Relationship to the DISMAN-SCHEDULE-MIB</name>
      <t><xref target="RFC3231"/> specifies a Management Information Base (MIB) used to
schedule management operations periodically or at specified dates and times.</t>
      <t>Despite no data nodes are defined in this document, <xref target="mapping"/> lists how main objects in the DISMAN-SCHEDULE-MIB
can be mapped to YANG parameters.</t>
      <table anchor="mapping">
        <name>YANG/MIB Mapping</name>
        <thead>
          <tr>
            <th align="left">MIB Object</th>
            <th align="left">YANG</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">schedLocalTime</td>
            <td align="left">local-time</td>
          </tr>
          <tr>
            <td align="left">schedType</td>
            <td align="left">schedule-type</td>
          </tr>
          <tr>
            <td align="left">schedName</td>
            <td align="left">schedule-id</td>
          </tr>
          <tr>
            <td align="left">schedOwner</td>
            <td align="left">Not Supported</td>
          </tr>
          <tr>
            <td align="left">schedDescr</td>
            <td align="left">description</td>
          </tr>
          <tr>
            <td align="left">schedInterval</td>
            <td align="left">interval</td>
          </tr>
          <tr>
            <td align="left">schedWeekDay</td>
            <td align="left">weekday</td>
          </tr>
          <tr>
            <td align="left">schedMonth</td>
            <td align="left">byyearmonth</td>
          </tr>
          <tr>
            <td align="left">schedDay</td>
            <td align="left">bymonthday</td>
          </tr>
          <tr>
            <td align="left">schedHour</td>
            <td align="left">byhour</td>
          </tr>
          <tr>
            <td align="left">schedMinute</td>
            <td align="left">byminute</td>
          </tr>
          <tr>
            <td align="left">schedContextName</td>
            <td align="left">Not Supported</td>
          </tr>
          <tr>
            <td align="left">schedAdminStatus</td>
            <td align="left">state</td>
          </tr>
          <tr>
            <td align="left">schedOperStatus</td>
            <td align="left">state</td>
          </tr>
          <tr>
            <td align="left">schedFailures</td>
            <td align="left">failure-counter</td>
          </tr>
          <tr>
            <td align="left">schedLastFailure</td>
            <td align="left">Not Supported</td>
          </tr>
          <tr>
            <td align="left">schedLastFailed</td>
            <td align="left">last-failed-occurrence</td>
          </tr>
          <tr>
            <td align="left">schedStorageType</td>
            <td align="left">Not Supported</td>
          </tr>
          <tr>
            <td align="left">schedVariable</td>
            <td align="left">Not applicable</td>
          </tr>
          <tr>
            <td align="left">schedValue</td>
            <td align="left">Not applicable</td>
          </tr>
          <tr>
            <td align="left">schedTriggers</td>
            <td align="left">counter/failure-counter</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="sec-schedule">
      <name>The "ietf-schedule" YANG Module</name>
      <t>This module imports types defined in <xref target="RFC6991"/> and <xref target="RFC7317"/>.</t>
      <sourcecode markers="true" name="ietf-schedule@2024-04-16.yang"><![CDATA[
module ietf-schedule {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-schedule";
  prefix schedule;

  import ietf-yang-types {
    prefix yang;
    reference
      "RFC 6991: Common YANG Data Types";
  }

  import ietf-system {
    prefix sys;
    reference
      "RFC 7317: A YANG Data Model for System Management";
  }

  organization
    "IETF NETMOD Working Group";
  contact
    "WG Web: <https://datatracker.ietf.org/wg/netmod/>
     WG List: <mailto:netmod@ietf.org>

     Editor:   Qiufang Ma
               <mailto:maqiufang1@huawei.com
     Author:   Qin Wu
               <mailto:bill.wu@huawei.com>
     Editor:   Mohamed Boucadair
               <mailto:mohamed.boucadair@orange.com>
     Author:   Daniel King
               <mailto:d.king@lancaster.ac.uk>";
  description
    "This YANG module defines a set of common types and groupings
     which are applicable for scheduling purposes such as events,
     policy, services, or resources based on date and time.

     Copyright (c) 2024 IETF Trust and the persons identified
     as authors of the code. All rights reserved.

     Redistribution and use in source and binary forms, with
     or without modification, is permitted pursuant to, and
     subject to the license terms contained in, the Revised
     BSD License set forth in Section 4.c of the IETF Trust's
     Legal Provisions Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); see the RFC
     itself for full legal notices.

     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 (RFC 2119) (RFC 8174) when, and only when,
     they appear in all capitals, as shown here.";

  revision 2024-04-16 {
    description
      "Initial revision.";
    reference
      "RFC XXXX: A Common YANG Data Model for Scheduling";
  }
  
  feature basic-recurrence {
    description
      "Indicates that the server supports configuring a basic
       scheduled recurrence.";
  }

  feature icalendar-recurrence {
    description
      "Indicates that the server supports configuring a comprehensive
       scheduled icalendar recurrence";
    reference
      "RFC 5545: Internet Calendaring and Scheduling Core Object
                 Specification (iCalendar),
                 Sections 3.3.10 and 3.8.5";
  }

  typedef weekday {
    type enumeration {
      enum sunday {
        value 0;
        description
          "Sunday of the week.";
      }
      enum monday {
        value 1;
        description
          "Monday of the week.";
      }
      enum tuesday {
        value 2;
        description
          "Tuesday of the week.";
      }
      enum wednesday {
        value 3;
        description
          "Wednesday of the week.";
      }
      enum thursday {
        value 4;
        description
          "Thursday of the week.";
      }
      enum friday {
        value 5;
        description
          "Friday of the week.";
      }
      enum saturday {
        value 6;
        description
          "Saturday of the week.";
      }
    }
    description
      "Seven days of the week.";
  }

  typedef duration {
    type string {
      pattern '((\+)?|\-)P((([0-9]+)D)?(T(0[0-9]|1[0-9]|2[0-3])'
            + ':[0-5][0-9]:[0-5][0-9]))|P([0-9]+)W';
    }
    description
      "Duration of the time. The format can represent nominal
       durations (weeks designated by 'W' and days designated by 'D')
       and accurate durations (hours:minutes:seconds follows the
       designator 'T').

       Note that this value type doesn't support the 'Y' and 'M'
       designators to specify durations in terms of years and months.

       Negative durations are typically used to schedule an alarm to
       trigger before an associated time.";
    reference
      "RFC 5545: Internet Calendaring and Scheduling Core Object
                 Specification (iCalendar), Sections 3.3.6 and
                 3.8.6.3";
  }

  identity frequency-type {
    description
      "Base identity for frequency type.";
  }

  identity secondly {
    base frequency-type;
    description
      "Indicates a repeating rule based on an interval of
       a second or more.";
  }

  identity minutely {
    base frequency-type;
    description
      "Indicates a repeating rule based on an interval of
       a minute or more.";
  }

  identity hourly {
    base frequency-type;
    description
      "Indicates a repeating rule based on an interval of
       an hour or more.";
  }

  identity daily {
    base frequency-type;
    description
      "Indicates a repeating rule based on an interval of
       a day or more.";
  }

  identity weekly {
    base frequency-type;
    description
      "Indicates a repeating rule based on an interval of
       a week or more.";
  }

  identity monthly {
    base frequency-type;
    description
      "Indicates a repeating rule based on an interval of
       a month or more.";
  }

  identity yearly {
    base frequency-type;
    description
      "Indicates a repeating rule based on an interval of
       a year or more.";
  }

  identity schedule-type {
    description
      "Base identity for schedule type.";
  }

  identity one-shot {
    base schedule-type;
    description
      "Indicates a one-shot schedule. That is a schedule that
       will trigger an action without the duration/end time being
       specified and then the schedule will disable itself.";
  }

  identity period {
    base schedule-type;
    description
      "Indicates a period-based schedule consisting either a
       start and end or a start and positive duration of time.";
  }
  
  identity recurrence {
    base schedule-type;
    description
      "Indicates a recurrence-based schedule.";
  }

  identity schedule-state {
    description
      "Base identity for schedule state.";
  }

  identity enabled {
    base schedule-state;
    description
      "Indicates a schedule with an enabled state.";
  }

  identity finished {
    base schedule-state;
    description
      "Indicates a schedule with a finished state.
       The finished state indicates that the schedule has ended.";
  }

  identity disabled {
    base schedule-state;
    description
      "Indicates a schedule with a disabled state.";
  }

  identity out-of-date {
    base schedule-state;
    description
      "Indicates a schedule with an out-of-date state.";
  }

  identity conflicted {
    base schedule-state;
    description
      "Indicates a schedule with a conflicted state with other 
       schedules.";
  }
  
  identity discard-action {
    description
      "Indicates that a schedule will be discarded.";
  }
  
  identity warning {
    base discard-action;
    description
      "Indicates that a warning message is generated
       when a schedule is discarded.";
  }

  identity error {
    base discard-action;
    description
      "Indicates that an error message is generated
       when a schedule is discarded.";
  }

  identity silently-discard {
    base discard-action;
    description
      "Indicates that an invalid schedule is silently 
       discarded.";
  }

  grouping generic-schedule-params {
    description
      "Includes a set of generic parameters that are followed by
       the entity that supports schedules.

       Such parameters are used as guards to prevent, e.g., stale
       configuration.";
    leaf description {
      type string;
      description
        "Provides a description of the schedule.";
    }
    leaf time-zone-identifier {
      type sys:timezone-name;
      description
        "Indicates the identifier for the time zone.";
    }
    leaf validity {
      type yang:date-and-time;
      description
        "Specifies the date and time after which a schedule will
         be considered as invalid. This parameter takes precedence
         over similar attributes that are provided at the schedule
         instance itself.";
    }
    leaf max-allowed-start {
      type yang:date-and-time;
      description
        "Specifies the maximum scheduled start date and time. 
         A requested schedule whose first instance occurs after 
         this value cannot be accepted by the entity. Specifically, 
         a requested schedule will be rejected if the first 
         occurrence of that schedule exceeds 'max-allowed-start'.";
    }
    leaf min-allowed-start {
      type yang:date-and-time;
      description
        "Specifies the minimum scheduled start date and time. 
         A requested schedule whose first instance occurs before 
         this value cannot be accepted by the entity. Specifically, 
         a requested schedule will be rejected if the first  
         occurrence of that schedule is scheduled before 
         'min-allowed-start'.";
    }
    leaf max-allowed-end {
      type yang:date-and-time;
      description
        "A requested schedule will be rejected if the end time of 
         the last occurrence exceeds 'max-allowed-end'.";
    }
    leaf discard-action {
      type identityref {
        base discard-action;
      }
      description
        "Specifies the behavior when a schedule is discarded when
         enforcing the guards in this grouping or it is received
         out-of-date.";    
    }
  }

  grouping period-of-time {
    description
      "This grouping is defined for period of time property.";
    reference
      "RFC 5545: Internet Calendaring and Scheduling Core Object
                 Specification (iCalendar), Section 3.3.9";
    leaf period-description {
      type string;
      description
        "Provides a description of the period.";
    }
    leaf period-start {
      type yang:date-and-time;
      mandatory true;
      description
        "Period start time.";
    }
    leaf time-zone-identifier {
      type sys:timezone-name;
      description
        "Indicates the identifier for the time zone in a time zone
         database. This parameter MUST be specified if 'period-start'
         value is neither reported in the format of UTC nor time zone
         offset to UTC.";
    }
    choice period-type {
      description
        "Indicates the type of the time period. Two types are
         supported.";
      case explicit {
        description
          "A period of time is identified by its start and its end.
           'period-start' indicates the period start.";
        leaf period-end {
          type yang:date-and-time;
          description
            "Period end time. The start MUST be before the end. If a
             local time without time zone offset to UTC time is
             specified, it MUST use the same time zone reference as
             'period-start' parameter. If 'period-start' also uses a
             local time without time zone offset to UTC, it MUST use
             the time zone as specified by the
             'time-zone-identifier' parameter.";
        }
      }
      case duration {
        description
          "A period of time is defined by a start and a positive
           duration of time.";
        leaf duration {
          type duration {
            pattern 'P((([0-9]+)D)?(T(0[0-9]|1[0-9]|2[0-3])'
                  + ':[0-5][0-9]:[0-5][0-9]))|P([0-9]+)W';
          }
          description
            "A positive duration of the time. This value is
             equivalent to the format of duration type except that
             the value cannot be negative.";
        }
      }
    }
  }

  grouping recurrence-basic {
    description
      "A simple definition of recurrence.";
    leaf recurrence-description {
      type string;
      description
        "Provides a description of the recurrence.";
    }
    leaf frequency {
      type identityref {
        base frequency-type;
      }
      mandatory true;
      description
        "Specifies the frequency type of the recurrence rule.";
    }
    leaf interval {
      type uint32;
      description
        "A positive integer representing at which intervals the
         recurrence rule repeats. For example, within a 'daily'
         recurrence rule, a value of '8' means every eight days.
         The default value is '1', means every second for a 
         'secondly' recurrence rule, every minute for a 'minutely'
         rule, and so on.";
    }
  }

  grouping recurrence-utc {
    description
      "A simple definition of recurrence with time specified in
       UTC. This grouping is intended to be machine-friendly.";
    container recurrence-first {
      description
        "Specifies the first instance of the recurrence.";
      leaf start-time-utc {
        type yang:date-and-time;
        description
          "Defines the instant date and time of the first instance
           in the recurrence set. A UTC format MUST be used.";
      }
      leaf duration {
        type uint32;
        units "seconds";
        description
          "When specified, it indicates how long the first occurrence
           last. Unless specified otherwise, it also applies to all
           the other instances in the recurrence set.";
      }
    }
    choice recurrence-end {
      description
        "Modes to control the end of a recurrence rule. If no
         choice is indicated, the recurrence rule is considered
         to repeat forever.";
      case until {
        description
          "This case defines a way that limits the end of a
           recurrence rule in an inclusive manner.";
        leaf utc-until {
          type yang:date-and-time;
          description
            "This parameter specifies a date and time value to
             inclusively terminate the recurrence in UTC format. If
             the value specified by this parameter is synchronized
             with the specified recurrence, it becomes the last
             instance of the recurrence.";
        }
      }
      case count {
        description
          "This case defines the number of occurrences at which
           to terminate the recurrence.";
        leaf count {
          type uint32;
          description
            "The positive number of occurrences at which to
             terminate the recurrence.";
        }
      }
    }
    uses recurrence-basic;
  }
  
  grouping recurrence-with-time-zone {
    description
      "A simple definition of recurrence to specify the time
       with a local time and time zone identifier. This grouping
       is intended to be human-friendly.";
    container recurrence-first {
      description
        "Specifies the first instance of the recurrence.";
      leaf start-time {
        type yang:date-and-time;
        description
          "Defines the instant date and time of the first instance 
           in the recurrence set.";
      }
      leaf duration {
        type duration;
        description
          "When specified, it indicates how long the first
           occurrence last. Unless specified otherwise, it also
           applies to all the other instances in the recurrence
           set.";
      }
      leaf time-zone-identifier {
        type sys:timezone-name;
        description
          "Indicates the identifier for the time zone in a time
           zone database. This parameter MUST be specified if
           'start-time' or 'until' value is neither reported in
           the format of UTC nor time zone offset to UTC.";
      }
    }
    choice recurrence-end {
      description
        "Modes to terminate the recurrence rule. If no choice is
         indicated, the recurrence rule is considered to repeat
         forever.";
      case until {
        description
          "The end of the recurrence is indicated by a specific
           date-and-time value.";
        leaf until {
          type yang:date-and-time;
          description
            "Specifies a date and time value to terminate the
             recurrence. If the value specified by this parameter
             is synchronized with the specified recurrence, it
             becomes the last instance of the recurrence.";
        }
      }
      case count {
        description
          "The end of the recurrence is indicated by the number
           of occurrences.";
        leaf count {
          type uint32;
          description
            "The positive number of occurrences at which to
             terminate the recurrence.";
        }
      }
    }
    uses recurrence-basic;
  }

  grouping recurrence-utc-with-date-times {
    description
      "This grouping defines an aggregate set of repeating 
       occurrences with UTC time format. The recurrence instances 
       are specified by the occurrences defined by both the
       recurrence rule and 'period-timeticks' list. Duplicate 
       instances are ignored.";
    uses recurrence-utc;
    list period-timeticks {
      key "period-start";
      description
        "A list of periods with timeticks formats.";      
      leaf period-start {
        type yang:timeticks;
        must
          "(not(derived-from(../../frequency,"
         +"'schedule:secondly')) or (current() < 100)) and "
         +"(not(derived-from(../../frequency,"
         +"'schedule:minutely')) or (current() < 6000)) and "
         +"(not(derived-from(../../frequency,'schedule:hourly'))"
         +" or (current() < 360000)) and "
         +"(not(derived-from(../../frequency,'schedule:daily'))"
         +" or (current() < 8640000)) and "
         +"(not(derived-from(../../frequency,'schedule:weekly'))"
         +" or (current() < 60480000)) and "
         +"(not(derived-from(../../frequency,"
         +"'schedule:monthly')) or (current() < 267840000)) and "
         +"(not(derived-from(../../frequency,'schedule:yearly'))"
         +" or (current() < 3162240000))" {
        error-message
          "The period-start must not exceed the frequency 
           interval.";
        }        
        description
          "Start time of the schedule within one recurrence.";
      }
      leaf period-end {
        type yang:timeticks;
        description
          "End time of the schedule within one recurrence.";
      }
    }
  }
  
  grouping recurrence-time-zone-with-date-times {
    description
      "This grouping defines an aggregate set of repeating 
       occurrences with local time format and time zone specified. 
       The recurrence instances are specified by the occurrences
       defined by both the recurrence rule and 'period' list. 
       Duplicate instances are ignored.";  
    uses recurrence-with-time-zone;
    list period {
      key "period-start";
      description
        "A list of periods with date-and-time formats.";
      uses period-of-time;
    }
  }

  grouping icalendar-recurrence {
    description
      "This grouping specifies properties of a recurrence rule.";
    reference
      "RFC 5545: Internet Calendaring and Scheduling Core Object
                 Specification (iCalendar), Section 3.8.5";
    uses recurrence-time-zone-with-date-times;
    leaf-list bysecond {
      type uint32 {
        range "0..60";
      }
      description
        "Specifies a list of seconds within a minute.";
    }
    leaf-list byminute {
      type uint32 {
        range "0..59";
      }
      description
        "Specifies a list of minutes within an hour.";
    }
    leaf-list byhour {
      type uint32 {
        range "0..23";
      }
      description
        "Specifies a list of hours of the day.";
    }
    list byday {
      key "weekday";
      description
        "Specifies a list of days of the week.";
      leaf-list direction {
        when "derived-from(../../frequency, 'schedule:monthly') or "
          +  "(derived-from(../../frequency, 'schedule:yearly') "
          +  " and not(../../byyearweek))";
        type int32 {
          range "-53..-1|1..53";
        }
        description
          "When specified, it indicates the nth occurrence of a
           specific day within the monthly or yearly recurrence
           rule. For example, within a monthly rule, +1 monday 
           represents the first monday within the month, whereas 
           -1 monday represents the last monday of the month.";
      }
      leaf weekday {
        type schedule:weekday;
        description
          "Corresponds to seven days of the week.";
      }
    }
    leaf-list bymonthday {
      type int32 {
        range "-31..-1|1..31";
      }
      description
        "Specifies a list of days of the month.";
    }
    leaf-list byyearday {
      type int32 {
        range "-366..-1|1..366";
      }
      description
        "Specifies a list of days of the year.";
    }
    leaf-list byyearweek {
      when "derived-from(../frequency, 'schedule:yearly')";
      type int32 {
        range "-53..-1|1..53";
      }
      description
        "Specifies a list of weeks of the year.";
    }
    leaf-list byyearmonth {
      type uint32 {
        range "1..12";
      }
      description
        "Specifies a list of months of the year.";
    }
    leaf-list bysetpos {
      type int32 {
        range "-366..-1|1..366";
      }
      description
        "Specifies a list of values that corresponds to the nth
         occurrence within the set of recurrence instances
         specified by the rule. It must only be used in conjunction
         with another by the rule part.";
    }
    leaf workweek-start {
      type schedule:weekday;
      description
        "Specifies the day on which the workweek starts. The 
         default value is 'monday'.";
    }
    leaf-list exception-dates {
      type yang:date-and-time;
      description
        "Defines a list of exceptions for recurrence.";
    }
  }

  grouping schedule-status {
    description
      "This grouping defines common properties of scheduling
       status.";
    leaf state {
      type identityref {
        base schedule-state;
      }
      description
        "Indicates the current state of the schedule.";
    }
    leaf version {
      type uint16;
      description
        "Indicates the version number of the schedule.";
    }
    leaf schedule-type {
      type identityref {
        base schedule-type;
      }
      description
        "Indicates the schedule type.";
    }
    leaf local-time {
      type yang:date-and-time;
      config false;
      description
        "Reports the local time as used by the entity that
         hosts the schedule.";
    }
    leaf last-update {
      type yang:date-and-time;
      config false;
      description
        "Reports the timestamp that the schedule is last updated.";
    }
    leaf counter {
      when "derived-from-or-self(../schedule-type, "
         + "'schedule:recurrence')";
      type yang:counter32;
      config false;
      description
        "The number of occurrences while invoking the scheduled 
         action successfully. The count wraps around when it reaches
         the maximum value.";
    }
    leaf last-occurrence {
      when "derived-from-or-self(../schedule-type, "
         + "'schedule:recurrence')";
      type yang:date-and-time;
      config false;
      description
        "Indicates the timestamp of last occurrence.";    
    }
    leaf upcoming-occurrence {
      when "derived-from-or-self(../schedule-type, "
         + "'schedule:recurrence')"
         + "and derived-from-or-self(../state, 'schedule:enabled')";
      type yang:date-and-time;
      config false;
      description
        "Indicates the timestamp of next occurrence.";
    }
    leaf last-failed-occurrence {
      when "derived-from-or-self(../schedule-type, "
         + "'schedule:recurrence')";
      type yang:date-and-time;
      config false;
      description
        "Indicates the timestamp of last failed action triggered by
         the schedule.";    
    }
    leaf failure-counter {
      when "derived-from-or-self(../schedule-type, "
         + "'schedule:recurrence')";
      type yang:counter32;
      config false;
      description
        "Counts the number of failures while invoking the scheduled
         action.";
    }
  }

  grouping schedule-status-with-name {
    description
      "This grouping defines common properties of scheduling
       status.";
    leaf schedule-id {
      type string;
      description
        "The schedule identifier that uniquely identifies a
         schedule within a device, controller, network, etc. 
         The unicity scope depends on the implementation.";
    }
    uses schedule-status;
  }
}
]]></sourcecode>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This section uses the template described in <xref section="3.7" sectionFormat="of" target="I-D.ietf-netmod-rfc8407bis"/>.</t>
      <t>The "ietf-schedule" YANG module specified in this document defines schema for data
   that is designed to be accessed via network management protocols such
   as NETCONF <xref target="RFC6241"/> or RESTCONF <xref target="RFC8040"/>.  The lowest NETCONF layer
   is the secure transport layer, and the mandatory-to-implement secure
   transport is Secure Shell (SSH) <xref target="RFC6242"/>.  The lowest RESTCONF layer
   is HTTPS, and the mandatory-to-implement secure transport is TLS
   <xref target="RFC8446"/>.</t>
      <t>The Network Configuration Access Control Model (NACM) <xref target="RFC8341"/>
   provides the means to restrict access for particular NETCONF or
   RESTCONF users to a preconfigured subset of all available NETCONF or
   RESTCONF protocol operations and content.</t>
      <t>The "ietf-schedule" module defines a set of types and
   groupings.  These nodes are intended to be reused by other YANG
   modules.  The module by itself does not expose any data nodes that
   are writable, data nodes that contain read-only state, or RPCs.  As
   such, there are no additional security issues related to the "ietf-
   schedule" module that need to be considered.</t>
      <t>Care must be taken when defining recurrences occurring very often and
   frequent that can be an additional source of attacks by keeping the system
   permanently busy with the management of scheduling.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="the-ietf-xml-registry">
        <name>The "IETF XML" Registry</name>
        <t>This document registers the following URI in the "IETF XML Registry" <xref target="RFC3688"/>.</t>
        <artwork><![CDATA[
        URI: urn:ietf:params:xml:ns:yang:ietf-schedule
        Registrant Contact: The IESG.
        XML: N/A, the requested URI is an XML namespace.
]]></artwork>
      </section>
      <section anchor="the-yang-module-names-registry">
        <name>The "YANG Module Names" Registry</name>
        <t>This document registers the following YANG module in the "YANG Module Names"
   registry <xref target="RFC6020"/>.</t>
        <artwork><![CDATA[
        name:               ietf-schedule
        namespace:          urn:ietf:params:xml:ns:yang:ietf-schedule
        prefix:             schedule
        maintained by IANA? N
        reference:          RFC XXXX
]]></artwork>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3231">
          <front>
            <title>Definitions of Managed Objects for Scheduling Management Operations</title>
            <author fullname="D. Levi" initials="D." surname="Levi"/>
            <author fullname="J. Schoenwaelder" initials="J." surname="Schoenwaelder"/>
            <date month="January" year="2002"/>
            <abstract>
              <t>This memo defines a portion of the Management Information Base (MIB) for use with network management protocols in the Internet community. In particular, it describes a set of managed objects that are used to schedule management operations periodically or at specified dates and times. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3231"/>
          <seriesInfo name="DOI" value="10.17487/RFC3231"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC7950">
          <front>
            <title>The YANG 1.1 Data Modeling Language</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols. This document describes the syntax and semantics of version 1.1 of the YANG language. YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification. There are a small number of backward incompatibilities from YANG version 1. This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7950"/>
          <seriesInfo name="DOI" value="10.17487/RFC7950"/>
        </reference>
        <reference anchor="RFC5545">
          <front>
            <title>Internet Calendaring and Scheduling Core Object Specification (iCalendar)</title>
            <author fullname="B. Desruisseaux" initials="B." role="editor" surname="Desruisseaux"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document defines the iCalendar data format for representing and exchanging calendaring and scheduling information such as events, to-dos, journal entries, and free/busy information, independent of any particular calendar service or protocol. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5545"/>
          <seriesInfo name="DOI" value="10.17487/RFC5545"/>
        </reference>
        <reference anchor="RFC6991">
          <front>
            <title>Common YANG Data Types</title>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <date month="July" year="2013"/>
            <abstract>
              <t>This document introduces a collection of common data types to be used with the YANG data modeling language. This document obsoletes RFC 6021.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6991"/>
          <seriesInfo name="DOI" value="10.17487/RFC6991"/>
        </reference>
        <reference anchor="RFC7317">
          <front>
            <title>A YANG Data Model for System Management</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="August" year="2014"/>
            <abstract>
              <t>This document defines a YANG data model for the configuration and identification of some common system properties within a device containing a Network Configuration Protocol (NETCONF) server. This document also includes data node definitions for system identification, time-of-day management, user management, DNS resolver configuration, and some protocol operations for system management.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7317"/>
          <seriesInfo name="DOI" value="10.17487/RFC7317"/>
        </reference>
        <reference anchor="RFC6241">
          <front>
            <title>Network Configuration Protocol (NETCONF)</title>
            <author fullname="R. Enns" initials="R." role="editor" surname="Enns"/>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <author fullname="J. Schoenwaelder" initials="J." role="editor" surname="Schoenwaelder"/>
            <author fullname="A. Bierman" initials="A." role="editor" surname="Bierman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices. It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages. The NETCONF protocol operations are realized as remote procedure calls (RPCs). This document obsoletes RFC 4741. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6241"/>
          <seriesInfo name="DOI" value="10.17487/RFC6241"/>
        </reference>
        <reference anchor="RFC8040">
          <front>
            <title>RESTCONF Protocol</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="K. Watsen" initials="K." surname="Watsen"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8040"/>
          <seriesInfo name="DOI" value="10.17487/RFC8040"/>
        </reference>
        <reference anchor="RFC6242">
          <front>
            <title>Using the NETCONF Protocol over Secure Shell (SSH)</title>
            <author fullname="M. Wasserman" initials="M." surname="Wasserman"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document describes a method for invoking and running the Network Configuration Protocol (NETCONF) within a Secure Shell (SSH) session as an SSH subsystem. This document obsoletes RFC 4742. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6242"/>
          <seriesInfo name="DOI" value="10.17487/RFC6242"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="RFC8341">
          <front>
            <title>Network Configuration Access Control Model</title>
            <author fullname="A. Bierman" initials="A." surname="Bierman"/>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>The standardization of network configuration interfaces for use with the Network Configuration Protocol (NETCONF) or the RESTCONF protocol requires a structured and secure operating environment that promotes human usability and multi-vendor interoperability. There is a need for standard mechanisms to restrict NETCONF or RESTCONF protocol access for particular users to a preconfigured subset of all available NETCONF or RESTCONF protocol operations and content. This document defines such an access control model.</t>
              <t>This document obsoletes RFC 6536.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="91"/>
          <seriesInfo name="RFC" value="8341"/>
          <seriesInfo name="DOI" value="10.17487/RFC8341"/>
        </reference>
        <reference anchor="RFC3688">
          <front>
            <title>The IETF XML Registry</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling"/>
            <date month="January" year="2004"/>
            <abstract>
              <t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="81"/>
          <seriesInfo name="RFC" value="3688"/>
          <seriesInfo name="DOI" value="10.17487/RFC3688"/>
        </reference>
        <reference anchor="RFC6020">
          <front>
            <title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
            <author fullname="M. Bjorklund" initials="M." role="editor" surname="Bjorklund"/>
            <date month="October" year="2010"/>
            <abstract>
              <t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6020"/>
          <seriesInfo name="DOI" value="10.17487/RFC6020"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="I-D.ietf-opsawg-ucl-acl">
          <front>
            <title>A YANG Data Model and RADIUS Extension for Policy-based Network Access Control</title>
            <author fullname="Qiufang Ma" initials="Q." surname="Ma">
              <organization>Huawei</organization>
            </author>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <author fullname="Mohamed Boucadair" initials="M." surname="Boucadair">
              <organization>Orange</organization>
            </author>
            <author fullname="Daniel King" initials="D." surname="King">
              <organization>Lancaster University</organization>
            </author>
            <date day="25" month="June" year="2024"/>
            <abstract>
              <t>   This document defines a YANG data model for policy-based network
   access control, which provides consistent and efficient enforcement
   of network access control policies based on group identity.
   Moreover, this document defines a mechanism to ease the maintenance
   of the mapping between a user group identifier and a set of IP/MAC
   addresses to enforce policy-based network access control.

   In addition, the document defines a Remote Authentication Dial-in
   User Service (RADIUS) attribute that is used to communicate the user
   group identifier as part of identification and authorization
   information.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-opsawg-ucl-acl-05"/>
        </reference>
        <reference anchor="I-D.contreras-opsawg-scheduling-oam-tests">
          <front>
            <title>A YANG Data Model for Network Diagnosis by Scheduling Sequences of OAM Tests</title>
            <author fullname="Luis M. Contreras" initials="L. M." surname="Contreras">
              <organization>Telefonica</organization>
            </author>
            <author fullname="Victor Lopez" initials="V." surname="Lopez">
              <organization>Nokia</organization>
            </author>
            <date day="8" month="July" year="2024"/>
            <abstract>
              <t>   This document defines a YANG data model for network diagnosis on-
   demand using Operations, Administration, and Maintenance (OAM) tests.
   This document defines both 'oam-unitary-test' and 'oam-test-sequence'
   data models to enable activation of network diagnosis procedures.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-contreras-opsawg-scheduling-oam-tests-02"/>
        </reference>
        <reference anchor="I-D.ietf-tvr-schedule-yang">
          <front>
            <title>YANG Data Model for Scheduled Attributes</title>
            <author fullname="Yingzhen Qu" initials="Y." surname="Qu">
              <organization>Futurewei Technologies</organization>
            </author>
            <author fullname="Acee Lindem" initials="A." surname="Lindem">
              <organization>LabN Consulting, L.L.C.</organization>
            </author>
            <author fullname="Eric Kinzie" initials="E." surname="Kinzie">
              <organization>LabN Consulting, L.L.C.</organization>
            </author>
            <author fullname="Don Fedyk" initials="D." surname="Fedyk">
              <organization>LabN Consulting, L.L.C.</organization>
            </author>
            <author fullname="Marc Blanchet" initials="M." surname="Blanchet">
              <organization>Viagenie</organization>
            </author>
            <date day="22" month="July" year="2024"/>
            <abstract>
              <t>   The YANG model in this document includes three modules, and can be
   used to manage network resources and topologies with scheduled
   attributes, such as predictable link loss and link connectivity as a
   function of time.  The intent is to have this information be utilized
   by Time-Variant Routing systems.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-tvr-schedule-yang-02"/>
        </reference>
        <reference anchor="RFC8413">
          <front>
            <title>Framework for Scheduled Use of Resources</title>
            <author fullname="Y. Zhuang" initials="Y." surname="Zhuang"/>
            <author fullname="Q. Wu" initials="Q." surname="Wu"/>
            <author fullname="H. Chen" initials="H." surname="Chen"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2018"/>
            <abstract>
              <t>Time-Scheduled (TS) reservation of Traffic Engineering (TE) resources can be used to provide resource booking for TE Label Switched Paths so as to better guarantee services for customers and to improve the efficiency of network resource usage at any moment in time, including network usage that is planned for the future. This document provides a framework that describes and discusses the architecture for supporting scheduled reservation of TE resources. This document does not describe specific protocols or protocol extensions needed to realize this service.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8413"/>
          <seriesInfo name="DOI" value="10.17487/RFC8413"/>
        </reference>
        <reference anchor="RFC8340">
          <front>
            <title>YANG Tree Diagrams</title>
            <author fullname="M. Bjorklund" initials="M." surname="Bjorklund"/>
            <author fullname="L. Berger" initials="L." role="editor" surname="Berger"/>
            <date month="March" year="2018"/>
            <abstract>
              <t>This document captures the current syntax used in YANG module tree diagrams. The purpose of this document is to provide a single location for this definition. This syntax may be updated from time to time based on the evolution of the YANG language.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="215"/>
          <seriesInfo name="RFC" value="8340"/>
          <seriesInfo name="DOI" value="10.17487/RFC8340"/>
        </reference>
        <reference anchor="I-D.ietf-netmod-rfc8407bis">
          <front>
            <title>Guidelines for Authors and Reviewers of Documents Containing YANG Data Models</title>
            <author fullname="Andy Bierman" initials="A." surname="Bierman">
              <organization>YumaWorks</organization>
            </author>
            <author fullname="Mohamed Boucadair" initials="M." surname="Boucadair">
              <organization>Orange</organization>
            </author>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <date day="27" month="September" year="2024"/>
            <abstract>
              <t>   This memo provides guidelines for authors and reviewers of
   specifications containing YANG modules, including IANA-maintained
   modules.  Recommendations and procedures are defined, which are
   intended to increase interoperability and usability of Network
   Configuration Protocol (NETCONF) and RESTCONF protocol
   implementations that utilize YANG modules.  This document obsoletes
   RFC 8407.

   Also, this document updates RFC 8126 by providing additional
   guidelines for writing the IANA considerations for RFCs that specify
   IANA-maintained modules.  The document also updates RFC 6020 by
   clarifying how modules and their revisions are handled by IANA.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-rfc8407bis-17"/>
        </reference>
        <reference anchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne"/>
            <author fullname="C. Newman" initials="C." surname="Newman"/>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC7951">
          <front>
            <title>JSON Encoding of Data Modeled with YANG</title>
            <author fullname="L. Lhotka" initials="L." surname="Lhotka"/>
            <date month="August" year="2016"/>
            <abstract>
              <t>This document defines encoding rules for representing configuration data, state data, parameters of Remote Procedure Call (RPC) operations or actions, and notifications defined using YANG as JavaScript Object Notation (JSON) text.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7951"/>
          <seriesInfo name="DOI" value="10.17487/RFC7951"/>
        </reference>
        <reference anchor="RFC9657">
          <front>
            <title>Time-Variant Routing (TVR) Use Cases</title>
            <author fullname="E. Birrane III" initials="E." surname="Birrane III"/>
            <author fullname="N. Kuhn" initials="N." surname="Kuhn"/>
            <author fullname="Y. Qu" initials="Y." surname="Qu"/>
            <author fullname="R. Taylor" initials="R." surname="Taylor"/>
            <author fullname="L. Zhang" initials="L." surname="Zhang"/>
            <date month="October" year="2024"/>
            <abstract>
              <t>This document introduces use cases where Time-Variant Routing (TVR) computations (i.e., routing computations that take into consideration time-based or scheduled changes to a network) could improve routing protocol convergence and/or network performance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9657"/>
          <seriesInfo name="DOI" value="10.17487/RFC9657"/>
        </reference>
        <reference anchor="I-D.ietf-netmod-eca-policy">
          <front>
            <title>A YANG Data model for ECA Policy Management</title>
            <author fullname="Qin Wu" initials="Q." surname="Wu">
              <organization>Huawei</organization>
            </author>
            <author fullname="Igor Bryskin" initials="I." surname="Bryskin">
              <organization>Individual</organization>
            </author>
            <author fullname="Henk Birkholz" initials="H." surname="Birkholz">
              <organization>Fraunhofer SIT</organization>
            </author>
            <author fullname="Xufeng Liu" initials="X." surname="Liu">
              <organization>Volta Networks</organization>
            </author>
            <author fullname="Benoît Claise" initials="B." surname="Claise">
              <organization>Cisco</organization>
            </author>
            <date day="19" month="February" year="2021"/>
            <abstract>
              <t>   This document defines a YANG data model for Event Condition Action
   (ECA) policy management.  The ECA policy YANG module provides the
   ability to delegate some network management functions to the server
   (e.g., a NETCONF or RESTCONF server) which can take simple and
   instant action when a trigger condition on the managed objects is
   met.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-netmod-eca-policy-01"/>
        </reference>
        <reference anchor="I-D.liu-netmod-yang-schedule">
          <front>
            <title>A YANG Data Model for Configuration Scheduling</title>
            <author fullname="Xufeng Liu" initials="X." surname="Liu">
              <organization>Jabil</organization>
            </author>
            <author fullname="Igor Bryskin" initials="I." surname="Bryskin">
              <organization>Huawei Technologies</organization>
            </author>
            <author fullname="Vishnu Pavan Beeram" initials="V. P." surname="Beeram">
              <organization>Juniper Networks</organization>
            </author>
            <author fullname="Tarek Saad" initials="T." surname="Saad">
              <organization>Cisco Systems Inc</organization>
            </author>
            <author fullname="Himanshu C. Shah" initials="H. C." surname="Shah">
              <organization>Ciena</organization>
            </author>
            <author fullname="Oscar Gonzalez de Dios" initials="O. G." surname="de Dios">
              <organization>Telefonica</organization>
            </author>
            <date day="1" month="March" year="2018"/>
            <abstract>
              <t>   This document describes a data model for configuration scheduling.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-liu-netmod-yang-schedule-05"/>
        </reference>
      </references>
    </references>
    <?line 1716?>

<section anchor="usage">
      <name>Examples of Format Representation</name>
      <t>This section provides some examples to illustrate the use of the
   period and recurrence formats defined in <xref target="sec-schedule"/>. The following
   modules are used for illustration purposes:</t>
      <artwork><![CDATA[
module example-sch-usage-1 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-1";
  prefix "ex-schu-1";

  import ietf-schedule {
    prefix "schedule";
  }

  container generic-schedule-params {
    uses schedule:generic-schedule-params;
  }
  container schedule-status {
    uses schedule:schedule-status;
  }
}

module example-sch-usage-2 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-2";
  prefix "ex-schu2";

  import ietf-schedule {
    prefix "schedule";
  }

  container period-of-time {
    uses schedule:period-of-time;
  }
}

module example-sch-usage-3 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-3";
  prefix "ex-schu-3";

  import ietf-schedule {
    prefix "schedule";
  }

  container recurrence-basic {
    uses schedule:recurrence-basic;
  }
}

module example-sch-usage-4 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-4";
  prefix "ex-schu-4";

  import ietf-schedule {
    prefix "schedule";
  }

  container recurrence-utc {
    uses schedule:recurrence-utc;
  }
}

module example-sch-usage-5 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-5";
  prefix "ex-schu-5";

  import ietf-schedule {
    prefix "schedule";
  }

  container recurrence-with-time-zone {
    uses schedule:recurrence-with-time-zone;
  }
}

module example-sch-usage-6 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-6";
  prefix "ex-schu-6";

  import ietf-schedule {
    prefix "schedule";
  }

  container recurrence-utc-with-date-times {
    uses schedule:recurrence-utc-with-date-times;
  }  
}

module example-sch-usage-7 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-7";
  prefix "ex-schu-8";

  import ietf-schedule {
    prefix "schedule";

  container recurrence-time-zone-with-date-times {
    uses schedule:recurrence-time-zone-with-date-times;
  }  
}

module example-sch-usage-8 {
  yang-version 1.1;
  namespace "http://example.com/example-sch-usage-8";
  prefix "ex-schu-8";

  container icalendar-recurrence {
    uses schedule:icalendar-recurrence;
  }
}

]]></artwork>
      <t>For each example, only the message body is provided with
   JSON used for encoding per the guidance in <xref target="RFC7951"/>.</t>
      <section anchor="the-generic-schedule-params-grouping">
        <name>The "generic-schedule-params" Grouping</name>
        <t><xref target="ex-0"/> illustrates the example of a requested schedule that needs to start no earlier than
08:00 AM, January 1, 2025 and end no later than 8:00 PM, January 31, 2025 (Beijing time).
Schedule requests that fail to meet the requirements are ignored by the system as indicates by
"discard-action".</t>
        <figure anchor="ex-0">
          <name>Generic Parameters with 'max-allowed-end' for Schedule Validation</name>
          <artwork><![CDATA[
{
  "example-sch-usage-1:generic-schedule-params": {
    "time-zone-identifier": "China/Beijing",
    "min-allowed-start": "2025-01-01T08:00:00",
    "max-allowed-end": "2025-01-31T20:00:00",
    "discard-action": "ietf-schedule:silently-discard"
  }
}
]]></artwork>
        </figure>
        <t>To illustrate the difference between "max-allowed-end" and "validity" parameters,
<xref target="ex-00"/> shows the example of a requested schedule that needs to start no earlier than
08:00 AM, January 1, 2025 (Paris time). Schedule requests that fail to meet the
requirements are discarded with warning messages. The requested schedule may end
after 8:00 PM, January 31, 2025, but any occurrences that are generated
after that time would be considered as invalid.</t>
        <figure anchor="ex-00">
          <name>Generic Parameters with 'validity' for Schedule Validation</name>
          <artwork><![CDATA[
{
  "example-sch-usage-1:generic-schedule-params": {
    "time-zone-identifier": "France/Paris",
    "validity": "2025-01-31T20:00:00",
    "min-allowed-start": "2025-01-01T08:00:00",
    "discard-action": "ietf-schedule:warning"
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-period-of-time-grouping">
        <name>The "period-of-time" Grouping</name>
        <t><xref target="ex-1"/> shows an example of a period that starts at 08:00:00 UTC, on January 1, 2025 and ends at 18:00:00 UTC
   on December 31, 2027.</t>
        <figure anchor="ex-1">
          <name>Simple Start/End Schedule</name>
          <artwork><![CDATA[
{
  "example-sch-usage-2:period-of-time": {
    "period-start": "2025-01-01T08:00:00Z",
    "period-end": "2027-12-31T18:00:00Z"
  }
}
]]></artwork>
        </figure>
        <t>An example of a period that starts at 08:00:00 UTC, on January 1, 2025 and lasts 15 days and
   5 hours and 20 minutes is encoded as shown in <xref target="ex-2"/>.</t>
        <figure anchor="ex-2">
          <name>Simple Schedule with Duration</name>
          <artwork><![CDATA[
{
  "example-sch-usage-2:period-of-time": {
    "period-start": "2025-01-01T08:00:00Z",
    "duration": "P15DT05:20:00"
  }
}
]]></artwork>
        </figure>
        <t>An example of a period that starts at 2:00 A.M. in Los Angeles on November 19,
   2025 and lasts 20 weeks is depicted in <xref target="ex-3"/>.</t>
        <figure anchor="ex-3">
          <name>Simple Schedule with Time Zone Indication</name>
          <artwork><![CDATA[
{
  "example-sch-usage-2:period-of-time": {
    "period-start": "2025-11-19T02:00:00",
    "time-zone-identifier": "America/Los_Angeles",
    "duration": "P20W"
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-recurrence-basic-grouping">
        <name>The "recurrence-basic" Grouping</name>
        <t><xref target="ex-6"/> indicates a recurrence of every 2 days which starts immediately and repeat forever:</t>
        <figure anchor="ex-4">
          <name>Simple Schedule with Recurrence</name>
          <artwork><![CDATA[
{
  "example-sch-usage-3:recurrence-basic": {
    "recurrence-description": "forever recurrence rule",
    "frequency": "ietf-schedule:daily",
    "interval": 2
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-recurrence-utc-grouping">
        <name>The "recurrence-utc" Grouping</name>
        <t><xref target="ex-5"/> indicates a recurrence from 8:00 AM to 9:00 AM every day, from
   December 1 to December 31, 2025 in UTC:</t>
        <figure anchor="ex-5">
          <name>Simple Schedule with Recurrence in UTC</name>
          <artwork><![CDATA[
{
  "example-sch-usage-4:recurrence-utc": {
    "recurrence-first": {
      "start-time-utc": "2025-12-01T08:00:00Z",
      "duration": 3600
    },
    "frequency": "ietf-schedule:daily",
    "interval": 1,
    "utc-until": "2025-12-31T23:59:59Z"
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-recurrence-with-time-zone-grouping">
        <name>The "recurrence-with-time-zone" Grouping</name>
        <t><xref target="ex-6"/> indicates a recurrence of every 2 hours for 10 occurrences, lasting
   10 minutes, and starting at 3 p.m. on December 1, 2025 in New York:</t>
        <figure anchor="ex-6">
          <name>Simple Schedule with Recurrence with Time Zone Indication</name>
          <artwork><![CDATA[
{
  "example-sch-usage-5:recurrence-with-time-zone": {
    "recurrence-first": {
      "start-time": "2025-12-01T15:00:00",
      "duration": "PT00:10:00",
      "time-zone-identifier": "America/New_York"
    },
    "frequency": "ietf-schedule:hourly",
    "interval": 2,
    "count": 10
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-recurrence-utc-with-date-times-grouping">
        <name>The "recurrence-utc-with-date-times" Grouping</name>
        <t><xref target="ex-7"/> indicates a recurrence that occurs every two days starting at 9:00 AM
   and 3:00 PM for a duration of 30 minutes and 40 minutes respectively,
   from 2025-06-01 to 2025-06-30 in UTC:</t>
        <figure anchor="ex-7">
          <name>Example of Recurrence With Date Times</name>
          <artwork><![CDATA[
{
  "example-sch-usage-6:recurrence-utc-with-date-times": {
    "recurrence-first": {
      "start-time-utc": "2025-06-01T09:00:00Z"
    },
    "frequency": "ietf-schedule:daily",
    "interval": 2,
    "utc-until": "2025-06-30T23:59:59Z",
    "period-timeticks": [
      {
        "period-start": "3240000",
        "period-end": "3420000"
      },
      {
        "period-start": "5400000",
        "period-end": "5640000"
      }
    ]
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-recurrence-time-zone-with-date-times-grouping">
        <name>The "recurrence-time-zone-with-date-times" Grouping</name>
        <t><xref target="ex-8"/> indicates a recurrence that occurs every
   30 minutes and last for 15 minutes from 9:00 AM to 5:00 PM, and extra two occurrences
   at 6:00 PM and 6:30 PM with each lasting for 20 minutes on 2025-12-01 (New York):</t>
        <figure anchor="ex-8">
          <name>Example of Advanced Recurrence Schedule</name>
          <artwork><![CDATA[
{
  "example-sch-usage-7:recurrence-time-zone-with-date-times": {
    "recurrence-first": {
      "start-time": "2025-12-01T09:00:00",
      "duration": "PT00:15:00",
      "time-zone-identifier": "America/New_York"
    },
    "frequency": "ietf-schedule:minutely",
    "interval": 30,
    "until": "2025-12-01T17:00:00Z",
    "period": [
      {
        "period-start": "2025-12-01T18:00:00",
        "duration": "PT00:20:00"
      },
      {
        "period-start": "2025-12-01T18:30:00",
        "duration": "PT00:20:00"
      }
    ]
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-icalendar-recurrence-grouping">
        <name>The "icalendar-recurrence" Grouping</name>
        <t><xref target="ex-9"/> indicates 10 occurrences that occur at
   8:00 AM (EST), every last Saturday of the month starting in January 2024:</t>
        <figure anchor="ex-9">
          <name>Simple iCalendar Recurrence</name>
          <artwork><![CDATA[
{
  "example-sch-usage-8:icalendar-recurrence": {
    "recurrence-first": {
      "start-time": "2024-01-27T08:00:00",
      "time-zone-identifier": "America/New_York"
    },
    "frequency": "ietf-schedule:monthly",
    "count": 10,
    "byday": [
      {
        "direction": [
          -1
        ],
        "weekday": "saturday"
      }
    ]
  }
}
]]></artwork>
        </figure>
        <t><xref target="ex-10"/> is an example of a recurrence that occurs on the last
   workday of the month until December 25, 2025, from January 1, 2025:</t>
        <figure anchor="ex-10">
          <name>Example of Advanced iCalendar Recurrence</name>
          <artwork><![CDATA[
{
  "example-sch-usage-8:icalendar-recurrence": {
    "recurrence-first": {
      "start-time": "2025-01-01"
    },
    "frequency": "ietf-schedule:monthly",
    "until": "2025-12-25",
    "byday": [
      {
        "weekday": "monday"
      },
      {
        "weekday": "tuesday"
      },
      {
        "weekday": "wednesday"
      },
      {
        "weekday": "thursday"
      },
      {
        "weekday": "friday"
      }
    ],
    "bysetpos": [
      -1
    ]
  }
}
]]></artwork>
        </figure>
        <t><xref target="ex-11"/> indicates a recurrence that occurs every 20
   minutes from 9:00 AM to 4:40 PM (UTC), with the occurrence starting at 10:20 AM
   being excluded on 2025-12-01:</t>
        <figure anchor="ex-11">
          <name>Example of Advanced iCalendar Recurrence with Exceptions</name>
          <artwork><![CDATA[
{
  "example-sch-usage-8:icalendar-recurrence": {
    "recurrence-first": {
      "start-time": "2025-12-01T09:00:00Z"
    },
    "until": "2025-12-01T16:40:00Z",
    "frequency": "ietf-schedule:minutely",
    "byminute": [
      0,
      20,
      40
    ],
    "byhour": [
      9,
      10,
      11,
      12,
      13,
      14,
      15,
      16
    ],
    "exception-dates": [
      "2025-12-01T10:20:00Z"
    ]
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="the-schedule-status-grouping">
        <name>The "schedule-status" Grouping</name>
        <t><xref target="ex-12"/> indicates the scheduled recurrence status of <xref target="ex-11"/> at the time
   of 12:15 PM, 2025-12-01 (UTC):</t>
        <figure anchor="ex-12">
          <name>Example of a Schedule Status</name>
          <artwork><![CDATA[
{
  "example-sch-usage-1:schedule-status": {
    "state": "ietf-schedule:enabled",
    "version": 1,
    "schedule-type": "ietf-schedule:recurrence",
    "counter": 9,
    "last-occurrence": [
      "2025-12-01T12:00:00Z"
    ],
    "upcoming-occurrence": [
      "2025-12-01T12:20:00Z"
    ]
  }
}
]]></artwork>
        </figure>
        <t>At the time of 12:15 PM, 2025-12-01 (UTC), the recurring event occurred at
  (note that occurrence at 10:20 AM is excluded):
  9:00, 9:20, 9:40, 10:00, 10:40, 11:00, 11:20, 11:40, 12:00.
  The last occurrence was at 12:00, the upcoming one is at 12:20.</t>
      </section>
    </section>
    <section anchor="sec-ext">
      <name>Examples of Using/Extending the "ietf-schedule" Module</name>
      <t>This non-normative section shows two examples for how the "ietf-schedule" module
   can be used or extended for scheduled events or attributes based on date and time.</t>
      <section anchor="features">
        <name>Example: Schedule Tasks to Execute Based on a Recurrence Rule</name>
        <t>Scheduled tasks can be used to execute specific actions based on certain recurrence rules (e.g.,
   every Friday at 8:00 AM). The following example module which "uses" the "icalendar-recurrence"
   grouping from "ietf-schedule" module shows how a scheduled task could be defined
   with different features used for options.</t>
        <artwork><![CDATA[
module example-scheduled-backup {
  yang-version 1.1;
  namespace "http://example.com/example-scheduled-backup";
  prefix "ex-scback";

  import ietf-inet-types {
    prefix "inet";
  }

  import ietf-schedule {
    prefix "schedule";
  }

  organization
    "Example, Inc.";

  contact
    "Support at example.com";

  description
    "Example of a module defining an scheduled based backup
     operation.";

  revision "2023-01-19" {
    description
      "Initial Version.";
    reference
      "RFC XXXX: A YANG Data Model for Scheduling.";
    }

  container scheduled-backup-tasks {
    description
      "A container for backing up all current running configuration
       on the device.";
    list tasks {
      key "task-id";
      description
        "The list of backing up tasks on this device.";
      leaf task-id {
        type string;
        description
          "The task identifier that uniquely identifies a scheduled 
           backup task.";
      }
      choice local-or-remote {
        description
          "Specifies whether the configuration to be backed up is
           local or remote.";
        case local {
          description
            "Configuration parameters for backing up of local
             devices.";
          leaf local {
            type empty;
            description
              "The parameter specifies the configuration to be
               backed up is on the local device.";
          }
        }
        case remote {
          description
            "Configuration parameters for backing up of remote
             devices.";
          leaf remote {
            type inet:domain-name;
            description
              "The parameter specifies the remote device domain
               name.";
          }
        }
      }

      container basic-recurrence-schedules {
        if-feature schedule:basic-recurrence;
        description
          "Basic recurrence schedule specification, only applies when
           schedule:basic-recurrence feaure is supported.";
        leaf schedule-id {
          type string;
          description
            "The schedule identifier for this recurrence rule.";
        }            
        uses schedule:recurrence-basic;
       }

      container icalendar-recurrence-schedules {
        if-feature schedule:icalendar-recurrence;
        description
          "Basic recurrence schedule specification, only applies when
           schedule:icalendar-recurrence feaure is supported.";
        leaf schedule-id {
          type string;
          description
            "The schedule identifier for this recurrence rule.";
        }           
        uses schedule:icalendar-recurrence;
      }      
    }
  
    list schedule-set {
      key "schedule-id";
      description
        "The list of schedule status for the backup tasks.";
      uses schedule:schedule-status;
    }
  }
}
]]></artwork>
      </section>
      <section anchor="augments">
        <name>Example: Schedule Network Properties to Change Based on Date and Time</name>
        <t>Network properties may change over a specific period of time or based on a
   recurrence rule, e.g., <xref target="RFC9657"/>.
   The following example module which augments the "recurrence-utc-with-date-times"
   grouping from "ietf-schedule" module shows how a scheduled based attribute
   could be defined.</t>
        <artwork><![CDATA[
module example-scheduled-link-bandwidth {
  yang-version 1.1;
  namespace "http://example.com/example-scheduled-link-bandwidth";
  prefix "ex-scattr";

  import ietf-network {
    prefix "nw";
    reference
      "RFC 8345: A YANG Data Model for Network Topologies";
  }

  import ietf-schedule {
    prefix "schedule";
    reference
      "RFC XXXX: A YANG Data Model for Scheduling";
  }

  organization
    "Example, Inc.";

  contact
    "Support at example.com";

  description
    "Example of a module defining a scheduled link bandwidth.";

  revision "2023-01-19" {
    description
      "Initial Version.";
    reference
      "RFC XXXX: A YANG Data Model for Scheduling.";
    }

  grouping link-bandwidth-grouping {
    description
      "Grouping of the link bandwidth definition.";
    leaf scheduled-bandwidth {
      type uint64;
      units "Kbps";
      description
        "Bandwidth values, expressed in kilobits per second.";
    }
  }

  container link-attributes {
    description
      "Definition of link attributes.";
    list link {
      key "source-node destination-node";
      description
        "Definition of link attributes.";
      leaf source-node {
        type nw:node-id;
        description
          "Indicates the source node identifier.";
      }
      leaf destination-node {
        type nw:node-id;
        description
          "Indicates the source node identifier.";
      }

      leaf default-bandwidth {
        type uint64;
        units "Kbps";
        description
          "Default bandwidth values when unspecified.";
      }

      choice time-variant-type {
        description
          "Controls the schedule type.";
        case period {
          uses schedule:period-of-time;
        }
        case recurrence {
          uses schedule:recurrence-utc-with-date-times {
            augment "period-timeticks" {
              description
                "Specifies the attributes inside each 
                 period-timeticks entry.";
              uses link-bandwidth-grouping;
            }
          }
        }
      }
    }
  }
}

]]></artwork>
        <t><xref target="ex-13"/> shows a configuration example of a link's bandwidth that is
  scheduled between 2025-12-01 0:00 UTC to the end of 2025-12-31 with a daily
  schedule. In each day, the bandwidth value is scheduled to be 500 Kbps between
  1:00 AM to 6:00 AM and 800 Kbps between 10:00 PM to 11:00 PM. The bandwidth
  value that's not covered by the period above is 1000 Kbps by default.</t>
        <figure anchor="ex-13">
          <name>Example of Scheduled Link's Bandwidth</name>
          <artwork><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<link-attributes
  xmlns="http://example.com/example-scheduled-link-bandwidth"
  xmlns:schedule="urn:ietf:params:xml:ns:yang:ietf-schedule">
  <link>
    <source-node>ne1</source-node>
    <destination-node>ne2</destination-node>
    <default-bandwidth>1000</default-bandwidth>
    <recurrence-first>
      <utc-start-time>2025-12-01T01:00:00Z</utc-start-time>
    </recurrence-first>
    <frequency>schedule:daily</frequency>
    <utc-until>2025-12-31T23:59:59Z</utc-until>
    <period-timeticks>
      <period-start>360000</period-start>
      <period-end>2160000</period-end>
      <scheduled-bandwidth>500</scheduled-bandwidth>
    </period-timeticks>
    <period-timeticks>
      <period-start>7920000</period-start>
      <period-end>8280000</period-end>
      <scheduled-bandwidth>800</scheduled-bandwidth>
    </period-timeticks>
  </link>
</link-attributes>
]]></artwork>
        </figure>
      </section>
    </section>
    <section anchor="ex-framework">
      <name>Examples of Using "ietf-schedule" Module for Scheduled Use of Resources Framework</name>
      <t>This section exemplifies how the architecture for supporting scheduled
   reservation of Traffic Engineering (TE) resources in <xref target="RFC8413"/> might leverage the "period-of-time"
   grouping defined in the "ietf-schedule" module to implement scheduled use of
   resources.</t>
      <t>The following example module shows how a scheduled link capacity reservation
   could be defined.</t>
      <artwork><![CDATA[
module example-sch-capacity-res {
  yang-version 1.1;
  namespace "http://example.com/example-sch-capacity-res";
  prefix "ex-schecaparev";

  import ietf-network-topology {
    prefix "nt";
  }

  import ietf-schedule {
    prefix "schedule";
  }

  container link-capability-reservations {
    list scheduled-link-capacity {
      key "schedule-id";
      leaf schedule-id {
        type string;
      }
      leaf link-id {
        type nt:link-id;
      }
      leaf reserved-capability {
        type uint64;
        units "Mbps";
      }
      uses schedule:period-of-time;
    }
  }
}
]]></artwork>
      <t><xref section="4" sectionFormat="of" target="RFC8413"/> defines the reference architecture for scheduled use
   of resources, the service requester sends a request to a Path Computation Element (PCE) and includes the
   parameters of the Label Switched Path (LSP) that the requester wishes to supply, the configuration
   example to provide the scheduled resource is shown in <xref target="ex-14"/>.</t>
      <figure anchor="ex-14">
        <name>Example of Scheduled Link's Bandwidth Reservation</name>
        <artwork><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<link-capability-reservations
  xmlns="http://example.com/example-sch-capacity-res"
  xmlns:schedule="urn:ietf:params:xml:ns:yang:ietf-schedule">
   <scheduled-link-capacity>
      <schedule-id>1</schedule-id>
      <link-id>1-2-1</link-id>
      <reserved-capability>500</reserved-capability>
      <period-start>2025-03-10T08:00:00Z</period-start>
      <period-end>2025-03-10T09:00:00Z</period-end>
   </scheduled-link-capacity>
   <scheduled-link-capacity>
      <schedule-id>2</schedule-id>
      <link-id>2-1-1</link-id>
      <reserved-capability>400</reserved-capability>
      <period-start>2025-04-01T00:00:00Z</period-start>
      <duration>PT09:00:00</duration>
   </scheduled-link-capacity>
   <scheduled-link-capacity>
      <schedule-id>3</schedule-id>
      <link-id>2-1-1</link-id>
      <reserved-capability>500</reserved-capability>
      <period-start>2025-04-01T09:00:00Z</period-start>
      <period-end>2025-04-01T23:59:59Z</period-end>
   </scheduled-link-capacity>
</link-capability-reservations>
]]></artwork>
      </figure>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This work is derived from the <xref target="I-D.ietf-opsawg-ucl-acl"/>. There is a desire
   from the OPSAWG to see this model be separately defined for wide use in scheduling context.</t>
      <t>Thanks to Adrian Farrel, Wei Pan, Tianran Zhou, Joe Clarke, Steve Baillargeon, and Dhruv Dhody
   for their valuable comments and inputs to this work.</t>
      <t>Many thanks to the authors of <xref target="I-D.ietf-tvr-schedule-yang"/>, <xref target="I-D.contreras-opsawg-scheduling-oam-tests"/>, and <xref target="I-D.ietf-netmod-eca-policy"/>
   for the constructive discussion during IETF#118.</t>
      <t>Other related efforts were explored in the past, e.g., <xref target="I-D.liu-netmod-yang-schedule"/>.</t>
      <t>Thanks to Reshad Rahman for the great YANGDOCTORS review.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
fKgNYI9wkVIRtcVmEheTlN2rmVy18nGB8Zg+3GXavLSZHmSFkTSOtAPD6MOT
GPbVQMgG+8prVAPSMsf+YHp5wWXVl0ELtdbpWayNyxTTNR0HNwiHA0AsWk8z
7HGVoHaSzysUGbjRembgCxbJyJ0gORONMkAefZvGkWTRBU1bjlY0k290MY/x
Li6+wOvVCulqkrgqSgea53gxBQRX08z0kbjO5xO8zyVdS2sqAAUettE0ZVdq
mcPuAp+sUBAIeKVyWWuN0rd1PUVSbF6zEX57Wx+bVUodM65d5NdEZ9zRuIo9
r9S6GpkP6oZ2U7mMTDdDKtkgpTI2ZzQ4SGxcWzSE9m+tt9Wv7Q0TsKTPKjPd
jnK6FJW+luWV0PXgOXoAx3hno86A06hXQ9wtZJoMcb8S7StZsKi01Vf8NKTZ
2lu2op56e2V4XWZBj+XGU+WvhW8G68kHDElKqw316ScHLktDbYBIDaSoSQ+k
lFf53Kit6pPfFdKvopAKX1L66Bs+v3A6zpAfaI5XV0Q1l6y7+jw+ie4uPEAN
rW0uWbC3U7NKx2xNKejIv57+thxPSNPWN9759k63uaT2f1zbjVur2yPfZo2i
OXy1s/37WfjSs2BTnzoQFrktOAxM3GY/183FIEhaFXaMVxWw9ry46USaObtX
d7XgC/sCv4WXyO1RnE7AuPEjHMxRuUVsBd7wSGAFieMjvhlD1YnsrMUBBiz/
9YjrbfVr21Vy6sEP/q25E/7gLRkBoesqWrjfreMsygR7HLSdSIckvbhEO+Wm
7MlmjZJxPJ9U0gU2R0dHCOaa4yM8CGDALw+W0BduY1HbZLWyRLqoxbhAjm9E
TZfDUtT+7Pb6dEFqgpXlFUsxHh7sbj08TzGiGVQgdB3QytscPwhnkUKI1FUl
Rf+dJ8NYAko55AZsVwxYkussUNrHKXo3kbaTohYAq3BL7t78fJJgHP+wFxIC
96vz3VrlC0kxuoqqyzC6kjI6q9/BF2PIJm1RpgO+6iIQx9Tdaa+Xij30gv98
dmS8H9+SEFxBMfPkpDYslIJJGi/LDejztFnB/NSkR2qhKEquNRsIF9FzP4l6
OgdePNlQH8mYuIP0hSVxF0IxWKe3L3ocmZo+9KS2B923pTL8rg8YfcA+xnWd
AL9erBcws3DJuU3xCU64RCFeQ/9YqwG0NR7y7nSw2zzDC1n0bZCcKjsmtnym
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
ifPsL/GRfREnIqjOth5ZeuAXcZztRo5DK7Y4jqub6jfN0P5vArMJb67pFDv8
HLzdqTURJXdnd5sayPefO8vH3KMhF4y5x4/69Zj07y+Bo/BQHYUTo8FZB+Ad
qXtoo5/R/oXJvtHhFyL+g1sQP3byKJhDAZG37unPiXIfGQG7p4xhMnE+VEVM
p8h7JA1z7cu5wXb7gx36nc48efCEW9NsljLPleaFGUbrih1vLDkbD1dykX4h
a1anYxFr3vttWbNKoRE4cTtb6sj5Ah6lysOgKbjaIbPHOfBQEEKCNnxWPXHu
BDu3nKDx+B0Ejt/h6Ao9ICP7HNpmrDqAIX906MA9cg6cq5JYRy7iYCKlp66f
nJ5tqFTCdOj8kuH8bE1LpdSYyYCs3SWn4SDoTr8j9e+izbv90Pfv/CbUza9g
2zU1Qz6g99RhmtVPn62v8afb13/8YpGUeoYNIKg678vp6ZGn2ejH/55do2ij
TxcBdZdSA1OWcFaVSBRDBmsEwZnNtOKKHkj2QxKX9jwpX5NKxDNy162u8azt
vfbyTbd2kR/aLWI6VuNqnpSrt75ORtlt2leXsJurNx8XaZ369Nr5oai1fCHo
EH32txYxvKXU2r+N4rxNNmmTjrA72CVxvw5a7UbHBPdZTydshbuPLF00bqoO
jE8XsRTiyNUHvi5Bu0LfU4mDQnYflm0L2VsIcpVTw9rpLUU32/q33S2PPNBU
s7o8Ug37uku/r3/b1r/t6N929W97+rd9ZxLvjao1m7N2kcqCpiB59m9Lnkw4
J/oZqy2gvbCpoFN/26Fo9/mZnQqWg7MAGnMQ5NGeyjcK3/W3QbsjxddWUJHA
l5Bl3w/xMhRJwcJ14pBHUPqChq/qLT+O82Cm3t8ifluUknQWEml7b+GatnXb
oX5FE4HXZM0DLKWL7QBdxMZvcMpII1Z1aLZl8Z7YqU2JoVxRRDGDO2J1DDOU
2byNqcHiR3S1IJwIdjkiFteB/2/T/3fh/+SLoX/orz7/1acW8A99iDjEeN6z
y3otvOuYr4i2qSPFdApuKSlXqr7d3ur5UaU/l9Bq8+QDBsOrCGs/1l6icz8+
wIBPMNasYNMMTnRGsaGYBFOFnsr9Lhh0OuwULTTMWhwanyNNcEyJCKcAC0px
IjH6drXwEW9DSbXSTS1RLlSeZ17lRzrrsuCBIYezuHxPV8onH2B3ocMPqnts
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

-->

</rfc>
